From 0f0bca7e0519af13d9217fbca2c20ce67cd3baba Mon Sep 17 00:00:00 2001 From: Florian Brosch Date: Thu, 18 Sep 2014 05:09:03 +0200 Subject: [PATCH] Infer array length of inline allocated arrays Fixes bug 644046. --- vala/valalocalvariable.vala | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) 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) { -- 2.47.2