]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Array with fixed length don't require explicit instantiation 0554ed7ad9cefe0f56e53dc00be88488dfa788bf
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 16 Dec 2018 19:01:19 +0000 (20:01 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sun, 16 Dec 2018 19:23:32 +0000 (20:23 +0100)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/720

tests/Makefile.am
tests/basic-types/arrays-fixed-assignment.vala [new file with mode: 0644]
vala/valaassignment.vala
vala/valafield.vala
vala/valalocalvariable.vala

index 380703da2da6498aecb34e1e516e59ff78951427..1a18f2c13a2809aad4dc5981290d3ac73af9950b 100644 (file)
@@ -25,6 +25,7 @@ TESTS = \
        basic-types/floats.vala \
        basic-types/strings.vala \
        basic-types/arrays.vala \
+       basic-types/arrays-fixed-assignment.vala \
        basic-types/array-uint8-uchar-compat.vala \
        basic-types/pointers.vala \
        basic-types/sizeof.vala \
diff --git a/tests/basic-types/arrays-fixed-assignment.vala b/tests/basic-types/arrays-fixed-assignment.vala
new file mode 100644 (file)
index 0000000..0ec0df4
--- /dev/null
@@ -0,0 +1,27 @@
+string foo[3];
+
+void main () {
+       {
+               foo = new string[3];
+       }
+       {
+               foo = new string[3] { "foo", "bar", "baz" };
+               assert (foo[1] == "bar");
+       }
+       {
+               foo = { "foo", "bar", "baz" };
+               assert (foo[1] == "bar");
+       }
+
+       {
+               string bar[3] = new string[3];
+       }
+       {
+               string bar[3] = new string[3] { "foo", "bar", "baz" };
+               assert (bar[1] == "bar");
+       }
+       {
+               string bar[3] = { "foo", "bar", "baz" };
+               assert (bar[1] == "bar");
+       }
+}
index f672b817775ceab1b0b1ea62d416df2614f513ff..ce3549aafcaaf314b87bb9bfea21cef9bbcf7a35 100644 (file)
@@ -305,6 +305,15 @@ public class Vala.Assignment : Expression {
                                        Report.error (source_reference, "Assignment: Invalid assignment attempt");
                                        return false;
                                }
+                       } else if (ma.symbol_reference is Variable) {
+                               unowned Variable variable = (Variable) ma.symbol_reference;
+                               unowned ArrayType? variable_array_type = variable.variable_type as ArrayType;
+                               if (variable_array_type != null && variable_array_type.fixed_length
+                                   && right is ArrayCreationExpression && ((ArrayCreationExpression) right).initializer_list == null) {
+                                       Report.warning (source_reference, "Arrays with fixed length don't require an explicit instantiation");
+                                       ((Block) parent_node.parent_node).replace_statement ((Statement) parent_node, new EmptyStatement (source_reference));
+                                       return true;
+                               }
                        }
 
                        if (left.value_type != null && right.value_type != null) {
index f02b09092a7cdb9628e4afb3b7f4b0eb6ec35ba3..6bd54ff95b376cae725b98a02658c029389d9a08 100644 (file)
@@ -107,6 +107,13 @@ public class Vala.Field : Variable, Lockable {
                        return false;
                }
 
+               unowned ArrayType? variable_array_type = variable_type as ArrayType;
+               if (variable_array_type != null && variable_array_type.fixed_length
+                   && initializer is ArrayCreationExpression && ((ArrayCreationExpression) initializer).initializer_list == null) {
+                       Report.warning (source_reference, "Arrays with fixed length don't require an explicit instantiation");
+                       initializer = null;
+               }
+
                if (initializer != null) {
                        initializer.target_type = variable_type;
 
index 591edb8fb78164f9429258962c02122b9c04cdb8..331cfcc1fcd84be6c181ab5b4a705da2f09c0c2e 100644 (file)
@@ -145,6 +145,13 @@ public class Vala.LocalVariable : Variable {
                        initializer.target_type = variable_type;
                }
 
+               unowned ArrayType? variable_array_type = variable_type as ArrayType;
+               if (variable_array_type != null && variable_array_type.fixed_length
+                   && initializer is ArrayCreationExpression && ((ArrayCreationExpression) initializer).initializer_list == null) {
+                       Report.warning (source_reference, "Arrays with fixed length don't require an explicit instantiation");
+                       initializer = null;
+               }
+
                if (initializer != null && !initializer.error) {
                        if (initializer.value_type == null) {
                                if (!(initializer is MemberAccess) && !(initializer is LambdaExpression)) {
@@ -180,8 +187,6 @@ public class Vala.LocalVariable : Variable {
                                return false;
                        }
 
-
-                       ArrayType variable_array_type = variable_type as ArrayType;
                        if (variable_array_type != null && variable_array_type.inline_allocated && !variable_array_type.fixed_length && is_initializer_list) {
                                variable_array_type.length = new IntegerLiteral (initializer_size.to_string ());
                                variable_array_type.fixed_length = true;