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