From cc12a1b5119b003132a16e83c19642bb6584f2df Mon Sep 17 00:00:00 2001 From: beetrees Date: Thu, 18 Apr 2024 06:43:44 +0100 Subject: [PATCH] Fix negating `f16` and `f128` constants --- compiler/rustc_mir_build/src/build/mod.rs | 16 ++++++++++++++-- tests/ui/numbers-arithmetic/f16-f128-lit.rs | 16 ++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/ui/numbers-arithmetic/f16-f128-lit.rs diff --git a/compiler/rustc_mir_build/src/build/mod.rs b/compiler/rustc_mir_build/src/build/mod.rs index b5d72619a3871..36e0c755007a1 100644 --- a/compiler/rustc_mir_build/src/build/mod.rs +++ b/compiler/rustc_mir_build/src/build/mod.rs @@ -1023,7 +1023,13 @@ pub(crate) fn parse_float_into_scalar( let num = num.as_str(); match float_ty { // FIXME(f16_f128): When available, compare to the library parser as with `f32` and `f64` - ty::FloatTy::F16 => num.parse::().ok().map(Scalar::from_f16), + ty::FloatTy::F16 => { + let mut f = num.parse::().ok()?; + if neg { + f = -f; + } + Some(Scalar::from_f16(f)) + } ty::FloatTy::F32 => { let Ok(rust_f) = num.parse::() else { return None }; let mut f = num @@ -1071,7 +1077,13 @@ pub(crate) fn parse_float_into_scalar( Some(Scalar::from_f64(f)) } // FIXME(f16_f128): When available, compare to the library parser as with `f32` and `f64` - ty::FloatTy::F128 => num.parse::().ok().map(Scalar::from_f128), + ty::FloatTy::F128 => { + let mut f = num.parse::().ok()?; + if neg { + f = -f; + } + Some(Scalar::from_f128(f)) + } } } diff --git a/tests/ui/numbers-arithmetic/f16-f128-lit.rs b/tests/ui/numbers-arithmetic/f16-f128-lit.rs new file mode 100644 index 0000000000000..762436edb1663 --- /dev/null +++ b/tests/ui/numbers-arithmetic/f16-f128-lit.rs @@ -0,0 +1,16 @@ +//@ run-pass + +#![feature(f16)] +#![feature(f128)] + +fn main() { + assert_eq!(0.0_f16.to_bits(), 0x0000); + assert_eq!((-0.0_f16).to_bits(), 0x8000); + assert_eq!(10.0_f16.to_bits(), 0x4900); + assert_eq!((-10.0_f16).to_bits(), 0xC900); + + assert_eq!(0.0_f128.to_bits(), 0x0000_0000_0000_0000_0000_0000_0000_0000); + assert_eq!((-0.0_f128).to_bits(), 0x8000_0000_0000_0000_0000_0000_0000_0000); + assert_eq!(10.0_f128.to_bits(), 0x4002_4000_0000_0000_0000_0000_0000_0000); + assert_eq!((-10.0_f128).to_bits(), 0xC002_4000_0000_0000_0000_0000_0000_0000); +}