From: Rico Tzschichholz Date: Wed, 17 Jun 2020 17:26:55 +0000 (+0200) Subject: codegen: Cast initializer-list to struct for non-constant/non-array assignments X-Git-Tag: 0.49.1~89 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=68db26a5a26338ce2ccb586d4a7eb109f4a3bbcf;p=thirdparty%2Fvala.git codegen: Cast initializer-list to struct for non-constant/non-array assignments Avoid invalid c-code and use the correct syntax for compound literals. Fixes https://gitlab.gnome.org/GNOME/vala/issues/1013 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 97c2617be..a159ecfcf 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -2764,7 +2764,12 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { } } - set_cvalue (list, clist); + if (list.parent_node is Constant + || (list.parent_node is Expression && ((Expression) list.parent_node).value_type is ArrayType)) { + set_cvalue (list, clist); + } else { + set_cvalue (list, new CCodeCastExpression (clist, get_ccode_name (list.target_type.type_symbol))); + } } else { // used as expression var instance = create_temp_value (list.value_type, true, list); diff --git a/tests/Makefile.am b/tests/Makefile.am index cb930e132..aebdf63f4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -275,6 +275,7 @@ TESTS = \ structs/struct-boxed-cast.vala \ structs/struct-empty-still.test \ structs/struct-initializer-list-in-array.vala \ + structs/struct-initializer-list-nested.vala \ structs/struct-no-gtype.vala \ structs/struct-no-gtype-inherit.vala \ structs/struct-static-field-initializer.vala \ diff --git a/tests/structs/struct-initializer-list-nested.vala b/tests/structs/struct-initializer-list-nested.vala new file mode 100644 index 000000000..dc5a48f21 --- /dev/null +++ b/tests/structs/struct-initializer-list-nested.vala @@ -0,0 +1,63 @@ +struct Foo { + int i; + int j; +} + +struct Bar { + Foo a; + Foo? b; +} + +struct Manam { + Foo a; + Bar b; +} + +struct Baz { + Foo f; +} + +const Baz BAZ = { { 23, 42 } }; + +const Baz[] BAZ_A = { { { 23, 42 } }, { { 47, 11 } } }; + +void main () { + { + const Baz LOCAL_BAZ = { { 23, 42 } }; + } + { + const Baz[] LOCAL_BAZ_A = { { { 23, 42 } }, { { 47, 11 } } }; + } + { + Bar bar = { { 23 , 47 }, { 42, 11 } }; + assert (bar.a.j == 47); + assert (bar.b.i == 42); + } + { + Bar? bar = { { 23 , 47 }, { 42, 11 } }; + assert (bar.a.i == 23); + assert (bar.b.j == 11); + } + { + Bar bar = {}; + bar = { { 23 , 47 }, { 42, 11 } }; + assert (bar.a.j == 47); + assert (bar.b.i == 42); + } + { + Manam manam = { { 23, 42 }, { { 23 , 47 }, { 42, 11 } } }; + assert (manam.a.i == 23); + assert (manam.b.b.j == 11); + } + { + Manam manam = {}; + manam = { { 23, 42 }, { { 23 , 47 }, { 42, 11 } } }; + assert (manam.a.i == 23); + assert (manam.b.b.j == 11); + } + { + Manam? manam = { { 23, 42 }, { { 23 , 47 }, { 42, 11 } } }; + assert (manam.a.j == 42); + assert (manam.b.a.i == 23); + } +}