// try to initialize uninitialized variables
// initialization not necessary for variables stored in closure
- cvar.initializer = default_value_for_type (local.variable_type, true);
- cvar.init0 = true;
+ if (is_init_allowed (local.variable_type)) {
+ cvar.initializer = default_value_for_type (local.variable_type, true);
+ cvar.init0 = true;
+ }
ccode.add_declaration (get_ccode_name (local.variable_type), cvar);
}
}
} else {
var cvar = new CCodeVariableDeclarator (local.name, null, get_ccode_declarator_suffix (local.variable_type));
- if (init) {
+ if (init && is_init_allowed (local.variable_type)) {
cvar.initializer = default_value_for_type (local.variable_type, true, on_error);
cvar.init0 = true;
}
return true;
}
+ public bool is_init_allowed (DataType type) {
+ unowned ArrayType? array_type = type as ArrayType;
+ if (array_type != null && array_type.inline_allocated
+ && array_type.fixed_length) {
+ unowned Constant? c = array_type.length.symbol_reference as Constant;
+ // our local constants are not actual constants in C
+ return (c == null || !(c.parent_symbol is Block));
+ }
+ return true;
+ }
+
public CCodeDeclaratorSuffix? get_ccode_declarator_suffix (DataType type) {
var array_type = type as ArrayType;
if (array_type != null) {
arrays/cast-silent-invalid.test \
arrays/class-field-length-cname.vala \
arrays/expression-bracket.test \
+ arrays/fixed-length-init0-not-allowed.vala \
arrays/field-global-length-cname.vala \
arrays/fixed-length-concat-invalid.test \
arrays/fixed-length-non-const.test \
--- /dev/null
+void main () {
+ const int FOO = 4;
+
+ char bar[FOO] = { 'f', 'o', 'o', '\0' };
+ assert ((string) bar == "foo");
+
+ char baz[FOO];
+ baz[0] = 'f';
+ baz[1] = 'o';
+ baz[2] = 'o';
+ baz[3] = '\0';
+ assert ((string) baz == "foo");
+}