]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Infer array length of inline allocated arrays 0f0bca7e0519af13d9217fbca2c20ce67cd3baba
authorFlorian Brosch <flo.brosch@gmail.com>
Thu, 18 Sep 2014 03:09:03 +0000 (05:09 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Sat, 25 Oct 2014 11:07:55 +0000 (13:07 +0200)
Fixes bug 644046.

vala/valalocalvariable.vala

index 17732ade9ef155600bf85bc04b16c209a2d81b93..7c1222421dbc77a48deb5aaae69be7fbd1f3dd99 100644 (file)
@@ -89,9 +89,18 @@ public class Vala.LocalVariable : Variable {
                        variable_type.check (context);
                }
 
+               // Catch initializer list transformation:
+               bool is_initializer_list = false;
+               int initializer_size = -1;
+
                if (initializer != null) {
                        initializer.target_type = variable_type;
 
+                       if (initializer is InitializerList) {
+                               initializer_size = ((InitializerList) initializer).size;
+                               is_initializer_list = true;
+                       }
+
                        initializer.check (context);
                }
 
@@ -156,6 +165,20 @@ 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;
+                               variable_array_type.nullable = false;
+                       }
+
+                       if (variable_array_type != null && variable_array_type.inline_allocated && initializer.value_type is ArrayType == false) {
+                               error = true;
+                               Report.error (source_reference, "only arrays are allowed as initializer for arrays with fixed length");
+                               return false;
+                       }
+
                        if (initializer.value_type.is_disposable ()) {
                                /* rhs transfers ownership of the expression */
                                if (!(variable_type is PointerType) && !variable_type.value_owned) {