From 2c710382a888e8f45b958bdf3e77213cc18c2733 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 16 May 2016 22:51:08 -0700 Subject: [PATCH] fix crash when error evaluating target of for expr closes #153 --- src/analyze.cpp | 2 +- test/run_tests.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index f1834dcdd3..d28b4152b5 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -3953,7 +3953,7 @@ static TypeTableEntry *analyze_for_expr(CodeGen *g, ImportTableEntry *import, Bl } TypeTableEntry *var_type; - if (node->data.for_expr.elem_is_ptr) { + if (child_type->id != TypeTableEntryIdInvalid && node->data.for_expr.elem_is_ptr) { var_type = get_pointer_to_type(g, child_type, false); } else { var_type = child_type; diff --git a/test/run_tests.cpp b/test/run_tests.cpp index 5df005e648..812484b463 100644 --- a/test/run_tests.cpp +++ b/test/run_tests.cpp @@ -1395,6 +1395,17 @@ fn something() -> %void { } pub fn main(args: [][]u8) { } )SOURCE", 1, ".tmp_source.zig:2:27: error: expected return type of main to be '%void', instead is 'void'"); + + add_compile_fail_case("invalid pointer for var type", R"SOURCE( +extern fn ext() -> isize; +var bytes: [ext()]u8 = undefined; +fn f() { + for (bytes) |*b, i| { + *b = u8(i); + } +} + )SOURCE", 1, ".tmp_source.zig:3:13: error: unable to evaluate constant expression"); + } //////////////////////////////////////////////////////////////////////////////