From: Jürg Billeter Date: Sun, 21 Mar 2010 17:35:42 +0000 (+0100) Subject: Fix struct initialization when temporary variables are used X-Git-Tag: 0.8.0~103 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c1ee79af32db6572ab1cd3d910d30c10cfbd95cb;p=thirdparty%2Fvala.git Fix struct initialization when temporary variables are used Fixes bug 613513. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index e68e88986..ded33db26 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -3019,16 +3019,25 @@ internal class Vala.CCodeBaseModule : CCodeModule { return; } - var expr_type = expr.value_type; - if (expr.target_type != null) { - expr_type = expr.target_type; - } + var expr_list = new CCodeCommaExpression (); - var full_expr_var = get_temp_variable (expr_type, true, expr, false); - expr.temp_vars.add (full_expr_var); + LocalVariable full_expr_var = null; + + var local_decl = expr.parent_node as LocalVariable; + var st = local_decl != null ? local_decl.variable_type.data_type as Struct : null; + if (st != null && !st.is_simple_type () && !local_decl.variable_type.nullable) { + expr_list.append_expression ((CCodeExpression) expr.ccodenode); + } else { + var expr_type = expr.value_type; + if (expr.target_type != null) { + expr_type = expr.target_type; + } + + full_expr_var = get_temp_variable (expr_type, true, expr, false); + expr.temp_vars.add (full_expr_var); - var expr_list = new CCodeCommaExpression (); - expr_list.append_expression (new CCodeAssignment (get_variable_cexpression (full_expr_var.name), (CCodeExpression) expr.ccodenode)); + expr_list.append_expression (new CCodeAssignment (get_variable_cexpression (full_expr_var.name), (CCodeExpression) expr.ccodenode)); + } foreach (LocalVariable local in temp_ref_vars) { var ma = new MemberAccess.simple (local.name); @@ -3036,9 +3045,11 @@ internal class Vala.CCodeBaseModule : CCodeModule { ma.value_type = local.variable_type.copy (); expr_list.append_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma)); } - - expr_list.append_expression (get_variable_cexpression (full_expr_var.name)); - + + if (full_expr_var != null) { + expr_list.append_expression (get_variable_cexpression (full_expr_var.name)); + } + expr.ccodenode = expr_list; temp_ref_vars.clear (); diff --git a/tests/Makefile.am b/tests/Makefile.am index b746e19c8..a71eda75e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -45,6 +45,7 @@ TESTS = \ structs/bug583603.vala \ structs/bug595587.vala \ structs/bug606202.vala \ + structs/bug613513.vala \ delegates/delegates.vala \ delegates/bug595610.vala \ delegates/bug595639.vala \ diff --git a/tests/structs/bug613513.vala b/tests/structs/bug613513.vala new file mode 100644 index 000000000..3140c6f1e --- /dev/null +++ b/tests/structs/bug613513.vala @@ -0,0 +1,10 @@ +struct Foo { + int i; + + public Foo (string s) { + } +} + +void main () { + var foo = Foo ("hello" + 42.to_string ()); +}