authorgravatar for garrisonhh@pm.mearrisonhh <garrisonhh@pm.me> 2024-02-20 19:55:29-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-02-21 00:55:29+00:00
log955fd65cb1705d8279eb195bdbc69810df1b1d98
tree6e9936a5031543bc3500fbd9dd124eae2d8b5d80
parentec7293422d28d253ffc3922684f03cecd3f15f4d
signaturebadge-check Signed by PGP key B5690EEEBB952194

Sema: fix peer type resolution for arrays of coercible elements


2 files changed, 32 insertions(+), 1 deletions(-)

src/Sema.zig+15-1
......@@ -34238,7 +34238,21 @@ fn resolvePeerTypesInner(
3423834238 .peer_idx_b = i,
3423934239 } };
3424034240
34241 if (!ty.childType(mod).eql(elem_ty, mod)) {
34241 const peer_elem_ty = ty.childType(mod);
34242 if (!peer_elem_ty.eql(elem_ty, mod)) coerce: {
34243 const peer_elem_coerces_to_elem =
34244 try sema.coerceInMemoryAllowed(block, elem_ty, peer_elem_ty, false, mod.getTarget(), src, src);
34245 if (peer_elem_coerces_to_elem == .ok) {
34246 break :coerce;
34247 }
34248
34249 const elem_coerces_to_peer_elem =
34250 try sema.coerceInMemoryAllowed(block, peer_elem_ty, elem_ty, false, mod.getTarget(), src, src);
34251 if (elem_coerces_to_peer_elem == .ok) {
34252 elem_ty = peer_elem_ty;
34253 break :coerce;
34254 }
34255
3424234256 return .{ .conflict = .{
3424334257 .peer_idx_a = first_arr_idx,
3424434258 .peer_idx_b = i,
test/behavior/cast.zig+17
......@@ -2201,6 +2201,23 @@ test "peer type resolution: pointer attributes are combined correctly" {
22012201 try expectEqualSlices(u8, std.mem.span(@volatileCast(r3)), "baz");
22022202}
22032203
2204test "peer type resolution: arrays of compatible types" {
2205 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2206 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2207 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2208
2209 var e0: u8 = 3;
2210 var e1: u8 = 2;
2211 var e2: u8 = 1;
2212 const a = [3]*u8{ &e0, &e1, &e2 };
2213 const b = [3]*const u8{ &e0, &e1, &e2 };
2214
2215 comptime assert(@TypeOf(a, b) == [3]*const u8);
2216 comptime assert(@TypeOf(b, a) == [3]*const u8);
2217
2218 try expectEqual(@as(@TypeOf(a, b), a), b);
2219}
2220
22042221test "cast builtins can wrap result in optional" {
22052222 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
22062223 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO