aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 44095a4a9..1cec41e2c 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -4616,8 +4616,6 @@ irValue *ir_emit_conv(irProcedure *proc, irValue *value, Type *t) {
} else {
GB_PANIC("invalid subtype cast");
}
- } else {
- GB_PANIC("invalid subtype cast");
}
}
@@ -7988,9 +7986,22 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
case_end;
case_ast_node(bs, BlockStmt, node);
- ir_open_scope(proc);
- ir_build_stmt_list(proc, bs->stmts);
- ir_close_scope(proc, irDeferExit_Default, nullptr);
+ if (bs->label != nullptr) {
+ irBlock *done = ir_new_block(proc, node, "block.done");
+ ir_push_target_list(proc, bs->label, done, nullptr, nullptr);
+
+ ir_open_scope(proc);
+ ir_build_stmt_list(proc, bs->stmts);
+ ir_close_scope(proc, irDeferExit_Default, nullptr);
+
+ ir_emit_jump(proc, done);
+ ir_start_block(proc, done);
+
+ } else {
+ ir_open_scope(proc);
+ ir_build_stmt_list(proc, bs->stmts);
+ ir_close_scope(proc, irDeferExit_Default, nullptr);
+ }
case_end;
case_ast_node(ds, DeferStmt, node);
@@ -8089,6 +8100,10 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
ir_build_cond(proc, is->cond, then, else_);
ir_start_block(proc, then);
+ if (is->label != nullptr) {
+ ir_push_target_list(proc, is->label, done, nullptr, nullptr);
+ }
+
ir_open_scope(proc);
ir_build_stmt(proc, is->body);
ir_close_scope(proc, irDeferExit_Default, nullptr);