aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-02-02 14:55:01 -0500
committerAndrew Kelley <superjoe30@gmail.com>2017-02-02 14:55:01 -0500
commit2b88441295d39d3e988c0771b6ad64531948ff0a (patch)
tree2b812b9985642b79eeb56e1018a4266cfa916f7a /src/analyze.cpp
parentb78c91951a1db34c615a011e0444608285f1a74c (diff)
downloadzig-2b88441295d39d3e988c0771b6ad64531948ff0a.tar.gz
zig-2b88441295d39d3e988c0771b6ad64531948ff0a.zip
fix behavior when initializing struct with undefined
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 25065e9f88..9278ddd555 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -275,6 +275,8 @@ TypeTableEntry *get_pointer_to_type(CodeGen *g, TypeTableEntry *child_type, bool
if (*parent_pointer) {
return *parent_pointer;
} else {
+ type_ensure_zero_bits_known(g, child_type);
+
TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdPointer);
const char *const_str = is_const ? "const " : "";
@@ -3190,7 +3192,7 @@ ConstExprValue *create_const_arg_tuple(CodeGen *g, size_t arg_index_start, size_
}
-void init_const_undefined(ConstExprValue *const_val) {
+void init_const_undefined(CodeGen *g, ConstExprValue *const_val) {
TypeTableEntry *canon_wanted_type = get_underlying_type(const_val->type);
if (canon_wanted_type->id == TypeTableEntryIdArray) {
const_val->special = ConstValSpecialStatic;
@@ -3200,12 +3202,24 @@ void init_const_undefined(ConstExprValue *const_val) {
for (size_t i = 0; i < elem_count; i += 1) {
ConstExprValue *element_val = &const_val->data.x_array.elements[i];
element_val->type = canon_wanted_type->data.array.child_type;
- init_const_undefined(element_val);
+ init_const_undefined(g, element_val);
if (get_underlying_type(element_val->type)->id == TypeTableEntryIdArray) {
element_val->data.x_array.parent_array = const_val;
element_val->data.x_array.parent_array_index = i;
}
}
+ } else if (canon_wanted_type->id == TypeTableEntryIdStruct) {
+ ensure_complete_type(g, canon_wanted_type);
+
+ const_val->special = ConstValSpecialStatic;
+ size_t field_count = canon_wanted_type->data.structure.src_field_count;
+ const_val->data.x_struct.fields = allocate<ConstExprValue>(field_count);
+ for (size_t i = 0; i < field_count; i += 1) {
+ ConstExprValue *field_val = &const_val->data.x_struct.fields[i];
+ field_val->type = canon_wanted_type->data.structure.fields[i].type_entry;
+ assert(field_val->type);
+ init_const_undefined(g, field_val);
+ }
} else {
const_val->special = ConstValSpecialUndef;
}