Commit 3caf6bacdc
src/ir.cpp
@@ -2945,7 +2945,7 @@ static IrInstruction *ir_gen_return(IrBuilder *irb, Scope *scope, AstNode *node,
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;
switch (node->data.return_expr.kind) {
test/cases/eval.zig
@@ -6,10 +6,10 @@ fn compileTimeRecursion() {
assert(some_data.len == 21);
}
-var some_data: [usize(fibbonaci(7))]u8 = undefined;
-fn fibbonaci(x: i32) -> i32 {
+var some_data: [usize(fibonacci(7))]u8 = undefined;
+fn fibonacci(x: i32) -> i32 {
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));
}
}
+
+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);
+}