summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2018-02-15 15:22:35 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2018-04-16 21:02:19 +0200
commitc689aad2b69e79b524f764d9733fc80e524e7c75 (patch)
tree084a00d07e384e7baea59e8c41cb0f48449acce8
parent26219fe5216873f65b3395f25fb2d4e72783a373 (diff)
downloadvala-c689aad2b69e79b524f764d9733fc80e524e7c75.tar.gz
vala: Properly handle array-initializers inside struct-initializers
https://bugzilla.gnome.org/show_bug.cgi?id=622178
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/basic-types/bug622178.vala50
-rw-r--r--vala/valainitializerlist.vala15
3 files changed, 63 insertions, 3 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 3bf37dad2..14774b503 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -27,6 +27,7 @@ TESTS = \
basic-types/bug595751.vala \
basic-types/bug596637.vala \
basic-types/bug596785.vala \
+ basic-types/bug622178.vala \
basic-types/bug632322.vala \
basic-types/bug643612.vala \
basic-types/bug644046.vala \
diff --git a/tests/basic-types/bug622178.vala b/tests/basic-types/bug622178.vala
new file mode 100644
index 000000000..c671d60b6
--- /dev/null
+++ b/tests/basic-types/bug622178.vala
@@ -0,0 +1,50 @@
+struct Foo {
+ int bar;
+ uint8[] data;
+ int baz;
+}
+
+struct Bar {
+ int bar;
+ uint8[,] data;
+ int baz;
+}
+
+struct Manam {
+ unowned string data[2];
+ int idata[2];
+ int bar;
+}
+
+const Manam[] MANAM = {
+ { { "foo", "bar" }, { 4711, 23 }, 42 },
+};
+
+void main () {
+ Foo foo = { 23, { 0, 1, 2, 3 }, 42 };
+ assert (foo.bar == 23);
+ assert (foo.baz == 42);
+ assert (foo.data.length == 4);
+ assert (foo.data[3] == 3);
+
+ Bar bar = { 23, { { 1, 2 }, { 3, 4 }, { 5, 6 } }, 42 };
+ assert (bar.bar == 23);
+ assert (bar.baz == 42);
+ assert (bar.data.length[0] == 3);
+ assert (bar.data.length[1] == 2);
+ assert (bar.data[2,0] == 5);
+
+ (unowned string)[] sa = { "foo", "bar" };
+ Manam manam = { sa, { 4711, 23 }, 42 };
+ assert (manam.data.length == 2);
+ assert (manam.data[1] == "bar");
+ assert (manam.idata.length == 2);
+ assert (manam.idata[1] == 23);
+ assert (manam.bar == 42);
+
+ assert (MANAM[0].data.length == 2);
+ assert (MANAM[0].data[1] == "bar");
+ assert (MANAM[0].idata.length == 2);
+ assert (MANAM[0].idata[1] == 23);
+ assert (MANAM[0].bar == 42);
+}
diff --git a/vala/valainitializerlist.vala b/vala/valainitializerlist.vala
index 6955aad1e..c9024b7b0 100644
--- a/vala/valainitializerlist.vala
+++ b/vala/valainitializerlist.vala
@@ -119,9 +119,18 @@ public class Vala.InitializerList : Expression {
/* initializer is used as array initializer */
var array_type = (ArrayType) target_type;
- if (!(parent_node is ArrayCreationExpression)
- && !(parent_node is Constant)
- && !(parent_node is InitializerList)) {
+ bool requires_constants_only = false;
+ unowned CodeNode? node = parent_node;
+ while (node != null) {
+ if (node is Constant) {
+ requires_constants_only = true;
+ break;
+ }
+ node = node.parent_node;
+ }
+
+ if (!(parent_node is ArrayCreationExpression) && !requires_constants_only
+ && (!(parent_node is InitializerList) || ((InitializerList) parent_node).target_type.data_type is Struct)) {
// transform shorthand form
// int[] array = { 42 };
// into