@@ -116,29 +116,49 @@ fn main() {
116
116
i64:: MAX as u64 ;
117
117
i128:: MAX as u128 ;
118
118
119
- ( -1i8 ) . abs ( ) as u8 ;
120
- ( -1i16 ) . abs ( ) as u16 ;
121
- ( -1i32 ) . abs ( ) as u32 ;
119
+ ( -1i8 ) . saturating_abs ( ) as u8 ;
120
+ // abs() can return a negative value in release builds
121
+ ( i8:: MIN ) . abs ( ) as u8 ;
122
+ //~^ ERROR: casting `i8` to `u8` may lose the sign of the value
123
+ ( -1i16 ) . saturating_abs ( ) as u16 ;
124
+ ( -1i32 ) . saturating_abs ( ) as u32 ;
122
125
( -1i64 ) . abs ( ) as u64 ;
123
126
( -1isize ) . abs ( ) as usize ;
124
127
125
128
( -1i8 ) . checked_abs ( ) . unwrap ( ) as u8 ;
129
+ ( i8:: MIN ) . checked_abs ( ) . unwrap ( ) as u8 ;
126
130
( -1i16 ) . checked_abs ( ) . unwrap ( ) as u16 ;
127
131
( -1i32 ) . checked_abs ( ) . unwrap ( ) as u32 ;
128
- ( -1i64 ) . checked_abs ( ) . unwrap ( ) as u64 ;
129
- ( -1isize ) . checked_abs ( ) . unwrap ( ) as usize ;
132
+ // SAFETY: -1 is a small number which will always return Some
133
+ ( unsafe { ( -1i64 ) . checked_abs ( ) . unwrap_unchecked ( ) } ) as u64 ;
134
+ ( -1isize ) . checked_abs ( ) . expect ( "-1 is a small number" ) as usize ;
135
+
136
+ ( -1i8 ) . isqrt ( ) as u8 ;
137
+ ( i8:: MIN ) . isqrt ( ) as u8 ;
138
+ ( -1i16 ) . isqrt ( ) as u16 ;
139
+ ( -1i32 ) . isqrt ( ) as u32 ;
140
+ ( -1i64 ) . isqrt ( ) as u64 ;
141
+ ( -1isize ) . isqrt ( ) as usize ;
142
+
143
+ ( -1i8 ) . checked_isqrt ( ) . unwrap ( ) as u8 ;
144
+ ( i8:: MIN ) . checked_isqrt ( ) . unwrap ( ) as u8 ;
145
+ ( -1i16 ) . checked_isqrt ( ) . unwrap ( ) as u16 ;
146
+ ( -1i32 ) . checked_isqrt ( ) . unwrap ( ) as u32 ;
147
+ // SAFETY: -1 is a small number which will always return Some
148
+ ( unsafe { ( -1i64 ) . checked_isqrt ( ) . unwrap_unchecked ( ) } ) as u64 ;
149
+ ( -1isize ) . checked_isqrt ( ) . expect ( "-1 is a small number" ) as usize ;
130
150
131
151
( -1i8 ) . rem_euclid ( 1i8 ) as u8 ;
132
- ( -1i8 ) . rem_euclid ( 1i8 ) as u16 ;
133
- ( -1i16 ) . rem_euclid ( 1i16 ) as u16 ;
152
+ ( -1i8 ) . wrapping_rem_euclid ( 1i8 ) . unwrap ( ) as u16 ;
153
+ ( -1i16 ) . rem_euclid ( 1i16 ) . unwrap ( ) as u16 ;
134
154
( -1i16 ) . rem_euclid ( 1i16 ) as u32 ;
135
155
( -1i32 ) . rem_euclid ( 1i32 ) as u32 ;
136
156
( -1i32 ) . rem_euclid ( 1i32 ) as u64 ;
137
157
( -1i64 ) . rem_euclid ( 1i64 ) as u64 ;
138
158
( -1i64 ) . rem_euclid ( 1i64 ) as u128 ;
139
159
( -1isize ) . rem_euclid ( 1isize ) as usize ;
140
160
( 1i8 ) . rem_euclid ( -1i8 ) as u8 ;
141
- ( 1i8 ) . rem_euclid ( -1i8 ) as u16 ;
161
+ ( 1i8 ) . wrapping_rem_euclid ( -1i8 ) as u16 ;
142
162
( 1i16 ) . rem_euclid ( -1i16 ) as u16 ;
143
163
( 1i16 ) . rem_euclid ( -1i16 ) as u32 ;
144
164
( 1i32 ) . rem_euclid ( -1i32 ) as u32 ;
@@ -371,14 +391,25 @@ fn issue11642() {
371
391
let x = x as i32 ;
372
392
( x * x) as u32 ;
373
393
x. pow ( 2 ) as u32 ;
374
- ( -2_i32 ) . pow ( 2 ) as u32
394
+ ( -2_i32 ) . saturating_pow ( 2 ) as u32
375
395
}
376
396
377
397
let _a = |x : i32 | -> u32 { ( x * x * x * x) as u32 } ;
378
398
399
+ ( 2_i32 ) . checked_pow ( 3 ) . unwrap ( ) as u32 ;
379
400
( -2_i32 ) . pow ( 3 ) as u32 ;
380
401
//~^ ERROR: casting `i32` to `u32` may lose the sign of the value
381
402
403
+ ( 2_i32 % 1 ) as u32 ;
404
+ ( 2_i32 % -1 ) as u32 ;
405
+ ( -2_i32 % 1 ) as u32 ;
406
+ //~^ ERROR: casting `i32` to `u32` may lose the sign of the value
407
+ ( -2_i32 % -1 ) as u32 ;
408
+ //~^ ERROR: casting `i32` to `u32` may lose the sign of the value
409
+ ( 2_i32 >> 1 ) as u32 ;
410
+ ( -2_i32 >> 1 ) as u32 ;
411
+ //~^ ERROR: casting `i32` to `u32` may lose the sign of the value
412
+
382
413
let x: i32 = 10 ;
383
414
( x * x) as u32 ;
384
415
( x * x * x) as u32 ;
@@ -387,12 +418,22 @@ fn issue11642() {
387
418
let y: i16 = -2 ;
388
419
( y * y * y * y * -2 ) as u16 ;
389
420
//~^ ERROR: casting `i16` to `u16` may lose the sign of the value
390
- ( y * y * y * y * 2 ) as u16 ;
391
- ( y * y * y * 2 ) as u16 ;
421
+ ( y * y * y / y * 2 ) as u16 ;
422
+ ( y * y / y * 2 ) as u16 ;
392
423
//~^ ERROR: casting `i16` to `u16` may lose the sign of the value
393
- ( y * y * y * -2 ) as u16 ;
424
+ ( y / y * y * -2 ) as u16 ;
394
425
//~^ ERROR: casting `i16` to `u16` may lose the sign of the value
395
426
427
+ ( y + y + y + -2 ) as u16 ;
428
+ //~^ ERROR: casting `i16` to `u16` may lose the sign of the value
429
+ ( y + y + y + 2 ) as u16 ;
430
+ //~^ ERROR: casting `i16` to `u16` may lose the sign of the value
431
+
432
+ let z: i16 = 2 ;
433
+ ( z + -2 ) as u16 ;
434
+ //~^ ERROR: casting `i16` to `u16` may lose the sign of the value
435
+ ( z + z + 2 ) as u16 ;
436
+
396
437
fn foo ( a : i32 , b : i32 , c : i32 ) -> u32 {
397
438
( a * a * b * b * c * c) as u32 ;
398
439
( a * b * c) as u32 ;
@@ -409,8 +450,9 @@ fn issue11642() {
409
450
//~^ ERROR: casting `i32` to `u32` may lose the sign of the value
410
451
( a / b + b * c) as u32 ;
411
452
//~^ ERROR: casting `i32` to `u32` may lose the sign of the value
412
- a. pow ( 3 ) as u32 ;
453
+ a. saturating_pow ( 3 ) as u32 ;
413
454
//~^ ERROR: casting `i32` to `u32` may lose the sign of the value
414
455
( a. abs ( ) * b. pow ( 2 ) / c. abs ( ) ) as u32
456
+ //~^ ERROR: casting `i32` to `u32` may lose the sign of the value
415
457
}
416
458
}
0 commit comments