| author | |
| committer | |
| log | 955fd65cb1705d8279eb195bdbc69810df1b1d98 |
| tree | 6e9936a5031543bc3500fbd9dd124eae2d8b5d80 |
| parent | ec7293422d28d253ffc3922684f03cecd3f15f4d |
| signature |
2 files changed, 32 insertions(+), 1 deletions(-)
src/Sema.zig+15-1| ... | ... | @@ -34238,7 +34238,21 @@ fn resolvePeerTypesInner( |
| 34238 | 34238 | .peer_idx_b = i, |
| 34239 | 34239 | } }; |
| 34240 | 34240 | |
| 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 | ||
| 34242 | 34256 | return .{ .conflict = .{ |
| 34243 | 34257 | .peer_idx_a = first_arr_idx, |
| 34244 | 34258 | .peer_idx_b = i, |
test/behavior/cast.zig+17| ... | ... | @@ -2201,6 +2201,23 @@ test "peer type resolution: pointer attributes are combined correctly" { |
| 2201 | 2201 | try expectEqualSlices(u8, std.mem.span(@volatileCast(r3)), "baz"); |
| 2202 | 2202 | } |
| 2203 | 2203 | |
| 2204 | test "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 | ||
| 2204 | 2221 | test "cast builtins can wrap result in optional" { |
| 2205 | 2222 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2206 | 2223 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |