fix sometimes using wrong outer scope for generating defers
parent
c75e58ffe6
commit
3caf6bacdc
|
@ -2945,7 +2945,7 @@ static IrInstruction *ir_gen_return(IrBuilder *irb, Scope *scope, AstNode *node,
|
||||||
return irb->codegen->invalid_instruction;
|
return irb->codegen->invalid_instruction;
|
||||||
}
|
}
|
||||||
|
|
||||||
Scope *outer_scope = fn_entry->child_scope;
|
Scope *outer_scope = irb->exec->begin_scope;
|
||||||
|
|
||||||
AstNode *expr_node = node->data.return_expr.expr;
|
AstNode *expr_node = node->data.return_expr.expr;
|
||||||
switch (node->data.return_expr.kind) {
|
switch (node->data.return_expr.kind) {
|
||||||
|
|
|
@ -6,10 +6,10 @@ fn compileTimeRecursion() {
|
||||||
|
|
||||||
assert(some_data.len == 21);
|
assert(some_data.len == 21);
|
||||||
}
|
}
|
||||||
var some_data: [usize(fibbonaci(7))]u8 = undefined;
|
var some_data: [usize(fibonacci(7))]u8 = undefined;
|
||||||
fn fibbonaci(x: i32) -> i32 {
|
fn fibonacci(x: i32) -> i32 {
|
||||||
if (x <= 1) return 1;
|
if (x <= 1) return 1;
|
||||||
return fibbonaci(x - 1) + fibbonaci(x - 2);
|
return fibonacci(x - 1) + fibonacci(x - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -219,3 +219,36 @@ fn inlinedBlockAndRuntimeBlockPhi() {
|
||||||
assert(!letsTryToCompareBools(false, false));
|
assert(!letsTryToCompareBools(false, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CmdFn = struct {
|
||||||
|
name: []const u8,
|
||||||
|
func: fn(i32) -> i32,
|
||||||
|
};
|
||||||
|
|
||||||
|
const cmd_fns = []CmdFn{
|
||||||
|
CmdFn {.name = "one", .func = one},
|
||||||
|
CmdFn {.name = "two", .func = two},
|
||||||
|
CmdFn {.name = "three", .func = three},
|
||||||
|
};
|
||||||
|
fn one(value: i32) -> i32 { value + 1 }
|
||||||
|
fn two(value: i32) -> i32 { value + 2 }
|
||||||
|
fn three(value: i32) -> i32 { value + 3 }
|
||||||
|
|
||||||
|
fn performFn(comptime prefix_char: u8, start_value: i32) -> i32 {
|
||||||
|
var result: i32 = start_value;
|
||||||
|
comptime var i = 0;
|
||||||
|
inline while (i < cmd_fns.len; i += 1) {
|
||||||
|
if (cmd_fns[i].name[0] == prefix_char) {
|
||||||
|
result = cmd_fns[i].func(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn comptimeIterateOverFnPtrList() {
|
||||||
|
@setFnTest(this);
|
||||||
|
|
||||||
|
assert(performFn('t', 1) == 6);
|
||||||
|
assert(performFn('o', 0) == 1);
|
||||||
|
assert(performFn('w', 99) == 99);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue