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