This commit is contained in:
Rue 2025-11-23 22:57:18 +00:00 committed by GitHub
commit cd85e4cebd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 34 additions and 15 deletions

View file

@ -24938,23 +24938,26 @@ fn analyzeMinMax(
if (vector_len) |len| { if (vector_len) |len| {
// Vector case; apply `opFunc` to each element. // Vector case; apply `opFunc` to each element.
if (elems_populated) { if (elems_populated) {
const coerced_operand_val = Value.fromInterned((try sema.coerce(block, intermediate_ty, Air.internedToRef(operand_val.toIntern()), operand_src)).toInterned().?);
for (elems, 0..@intCast(len)) |*elem, elem_idx| { for (elems, 0..@intCast(len)) |*elem, elem_idx| {
const new_elem = try operand_val.elemValue(pt, elem_idx); elem.* = opFunc(.fromInterned(elem.*), try coerced_operand_val.elemValue(pt, elem_idx), zcu).toIntern();
elem.* = opFunc(.fromInterned(elem.*), new_elem, zcu).toIntern();
} }
} else { } else {
elems_populated = true; elems_populated = true;
const coerced_operand_val = Value.fromInterned((try sema.coerce(block, intermediate_ty, Air.internedToRef(operand_val.toIntern()), operand_src)).toInterned().?);
for (elems, 0..@intCast(len)) |*elem_out, elem_idx| { for (elems, 0..@intCast(len)) |*elem_out, elem_idx| {
elem_out.* = (try operand_val.elemValue(pt, elem_idx)).toIntern(); elem_out.* = (try coerced_operand_val.elemValue(pt, elem_idx)).toIntern();
} }
} }
} else { } else {
// Scalar case; just apply `opFunc`. // Scalar case; just apply `opFunc`.
if (elems_populated) { if (elems_populated) {
elems[0] = opFunc(.fromInterned(elems[0]), operand_val, zcu).toIntern(); const coerced_operand_val = Value.fromInterned((try sema.coerce(block, intermediate_scalar_ty, Air.internedToRef(operand_val.toIntern()), operand_src)).toInterned().?);
elems[0] = opFunc(.fromInterned(elems[0]), coerced_operand_val, zcu).toIntern();
} else { } else {
elems_populated = true; elems_populated = true;
elems[0] = operand_val.toIntern(); const coerced_operand_val = Value.fromInterned((try sema.coerce(block, intermediate_scalar_ty, Air.internedToRef(operand_val.toIntern()), operand_src)).toInterned().?);
elems[0] = coerced_operand_val.toIntern();
} }
} }
} }
@ -24975,17 +24978,7 @@ fn analyzeMinMax(
}; };
_ = runtime_src; _ = runtime_src;
// The result is runtime-known. // The result is runtime-known.
// Coerce each element to the intermediate scalar type, unless there were no comptime-known operands.
if (!elems_populated) break :ct null; if (!elems_populated) break :ct null;
for (elems) |*elem| {
if (Value.fromInterned(elem.*).isUndef(zcu)) {
elem.* = (try pt.undefValue(intermediate_scalar_ty)).toIntern();
} else {
// This coercion will always succeed, because `intermediate_scalar_ty` can definitely hold all operands.
const coerced_ref = try sema.coerce(block, intermediate_scalar_ty, Air.internedToRef(elem.*), .unneeded);
elem.* = coerced_ref.toInterned().?;
}
}
break :ct if (vector_len != null) break :ct if (vector_len != null)
try pt.aggregateValue(intermediate_ty, elems) try pt.aggregateValue(intermediate_ty, elems)
else else

View file

@ -0,0 +1,26 @@
// zig fmt: off
comptime { _ = @min(@as(f32, 1.0), u32_max); }
comptime { _ = @max(@as(f32, 1.0), u32_max); }
comptime { _ = @min(@as(f32, 1.0), 1234, u32_max, 0.1); }
comptime { _ = @max(@as(f32, 1.0), 1234, u32_max, 0.1); }
comptime {
var f: f32 = 1.0;
_ = &f;
_ = @min(f, u32_max);
}
comptime {
var f: f32 = 1.0;
_ = &f;
_ = @max(f, u32_max);
}
const u32_max: u32 = 4294967295;
// error
//
// :2:36: error: type 'f32' cannot represent integer value '4294967295'
// :3:36: error: type 'f32' cannot represent integer value '4294967295'
// :4:42: error: type 'f32' cannot represent integer value '4294967295'
// :5:42: error: type 'f32' cannot represent integer value '4294967295'
// :9:17: error: type 'f32' cannot represent integer value '4294967295'
// :14:17: error: type 'f32' cannot represent integer value '4294967295'