Commit fe6249348f

Veikka Tuominen <git@vexu.eu>
2022-11-15 23:31:09
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
1 parent fb09093
Changed files (2)
src
test
behavior
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(
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);
+}