Skip to content

Commit 17e632d

Browse files
committed
or_patterns: test default binding modes
1 parent 29437e5 commit 17e632d

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// Test that or-patterns are pass-through with respect to default binding modes.
2+
3+
// check-pass
4+
5+
#![feature(or_patterns)]
6+
#![allow(irrefutable_let_patterns)]
7+
8+
fn main() {
9+
// A regression test for a mistake we made at one point:
10+
match &1 {
11+
e @ &(1..=2) | e @ &(3..=4) => {}
12+
_ => {}
13+
}
14+
15+
match &0 {
16+
0 | &1 => {}
17+
_ => {}
18+
}
19+
20+
type R<'a> = &'a Result<u8, u8>;
21+
22+
let res: R<'_> = &Ok(0);
23+
24+
match res {
25+
// Alternatives propagate expected type / binding mode independently.
26+
Ok(mut x) | &Err(mut x) => drop::<u8>(x),
27+
}
28+
match res {
29+
&(Ok(x) | Err(x)) => drop::<u8>(x),
30+
}
31+
match res {
32+
Ok(x) | Err(x) => drop::<&u8>(x),
33+
}
34+
if let Ok(mut x) | &Err(mut x) = res {
35+
drop::<u8>(x);
36+
}
37+
if let &(Ok(x) | Err(x)) = res {
38+
drop::<u8>(x);
39+
}
40+
let Ok(mut x) | &Err(mut x) = res;
41+
drop::<u8>(x);
42+
let &(Ok(x) | Err(x)) = res;
43+
drop::<u8>(x);
44+
let Ok(x) | Err(x) = res;
45+
drop::<&u8>(x);
46+
for Ok(mut x) | &Err(mut x) in std::iter::once(res) {
47+
drop::<u8>(x);
48+
}
49+
for &(Ok(x) | Err(x)) in std::iter::once(res) {
50+
drop::<u8>(x);
51+
}
52+
for Ok(x) | Err(x) in std::iter::once(res) {
53+
drop::<&u8>(x);
54+
}
55+
fn f1((Ok(mut x) | &Err(mut x)): R<'_>) {
56+
drop::<u8>(x);
57+
}
58+
fn f2(&(Ok(x) | Err(x)): R<'_>) {
59+
drop::<u8>(x);
60+
}
61+
fn f3((Ok(x) | Err(x)): R<'_>) {
62+
drop::<&u8>(x);
63+
}
64+
65+
// Wrap inside another type (a product for a simplity with irrefutable contexts).
66+
#[derive(Copy, Clone)]
67+
struct Wrap<T>(T);
68+
let wres = Wrap(res);
69+
70+
match wres {
71+
Wrap(Ok(mut x) | &Err(mut x)) => drop::<u8>(x),
72+
}
73+
match wres {
74+
Wrap(&(Ok(x) | Err(x))) => drop::<u8>(x),
75+
}
76+
match wres {
77+
Wrap(Ok(x) | Err(x)) => drop::<&u8>(x),
78+
}
79+
if let Wrap(Ok(mut x) | &Err(mut x)) = wres {
80+
drop::<u8>(x);
81+
}
82+
if let Wrap(&(Ok(x) | Err(x))) = wres {
83+
drop::<u8>(x);
84+
}
85+
if let Wrap(Ok(x) | Err(x)) = wres {
86+
drop::<&u8>(x);
87+
}
88+
let Wrap(Ok(mut x) | &Err(mut x)) = wres;
89+
drop::<u8>(x);
90+
let Wrap(&(Ok(x) | Err(x))) = wres;
91+
drop::<u8>(x);
92+
let Wrap(Ok(x) | Err(x)) = wres;
93+
drop::<&u8>(x);
94+
for Wrap(Ok(mut x) | &Err(mut x)) in std::iter::once(wres) {
95+
drop::<u8>(x);
96+
}
97+
for Wrap(&(Ok(x) | Err(x))) in std::iter::once(wres) {
98+
drop::<u8>(x);
99+
}
100+
for Wrap(Ok(x) | Err(x)) in std::iter::once(wres) {
101+
drop::<&u8>(x);
102+
}
103+
fn fw1(Wrap(Ok(mut x) | &Err(mut x)): Wrap<R<'_>>) {
104+
drop::<u8>(x);
105+
}
106+
fn fw2(Wrap(&(Ok(x) | Err(x))): Wrap<R<'_>>) {
107+
drop::<u8>(x);
108+
}
109+
fn fw3(Wrap(Ok(x) | Err(x)): Wrap<R<'_>>) {
110+
drop::<&u8>(x);
111+
}
112+
113+
// Nest some more:
114+
115+
enum Tri<P> {
116+
A(P),
117+
B(P),
118+
C(P),
119+
}
120+
121+
let tri = &Tri::A(&Ok(0));
122+
let Tri::A(Ok(mut x) | Err(mut x))
123+
| Tri::B(&Ok(mut x) | Err(mut x))
124+
| &Tri::C(Ok(mut x) | Err(mut x)) = tri;
125+
drop::<u8>(x);
126+
127+
match tri {
128+
Tri::A(Ok(mut x) | Err(mut x))
129+
| Tri::B(&Ok(mut x) | Err(mut x))
130+
| &Tri::C(Ok(mut x) | Err(mut x)) => drop::<u8>(x),
131+
}
132+
}

0 commit comments

Comments
 (0)