From 799a558e393d1c8286e8faec2bf8930138d8b1f4 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 4 Nov 2022 17:10:23 +0200 Subject: Sema: implement peer type resolution of function pointers and function bodies Closes #13438 --- src/Sema.zig | 12 ++++++++++++ test/behavior/cast.zig | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/Sema.zig b/src/Sema.zig index 3def393dfb..a127031808 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -28769,6 +28769,13 @@ fn resolvePeerTypes( } } }, + .Fn => { + if (!cand_info.mutable and cand_info.pointee_type.zigTypeTag() == .Fn and .ok == try sema.coerceInMemoryAllowedFns(block, chosen_ty, cand_info.pointee_type, target, src, src)) { + chosen = candidate; + chosen_i = candidate_i + 1; + continue; + } + }, else => {}, } }, @@ -28799,6 +28806,11 @@ fn resolvePeerTypes( .Vector => continue, else => {}, }, + .Fn => if (chosen_ty.isSinglePointer() and chosen_ty.isConstPtr() and chosen_ty.childType().zigTypeTag() == .Fn) { + if (.ok == try sema.coerceInMemoryAllowedFns(block, chosen_ty.childType(), candidate_ty, target, src, src)) { + continue; + } + }, else => {}, } diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig index 07d45ad3dc..0de4b6d53e 100644 --- a/test/behavior/cast.zig +++ b/test/behavior/cast.zig @@ -1419,3 +1419,13 @@ test "floatToInt to zero-bit int" { var a: f32 = 0.0; comptime try std.testing.expect(@floatToInt(u0, a) == 0); } + +test "peer type resolution of function pointer and function body" { + if (builtin.zig_backend == .stage1) return error.SkipZigTest; + + const T = fn () u32; + const a: T = undefined; + const b: *const T = undefined; + try expect(@TypeOf(a, b) == *const fn () u32); + try expect(@TypeOf(b, a) == *const fn () u32); +} -- cgit v1.2.3