]> git.lizzy.rs Git - rust.git/blob - src/test/ui/consts/const-int-arithmetic.rs
9b2e30961aae601efce00c830a0d5038bd0e239d
[rust.git] / src / test / ui / consts / const-int-arithmetic.rs
1 // run-pass
2
3 #![feature(const_checked_int_methods)]
4 #![feature(const_euclidean_int_methods)]
5 #![feature(const_overflowing_int_methods)]
6 #![feature(const_wrapping_int_methods)]
7
8 use std::{i8, i128};
9
10 macro_rules! suite {
11     ($(
12         $fn:ident -> $ty:ty { $( $label:ident : $expr:expr, $result:expr; )* }
13     )*) => { $(
14         fn $fn() {
15             $(
16                 const $label: $ty = $expr;
17                 assert_eq!($label, $result);
18             )*
19         }
20     )* }
21 }
22
23 suite!(
24     checked -> Option<i8> {
25         // `const_checked_int_methods`
26         C1: 5i8.checked_add(2), Some(7);
27         C2: 127i8.checked_add(2), None;
28
29         C3: 5i8.checked_sub(2), Some(3);
30         C4: (-127i8).checked_sub(2), None;
31
32         C5: 1i8.checked_mul(3), Some(3);
33         C6: 5i8.checked_mul(122), None;
34         C7: (-127i8).checked_mul(-99), None;
35
36         C8: (i8::MIN + 1).checked_div(-1), Some(127);
37         C9: i8::MIN.checked_div(-1), None;
38         C10: 1i8.checked_div(0), None;
39
40         C11: 5i8.checked_rem(2), Some(1);
41         C12: 5i8.checked_rem(0), None;
42         C13: i8::MIN.checked_rem(-1), None;
43
44         C14: 5i8.checked_neg(), Some(-5);
45         C15: i8::MIN.checked_neg(), None;
46
47         C16: 0x1i8.checked_shl(4), Some(0x10);
48         C17: 0x1i8.checked_shl(129), None;
49
50         C18: 0x10i8.checked_shr(4), Some(0x1);
51         C19: 0x10i8.checked_shr(128), None;
52
53
54         C20: (-5i8).checked_abs(), Some(5);
55         C21: i8::MIN.checked_abs(), None;
56
57         // `const_euclidean_int_methods`
58         C22: (i8::MIN + 1).checked_div_euclid(-1), Some(127);
59         C23: i8::MIN.checked_div_euclid(-1), None;
60         C24: (1i8).checked_div_euclid(0), None;
61
62         C25: 5i8.checked_rem_euclid(2), Some(1);
63         C26: 5i8.checked_rem_euclid(0), None;
64         C27: i8::MIN.checked_rem_euclid(-1), None;
65     }
66     checked_i128 -> Option<i128> {
67         CHK_ADD_I128: i128::MAX.checked_add(1), None;
68         CHK_MUL_I128: i128::MIN.checked_mul(-1), None;
69     }
70
71     saturating_and_wrapping -> i8 {
72         // `const_saturating_int_methods`
73         C28: 100i8.saturating_add(1), 101;
74         C29: i8::MAX.saturating_add(100), i8::MAX;
75         C30: i8::MIN.saturating_add(-1), i8::MIN;
76
77         C31: 100i8.saturating_sub(127), -27;
78         C32: i8::MIN.saturating_sub(100), i8::MIN;
79         C33: i8::MAX.saturating_sub(-1), i8::MAX;
80
81         C34: 10i8.saturating_mul(12), 120;
82         C35: i8::MAX.saturating_mul(10), i8::MAX;
83         C36: i8::MIN.saturating_mul(10), i8::MIN;
84
85         C37: 100i8.saturating_neg(), -100;
86         C38: (-100i8).saturating_neg(), 100;
87         C39: i8::MIN.saturating_neg(), i8::MAX;
88         C40: i8::MAX.saturating_neg(), i8::MIN + 1;
89
90         C57: 100i8.saturating_abs(), 100;
91         C58: (-100i8).saturating_abs(), 100;
92         C59: i8::MIN.saturating_abs(), i8::MAX;
93         C60: (i8::MIN + 1).saturating_abs(), i8::MAX;
94
95         // `const_wrapping_int_methods`
96         C41: 100i8.wrapping_div(10), 10;
97         C42: (-128i8).wrapping_div(-1), -128;
98
99         C43: 100i8.wrapping_rem(10), 0;
100         C44: (-128i8).wrapping_rem(-1), 0;
101
102         // `const_euclidean_int_methods`
103         C45: 100i8.wrapping_div_euclid(10), 10;
104         C46: (-128i8).wrapping_div_euclid(-1), -128;
105
106         C47: 100i8.wrapping_rem_euclid(10), 0;
107         C48: (-128i8).wrapping_rem_euclid(-1), 0;
108     }
109     saturating_and_wrapping_i128 -> i128 {
110         SAT_ADD_I128: i128::MAX.saturating_add(1), i128::MAX;
111         SAT_MUL_I128: i128::MAX.saturating_mul(2), i128::MAX;
112
113         WRP_ADD_I128: i128::MAX.wrapping_add(1), i128::MIN;
114         WRP_MUL_I128: i128::MAX.wrapping_mul(3), i128::MAX-2;
115     }
116
117     overflowing -> (i8, bool) {
118         // `const_overflowing_int_methods`
119         C49: 5i8.overflowing_div(2), (2, false);
120         C50: i8::MIN.overflowing_div(-1), (i8::MIN, true);
121
122         C51: 5i8.overflowing_rem(2), (1, false);
123         C52: i8::MIN.overflowing_rem(-1), (0, true);
124
125         // `const_euclidean_int_methods`
126         C53: 5i8.overflowing_div_euclid(2), (2, false);
127         C54: i8::MIN.overflowing_div_euclid(-1), (i8::MIN, true);
128
129         C55: 5i8.overflowing_rem_euclid(2), (1, false);
130         C56: i8::MIN.overflowing_rem_euclid(-1), (0, true);
131     }
132     overflowing_i128 -> (i128, bool) {
133         OFL_ADD_I128: i128::MAX.overflowing_add(1), (i128::MIN, true);
134         OFL_MUL_I128: i128::MAX.overflowing_mul(3), (i128::MAX-2, true);
135     }
136 );
137
138 fn main() {
139    checked();
140    checked_i128();
141    saturating_and_wrapping();
142    saturating_and_wrapping_i128();
143    overflowing();
144    overflowing_i128();
145 }