aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2015-12-24 15:30:32 -0700
committerAndrew Kelley <superjoe30@gmail.com>2015-12-24 15:30:55 -0700
commit44ca5e19dc174383b1b0490e636398092711306d (patch)
tree5aafee34cee55228bdfd059313389c2a49a63001 /src/codegen.cpp
parent5ceaae288c4f80fe5ce1449cd9d2efe0e541d629 (diff)
downloadzig-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.cpp12
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) {