zig

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

commit fe6249348f615c975a2db53bb0c93f83bd2a281b (tree)
parent fb09093d95f2dc9bf454ba0d1d489316311adffc
Author: Veikka Tuominen <git@vexu.eu>
Date:   Wed, 16 Nov 2022 00:31:09 +0200

Sema: ensure comptime reference to function points to original decl

This prevents sema from creating new decls for the functions and
passing them to the backends as non-function decls.

Closes #12501

Diffstat:
Msrc/Sema.zig | 7+++++++
Mtest/behavior/eval.zig | 15+++++++++++++++
2 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -27404,6 +27404,13 @@ fn analyzeRef( const operand_ty = sema.typeOf(operand); if (try sema.resolveMaybeUndefVal(operand)) |val| { + switch (val.tag()) { + .extern_fn, .function => { + const decl_index = val.pointerDecl().?; + return sema.analyzeDeclRef(decl_index); + }, + else => {}, + } var anon_decl = try block.startAnonDecl(); defer anon_decl.deinit(); return sema.analyzeDeclRef(try anon_decl.finish( diff --git a/test/behavior/eval.zig b/test/behavior/eval.zig @@ -1507,3 +1507,18 @@ test "inline call in @TypeOf inherits is_inline property" { }; try expect(S.T == void); } + +test "comptime function turns function value to function pointer" { + const S = struct { + fn fnPtr(function: anytype) *const @TypeOf(function) { + return &function; + } + fn Nil() u8 { + return 0; + } + const foo = &[_]*const fn () u8{ + fnPtr(Nil), + }; + }; + comptime try expect(S.foo[0] == &S.Nil); +}