From: Jürg Billeter Date: Wed, 24 Mar 2010 20:01:13 +0000 (+0100) Subject: Fix struct initialization with member initializers X-Git-Tag: 0.8.0~48 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb15c9844769c26cd4bf2196424941772dfee0a7;p=thirdparty%2Fvala.git Fix struct initialization with member initializers Fixes bug 613825. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 223d49a21..c937531ea 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -2022,6 +2022,17 @@ internal class Vala.CCodeBaseModule : CCodeModule { } } + bool has_simple_struct_initializer (LocalVariable local) { + var st = local.variable_type.data_type as Struct; + var initializer = local.initializer as ObjectCreationExpression; + if (st != null && (!st.is_simple_type () || st.get_cname () == "va_list") && !local.variable_type.nullable && + initializer != null && initializer.get_object_initializer ().size == 0) { + return true; + } else { + return false; + } + } + public override void visit_local_variable (LocalVariable local) { check_type (local.variable_type); @@ -2166,8 +2177,7 @@ internal class Vala.CCodeBaseModule : CCodeModule { closure_struct.add_field (local.variable_type.get_cname (), get_variable_cname (local.name) + local.variable_type.get_cdeclarator_suffix ()); if (local.initializer != null) { - var st = local.variable_type.data_type as Struct; - if (st != null && (!st.is_simple_type () || st.get_cname () == "va_list") && !local.variable_type.nullable && local.initializer is ObjectCreationExpression) { + if (has_simple_struct_initializer (local)) { cfrag.append (new CCodeExpressionStatement (rhs)); } else { cfrag.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (local.name)), rhs))); @@ -2175,8 +2185,7 @@ internal class Vala.CCodeBaseModule : CCodeModule { } } else { CCodeStatement post_stmt = null; - var st = local.variable_type.data_type as Struct; - if (st != null && (!st.is_simple_type () || st.get_cname () == "va_list") && !local.variable_type.nullable && local.initializer is ObjectCreationExpression) { + if (has_simple_struct_initializer (local)) { post_stmt = new CCodeExpressionStatement (rhs); rhs = null; } @@ -2999,8 +3008,7 @@ internal class Vala.CCodeBaseModule : CCodeModule { 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) { + if (local_decl != null && has_simple_struct_initializer (local_decl)) { expr_list.append_expression ((CCodeExpression) expr.ccodenode); } else { var expr_type = expr.value_type; @@ -4000,7 +4008,7 @@ internal class Vala.CCodeBaseModule : CCodeModule { // value-type initialization or object creation expression with object initializer var local = expr.parent_node as LocalVariable; - if (local != null && !local.variable_type.nullable) { + if (local != null && has_simple_struct_initializer (local)) { instance = get_variable_cexpression (get_variable_cname (local.name)); } else { var temp_decl = get_temp_variable (expr.type_reference, false, expr); @@ -4206,7 +4214,7 @@ internal class Vala.CCodeBaseModule : CCodeModule { } var local = expr.parent_node as LocalVariable; - if (st != null && (!st.is_simple_type () || st.get_cname () == "va_list") && local != null && !local.variable_type.nullable) { + if (local != null && has_simple_struct_initializer (local)) { // no comma expression necessary expr.ccodenode = creation_expr; } else if (instance != null) { diff --git a/tests/Makefile.am b/tests/Makefile.am index 661de874f..04e3980a8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -46,6 +46,7 @@ TESTS = \ structs/bug595587.vala \ structs/bug606202.vala \ structs/bug613513.vala \ + structs/bug613825.vala \ delegates/delegates.vala \ delegates/bug595610.vala \ delegates/bug595639.vala \ diff --git a/tests/structs/bug613825.vala b/tests/structs/bug613825.vala new file mode 100644 index 000000000..fc6cdd04b --- /dev/null +++ b/tests/structs/bug613825.vala @@ -0,0 +1,8 @@ +struct Foo { + int i; +} + +void main () { + var foo = Foo () { i = 42 }; + assert (foo.i == 42); +}