From c64f6f950343aef3c6d8fbffcff3ff4fc76960f4 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 22 Sep 2016 10:40:05 -0400 Subject: [PATCH] fix compile crash when leaving out for loop parameter --- src/analyze.cpp | 9 +++++++-- test/run_tests.cpp | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index f38459528b..bae41742b4 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -4164,6 +4164,12 @@ static TypeTableEntry *analyze_for_expr(CodeGen *g, ImportTableEntry *import, Bl child_context->parent_loop_node = node; AstNode *elem_var_node = node->data.for_expr.elem_node; + if (!elem_var_node) { + add_node_error(g, node->data.for_expr.body, + buf_sprintf("for loop expression missing element parameter")); + return g->builtin_types.entry_invalid; + } + elem_var_node->block_context = child_context; Buf *elem_var_name = elem_var_node->data.symbol_expr.symbol; node->data.for_expr.elem_var = add_local_var(g, elem_var_node, import, child_context, elem_var_name, @@ -4180,8 +4186,7 @@ static TypeTableEntry *analyze_for_expr(CodeGen *g, ImportTableEntry *import, Bl g->builtin_types.entry_usize, true, nullptr); } - AstNode *for_body_node = node->data.for_expr.body; - analyze_expression(g, import, child_context, g->builtin_types.entry_void, for_body_node); + analyze_expression(g, import, child_context, g->builtin_types.entry_void, node->data.for_expr.body); return g->builtin_types.entry_void; diff --git a/test/run_tests.cpp b/test/run_tests.cpp index a7085a48af..bbf1fd2168 100644 --- a/test/run_tests.cpp +++ b/test/run_tests.cpp @@ -1495,6 +1495,12 @@ pub fn f() { add_compile_fail_case("main function with bogus args type", R"SOURCE( pub fn main(args: [][]bogus) -> %void {} )SOURCE", 1, ".tmp_source.zig:2:23: error: use of undeclared identifier 'bogus'"); + + add_compile_fail_case("main function with bogus args type", R"SOURCE( +fn foo(blah: []u8) { + for (blah) { } +} + )SOURCE", 1, ".tmp_source.zig:3:16: error: for loop expression missing element parameter"); } //////////////////////////////////////////////////////////////////////////////