|
| 1 | +// run-pass |
| 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);)+ |
| 15 | + } |
| 16 | + } |
| 17 | +} |
| 18 | + |
| 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); |
| 166 | +} |
0 commit comments