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
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user