commit 131c133bb74eab2012158c8ecfaa78944db197c7 (tree)
parent 02c1b9df3bcf2e0324adf02fd6c0ed56fe58c6d3
Author: Alexandros Naskos <alex_naskos@hotmail.com>
Date: Thu, 3 May 2018 04:43:07 +0300
Fixed inlining determination test (#972)
When deciding wether we should inline a scope, look up the parents until we get to a function definition scope
Diffstat:
3 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/src/ir.cpp b/src/ir.cpp
@@ -145,6 +145,8 @@ static bool ir_should_inline(IrExecutable *exec, Scope *scope) {
while (scope != nullptr) {
if (scope->id == ScopeIdCompTime)
return true;
+ if (scope->id == ScopeIdFnDef)
+ break;
scope = scope->parent;
}
return false;
diff --git a/test/behavior.zig b/test/behavior.zig
@@ -52,4 +52,5 @@ comptime {
_ = @import("cases/var_args.zig");
_ = @import("cases/void.zig");
_ = @import("cases/while.zig");
+ _ = @import("cases/fn_in_struct_in_comptime.zig");
}
diff --git a/test/cases/fn_in_struct_in_comptime.zig b/test/cases/fn_in_struct_in_comptime.zig
@@ -0,0 +1,17 @@
+const assert = @import("std").debug.assert;
+
+fn get_foo() fn(&u8)usize {
+ comptime {
+ return struct {
+ fn func(ptr: &u8) usize {
+ var u = @ptrToInt(ptr);
+ return u;
+ }
+ }.func;
+ }
+}
+
+test "define a function in an anonymous struct in comptime" {
+ const foo = get_foo();
+ assert(foo(@intToPtr(&u8, 12345)) == 12345);
+}