From: Luca Bruno Date: Fri, 20 May 2011 13:18:55 +0000 (+0200) Subject: codegen: Fix copy of fixed arrays when elements require copy X-Git-Tag: 0.13.0~93 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3bb552a242a8dfb4bbd4f5b0ecd01a04081251ad;p=thirdparty%2Fvala.git codegen: Fix copy of fixed arrays when elements require copy Fixes bug 613840. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 9fb3ca319..55ecb6970 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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); + } } } diff --git a/tests/Makefile.am b/tests/Makefile.am index 3169591c6..1f8fec7df 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..baf7fe5ab --- /dev/null +++ b/tests/objects/bug613840.vala @@ -0,0 +1,5 @@ +void main () { + Object a[1] = {new Object()}; + Object b[1] = a; + assert (a[0] == b[0]); +}