1
+ #![ feature( track_caller) ]
2
+ use std:: fmt:: Debug ;
3
+
4
+ // Helper function to avoid promotion so that this tests "run-time" casts, not CTFE.
5
+ // Doesn't make a big difference when running this in Miri, but when running this in
6
+ // rustc (with -Zmir-opt-level=0) for comparison it means we use LLVM casts.
7
+ #[ track_caller]
8
+ #[ inline( never) ]
9
+ fn assert_eq < T : PartialEq + Debug > ( x : T , y : T ) {
10
+ assert_eq ! ( x, y) ;
11
+ }
12
+
1
13
fn main ( ) {
2
14
// basic arithmetic
3
- assert_eq ! ( 6.0_f32 * 6.0_f32 , 36.0_f32 ) ;
4
- assert_eq ! ( 6.0_f64 * 6.0_f64 , 36.0_f64 ) ;
5
- assert_eq ! ( -{ 5.0_f32 } , -5.0_f32 ) ;
6
- assert_eq ! ( -{ 5.0_f64 } , -5.0_f64 ) ;
15
+ assert_eq ( 6.0_f32 * 6.0_f32 , 36.0_f32 ) ;
16
+ assert_eq ( 6.0_f64 * 6.0_f64 , 36.0_f64 ) ;
17
+ assert_eq ( -{ 5.0_f32 } , -5.0_f32 ) ;
18
+ assert_eq ( -{ 5.0_f64 } , -5.0_f64 ) ;
7
19
// infinities, NaN
8
20
assert ! ( ( 5.0_f32 /0.0 ) . is_infinite( ) ) ;
9
21
assert ! ( ( 5.0_f64 /0.0 ) . is_infinite( ) ) ;
@@ -12,84 +24,84 @@ fn main() {
12
24
// byte-level transmute
13
25
let x: u64 = unsafe { std:: mem:: transmute ( 42.0_f64 ) } ;
14
26
let y: f64 = unsafe { std:: mem:: transmute ( x) } ;
15
- assert_eq ! ( y, 42.0_f64 ) ;
27
+ assert_eq ( y, 42.0_f64 ) ;
16
28
let x: u32 = unsafe { std:: mem:: transmute ( 42.0_f32 ) } ;
17
29
let y: f32 = unsafe { std:: mem:: transmute ( x) } ;
18
- assert_eq ! ( y, 42.0_f32 ) ;
30
+ assert_eq ( y, 42.0_f32 ) ;
19
31
20
32
// f32-to-int casts
21
- assert_eq ! ( 5.0f32 as u32 , 5 ) ;
22
- assert_eq ! ( -5.0f32 as u32 , 0 ) ;
23
- assert_eq ! ( 5.0f32 as i32 , 5 ) ;
24
- assert_eq ! ( -5.0f32 as i32 , -5 ) ;
25
- assert_eq ! ( std:: f32 :: MAX as i32 , i32 :: MAX ) ;
26
- assert_eq ! ( std:: f32 :: INFINITY as i32 , i32 :: MAX ) ;
27
- assert_eq ! ( std:: f32 :: MAX as u32 , u32 :: MAX ) ;
28
- assert_eq ! ( std:: f32 :: INFINITY as u32 , u32 :: MAX ) ;
29
- assert_eq ! ( std:: f32 :: MIN as i32 , i32 :: MIN ) ;
30
- assert_eq ! ( std:: f32 :: NEG_INFINITY as i32 , i32 :: MIN ) ;
31
- assert_eq ! ( std:: f32 :: MIN as u32 , 0 ) ;
32
- assert_eq ! ( std:: f32 :: NEG_INFINITY as u32 , 0 ) ;
33
- assert_eq ! ( std:: f32 :: NAN as i32 , 0 ) ;
34
- assert_eq ! ( std:: f32 :: NAN as u32 , 0 ) ;
35
- assert_eq ! ( u128 :: MAX as f32 , std:: f32 :: INFINITY ) ;
36
- assert_eq ! ( ( u32 :: MAX -127 ) as f32 as u32 , u32 :: MAX ) ; // rounding loss
37
- assert_eq ! ( ( u32 :: MAX -128 ) as f32 as u32 , u32 :: MAX -255 ) ; // rounding loss
33
+ assert_eq ( 5.0f32 as u32 , 5 ) ;
34
+ assert_eq ( -5.0f32 as u32 , 0 ) ;
35
+ assert_eq ( 5.0f32 as i32 , 5 ) ;
36
+ assert_eq ( -5.0f32 as i32 , -5 ) ;
37
+ assert_eq ( std:: f32:: MAX as i32 , i32:: MAX ) ;
38
+ assert_eq ( std:: f32:: INFINITY as i32 , i32:: MAX ) ;
39
+ assert_eq ( std:: f32:: MAX as u32 , u32:: MAX ) ;
40
+ assert_eq ( std:: f32:: INFINITY as u32 , u32:: MAX ) ;
41
+ assert_eq ( std:: f32:: MIN as i32 , i32:: MIN ) ;
42
+ assert_eq ( std:: f32:: NEG_INFINITY as i32 , i32:: MIN ) ;
43
+ assert_eq ( std:: f32:: MIN as u32 , 0 ) ;
44
+ assert_eq ( std:: f32:: NEG_INFINITY as u32 , 0 ) ;
45
+ assert_eq ( std:: f32:: NAN as i32 , 0 ) ;
46
+ assert_eq ( std:: f32:: NAN as u32 , 0 ) ;
47
+ assert_eq ( u128:: MAX as f32 , std:: f32:: INFINITY ) ;
48
+ assert_eq ( ( u32:: MAX -127 ) as f32 as u32 , u32:: MAX ) ; // rounding loss
49
+ assert_eq ( ( u32:: MAX -128 ) as f32 as u32 , u32:: MAX -255 ) ; // rounding loss
38
50
39
51
// f64-to-int casts
40
- assert_eq ! ( 5.0f64 as u64 , 5 ) ;
41
- assert_eq ! ( -5.0f64 as u64 , 0 ) ;
42
- assert_eq ! ( 5.0f64 as i64 , 5 ) ;
43
- assert_eq ! ( -5.0f64 as i64 , -5 ) ;
44
- assert_eq ! ( std:: f64 :: MAX as i64 , i64 :: MAX ) ;
45
- assert_eq ! ( std:: f64 :: INFINITY as i64 , i64 :: MAX ) ;
46
- assert_eq ! ( std:: f64 :: MAX as u64 , u64 :: MAX ) ;
47
- assert_eq ! ( std:: f64 :: INFINITY as u64 , u64 :: MAX ) ;
48
- assert_eq ! ( std:: f64 :: MIN as i64 , i64 :: MIN ) ;
49
- assert_eq ! ( std:: f64 :: NEG_INFINITY as i64 , i64 :: MIN ) ;
50
- assert_eq ! ( std:: f64 :: MIN as u64 , 0 ) ;
51
- assert_eq ! ( std:: f64 :: NEG_INFINITY as u64 , 0 ) ;
52
- assert_eq ! ( std:: f64 :: NAN as i64 , 0 ) ;
53
- assert_eq ! ( std:: f64 :: NAN as u64 , 0 ) ;
54
- assert_eq ! ( u128 :: MAX as f64 as u128 , u128 :: MAX ) ;
55
- assert_eq ! ( ( u64 :: MAX -1023 ) as f64 as u64 , u64 :: MAX ) ; // rounding loss
56
- assert_eq ! ( ( u64 :: MAX -1024 ) as f64 as u64 , u64 :: MAX -2047 ) ; // rounding loss
52
+ assert_eq ( 5.0f64 as u64 , 5 ) ;
53
+ assert_eq ( -5.0f64 as u64 , 0 ) ;
54
+ assert_eq ( 5.0f64 as i64 , 5 ) ;
55
+ assert_eq ( -5.0f64 as i64 , -5 ) ;
56
+ assert_eq ( std:: f64:: MAX as i64 , i64:: MAX ) ;
57
+ assert_eq ( std:: f64:: INFINITY as i64 , i64:: MAX ) ;
58
+ assert_eq ( std:: f64:: MAX as u64 , u64:: MAX ) ;
59
+ assert_eq ( std:: f64:: INFINITY as u64 , u64:: MAX ) ;
60
+ assert_eq ( std:: f64:: MIN as i64 , i64:: MIN ) ;
61
+ assert_eq ( std:: f64:: NEG_INFINITY as i64 , i64:: MIN ) ;
62
+ assert_eq ( std:: f64:: MIN as u64 , 0 ) ;
63
+ assert_eq ( std:: f64:: NEG_INFINITY as u64 , 0 ) ;
64
+ assert_eq ( std:: f64:: NAN as i64 , 0 ) ;
65
+ assert_eq ( std:: f64:: NAN as u64 , 0 ) ;
66
+ assert_eq ( u128:: MAX as f64 as u128 , u128:: MAX ) ;
67
+ assert_eq ( ( u64:: MAX -1023 ) as f64 as u64 , u64:: MAX ) ; // rounding loss
68
+ assert_eq ( ( u64:: MAX -1024 ) as f64 as u64 , u64:: MAX -2047 ) ; // rounding loss
57
69
58
70
// f32 <-> f64 casts
59
- assert_eq ! ( 5.0f64 as f32 , 5.0f32 ) ;
60
- assert_eq ! ( 5.0f32 as f64 , 5.0f64 ) ;
61
- assert_eq ! ( std:: f64 :: MAX as f32 , std:: f32 :: INFINITY ) ;
62
- assert_eq ! ( std:: f64 :: MIN as f32 , std:: f32 :: NEG_INFINITY ) ;
63
- assert_eq ! ( std:: f32 :: INFINITY as f64 , std:: f64 :: INFINITY ) ;
64
- assert_eq ! ( std:: f32 :: NEG_INFINITY as f64 , std:: f64 :: NEG_INFINITY ) ;
71
+ assert_eq ( 5.0f64 as f32 , 5.0f32 ) ;
72
+ assert_eq ( 5.0f32 as f64 , 5.0f64 ) ;
73
+ assert_eq ( std:: f64:: MAX as f32 , std:: f32:: INFINITY ) ;
74
+ assert_eq ( std:: f64:: MIN as f32 , std:: f32:: NEG_INFINITY ) ;
75
+ assert_eq ( std:: f32:: INFINITY as f64 , std:: f64:: INFINITY ) ;
76
+ assert_eq ( std:: f32:: NEG_INFINITY as f64 , std:: f64:: NEG_INFINITY ) ;
65
77
66
78
// f32 min/max
67
- assert_eq ! ( ( 1.0 as f32 ) . max( -1.0 ) , 1.0 ) ;
68
- assert_eq ! ( ( 1.0 as f32 ) . min( -1.0 ) , -1.0 ) ;
69
- assert_eq ! ( std:: f32 :: NAN . min( 9.0 ) , 9.0 ) ;
70
- assert_eq ! ( std:: f32 :: NAN . max( -9.0 ) , -9.0 ) ;
71
- assert_eq ! ( ( 9.0 as f32 ) . min( std:: f32 :: NAN ) , 9.0 ) ;
72
- assert_eq ! ( ( -9.0 as f32 ) . max( std:: f32 :: NAN ) , -9.0 ) ;
79
+ assert_eq ( ( 1.0 as f32 ) . max ( -1.0 ) , 1.0 ) ;
80
+ assert_eq ( ( 1.0 as f32 ) . min ( -1.0 ) , -1.0 ) ;
81
+ assert_eq ( std:: f32:: NAN . min ( 9.0 ) , 9.0 ) ;
82
+ assert_eq ( std:: f32:: NAN . max ( -9.0 ) , -9.0 ) ;
83
+ assert_eq ( ( 9.0 as f32 ) . min ( std:: f32:: NAN ) , 9.0 ) ;
84
+ assert_eq ( ( -9.0 as f32 ) . max ( std:: f32:: NAN ) , -9.0 ) ;
73
85
74
86
// f64 min/max
75
- assert_eq ! ( ( 1.0 as f64 ) . max( -1.0 ) , 1.0 ) ;
76
- assert_eq ! ( ( 1.0 as f64 ) . min( -1.0 ) , -1.0 ) ;
77
- assert_eq ! ( std:: f64 :: NAN . min( 9.0 ) , 9.0 ) ;
78
- assert_eq ! ( std:: f64 :: NAN . max( -9.0 ) , -9.0 ) ;
79
- assert_eq ! ( ( 9.0 as f64 ) . min( std:: f64 :: NAN ) , 9.0 ) ;
80
- assert_eq ! ( ( -9.0 as f64 ) . max( std:: f64 :: NAN ) , -9.0 ) ;
87
+ assert_eq ( ( 1.0 as f64 ) . max ( -1.0 ) , 1.0 ) ;
88
+ assert_eq ( ( 1.0 as f64 ) . min ( -1.0 ) , -1.0 ) ;
89
+ assert_eq ( std:: f64:: NAN . min ( 9.0 ) , 9.0 ) ;
90
+ assert_eq ( std:: f64:: NAN . max ( -9.0 ) , -9.0 ) ;
91
+ assert_eq ( ( 9.0 as f64 ) . min ( std:: f64:: NAN ) , 9.0 ) ;
92
+ assert_eq ( ( -9.0 as f64 ) . max ( std:: f64:: NAN ) , -9.0 ) ;
81
93
82
94
// f32 copysign
83
- assert_eq ! ( 3.5_f32 . copysign( 0.42 ) , 3.5_f32 ) ;
84
- assert_eq ! ( 3.5_f32 . copysign( -0.42 ) , -3.5_f32 ) ;
85
- assert_eq ! ( ( -3.5_f32 ) . copysign( 0.42 ) , 3.5_f32 ) ;
86
- assert_eq ! ( ( -3.5_f32 ) . copysign( -0.42 ) , -3.5_f32 ) ;
95
+ assert_eq ( 3.5_f32 . copysign ( 0.42 ) , 3.5_f32 ) ;
96
+ assert_eq ( 3.5_f32 . copysign ( -0.42 ) , -3.5_f32 ) ;
97
+ assert_eq ( ( -3.5_f32 ) . copysign ( 0.42 ) , 3.5_f32 ) ;
98
+ assert_eq ( ( -3.5_f32 ) . copysign ( -0.42 ) , -3.5_f32 ) ;
87
99
assert ! ( std:: f32 :: NAN . copysign( 1.0 ) . is_nan( ) ) ;
88
100
89
101
// f64 copysign
90
- assert_eq ! ( 3.5_f64 . copysign( 0.42 ) , 3.5_f64 ) ;
91
- assert_eq ! ( 3.5_f64 . copysign( -0.42 ) , -3.5_f64 ) ;
92
- assert_eq ! ( ( -3.5_f64 ) . copysign( 0.42 ) , 3.5_f64 ) ;
93
- assert_eq ! ( ( -3.5_f64 ) . copysign( -0.42 ) , -3.5_f64 ) ;
102
+ assert_eq ( 3.5_f64 . copysign ( 0.42 ) , 3.5_f64 ) ;
103
+ assert_eq ( 3.5_f64 . copysign ( -0.42 ) , -3.5_f64 ) ;
104
+ assert_eq ( ( -3.5_f64 ) . copysign ( 0.42 ) , 3.5_f64 ) ;
105
+ assert_eq ( ( -3.5_f64 ) . copysign ( -0.42 ) , -3.5_f64 ) ;
94
106
assert ! ( std:: f64 :: NAN . copysign( 1.0 ) . is_nan( ) ) ;
95
107
}
0 commit comments