authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-12-31 01:58:37-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-12-31 01:58:37-05:00
log2ccdaee101e6e0d8cb4a4560b032ff9bab4b5f58
treeab02ac3abab1d851d6c8b9f0b0d8229f114a6004
parent76fa6cdce36671bd9ad54248d77a3941f2eb3e34

IR: add error for goto jumping over variable declaration


2 files changed, 12 insertions(+), 3 deletions(-)

src/codegen.cpp+2
......@@ -3008,6 +3008,8 @@ static void do_code_gen(CodeGen *g) {
30083008 }
30093009 if (ir_get_var_is_comptime(var))
30103010 continue;
3011 if (type_requires_comptime(var->value.type))
3012 continue;
30113013
30123014 if (var->src_arg_index == SIZE_MAX) {
30133015 var->value_ref = LLVMBuildAlloca(g->builder, var->value.type->type_ref, buf_ptr(&var->name));
src/ir.cpp+10-3
......@@ -2738,12 +2738,14 @@ static void ir_count_defers(IrBuilder *irb, Scope *inner_scope, Scope *outer_sco
27382738 }
27392739}
27402740
2741static void ir_gen_defers_for_block(IrBuilder *irb, Scope *inner_scope, Scope *outer_scope,
2741static bool ir_gen_defers_for_block(IrBuilder *irb, Scope *inner_scope, Scope *outer_scope,
27422742 bool gen_error_defers, bool gen_maybe_defers)
27432743{
27442744 Scope *scope = inner_scope;
27452745 while (scope != outer_scope) {
2746 assert(scope);
2746 if (!scope)
2747 return false;
2748
27472749 if (scope->id == ScopeIdDefer) {
27482750 AstNode *defer_node = scope->source_node;
27492751 assert(defer_node->type == NodeTypeDefer);
......@@ -2759,6 +2761,7 @@ static void ir_gen_defers_for_block(IrBuilder *irb, Scope *inner_scope, Scope *o
27592761 }
27602762 scope = scope->parent;
27612763 }
2764 return true;
27622765}
27632766
27642767static void ir_set_cursor_at_end(IrBuilder *irb, IrBasicBlock *basic_block) {
......@@ -5105,7 +5108,11 @@ static bool ir_goto_pass2(IrBuilder *irb) {
51055108
51065109 IrInstruction *is_comptime = ir_build_const_bool(irb, goto_item->scope, source_node,
51075110 ir_should_inline(irb) || source_node->data.goto_expr.is_inline);
5108 ir_gen_defers_for_block(irb, goto_item->scope, label->bb->scope, false, false);
5111 if (!ir_gen_defers_for_block(irb, goto_item->scope, label->bb->scope, false, false)) {
5112 add_node_error(irb->codegen, source_node,
5113 buf_sprintf("no label in scope named '%s'", buf_ptr(label_name)));
5114 return false;
5115 }
51095116 ir_build_br(irb, goto_item->scope, source_node, label->bb, is_comptime);
51105117 }
51115118