| 
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