authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-09-22 10:40:05-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-09-22 10:40:05-04:00
logc64f6f950343aef3c6d8fbffcff3ff4fc76960f4
tree0f78240a470d92662218dd932eabf41a7c3b98f2
parent7aeca9bfed654f7f5d0e4b9775459b878f4726ed

fix compile crash when leaving out for loop parameter


2 files changed, 13 insertions(+), 2 deletions(-)

src/analyze.cpp+7-2
...@@ -4164,6 +4164,12 @@ static TypeTableEntry *analyze_for_expr(CodeGen *g, ImportTableEntry *import, Bl...@@ -4164,6 +4164,12 @@ static TypeTableEntry *analyze_for_expr(CodeGen *g, ImportTableEntry *import, Bl
4164 child_context->parent_loop_node = node;4164 child_context->parent_loop_node = node;
41654165
4166 AstNode *elem_var_node = node->data.for_expr.elem_node;4166 AstNode *elem_var_node = node->data.for_expr.elem_node;
4167 if (!elem_var_node) {
4168 add_node_error(g, node->data.for_expr.body,
4169 buf_sprintf("for loop expression missing element parameter"));
4170 return g->builtin_types.entry_invalid;
4171 }
4172
4167 elem_var_node->block_context = child_context;4173 elem_var_node->block_context = child_context;
4168 Buf *elem_var_name = elem_var_node->data.symbol_expr.symbol;4174 Buf *elem_var_name = elem_var_node->data.symbol_expr.symbol;
4169 node->data.for_expr.elem_var = add_local_var(g, elem_var_node, import, child_context, elem_var_name,4175 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...@@ -4180,8 +4186,7 @@ static TypeTableEntry *analyze_for_expr(CodeGen *g, ImportTableEntry *import, Bl
4180 g->builtin_types.entry_usize, true, nullptr);4186 g->builtin_types.entry_usize, true, nullptr);
4181 }4187 }
41824188
4183 AstNode *for_body_node = node->data.for_expr.body;4189 analyze_expression(g, import, child_context, g->builtin_types.entry_void, node->data.for_expr.body);
4184 analyze_expression(g, import, child_context, g->builtin_types.entry_void, for_body_node);
41854190
41864191
4187 return g->builtin_types.entry_void;4192 return g->builtin_types.entry_void;
test/run_tests.cpp+6
...@@ -1495,6 +1495,12 @@ pub fn f() {...@@ -1495,6 +1495,12 @@ pub fn f() {
1495 add_compile_fail_case("main function with bogus args type", R"SOURCE(1495 add_compile_fail_case("main function with bogus args type", R"SOURCE(
1496pub fn main(args: [][]bogus) -> %void {}1496pub fn main(args: [][]bogus) -> %void {}
1497 )SOURCE", 1, ".tmp_source.zig:2:23: error: use of undeclared identifier 'bogus'");1497 )SOURCE", 1, ".tmp_source.zig:2:23: error: use of undeclared identifier 'bogus'");
1498
1499 add_compile_fail_case("main function with bogus args type", R"SOURCE(
1500fn foo(blah: []u8) {
1501 for (blah) { }
1502}
1503 )SOURCE", 1, ".tmp_source.zig:3:16: error: for loop expression missing element parameter");
1498}1504}
14991505
1500//////////////////////////////////////////////////////////////////////////////1506//////////////////////////////////////////////////////////////////////////////