Sema: don't emit instruction when casting @min/@max result to OPV type

Resolves: #21408
This commit is contained in:
mlugg 2024-09-15 13:25:18 +01:00 committed by Matthew Lugg
parent 19924ca289
commit 258236ec1b
2 changed files with 18 additions and 0 deletions

View File

@ -26201,6 +26201,10 @@ fn analyzeMinMax(
.child = refined_scalar_ty.toIntern(),
}) else refined_scalar_ty;
if (try sema.typeHasOnePossibleValue(refined_ty)) |opv| {
return Air.internedToRef(opv.toIntern());
}
if (!refined_ty.eql(unrefined_ty, zcu)) {
// We've reduced the type - cast the result down
return block.addTyOp(.intcast, refined_ty, cur_minmax.?);

View File

@ -336,3 +336,17 @@ test "@min/@max of signed and unsigned runtime integers" {
try expectEqual(x, @min(x, y));
try expectEqual(y, @max(x, y));
}
test "@min resulting in u0" {
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
const S = struct {
fn min(a: u0, b: u8) u8 {
return @min(a, b);
}
};
const x = S.min(0, 1);
try expect(x == 0);
}