Skip to content

Commit

Permalink
expand inner or pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
ouz-a committed Jun 17, 2022
1 parent 3a8b014 commit 90abfe9
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 1 deletion.
12 changes: 11 additions & 1 deletion compiler/rustc_mir_build/src/thir/pattern/usefulness.rs
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,17 @@ impl<'p, 'tcx> Matrix<'p, 'tcx> {
/// expands it.
fn push(&mut self, row: PatStack<'p, 'tcx>) {
if !row.is_empty() && row.head().is_or_pat() {
self.patterns.extend(row.expand_or_pat());
let pats = row.expand_or_pat();
let mut no_inner_or = true;
for pat in pats {
if !pat.is_empty() && pat.head().is_or_pat() {
self.patterns.extend(pat.expand_or_pat());
no_inner_or = false;
}
}
if no_inner_or {
self.patterns.extend(row.expand_or_pat());
}
} else {
self.patterns.push(row);
}
Expand Down
13 changes: 13 additions & 0 deletions src/test/ui/or-patterns/inner-or-pat-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#[allow(unused_variables)]
#[allow(unused_parens)]
fn main() {
let x = "foo";
match x {
x @ ((("h" | "ho" | "yo" | ("dude" | "w")) | () | "nop") | ("hey" | "gg")) |
//~^ ERROR mismatched types
x @ ("black" | "pink") |
x @ ("red" | "blue") => {
}
_ => (),
}
}
11 changes: 11 additions & 0 deletions src/test/ui/or-patterns/inner-or-pat-2.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0308]: mismatched types
--> $DIR/inner-or-pat-2.rs:6:54
|
LL | match x {
| - this expression has type `&str`
LL | x @ ((("h" | "ho" | "yo" | ("dude" | "w")) | () | "nop") | ("hey" | "gg")) |
| ^^ expected `str`, found `()`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
15 changes: 15 additions & 0 deletions src/test/ui/or-patterns/inner-or-pat-3.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// run-pass

#[allow(unreachable_patterns)]
#[allow(unused_variables)]
#[allow(unused_parens)]
fn main() {
let x = "foo";

match x {
x @ ("foo" | "bar") |
(x @ "red" | (x @ "blue" | x @ "red")) => {
}
_ => (),
}
}
13 changes: 13 additions & 0 deletions src/test/ui/or-patterns/inner-or-pat-4.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#[allow(unused_variables)]
#[allow(unused_parens)]
fn main() {
let x = "foo";

match x {
x @ ("foo" | "bar") |
(x @ "red" | (x @ "blue" | "red")) => {
//~^ variable `x` is not bound in all patterns
}
_ => (),
}
}
11 changes: 11 additions & 0 deletions src/test/ui/or-patterns/inner-or-pat-4.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0408]: variable `x` is not bound in all patterns
--> $DIR/inner-or-pat-4.rs:8:37
|
LL | (x @ "red" | (x @ "blue" | "red")) => {
| - ^^^^^ pattern doesn't bind `x`
| |
| variable not in all patterns

error: aborting due to previous error

For more information about this error, try `rustc --explain E0408`.
14 changes: 14 additions & 0 deletions src/test/ui/or-patterns/inner-or-pat.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// run-pass

#[allow(unused_variables)]
#[allow(unused_parens)]
fn main() {
let x = "foo";
match x {
x @ ((("h" | "ho" | "yo" | ("dude" | "w")) | "no" | "nop") | ("hey" | "gg")) |
x @ ("black" | "pink") |
x @ ("red" | "blue") => {
}
_ => (),
}
}

0 comments on commit 90abfe9

Please sign in to comment.