diff options
author | Florian Brosch <flo.brosch@gmail.com> | 2014-09-18 05:09:03 +0200 |
---|---|---|
committer | Luca Bruno <lucabru@src.gnome.org> | 2014-10-25 13:07:55 +0200 |
commit | 0f0bca7e0519af13d9217fbca2c20ce67cd3baba (patch) | |
tree | 8fc019f87d6dbe8487ead5659517cb05b0d69422 /vala/valalocalvariable.vala | |
parent | f0b5b2d70b654dba1ee06992c25edd2a2fa174e7 (diff) | |
download | vala-0f0bca7e0519af13d9217fbca2c20ce67cd3baba.tar.gz |
Infer array length of inline allocated arrays
Fixes bug 644046.
Diffstat (limited to 'vala/valalocalvariable.vala')
-rw-r--r-- | vala/valalocalvariable.vala | 23 |
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) { |