summaryrefslogtreecommitdiff
path: root/vala/valalocalvariable.vala
diff options
context:
space:
mode:
authorFlorian Brosch <flo.brosch@gmail.com>2014-09-18 05:09:03 +0200
committerLuca Bruno <lucabru@src.gnome.org>2014-10-25 13:07:55 +0200
commit0f0bca7e0519af13d9217fbca2c20ce67cd3baba (patch)
tree8fc019f87d6dbe8487ead5659517cb05b0d69422 /vala/valalocalvariable.vala
parentf0b5b2d70b654dba1ee06992c25edd2a2fa174e7 (diff)
downloadvala-0f0bca7e0519af13d9217fbca2c20ce67cd3baba.tar.gz
Infer array length of inline allocated arrays
Fixes bug 644046.
Diffstat (limited to 'vala/valalocalvariable.vala')
-rw-r--r--vala/valalocalvariable.vala23
1 files changed, 23 insertions, 0 deletions
diff --git a/vala/valalocalvariable.vala b/vala/valalocalvariable.vala
index 17732ade9..7c1222421 100644
--- a/vala/valalocalvariable.vala
+++ b/vala/valalocalvariable.vala
@@ -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) {