diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2018-02-15 15:22:35 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2018-04-16 21:02:19 +0200 |
commit | c689aad2b69e79b524f764d9733fc80e524e7c75 (patch) | |
tree | 084a00d07e384e7baea59e8c41cb0f48449acce8 | |
parent | 26219fe5216873f65b3395f25fb2d4e72783a373 (diff) | |
download | vala-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.am | 1 | ||||
-rw-r--r-- | tests/basic-types/bug622178.vala | 50 | ||||
-rw-r--r-- | vala/valainitializerlist.vala | 15 |
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 |