aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Sema.zig12
-rw-r--r--test/behavior/cast.zig10
2 files changed, 22 insertions, 0 deletions
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);
+}