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) {...@@ -3008,6 +3008,8 @@ static void do_code_gen(CodeGen *g) {
3008 }3008 }
3009 if (ir_get_var_is_comptime(var))3009 if (ir_get_var_is_comptime(var))
3010 continue;3010 continue;
3011 if (type_requires_comptime(var->value.type))
3012 continue;
30113013
3012 if (var->src_arg_index == SIZE_MAX) {3014 if (var->src_arg_index == SIZE_MAX) {
3013 var->value_ref = LLVMBuildAlloca(g->builder, var->value.type->type_ref, buf_ptr(&var->name));3015 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...@@ -2738,12 +2738,14 @@ static void ir_count_defers(IrBuilder *irb, Scope *inner_scope, Scope *outer_sco
2738 }2738 }
2739}2739}
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,
2742 bool gen_error_defers, bool gen_maybe_defers)2742 bool gen_error_defers, bool gen_maybe_defers)
2743{2743{
2744 Scope *scope = inner_scope;2744 Scope *scope = inner_scope;
2745 while (scope != outer_scope) {2745 while (scope != outer_scope) {
2746 assert(scope);2746 if (!scope)
2747 return false;
2748
2747 if (scope->id == ScopeIdDefer) {2749 if (scope->id == ScopeIdDefer) {
2748 AstNode *defer_node = scope->source_node;2750 AstNode *defer_node = scope->source_node;
2749 assert(defer_node->type == NodeTypeDefer);2751 assert(defer_node->type == NodeTypeDefer);
...@@ -2759,6 +2761,7 @@ static void ir_gen_defers_for_block(IrBuilder *irb, Scope *inner_scope, Scope *o...@@ -2759,6 +2761,7 @@ static void ir_gen_defers_for_block(IrBuilder *irb, Scope *inner_scope, Scope *o
2759 }2761 }
2760 scope = scope->parent;2762 scope = scope->parent;
2761 }2763 }
2764 return true;
2762}2765}
27632766
2764static void ir_set_cursor_at_end(IrBuilder *irb, IrBasicBlock *basic_block) {2767static void ir_set_cursor_at_end(IrBuilder *irb, IrBasicBlock *basic_block) {
...@@ -5105,7 +5108,11 @@ static bool ir_goto_pass2(IrBuilder *irb) {...@@ -5105,7 +5108,11 @@ static bool ir_goto_pass2(IrBuilder *irb) {
51055108
5106 IrInstruction *is_comptime = ir_build_const_bool(irb, goto_item->scope, source_node,5109 IrInstruction *is_comptime = ir_build_const_bool(irb, goto_item->scope, source_node,
5107 ir_should_inline(irb) || source_node->data.goto_expr.is_inline);5110 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 }
5109 ir_build_br(irb, goto_item->scope, source_node, label->bb, is_comptime);5116 ir_build_br(irb, goto_item->scope, source_node, label->bb, is_comptime);
5110 }5117 }
51115118