Skip to content

Commit 0aa6075

Browse files
#128598 rebase done
1 parent 9e5bdb7 commit 0aa6075

File tree

1 file changed

+26
-17
lines changed

1 file changed

+26
-17
lines changed

tests/ui/consts/const-float-bits-conv.rs

+26-17
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ fn f16(){
4444
const_assert!(f16::from_bits(0x5be0), 252.0);
4545
const_assert!(f16::from_ne_bytes(0x5be0u16.to_ne_bytes()), 252.0);
4646
const_assert!(f16::from_bits(0xcb20), -14.25);
47+
48+
// Check that NaNs roundtrip their bits regardless of signalingness
49+
// 0xA is 0b1010; 0x5 is 0b0101 -- so these two together clobbers all the mantissa bits
50+
// NOTE: These names assume `f{BITS}::NAN` is a quiet NAN and IEEE754-2008's NaN rules apply!
51+
const QUIET_NAN: u16 = f16::NAN.to_bits() ^ 0x02AA;
52+
const SIGNALING_NAN: u16 = 0x7eaa;
53+
54+
const_assert!(f16::from_bits(QUIET_NAN).is_nan());
55+
const_assert!(f16::from_bits(SIGNALING_NAN).is_nan());
56+
const_assert!(f16::from_bits(QUIET_NAN).to_bits(), QUIET_NAN);
57+
if !has_broken_floats() {
58+
const_assert!(f16::from_bits(SIGNALING_NAN).to_bits(), SIGNALING_NAN);
59+
}
4760
}
4861

4962
fn f32() {
@@ -106,23 +119,6 @@ fn f64() {
106119
}
107120
}
108121

109-
fn f128() {
110-
const_assert!((1f128).to_bits(), 0x3fff0000000000000000000000000000);
111-
const_assert!(u128::from_be_bytes(1f128.to_be_bytes()), 0x3fff0000000000000000000000000000);
112-
const_assert!((12.5f128).to_bits(), 0x40029000000000000000000000000000);
113-
const_assert!(u128::from_le_bytes(12.5f128.to_le_bytes()), 0x40029000000000000000000000000000);
114-
const_assert!((1337f128).to_bits(), 0x40094e40000000000000000000000000);
115-
const_assert!(u128::from_ne_bytes(1337f128.to_ne_bytes()), 0x40094e40000000000000000000000000);
116-
const_assert!((-14.25f128).to_bits(), 0xc002c800000000000000000000000000);
117-
const_assert!(f128::from_bits(0x3fff0000000000000000000000000000), 1.0);
118-
const_assert!(f128::from_be_bytes(0x3fff0000000000000000000000000000u128.to_be_bytes()), 1.0);
119-
const_assert!(f128::from_bits(0x40029000000000000000000000000000), 12.5);
120-
const_assert!(f128::from_le_bytes(0x40029000000000000000000000000000u128.to_le_bytes()), 12.5);
121-
const_assert!(f128::from_bits(0x40094e40000000000000000000000000), 1337.0);
122-
const_assert!(f128::from_ne_bytes(0x40094e40000000000000000000000000u128.to_ne_bytes()), 1337.0);
123-
const_assert!(f128::from_bits(0xc002c800000000000000000000000000), -14.25);
124-
}
125-
126122
fn f128() {
127123
const_assert!((1f128).to_bits(), 0x3fff0000000000000000000000000000);
128124
const_assert!(u128::from_be_bytes(1f128.to_be_bytes()), 0x3fff0000000000000000000000000000);
@@ -138,6 +134,19 @@ fn f128() {
138134
const_assert!(f128::from_bits(0x40094e40000000000000000000000000), 1337.0);
139135
assert_eq!(f128::from_ne_bytes(0x40094e40000000000000000000000000u128.to_ne_bytes()), 1337.0);
140136
const_assert!(f128::from_bits(0xc002c800000000000000000000000000), -14.25);
137+
138+
// Check that NaNs roundtrip their bits regardless of signalingness
139+
// 0xA is 0b1010; 0x5 is 0b0101 -- so these two together clobbers all the mantissa bits
140+
// NOTE: These names assume `f{BITS}::NAN` is a quiet NAN and IEEE754-2008's NaN rules apply!
141+
const QUIET_NAN: u128 = f128::NAN.to_bits() | 0x0008_0000_0000_0000_0000_0000_0000_0000; // Set a non-zero mantissa bit
142+
const SIGNALING_NAN: u128 = QUIET_NAN | 0x0000_0001_0000_0000_0000_0000_0000_0000; // Set the most significant mantissa bit
143+
144+
const_assert!(f128::from_bits(QUIET_NAN).is_nan());
145+
const_assert!(f128::from_bits(SIGNALING_NAN).is_nan());
146+
const_assert!(f128::from_bits(QUIET_NAN).to_bits(), QUIET_NAN);
147+
if !has_broken_floats() {
148+
const_assert!(f128::from_bits(SIGNALING_NAN).to_bits(), SIGNALING_NAN);
149+
}
141150
}
142151

143152
fn main() {

0 commit comments

Comments
 (0)