|
1 | 1 | // run-pass
|
2 | 2 |
|
3 |
| -#![feature(const_int_checked)] |
4 |
| -#![feature(const_int_euclidean)] |
5 |
| -#![feature(const_int_overflowing)] |
6 |
| -#![feature(const_int_saturating)] |
7 |
| -#![feature(const_int_wrapping)] |
8 |
| - |
9 |
| -macro_rules! assert_same_const { |
10 |
| - ($(const $ident:ident: $ty:ty = $exp:expr;)+) => { |
11 |
| - $(const $ident: $ty = $exp;)+ |
12 |
| - |
13 |
| - pub fn main() { |
14 |
| - $(assert_eq!($exp, $ident);)+ |
| 3 | +#![feature(saturating_neg)] |
| 4 | +#![feature(const_checked_int_methods)] |
| 5 | +#![feature(const_euclidean_int_methods)] |
| 6 | +#![feature(const_overflowing_int_methods)] |
| 7 | +#![feature(const_saturating_int_methods)] |
| 8 | +#![feature(const_wrapping_int_methods)] |
| 9 | + |
| 10 | +use std::i8; |
| 11 | + |
| 12 | +macro_rules! suite { |
| 13 | + ($( |
| 14 | + $fn:ident -> $ty:ty { $( $label:ident : $expr:expr, $result:expr; )* } |
| 15 | + )*) => { $( |
| 16 | + fn $fn() { |
| 17 | + $( |
| 18 | + const $label: $ty = $expr; |
| 19 | + assert_eq!($label, $result); |
| 20 | + )* |
15 | 21 | }
|
16 |
| - } |
| 22 | + )* } |
17 | 23 | }
|
18 | 24 |
|
19 |
| -assert_same_const! { |
20 |
| - // `const_int_checked` |
21 |
| - const CHECKED_ADD_I32_A: Option<i32> = 5i32.checked_add(2); |
22 |
| - const CHECKED_ADD_I8_A: Option<i8> = 127i8.checked_add(2); |
23 |
| - const CHECKED_ADD_U8_A: Option<u8> = 255u8.checked_add(2); |
24 |
| - |
25 |
| - const CHECKED_SUB_I32_A: Option<i32> = 5i32.checked_sub(2); |
26 |
| - const CHECKED_SUB_I8_A: Option<i8> = (-127 as i8).checked_sub(2); |
27 |
| - const CHECKED_SUB_U8_A: Option<u8> = 1u8.checked_sub(2); |
28 |
| - |
29 |
| - const CHECKED_MUL_I32_A: Option<i32> = 5i32.checked_mul(7777); |
30 |
| - const CHECKED_MUL_I8_A: Option<i8> = (-127 as i8).checked_mul(-99); |
31 |
| - const CHECKED_MUL_U8_A: Option<u8> = 1u8.checked_mul(3); |
32 |
| - |
33 |
| - const CHECKED_DIV_I32_A: Option<i32> = 5i32.checked_div(7777); |
34 |
| - const CHECKED_DIV_I8_A: Option<i8> = (-127 as i8).checked_div(-99); |
35 |
| - const CHECKED_DIV_U8_A: Option<u8> = 1u8.checked_div(3); |
36 |
| - |
37 |
| - const CHECKED_REM_I32_A: Option<i32> = 5i32.checked_rem(7777); |
38 |
| - const CHECKED_REM_I8_A: Option<i8> = (-127 as i8).checked_rem(-99); |
39 |
| - const CHECKED_REM_U8_A: Option<u8> = 1u8.checked_rem(3); |
40 |
| - const CHECKED_REM_U8_B: Option<u8> = 1u8.checked_rem(0); |
41 |
| - |
42 |
| - const CHECKED_NEG_I32_A: Option<i32> = 5i32.checked_neg(); |
43 |
| - const CHECKED_NEG_I8_A: Option<i8> = (-127 as i8).checked_neg(); |
44 |
| - const CHECKED_NEG_U8_A: Option<u8> = 1u8.checked_neg(); |
45 |
| - const CHECKED_NEG_U8_B: Option<u8> = u8::min_value().checked_neg(); |
46 |
| - |
47 |
| - const CHECKED_SHL_I32_A: Option<i32> = 5i32.checked_shl(77777); |
48 |
| - const CHECKED_SHL_I8_A: Option<i8> = (-127 as i8).checked_shl(2); |
49 |
| - const CHECKED_SHL_U8_A: Option<u8> = 1u8.checked_shl(8); |
50 |
| - const CHECKED_SHL_U8_B: Option<u8> = 1u8.checked_shl(0); |
51 |
| - |
52 |
| - const CHECKED_SHR_I32_A: Option<i32> = 5i32.checked_shr(77777); |
53 |
| - const CHECKED_SHR_I8_A: Option<i8> = (-127 as i8).checked_shr(2); |
54 |
| - const CHECKED_SHR_U8_A: Option<u8> = 1u8.checked_shr(8); |
55 |
| - const CHECKED_SHR_U8_B: Option<u8> = 1u8.checked_shr(0); |
56 |
| - |
57 |
| - const CHECKED_ABS_I32_A: Option<i32> = 5i32.checked_abs(); |
58 |
| - const CHECKED_ABS_I8_A: Option<i8> = (-127 as i8).checked_abs(); |
59 |
| - const CHECKED_ABS_I8_B: Option<i8> = 1i8.checked_abs(); |
60 |
| - const CHECKED_ABS_I8_C: Option<i8> = i8::min_value().checked_abs(); |
61 |
| - |
62 |
| - // `const_int_overflowing` |
63 |
| - const DIV_A: (i8, bool) = 8i8.overflowing_div(2); |
64 |
| - const DIV_B: (i8, bool) = 8i8.overflowing_div(3); |
65 |
| - const DIV_C: (i8, bool) = i8::min_value().overflowing_div(-1i8); |
66 |
| - const DIV_D: (u8, bool) = 8u8.overflowing_div(2); |
67 |
| - const DIV_E: (u8, bool) = 8u8.overflowing_div(3); |
68 |
| - |
69 |
| - const REM_A: (i8, bool) = 8i8.overflowing_rem(2); |
70 |
| - const REM_B: (i8, bool) = 8i8.overflowing_rem(3); |
71 |
| - const REM_C: (i8, bool) = i8::min_value().overflowing_rem(-1i8); |
72 |
| - const REM_D: (u8, bool) = 8u8.overflowing_rem(2); |
73 |
| - const REM_E: (u8, bool) = 8u8.overflowing_rem(3); |
74 |
| - |
75 |
| - // `const_int_saturating` |
76 |
| - const ADD_INT_U32_NO: u32 = (42 as u32).saturating_add(2); |
77 |
| - const ADD_INT_U32: u32 = u32::max_value().saturating_add(1); |
78 |
| - const ADD_INT_U128: u128 = u128::max_value().saturating_add(1); |
79 |
| - const ADD_INT_I128: i128 = i128::max_value().saturating_add(1); |
80 |
| - const ADD_INT_I128_NEG: i128 = i128::min_value().saturating_add(-1); |
81 |
| - |
82 |
| - const SUB_INT_U32_NO: u32 = (42 as u32).saturating_sub(2); |
83 |
| - const SUB_INT_U32: u32 = (1 as u32).saturating_sub(2); |
84 |
| - const SUB_INT_I32_NO: i32 = (-42 as i32).saturating_sub(2); |
85 |
| - const SUB_INT_I32_NEG: i32 = i32::min_value().saturating_sub(1); |
86 |
| - const SUB_INT_I32_POS: i32 = i32::max_value().saturating_sub(-1); |
87 |
| - const SUB_INT_U128: u128 = (0 as u128).saturating_sub(1); |
88 |
| - const SUB_INT_I128_NEG: i128 = i128::min_value().saturating_sub(1); |
89 |
| - const SUB_INT_I128_POS: i128 = i128::max_value().saturating_sub(-1); |
90 |
| - |
91 |
| - const MUL_INT_U32_NO: u32 = (42 as u32).saturating_mul(2); |
92 |
| - const MUL_INT_U32: u32 = (1 as u32).saturating_mul(2); |
93 |
| - const MUL_INT_I32_NO: i32 = (-42 as i32).saturating_mul(2); |
94 |
| - const MUL_INT_I32_NEG: i32 = i32::min_value().saturating_mul(1); |
95 |
| - const MUL_INT_I32_POS: i32 = i32::max_value().saturating_mul(2); |
96 |
| - const MUL_INT_U128: u128 = (0 as u128).saturating_mul(1); |
97 |
| - const MUL_INT_I128_NEG: i128 = i128::min_value().saturating_mul(2); |
98 |
| - const MUL_INT_I128_POS: i128 = i128::max_value().saturating_mul(2); |
99 |
| - |
100 |
| - const NEG_INT_I8: i8 = (-42i8).saturating_neg(); |
101 |
| - const NEG_INT_I8_B: i8 = i8::min_value().saturating_neg(); |
102 |
| - const NEG_INT_I32: i32 = i32::min_value().saturating_neg(); |
103 |
| - const NEG_INT_I32_B: i32 = i32::max_value().saturating_neg(); |
104 |
| - const NEG_INT_I128: i128 = i128::min_value().saturating_neg(); |
105 |
| - const NEG_INT_I128_B: i128 = i128::max_value().saturating_neg(); |
106 |
| - |
107 |
| - const ABS_INT_I8_A: i8 = 4i8.saturating_abs(); |
108 |
| - const ABS_INT_I8_B: i8 = -4i8.saturating_abs(); |
109 |
| - const ABS_INT_I8_C: i8 = i8::min_value().saturating_abs(); |
110 |
| - const ABS_INT_I32_A: i32 = 4i32.saturating_abs(); |
111 |
| - const ABS_INT_I32_B: i32 = -4i32.saturating_abs(); |
112 |
| - const ABS_INT_I32_C: i32 = i32::min_value().saturating_abs(); |
113 |
| - const ABS_INT_I128_A: i128 = 4i128.saturating_abs(); |
114 |
| - const ABS_INT_I128_B: i128 = -4i128.saturating_abs(); |
115 |
| - const ABS_INT_I128_C: i128 = i128::min_value().saturating_abs(); |
116 |
| - |
117 |
| - // `const_int_euclidean` |
118 |
| - const CHECKED_DIV_I32_A: Option<i32> = 5i32.checked_div_euclid(7777); |
119 |
| - const CHECKED_DIV_I8_A: Option<i8> = (-127 as i8).checked_div_euclid(-99); |
120 |
| - const CHECKED_DIV_I8_B: Option<i8> = (-127 as i8).checked_div_euclid(1); |
121 |
| - const CHECKED_DIV_I8_C: Option<i8> = i8::min_value().checked_div_euclid(-1); |
122 |
| - const CHECKED_DIV_U8_A: Option<u8> = 1u8.checked_div_euclid(3); |
123 |
| - |
124 |
| - const CHECKED_REM_I32_A: Option<i32> = 5i32.checked_rem_euclid(7777); |
125 |
| - const CHECKED_REM_I8_A: Option<i8> = (-127 as i8).checked_rem_euclid(-99); |
126 |
| - const CHECKED_REM_I8_B: Option<i8> = (-127 as i8).checked_rem_euclid(0); |
127 |
| - const CHECKED_REM_I8_C: Option<i8> = i8::min_value().checked_rem_euclid(-1); |
128 |
| - const CHECKED_REM_U8_A: Option<u8> = 1u8.checked_rem_euclid(3); |
129 |
| - |
130 |
| - const WRAPPING_DIV_I32_A: i32 = 5i32.wrapping_div_euclid(7777); |
131 |
| - const WRAPPING_DIV_I8_A: i8 = (-127 as i8).wrapping_div_euclid(-99); |
132 |
| - const WRAPPING_DIV_I8_B: i8 = (-127 as i8).wrapping_div_euclid(1); |
133 |
| - const WRAPPING_DIV_I8_C: i8 = i8::min_value().wrapping_div_euclid(-1); |
134 |
| - const WRAPPING_DIV_U8_A: u8 = 1u8.wrapping_div_euclid(3); |
135 |
| - |
136 |
| - const WRAPPING_REM_I32_A: i32 = 5i32.wrapping_rem_euclid(7777); |
137 |
| - const WRAPPING_REM_I8_A: i8 = (-127 as i8).wrapping_rem_euclid(-99); |
138 |
| - const WRAPPING_REM_I8_B: i8 = (-127 as i8).wrapping_rem_euclid(1); |
139 |
| - const WRAPPING_REM_I8_C: i8 = i8::min_value().wrapping_rem_euclid(-1); |
140 |
| - const WRAPPING_REM_U8_A: u8 = 1u8.wrapping_rem_euclid(3); |
141 |
| - |
142 |
| - const OVERFLOWING_DIV_I32_A: (i32, bool) = 5i32.overflowing_div_euclid(7777); |
143 |
| - const OVERFLOWING_DIV_I8_A: (i8, bool) = (-127 as i8).overflowing_div_euclid(-99); |
144 |
| - const OVERFLOWING_DIV_I8_B: (i8, bool) = (-127 as i8).overflowing_div_euclid(1); |
145 |
| - const OVERFLOWING_DIV_I8_C: (i8, bool) = i8::min_value().overflowing_div_euclid(-1); |
146 |
| - const OVERFLOWING_DIV_U8_A: (u8, bool) = 1u8.overflowing_div_euclid(3); |
147 |
| - |
148 |
| - const OVERFLOWING_REM_I32_A: (i32, bool) = 5i32.overflowing_rem_euclid(7777); |
149 |
| - const OVERFLOWING_REM_I8_A: (i8, bool) = (-127 as i8).overflowing_rem_euclid(-99); |
150 |
| - const OVERFLOWING_REM_I8_B: (i8, bool) = (-127 as i8).overflowing_rem_euclid(1); |
151 |
| - const OVERFLOWING_REM_I8_C: (i8, bool) = i8::min_value().overflowing_rem_euclid(-1); |
152 |
| - const OVERFLOWING_REM_U8_A: (u8, bool) = 1u8.overflowing_rem_euclid(3); |
153 |
| - |
154 |
| - // `const_int_wrapping` |
155 |
| - const DIV_A: i8 = 8i8.wrapping_div(2); |
156 |
| - const DIV_B: i8 = 8i8.wrapping_div(3); |
157 |
| - const DIV_C: i8 = i8::min_value().wrapping_div(-1i8); |
158 |
| - const DIV_D: u8 = 8u8.wrapping_div(2); |
159 |
| - const DIV_E: u8 = 8u8.wrapping_div(3); |
160 |
| - |
161 |
| - const REM_A: i8 = 8i8.wrapping_rem(2); |
162 |
| - const REM_B: i8 = 8i8.wrapping_rem(3); |
163 |
| - const REM_C: i8 = i8::min_value().wrapping_rem(-1i8); |
164 |
| - const REM_D: u8 = 8u8.wrapping_rem(2); |
165 |
| - const REM_E: u8 = 8u8.wrapping_rem(3); |
| 25 | +suite!( |
| 26 | + checked -> Option<i8> { |
| 27 | + // `const_checked_int_methods` |
| 28 | + C1: 5i8.checked_add(2), Some(7); |
| 29 | + C2: 127i8.checked_add(2), None; |
| 30 | + |
| 31 | + C3: 5i8.checked_sub(2), Some(3); |
| 32 | + C4: (-127i8).checked_sub(2), None; |
| 33 | + |
| 34 | + C5: 1i8.checked_mul(3), Some(3); |
| 35 | + C6: 5i8.checked_mul(122), None; |
| 36 | + C7: (-127i8).checked_mul(-99), None; |
| 37 | + |
| 38 | + C8: (i8::min_value() + 1).checked_div(-1), Some(127); |
| 39 | + C9: i8::min_value().checked_div(-1), None; |
| 40 | + C10: 1i8.checked_div(0), None; |
| 41 | + |
| 42 | + C11: 5i8.checked_rem(2), Some(1); |
| 43 | + C12: 5i8.checked_rem(0), None; |
| 44 | + C13: i8::MIN.checked_rem(-1), None; |
| 45 | + |
| 46 | + C14: 5i8.checked_neg(), Some(-5); |
| 47 | + C15: i8::MIN.checked_neg(), None; |
| 48 | + |
| 49 | + C16: 0x1i8.checked_shl(4), Some(0x10); |
| 50 | + C17: 0x1i8.checked_shl(129), None; |
| 51 | + |
| 52 | + C18: 0x10i8.checked_shr(4), Some(0x1); |
| 53 | + C19: 0x10i8.checked_shr(128), None; |
| 54 | + |
| 55 | + |
| 56 | + C20: (-5i8).checked_abs(), Some(5); |
| 57 | + C21: i8::MIN.checked_abs(), None; |
| 58 | + |
| 59 | + // `const_euclidean_int_methods` |
| 60 | + C22: (i8::min_value() + 1).checked_div_euclid(-1), Some(127); |
| 61 | + C23: i8::min_value().checked_div_euclid(-1), None; |
| 62 | + C24: (1i8).checked_div_euclid(0), None; |
| 63 | + |
| 64 | + C25: 5i8.checked_rem_euclid(2), Some(1); |
| 65 | + C26: 5i8.checked_rem_euclid(0), None; |
| 66 | + C27: i8::MIN.checked_rem_euclid(-1), None; |
| 67 | + } |
| 68 | + |
| 69 | + saturating_and_wrapping -> i8 { |
| 70 | + // `const_saturating_int_methods` |
| 71 | + C28: 100i8.saturating_add(1), 101; |
| 72 | + C29: i8::max_value().saturating_add(100), i8::max_value(); |
| 73 | + C30: i8::min_value().saturating_add(-1), i8::min_value(); |
| 74 | + |
| 75 | + C31: 100i8.saturating_sub(127), -27; |
| 76 | + C32: i8::min_value().saturating_sub(100), i8::min_value(); |
| 77 | + C33: i8::max_value().saturating_sub(-1), i8::max_value(); |
| 78 | + |
| 79 | + C34: 10i8.saturating_mul(12), 120; |
| 80 | + C35: i8::MAX.saturating_mul(10), i8::MAX; |
| 81 | + C36: i8::MIN.saturating_mul(10), i8::MIN; |
| 82 | + |
| 83 | + C37: 100i8.saturating_neg(), -100; |
| 84 | + C38: (-100i8).saturating_neg(), 100; |
| 85 | + C39: i8::min_value().saturating_neg(), i8::max_value(); |
| 86 | + C40: i8::max_value().saturating_neg(), i8::min_value() + 1; |
| 87 | + |
| 88 | + C57: 100i8.saturating_abs(), 100; |
| 89 | + C58: (-100i8).saturating_abs(), 100; |
| 90 | + C59: i8::min_value().saturating_abs(), i8::max_value(); |
| 91 | + C60: (i8::min_value() + 1).saturating_abs(), i8::max_value(); |
| 92 | + |
| 93 | + // `const_wrapping_int_methods` |
| 94 | + C41: 100i8.wrapping_div(10), 10; |
| 95 | + C42: (-128i8).wrapping_div(-1), -128; |
| 96 | + |
| 97 | + C43: 100i8.wrapping_rem(10), 0; |
| 98 | + C44: (-128i8).wrapping_rem(-1), 0; |
| 99 | + |
| 100 | + // `const_euclidean_int_methods` |
| 101 | + C45: 100i8.wrapping_div_euclid(10), 10; |
| 102 | + C46: (-128i8).wrapping_div_euclid(-1), -128; |
| 103 | + |
| 104 | + C47: 100i8.wrapping_rem_euclid(10), 0; |
| 105 | + C48: (-128i8).wrapping_rem_euclid(-1), 0; |
| 106 | + } |
| 107 | + |
| 108 | + overflowing -> (i8, bool) { |
| 109 | + // `const_overflowing_int_methods` |
| 110 | + C49: 5i8.overflowing_div(2), (2, false); |
| 111 | + C50: i8::MIN.overflowing_div(-1), (i8::MIN, true); |
| 112 | + |
| 113 | + C51: 5i8.overflowing_rem(2), (1, false); |
| 114 | + C52: i8::MIN.overflowing_rem(-1), (0, true); |
| 115 | + |
| 116 | + // `const_euclidean_int_methods` |
| 117 | + C53: 5i8.overflowing_div_euclid(2), (2, false); |
| 118 | + C54: i8::MIN.overflowing_div_euclid(-1), (i8::MIN, true); |
| 119 | + |
| 120 | + C55: 5i8.overflowing_rem_euclid(2), (1, false); |
| 121 | + C56: i8::MIN.overflowing_rem_euclid(-1), (0, true); |
| 122 | + |
| 123 | + } |
| 124 | +); |
| 125 | + |
| 126 | +fn main() { |
| 127 | + checked(); |
| 128 | + saturating_and_wrapping(); |
| 129 | + overflowing(); |
166 | 130 | }
|
0 commit comments