authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2023-06-10 01:50:05+01:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-06-10 21:41:49+03:00
log1e7dcaa3ae57294ab5998b44a8c13ccc5019e7ea
tree4b33f51418adc71787d43407339379d305cb9f1a
parentc842deea757a3de7565b6b06f5e6c0b5cc883827

Sema: resolve peer vector types before comparison

Resolves: #15732

2 files changed, 21 insertions(+), 4 deletions(-)

src/Sema.zig+8-4
......@@ -30158,15 +30158,19 @@ fn cmpVector(
3015830158 assert(rhs_ty.zigTypeTag() == .Vector);
3015930159 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);
3016030160
30161 const resolved_ty = try sema.resolvePeerTypes(block, src, &.{ lhs, rhs }, .{ .override = &.{ lhs_src, rhs_src } });
30162 const casted_lhs = try sema.coerce(block, resolved_ty, lhs, lhs_src);
30163 const casted_rhs = try sema.coerce(block, resolved_ty, rhs, rhs_src);
30164
3016130165 const result_ty = try Type.vector(sema.arena, lhs_ty.vectorLen(), Type.bool);
3016230166
3016330167 const runtime_src: LazySrcLoc = src: {
30164 if (try sema.resolveMaybeUndefVal(lhs)) |lhs_val| {
30165 if (try sema.resolveMaybeUndefVal(rhs)) |rhs_val| {
30168 if (try sema.resolveMaybeUndefVal(casted_lhs)) |lhs_val| {
30169 if (try sema.resolveMaybeUndefVal(casted_rhs)) |rhs_val| {
3016630170 if (lhs_val.isUndef() or rhs_val.isUndef()) {
3016730171 return sema.addConstUndef(result_ty);
3016830172 }
30169 const cmp_val = try sema.compareVector(lhs_val, op, rhs_val, lhs_ty);
30173 const cmp_val = try sema.compareVector(lhs_val, op, rhs_val, resolved_ty);
3017030174 return sema.addConstant(result_ty, cmp_val);
3017130175 } else {
3017230176 break :src rhs_src;
......@@ -30177,7 +30181,7 @@ fn cmpVector(
3017730181 };
3017830182
3017930183 try sema.requireRuntimeBlock(block, src, runtime_src);
30180 return block.addCmpVector(lhs, rhs, op);
30184 return block.addCmpVector(casted_lhs, casted_rhs, op);
3018130185}
3018230186
3018330187fn wrapOptional(
test/behavior/vector.zig+13
......@@ -1330,3 +1330,16 @@ test "addition of vectors represented as strings" {
13301330 const bar: V = @typeName(u32).*;
13311331 try expectEqual(V{ 219, 162, 161 }, foo + bar);
13321332}
1333
1334test "compare vectors with different element types" {
1335 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1336 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1337 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1338 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1339 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1340 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
1341
1342 var a: @Vector(2, u8) = .{ 1, 2 };
1343 var b: @Vector(2, u9) = .{ 3, 0 };
1344 try expectEqual(@Vector(2, bool){ true, false }, a < b);
1345}