[vala/staging] codegen: Cast initializer-list to struct for non-contantst assignments
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/staging] codegen: Cast initializer-list to struct for non-contantst assignments
- Date: Wed, 17 Jun 2020 20:09:14 +0000 (UTC)
commit 6d5532d60567215bad7f452148da549cb4489a7a
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Wed Jun 17 19:26:55 2020 +0200
codegen: Cast initializer-list to struct for non-contantst assignments
Avoid invalid c-code and use the correct syntax for compound literals.
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1013
codegen/valaccodebasemodule.vala | 6 ++-
tests/Makefile.am | 1 +
tests/structs/struct-initializer-list-nested.vala | 58 +++++++++++++++++++++++
3 files changed, 64 insertions(+), 1 deletion(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 97c2617be..aff8047ef 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -2764,7 +2764,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
}
- set_cvalue (list, clist);
+ if (list.parent_node is Constant) {
+ 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..7bbf1510b
--- /dev/null
+++ b/tests/structs/struct-initializer-list-nested.vala
@@ -0,0 +1,58 @@
+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 } };
+
+void main () {
+ {
+ const Baz LOCAL_BAZ = { { 23, 42 } };
+ }
+ {
+ 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);
+ }
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]