aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-04-18 18:18:41 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-04-18 18:18:41 -0700
commitff1ab3fe9ce82a79f1e08236b8a7be42de1ff792 (patch)
tree8715cf4371f04f52030c85c6e2ae4e4ae3b1e3b8 /src/analyze.cpp
parentf4c7e1bf4971503e2d33af80537aef27ed2e4fe1 (diff)
downloadzig-ff1ab3fe9ce82a79f1e08236b8a7be42de1ff792.tar.gz
zig-ff1ab3fe9ce82a79f1e08236b8a7be42de1ff792.zip
fix crash in non-const expression in struct literal outside fn
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 38835a0d86..fa7f4f3b3c 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -2195,6 +2195,8 @@ static TypeTableEntry *analyze_container_init_expr(CodeGen *g, ImportTableEntry
int expr_field_count = container_init_expr->entries.length;
int actual_field_count = container_type->data.structure.src_field_count;
+ AstNode *non_const_expr_culprit = nullptr;
+
int *field_use_counts = allocate<int>(actual_field_count);
ConstExprValue *const_val = &get_resolved_expr(node)->const_val;
const_val->ok = true;
@@ -2239,11 +2241,17 @@ static TypeTableEntry *analyze_container_init_expr(CodeGen *g, ImportTableEntry
const_val->depends_on_compile_var = const_val->depends_on_compile_var || field_val->depends_on_compile_var;
} else {
const_val->ok = false;
+ non_const_expr_culprit = val_field_node->data.struct_val_field.expr;
}
}
}
if (!const_val->ok) {
- context->fn_entry->struct_val_expr_alloca_list.append(codegen);
+ assert(non_const_expr_culprit);
+ if (context->fn_entry) {
+ context->fn_entry->struct_val_expr_alloca_list.append(codegen);
+ } else {
+ add_node_error(g, non_const_expr_culprit, buf_sprintf("unable to evaluate constant expression"));
+ }
}
for (int i = 0; i < actual_field_count; i += 1) {