mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
Merge c091e47f54 into 9082b004b6
This commit is contained in:
commit
cd85e4cebd
2 changed files with 34 additions and 15 deletions
23
src/Sema.zig
23
src/Sema.zig
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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'
|
||||||
Loading…
Add table
Reference in a new issue