]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Properly handle array-initializers inside struct-initializers
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 15 Feb 2018 14:22:35 +0000 (15:22 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 15 Feb 2018 19:54:49 +0000 (20:54 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=622178

tests/Makefile.am
tests/basic-types/bug622178.vala [new file with mode: 0644]
vala/valainitializerlist.vala

index decdb14e24132d37bdccde5f404d8c425a1e053f..7ccc8756e113f07f7edc714014852eab14c0fed4 100644 (file)
@@ -28,6 +28,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 (file)
index 0000000..c671d60
--- /dev/null
@@ -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);
+}
index c1f97ca3eb54456dee5707e3bca02c81ddac044f..9a18b71e17335f66bb1a7569c1c437d204eba14e 100644 (file)
@@ -129,9 +129,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