]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix regression when coalescing: value owned if either of the two is owned
authorLuca Bruno <lucabru@src.gnome.org>
Sun, 26 Jan 2014 17:06:43 +0000 (18:06 +0100)
committerLuca Bruno <lucabru@src.gnome.org>
Sun, 26 Jan 2014 17:06:43 +0000 (18:06 +0100)
tests/control-flow/bug639482.vala
vala/valabinaryexpression.vala

index 27a8e20ba6ae9cdee34a21795d66e166d62a74da..4a0a5508bfcef196f5bf322271d763062bfaf485 100644 (file)
@@ -1,4 +1,14 @@
+public string test() throws Error {
+       return "foo";
+}
+
 void main () {
        string empty = null;
        assert ((false ? "A" : (empty ?? "B")) == "B");
+
+       string foo = "bar" ?? test ();
+       assert (foo == "bar");
+
+       foo = empty ?? test ();
+       assert (foo == "foo");
 }
index 9c1ef4c984747137a526528657172b135be5bc9f..bdd9e5eb233cbf27bc0d89370a10880ab69e9cef 100644 (file)
@@ -198,8 +198,24 @@ public class Vala.BinaryExpression : Expression {
                                error = true;
                                return false;
                        }
-                       
-                       var local = new LocalVariable (left.value_type != null ? left.value_type.copy () : null, get_temp_name (), left, source_reference);
+
+                       if (!right.check (context)) {
+                               error = true;
+                               return false;
+                       }
+
+                       DataType local_type = null;
+                       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;
+                               }
+                       } else if (right.value_type != null) {
+                               local_type = right.value_type.copy ();
+                       }
+               
+                       var local = new LocalVariable (local_type, get_temp_name (), left, source_reference);
                        var decl = new DeclarationStatement (local, source_reference);
 
                        var right_stmt = new ExpressionStatement (new Assignment (new MemberAccess.simple (local.name, right.source_reference), right, AssignmentOperator.SIMPLE, right.source_reference), right.source_reference);