summaryrefslogtreecommitdiff
path: root/vala/valabinaryexpression.vala
diff options
context:
space:
mode:
authorMarvin W <git@larma.de>2017-04-11 17:19:58 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2017-04-17 10:58:45 +0200
commit50748111d26d839cb8244e1bfc0c6924305a90b1 (patch)
treeaab283a0560cbe88e8bf813bf17d29d12f74af0c /vala/valabinaryexpression.vala
parent2637bc5499279f8a49a47a7f2a3bf41e55db16a3 (diff)
downloadvala-50748111d26d839cb8244e1bfc0c6924305a90b1.tar.gz
vala: Handle non-null in coalescing expression
https://bugzilla.gnome.org/show_bug.cgi?id=611223
Diffstat (limited to 'vala/valabinaryexpression.vala')
-rw-r--r--vala/valabinaryexpression.vala33
1 files changed, 29 insertions, 4 deletions
diff --git a/vala/valabinaryexpression.vala b/vala/valabinaryexpression.vala
index 82e605398..19287da85 100644
--- a/vala/valabinaryexpression.vala
+++ b/vala/valabinaryexpression.vala
@@ -210,12 +210,31 @@ public class Vala.BinaryExpression : Expression {
}
DataType local_type = null;
- if (left.value_type != null) {
+ bool cast_non_null = false;
+ if (left.value_type is NullType && right.value_type != null) {
+ Report.warning (left.source_reference, "left operand is always null");
+ local_type = right.value_type.copy ();
+ local_type.nullable = true;
+ if (!right.value_type.nullable) {
+ cast_non_null = true;
+ }
+ } else if (left.value_type != null) {
local_type = left.value_type.copy ();
if (right.value_type != null && right.value_type.value_owned) {
// value owned if either left or right is owned
local_type.value_owned = true;
}
+ if (context.experimental_non_null) {
+ if (!local_type.nullable) {
+ Report.warning (left.source_reference, "left operand is never null");
+ if (right.value_type != null && right.value_type.nullable) {
+ local_type.nullable = true;
+ cast_non_null = true;
+ }
+ } else if (right.value_type != null && !right.value_type.nullable) {
+ cast_non_null = true;
+ }
+ }
} else if (right.value_type != null) {
local_type = right.value_type.copy ();
}
@@ -246,10 +265,16 @@ public class Vala.BinaryExpression : Expression {
return false;
}
- var temp_access = SemanticAnalyzer.create_temp_access (local, target_type);
- temp_access.check (context);
+ var replace_expr = SemanticAnalyzer.create_temp_access (local, target_type);
+ if (cast_non_null && replace_expr.target_type != null) {
+ var cast = new CastExpression.non_null (replace_expr, source_reference);
+ cast.target_type = replace_expr.target_type.copy ();
+ cast.target_type.nullable = false;
+ replace_expr = cast;
+ }
+ replace_expr.check (context);
- parent_node.replace_expression (this, temp_access);
+ parent_node.replace_expression (this, replace_expr);
return true;
}