diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-04-18 18:18:41 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-04-18 18:18:41 -0700 |
| commit | ff1ab3fe9ce82a79f1e08236b8a7be42de1ff792 (patch) | |
| tree | 8715cf4371f04f52030c85c6e2ae4e4ae3b1e3b8 | |
| parent | f4c7e1bf4971503e2d33af80537aef27ed2e4fe1 (diff) | |
| download | zig-ff1ab3fe9ce82a79f1e08236b8a7be42de1ff792.tar.gz zig-ff1ab3fe9ce82a79f1e08236b8a7be42de1ff792.zip | |
fix crash in non-const expression in struct literal outside fn
| -rw-r--r-- | src/analyze.cpp | 10 | ||||
| -rw-r--r-- | test/run_tests.cpp | 9 |
2 files changed, 18 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) { diff --git a/test/run_tests.cpp b/test/run_tests.cpp index fdc03b0ae0..3d3d029387 100644 --- a/test/run_tests.cpp +++ b/test/run_tests.cpp @@ -1191,6 +1191,15 @@ fn fibbonaci(x: i32) -> i32 { add_compile_fail_case("@embed_file with bogus file", R"SOURCE( const resource = @embed_file("bogus.txt"); )SOURCE", 1, ".tmp_source.zig:2:18: error: unable to find './bogus.txt'"); + + + add_compile_fail_case("non-const expression in struct literal outside function", R"SOURCE( +struct Foo { + x: i32, +} +const a = Foo {.x = get_it()}; +extern fn get_it() -> i32; + )SOURCE", 1, ".tmp_source.zig:5:27: error: unable to evaluate constant expression"); } ////////////////////////////////////////////////////////////////////////////// |
