zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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:
Msrc/ir.cpp | 2++
Mtest/behavior.zig | 1+
Atest/cases/fn_in_struct_in_comptime.zig | 17+++++++++++++++++
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); +}