]> git.lizzy.rs Git - rust.git/blob - tests/ui/half-open-range-patterns/half-open-range-pats-semantics.rs
Rollup merge of #106715 - BoxyUwU:new_solver_triagebot, r=lcnr
[rust.git] / tests / ui / half-open-range-patterns / half-open-range-pats-semantics.rs
1 // run-pass
2
3 // Test half-open range patterns against their expression equivalents
4 // via `.contains(...)` and make sure the dynamic semantics match.
5
6 #![feature(exclusive_range_pattern)]
7 #![allow(illegal_floating_point_literal_pattern)]
8 #![allow(unreachable_patterns)]
9
10 macro_rules! yes {
11     ($scrutinee:expr, $($t:tt)+) => {
12         {
13             let m = match $scrutinee { $($t)+ => true, _ => false, };
14             let c = ($($t)+).contains(&$scrutinee);
15             assert_eq!(m, c);
16             m
17         }
18     }
19 }
20
21 fn range_to_inclusive() {
22     // `..=X` (`RangeToInclusive`-equivalent):
23     //---------------------------------------
24
25     // u8; `..=X`
26     assert!(yes!(u8::MIN, ..=u8::MIN));
27     assert!(yes!(u8::MIN, ..=5));
28     assert!(yes!(5u8, ..=5));
29     assert!(!yes!(6u8, ..=5));
30
31     // i16; `..=X`
32     assert!(yes!(i16::MIN, ..=i16::MIN));
33     assert!(yes!(i16::MIN, ..=0));
34     assert!(yes!(i16::MIN, ..=-5));
35     assert!(yes!(-5, ..=-5));
36     assert!(!yes!(-4, ..=-5));
37
38     // char; `..=X`
39     assert!(yes!('\u{0}', ..='\u{0}'));
40     assert!(yes!('\u{0}', ..='a'));
41     assert!(yes!('a', ..='a'));
42     assert!(!yes!('b', ..='a'));
43
44     // f32; `..=X`
45     assert!(yes!(f32::NEG_INFINITY, ..=f32::NEG_INFINITY));
46     assert!(yes!(f32::NEG_INFINITY, ..=1.0f32));
47     assert!(yes!(1.5f32, ..=1.5f32));
48     assert!(!yes!(1.6f32, ..=-1.5f32));
49
50     // f64; `..=X`
51     assert!(yes!(f64::NEG_INFINITY, ..=f64::NEG_INFINITY));
52     assert!(yes!(f64::NEG_INFINITY, ..=1.0f64));
53     assert!(yes!(1.5f64, ..=1.5f64));
54     assert!(!yes!(1.6f64, ..=-1.5f64));
55 }
56
57 fn range_to() {
58     // `..X` (`RangeTo`-equivalent):
59     //-----------------------------
60
61     // u8; `..X`
62     assert!(yes!(0u8, ..1));
63     assert!(yes!(0u8, ..5));
64     assert!(!yes!(5u8, ..5));
65     assert!(!yes!(6u8, ..5));
66
67     // u8; `..X`
68     const NU8: u8 = u8::MIN + 1;
69     assert!(yes!(u8::MIN, ..NU8));
70     assert!(yes!(0u8, ..5));
71     assert!(!yes!(5u8, ..5));
72     assert!(!yes!(6u8, ..5));
73
74     // i16; `..X`
75     const NI16: i16 = i16::MIN + 1;
76     assert!(yes!(i16::MIN, ..NI16));
77     assert!(yes!(i16::MIN, ..5));
78     assert!(yes!(-6, ..-5));
79     assert!(!yes!(-5, ..-5));
80
81     // char; `..X`
82     assert!(yes!('\u{0}', ..'\u{1}'));
83     assert!(yes!('\u{0}', ..'a'));
84     assert!(yes!('a', ..'b'));
85     assert!(!yes!('a', ..'a'));
86     assert!(!yes!('b', ..'a'));
87
88     // f32; `..X`
89     assert!(yes!(f32::NEG_INFINITY, ..1.0f32));
90     assert!(!yes!(1.5f32, ..1.5f32));
91     const E32: f32 = 1.5f32 + f32::EPSILON;
92     assert!(yes!(1.5f32, ..E32));
93     assert!(!yes!(1.6f32, ..1.5f32));
94
95     // f64; `..X`
96     assert!(yes!(f64::NEG_INFINITY, ..1.0f64));
97     assert!(!yes!(1.5f64, ..1.5f64));
98     const E64: f64 = 1.5f64 + f64::EPSILON;
99     assert!(yes!(1.5f64, ..E64));
100     assert!(!yes!(1.6f64, ..1.5f64));
101 }
102
103 fn range_from() {
104     // `X..` (`RangeFrom`-equivalent):
105     //--------------------------------
106
107     // u8; `X..`
108     assert!(yes!(u8::MIN, u8::MIN..));
109     assert!(yes!(u8::MAX, u8::MIN..));
110     assert!(!yes!(u8::MIN, 1..));
111     assert!(!yes!(4, 5..));
112     assert!(yes!(5, 5..));
113     assert!(yes!(6, 5..));
114     assert!(yes!(u8::MAX, u8::MAX..));
115
116     // i16; `X..`
117     assert!(yes!(i16::MIN, i16::MIN..));
118     assert!(yes!(i16::MAX, i16::MIN..));
119     const NI16: i16 = i16::MIN + 1;
120     assert!(!yes!(i16::MIN, NI16..));
121     assert!(!yes!(-4, 5..));
122     assert!(yes!(-4, -4..));
123     assert!(yes!(-3, -4..));
124     assert!(yes!(i16::MAX, i16::MAX..));
125
126     // char; `X..`
127     assert!(yes!('\u{0}', '\u{0}'..));
128     assert!(yes!(core::char::MAX, '\u{0}'..));
129     assert!(yes!('a', 'a'..));
130     assert!(yes!('b', 'a'..));
131     assert!(!yes!('a', 'b'..));
132     assert!(yes!(core::char::MAX, core::char::MAX..));
133
134     // f32; `X..`
135     assert!(yes!(f32::NEG_INFINITY, f32::NEG_INFINITY..));
136     assert!(yes!(f32::INFINITY, f32::NEG_INFINITY..));
137     assert!(!yes!(f32::NEG_INFINITY, 1.0f32..));
138     assert!(yes!(f32::INFINITY, 1.0f32..));
139     assert!(!yes!(1.0f32 - f32::EPSILON, 1.0f32..));
140     assert!(yes!(1.0f32, 1.0f32..));
141     assert!(yes!(f32::INFINITY, 1.0f32..));
142     assert!(yes!(f32::INFINITY, f32::INFINITY..));
143
144     // f64; `X..`
145     assert!(yes!(f64::NEG_INFINITY, f64::NEG_INFINITY..));
146     assert!(yes!(f64::INFINITY, f64::NEG_INFINITY..));
147     assert!(!yes!(f64::NEG_INFINITY, 1.0f64..));
148     assert!(yes!(f64::INFINITY, 1.0f64..));
149     assert!(!yes!(1.0f64 - f64::EPSILON, 1.0f64..));
150     assert!(yes!(1.0f64, 1.0f64..));
151     assert!(yes!(f64::INFINITY, 1.0f64..));
152     assert!(yes!(f64::INFINITY, f64::INFINITY..));
153 }
154
155 fn main() {
156     range_to_inclusive();
157     range_to();
158     range_from();
159 }