]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix copy of fixed arrays when elements require copy
authorLuca Bruno <lucabru@src.gnome.org>
Fri, 20 May 2011 13:18:55 +0000 (15:18 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Fri, 20 May 2011 13:22:08 +0000 (15:22 +0200)
Fixes bug 613840.

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/objects/bug613840.vala [new file with mode: 0644]

index 9fb3ca319be3528af9a9a10f32886bd569b370b2..55ecb6970d7300e25db8eaa4b70d2484917a036d 100644 (file)
@@ -5197,10 +5197,14 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                if (target_type.value_owned && (!type.value_owned || boxing || unboxing)) {
                        // need to copy value
                        if (requires_copy (target_type) && !(type is NullType)) {
-                               var decl = get_temp_variable (target_type, true, node, false);
-                               emit_temp_var (decl);
-                               ccode.add_assignment (get_variable_cexpression (decl.name), get_cvalue_ (copy_value (result, node)));
-                               result.cvalue = get_variable_cexpression (decl.name);
+                               result = (GLibValue) copy_value (result, node);
+                               // drop this assignment when target values are guaranteed to be effect-free
+                               if (!(target_type is ArrayType && ((ArrayType) target_type).fixed_length)) {
+                                       var decl = get_temp_variable (target_type, true, node, false);
+                                       emit_temp_var (decl);
+                                       ccode.add_assignment (get_variable_cexpression (decl.name), get_cvalue_ (result));
+                                       result.cvalue = get_variable_cexpression (decl.name);
+                               }
                        }
                }
 
index 3169591c64b2c98e37026e99f6bc1269be401dbd..1f8fec7df6d955f03b7281b9876c6dfae6428c47 100644 (file)
@@ -75,6 +75,7 @@ TESTS = \
        objects/bug597155.vala \
        objects/bug597161.vala \
        objects/bug613486.vala \
+       objects/bug613840.vala \
        objects/bug620706.vala \
        objects/bug624594.vala \
        objects/bug628639.vala \
diff --git a/tests/objects/bug613840.vala b/tests/objects/bug613840.vala
new file mode 100644 (file)
index 0000000..baf7fe5
--- /dev/null
@@ -0,0 +1,5 @@
+void main () {
+       Object a[1] = {new Object()};
+       Object b[1] = a;
+       assert (a[0] == b[0]);
+}