authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-01-29 21:57:49-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-01-29 21:57:49-05:00
log3caf6bacdcc797167e5db1b5545aad8e464cf311
tree3b3d61eca71716e9d9a7dec2eaef25e2fd4153f3
parentc75e58ffe6905c6a7d4e9f082726ea2cdcec514e

fix sometimes using wrong outer scope for generating defers


2 files changed, 37 insertions(+), 4 deletions(-)

src/ir.cpp+1-1
......@@ -2945,7 +2945,7 @@ static IrInstruction *ir_gen_return(IrBuilder *irb, Scope *scope, AstNode *node,
29452945 return irb->codegen->invalid_instruction;
29462946 }
29472947
2948 Scope *outer_scope = fn_entry->child_scope;
2948 Scope *outer_scope = irb->exec->begin_scope;
29492949
29502950 AstNode *expr_node = node->data.return_expr.expr;
29512951 switch (node->data.return_expr.kind) {
test/cases/eval.zig+36-3
......@@ -6,10 +6,10 @@ fn compileTimeRecursion() {
66
77 assert(some_data.len == 21);
88}
9var some_data: [usize(fibbonaci(7))]u8 = undefined;
10fn fibbonaci(x: i32) -> i32 {
9var some_data: [usize(fibonacci(7))]u8 = undefined;
10fn fibonacci(x: i32) -> i32 {
1111 if (x <= 1) return 1;
12 return fibbonaci(x - 1) + fibbonaci(x - 2);
12 return fibonacci(x - 1) + fibonacci(x - 2);
1313}
1414
1515
......@@ -219,3 +219,36 @@ fn inlinedBlockAndRuntimeBlockPhi() {
219219 assert(!letsTryToCompareBools(false, false));
220220 }
221221}
222
223const CmdFn = struct {
224 name: []const u8,
225 func: fn(i32) -> i32,
226};
227
228const cmd_fns = []CmdFn{
229 CmdFn {.name = "one", .func = one},
230 CmdFn {.name = "two", .func = two},
231 CmdFn {.name = "three", .func = three},
232};
233fn one(value: i32) -> i32 { value + 1 }
234fn two(value: i32) -> i32 { value + 2 }
235fn three(value: i32) -> i32 { value + 3 }
236
237fn performFn(comptime prefix_char: u8, start_value: i32) -> i32 {
238 var result: i32 = start_value;
239 comptime var i = 0;
240 inline while (i < cmd_fns.len; i += 1) {
241 if (cmd_fns[i].name[0] == prefix_char) {
242 result = cmd_fns[i].func(result);
243 }
244 }
245 return result;
246}
247
248fn comptimeIterateOverFnPtrList() {
249 @setFnTest(this);
250
251 assert(performFn('t', 1) == 6);
252 assert(performFn('o', 0) == 1);
253 assert(performFn('w', 99) == 99);
254}