Skip to content

Commit b7f43d0

Browse files
committed
constify {float}::total_cmp()
1 parent 136fb1e commit b7f43d0

File tree

5 files changed

+121
-4
lines changed

5 files changed

+121
-4
lines changed

library/core/src/num/f128.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1196,7 +1196,8 @@ impl f128 {
11961196
#[inline]
11971197
#[must_use]
11981198
#[unstable(feature = "f128", issue = "116909")]
1199-
pub fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
1199+
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
1200+
pub const fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
12001201
let mut left = self.to_bits() as i128;
12011202
let mut right = other.to_bits() as i128;
12021203

library/core/src/num/f16.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1175,7 +1175,8 @@ impl f16 {
11751175
#[inline]
11761176
#[must_use]
11771177
#[unstable(feature = "f16", issue = "116909")]
1178-
pub fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
1178+
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
1179+
pub const fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
11791180
let mut left = self.to_bits() as i16;
11801181
let mut right = other.to_bits() as i16;
11811182

library/core/src/num/f32.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1353,9 +1353,10 @@ impl f32 {
13531353
/// }
13541354
/// ```
13551355
#[stable(feature = "total_cmp", since = "1.62.0")]
1356+
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
13561357
#[must_use]
13571358
#[inline]
1358-
pub fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
1359+
pub const fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
13591360
let mut left = self.to_bits() as i32;
13601361
let mut right = other.to_bits() as i32;
13611362

library/core/src/num/f64.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1351,9 +1351,10 @@ impl f64 {
13511351
/// }
13521352
/// ```
13531353
#[stable(feature = "total_cmp", since = "1.62.0")]
1354+
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
13541355
#[must_use]
13551356
#[inline]
1356-
pub fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
1357+
pub const fn total_cmp(&self, other: &Self) -> crate::cmp::Ordering {
13571358
let mut left = self.to_bits() as i64;
13581359
let mut right = other.to_bits() as i64;
13591360

tests/ui/consts/const-total-cmp.rs

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
//@ run-pass
2+
3+
#![feature(const_cmp, f16, f128)]
4+
5+
use std::cmp::Ordering;
6+
7+
fn main() {
8+
// Test f32::total_cmp in const context
9+
const F32_EQUAL: Ordering = (1.0_f32).total_cmp(&1.0_f32);
10+
assert_eq!(F32_EQUAL, Ordering::Equal);
11+
12+
const F32_LESS: Ordering = (1.0_f32).total_cmp(&2.0_f32);
13+
assert_eq!(F32_LESS, Ordering::Less);
14+
15+
const F32_GREATER: Ordering = (2.0_f32).total_cmp(&1.0_f32);
16+
assert_eq!(F32_GREATER, Ordering::Greater);
17+
18+
// Test special values for f32
19+
const F32_NEG_ZERO_VS_POS_ZERO: Ordering = (-0.0_f32).total_cmp(&0.0_f32);
20+
assert_eq!(F32_NEG_ZERO_VS_POS_ZERO, Ordering::Less);
21+
22+
const F32_NAN_VS_FINITE: Ordering = f32::NAN.total_cmp(&1.0_f32);
23+
assert_eq!(F32_NAN_VS_FINITE, Ordering::Greater);
24+
25+
const F32_INFINITY_VS_FINITE: Ordering = f32::INFINITY.total_cmp(&1.0_f32);
26+
assert_eq!(F32_INFINITY_VS_FINITE, Ordering::Greater);
27+
28+
const F32_NEG_INFINITY_VS_FINITE: Ordering = f32::NEG_INFINITY.total_cmp(&1.0_f32);
29+
assert_eq!(F32_NEG_INFINITY_VS_FINITE, Ordering::Less);
30+
31+
// Test f64::total_cmp in const context
32+
const F64_EQUAL: Ordering = (1.0_f64).total_cmp(&1.0_f64);
33+
assert_eq!(F64_EQUAL, Ordering::Equal);
34+
35+
const F64_LESS: Ordering = (1.0_f64).total_cmp(&2.0_f64);
36+
assert_eq!(F64_LESS, Ordering::Less);
37+
38+
const F64_GREATER: Ordering = (2.0_f64).total_cmp(&1.0_f64);
39+
assert_eq!(F64_GREATER, Ordering::Greater);
40+
41+
// Test special values for f64
42+
const F64_NEG_ZERO_VS_POS_ZERO: Ordering = (-0.0_f64).total_cmp(&0.0_f64);
43+
assert_eq!(F64_NEG_ZERO_VS_POS_ZERO, Ordering::Less);
44+
45+
const F64_NAN_VS_FINITE: Ordering = f64::NAN.total_cmp(&1.0_f64);
46+
assert_eq!(F64_NAN_VS_FINITE, Ordering::Greater);
47+
48+
const F64_INFINITY_VS_FINITE: Ordering = f64::INFINITY.total_cmp(&1.0_f64);
49+
assert_eq!(F64_INFINITY_VS_FINITE, Ordering::Greater);
50+
51+
const F64_NEG_INFINITY_VS_FINITE: Ordering = f64::NEG_INFINITY.total_cmp(&1.0_f64);
52+
assert_eq!(F64_NEG_INFINITY_VS_FINITE, Ordering::Less);
53+
54+
// Test edge cases: comparing NaNs with each other
55+
const F32_NAN_VS_NAN: Ordering = f32::NAN.total_cmp(&f32::NAN);
56+
assert_eq!(F32_NAN_VS_NAN, Ordering::Equal);
57+
58+
const F64_NAN_VS_NAN: Ordering = f64::NAN.total_cmp(&f64::NAN);
59+
assert_eq!(F64_NAN_VS_NAN, Ordering::Equal);
60+
61+
// Test subnormal numbers
62+
const F32_SUBNORMAL_CMP: Ordering = f32::MIN_POSITIVE.total_cmp(&(f32::MIN_POSITIVE / 2.0));
63+
assert_eq!(F32_SUBNORMAL_CMP, Ordering::Greater);
64+
65+
const F64_SUBNORMAL_CMP: Ordering = f64::MIN_POSITIVE.total_cmp(&(f64::MIN_POSITIVE / 2.0));
66+
assert_eq!(F64_SUBNORMAL_CMP, Ordering::Greater);
67+
68+
// Test f16::total_cmp in const context
69+
const F16_EQUAL: Ordering = (1.0_f16).total_cmp(&1.0_f16);
70+
assert_eq!(F16_EQUAL, Ordering::Equal);
71+
72+
const F16_LESS: Ordering = (1.0_f16).total_cmp(&2.0_f16);
73+
assert_eq!(F16_LESS, Ordering::Less);
74+
75+
const F16_GREATER: Ordering = (2.0_f16).total_cmp(&1.0_f16);
76+
assert_eq!(F16_GREATER, Ordering::Greater);
77+
78+
// Test special values for f16
79+
const F16_NEG_ZERO_VS_POS_ZERO: Ordering = (-0.0_f16).total_cmp(&0.0_f16);
80+
assert_eq!(F16_NEG_ZERO_VS_POS_ZERO, Ordering::Less);
81+
82+
const F16_NAN_VS_FINITE: Ordering = f16::NAN.total_cmp(&1.0_f16);
83+
assert_eq!(F16_NAN_VS_FINITE, Ordering::Greater);
84+
85+
const F16_INFINITY_VS_FINITE: Ordering = f16::INFINITY.total_cmp(&1.0_f16);
86+
assert_eq!(F16_INFINITY_VS_FINITE, Ordering::Greater);
87+
88+
const F16_NAN_VS_NAN: Ordering = f16::NAN.total_cmp(&f16::NAN);
89+
assert_eq!(F16_NAN_VS_NAN, Ordering::Equal);
90+
91+
// Test f128::total_cmp in const context
92+
const F128_EQUAL: Ordering = (1.0_f128).total_cmp(&1.0_f128);
93+
assert_eq!(F128_EQUAL, Ordering::Equal);
94+
95+
const F128_LESS: Ordering = (1.0_f128).total_cmp(&2.0_f128);
96+
assert_eq!(F128_LESS, Ordering::Less);
97+
98+
const F128_GREATER: Ordering = (2.0_f128).total_cmp(&1.0_f128);
99+
assert_eq!(F128_GREATER, Ordering::Greater);
100+
101+
// Test special values for f128
102+
const F128_NEG_ZERO_VS_POS_ZERO: Ordering = (-0.0_f128).total_cmp(&0.0_f128);
103+
assert_eq!(F128_NEG_ZERO_VS_POS_ZERO, Ordering::Less);
104+
105+
const F128_NAN_VS_FINITE: Ordering = f128::NAN.total_cmp(&1.0_f128);
106+
assert_eq!(F128_NAN_VS_FINITE, Ordering::Greater);
107+
108+
const F128_INFINITY_VS_FINITE: Ordering = f128::INFINITY.total_cmp(&1.0_f128);
109+
assert_eq!(F128_INFINITY_VS_FINITE, Ordering::Greater);
110+
111+
const F128_NAN_VS_NAN: Ordering = f128::NAN.total_cmp(&f128::NAN);
112+
assert_eq!(F128_NAN_VS_NAN, Ordering::Equal);
113+
}

0 commit comments

Comments
 (0)