3 // Test half-open range patterns against their expression equivalents
4 // via `.contains(...)` and make sure the dynamic semantics match.
6 #![feature(half_open_range_patterns)]
7 #![feature(exclusive_range_pattern)]
8 #![allow(illegal_floating_point_literal_pattern)]
9 #![allow(unreachable_patterns)]
12 ($scrutinee
:expr
, $
($t
:tt
)+) => {
14 let m
= match $scrutinee { $($t)+ => true, _ => false, }
;
15 let c
= ($
($t
)+).contains(&$scrutinee
);
22 fn range_to_inclusive() {
23 // `..=X` (`RangeToInclusive`-equivalent):
24 //---------------------------------------
27 assert
!(yes
!(u8::MIN
, ..=u8::MIN
));
28 assert
!(yes
!(u8::MIN
, ..=5));
29 assert
!(yes
!(5u8, ..=5));
30 assert
!(!yes
!(6u8, ..=5));
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));
40 assert
!(yes
!('
\u{0}'
, ..='
\u{0}'
));
41 assert
!(yes
!('
\u{0}'
, ..='a'
));
42 assert
!(yes
!('a'
, ..='a'
));
43 assert
!(!yes
!('b'
, ..='a'
));
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));
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));
59 // `..X` (`RangeTo`-equivalent):
60 //-----------------------------
63 assert
!(yes
!(0u8, ..1));
64 assert
!(yes
!(0u8, ..5));
65 assert
!(!yes
!(5u8, ..5));
66 assert
!(!yes
!(6u8, ..5));
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));
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));
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'
));
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));
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));
105 // `X..` (`RangeFrom`-equivalent):
106 //--------------------------------
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
..));
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
..));
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
..));
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
..));
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
..));
157 range_to_inclusive();