[vala/staging] vala: Properly handle array-initializers inside struct-initializers



commit 8fc78e5a48805e16556f4717a5dcbab78e96e743
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Thu Feb 15 15:22:35 2018 +0100

    vala: Properly handle array-initializers inside struct-initializers
    
    https://bugzilla.gnome.org/show_bug.cgi?id=622178

 tests/Makefile.am                |    1 +
 tests/basic-types/bug622178.vala |   26 ++++++++++++++++++++++++++
 vala/valainitializerlist.vala    |    4 +++-
 3 files changed, 30 insertions(+), 1 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index decdb14..7ccc875 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 0000000..7754312
--- /dev/null
+++ b/tests/basic-types/bug622178.vala
@@ -0,0 +1,26 @@
+struct Foo {
+       int bar;
+       uint8[] data;
+       int baz;
+}
+
+struct Bar {
+       int bar;
+       uint8[,] data;
+       int baz;
+}
+
+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);
+}
diff --git a/vala/valainitializerlist.vala b/vala/valainitializerlist.vala
index c1f97ca..a30952d 100644
--- a/vala/valainitializerlist.vala
+++ b/vala/valainitializerlist.vala
@@ -131,7 +131,9 @@ public class Vala.InitializerList : Expression {
 
                        if (!(parent_node is ArrayCreationExpression)
                              && !(parent_node is Constant)
-                             && !(parent_node is InitializerList)) {
+                             && (!(parent_node is InitializerList)
+                                 || (((InitializerList) parent_node).target_type.data_type is Struct
+                                     && (array_type.value_owned || array_type.element_type.value_owned)))) {
                                // transform shorthand form
                                //     int[] array = { 42 };
                                // into


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]