Skip to content

Commit b7b026b

Browse files
committed
Auto merge of rust-lang#14825 - HKalbasi:float-const-eval, r=Veykril
Fix evaluating negative for floating point types fix rust-lang#14704 Unary operators was missed from rust-lang#14705
2 parents a20a08f + fd034be commit b7b026b

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

crates/hir-ty/src/consteval/tests.rs

+4
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ fn floating_point() {
113113
r#"const GOAL: f32 = 2.0 + 3.0 * 5.5 - 8.;"#,
114114
i128::from_le_bytes(pad16(&f32::to_le_bytes(10.5), true)),
115115
);
116+
check_number(
117+
r#"const GOAL: f32 = -90.0 + 36.0;"#,
118+
i128::from_le_bytes(pad16(&f32::to_le_bytes(-54.0), true)),
119+
);
116120
}
117121

118122
#[test]

crates/hir-ty/src/mir/eval.rs

+26-13
Original file line numberDiff line numberDiff line change
@@ -759,25 +759,38 @@ impl Evaluator<'_> {
759759
let size = self.size_of_sized(&ty, locals, "operand of unary op")?;
760760
c = self.read_memory(Address::from_bytes(c)?, size)?;
761761
}
762-
let mut c = c.to_vec();
763-
if ty.as_builtin() == Some(BuiltinType::Bool) {
764-
c[0] = 1 - c[0];
762+
if let TyKind::Scalar(chalk_ir::Scalar::Float(f)) = ty.kind(Interner) {
763+
match f {
764+
chalk_ir::FloatTy::F32 => {
765+
let c = -from_bytes!(f32, c);
766+
Owned(c.to_le_bytes().into())
767+
}
768+
chalk_ir::FloatTy::F64 => {
769+
let c = -from_bytes!(f32, c);
770+
Owned(c.to_le_bytes().into())
771+
}
772+
}
765773
} else {
766-
match op {
767-
UnOp::Not => c.iter_mut().for_each(|x| *x = !*x),
768-
UnOp::Neg => {
769-
c.iter_mut().for_each(|x| *x = !*x);
770-
for k in c.iter_mut() {
771-
let o;
772-
(*k, o) = k.overflowing_add(1);
773-
if !o {
774-
break;
774+
let mut c = c.to_vec();
775+
if ty.as_builtin() == Some(BuiltinType::Bool) {
776+
c[0] = 1 - c[0];
777+
} else {
778+
match op {
779+
UnOp::Not => c.iter_mut().for_each(|x| *x = !*x),
780+
UnOp::Neg => {
781+
c.iter_mut().for_each(|x| *x = !*x);
782+
for k in c.iter_mut() {
783+
let o;
784+
(*k, o) = k.overflowing_add(1);
785+
if !o {
786+
break;
787+
}
775788
}
776789
}
777790
}
778791
}
792+
Owned(c)
779793
}
780-
Owned(c)
781794
}
782795
Rvalue::CheckedBinaryOp(op, lhs, rhs) => {
783796
let lc = self.eval_operand(lhs, locals)?;

0 commit comments

Comments
 (0)