diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2015-12-24 15:30:32 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2015-12-24 15:30:55 -0700 |
| commit | 44ca5e19dc174383b1b0490e636398092711306d (patch) | |
| tree | 5aafee34cee55228bdfd059313389c2a49a63001 /src/codegen.cpp | |
| parent | 5ceaae288c4f80fe5ce1449cd9d2efe0e541d629 (diff) | |
| download | zig-44ca5e19dc174383b1b0490e636398092711306d.tar.gz zig-44ca5e19dc174383b1b0490e636398092711306d.zip | |
add error for break outside loop
also fix break in nested loops
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index d4870e002b..b20eb8801c 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -1024,10 +1024,12 @@ static LLVMValueRef gen_while_expr(CodeGen *g, AstNode *node) { LLVMBuildCondBr(g->builder, cond_val, body_block, end_block); LLVMPositionBuilderAtEnd(g->builder, body_block); - g->cur_break_block = end_block; + g->break_block_stack.append(end_block); gen_expr(g, node->data.while_expr.body); - g->cur_break_block = nullptr; - LLVMBuildBr(g->builder, cond_block); + g->break_block_stack.pop(); + if (get_expr_type(node->data.while_expr.body)->id != TypeTableEntryIdUnreachable) { + LLVMBuildBr(g->builder, cond_block); + } LLVMPositionBuilderAtEnd(g->builder, end_block); return nullptr; @@ -1035,10 +1037,10 @@ static LLVMValueRef gen_while_expr(CodeGen *g, AstNode *node) { static LLVMValueRef gen_break(CodeGen *g, AstNode *node) { assert(node->type == NodeTypeBreak); - assert(g->cur_break_block); + LLVMBasicBlockRef dest_block = g->break_block_stack.last(); add_debug_source_node(g, node); - return LLVMBuildBr(g->builder, g->cur_break_block); + return LLVMBuildBr(g->builder, dest_block); } static LLVMValueRef gen_expr_no_cast(CodeGen *g, AstNode *node) { |
