Skip to content

Commit

Permalink
fix #72680 by explicitly checking for or-pattern before test
Browse files Browse the repository at this point in the history
  • Loading branch information
mark-i-m committed Nov 8, 2020
1 parent b2d115f commit 459dae9
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 0 deletions.
10 changes: 10 additions & 0 deletions compiler/rustc_mir_build/src/build/matches/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
(&TestKind::Range { .. }, _) => None,

(&TestKind::Eq { .. } | &TestKind::Len { .. }, _) => {
// We do call `test()` below to see what kind of test `match_pair` would require.
// If it is the same test as `test`, then we can just use `test`.
//
// However, `test()` assumes that there won't be any or-patterns, so we need to
// specially handle that here and return `None` (since the `test` clearly doesn't
// apply to an or-pattern).
if let PatKind::Or { .. } = &*match_pair.pattern.kind {
return None;
}

// These are all binary tests.
//
// FIXME(#29623) we can be more clever here
Expand Down
65 changes: 65 additions & 0 deletions src/test/ui/match/issue-72680.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
// run-pass

#![feature(or_patterns)]

fn main() {
assert_eq!(f("", 0), true);
assert_eq!(f("a", 1), true);
assert_eq!(f("b", 1), true);

assert_eq!(f("", 1), false);
assert_eq!(f("a", 0), false);
assert_eq!(f("b", 0), false);

assert_eq!(f("asdf", 032), false);

////

assert_eq!(g(true, true, true), false);
assert_eq!(g(false, true, true), false);
assert_eq!(g(true, false, true), false);
assert_eq!(g(false, false, true), false);
assert_eq!(g(true, true, false), false);

assert_eq!(g(false, true, false), true);
assert_eq!(g(true, false, false), true);
assert_eq!(g(false, false, false), true);

////

assert_eq!(h(true, true, true), false);
assert_eq!(h(false, true, true), false);
assert_eq!(h(true, false, true), false);
assert_eq!(h(false, false, true), false);
assert_eq!(h(true, true, false), false);

assert_eq!(h(false, true, false), true);
assert_eq!(h(true, false, false), true);
assert_eq!(h(false, false, false), true);
}

fn f(s: &str, num: usize) -> bool {
match (s, num) {
("", 0) | ("a" | "b", 1) => true,

_ => false,
}
}

fn g(x: bool, y: bool, z: bool) -> bool {
match (x, y, x, z) {
(true | false, false, true, false) => true,
(false, true | false, true | false, false) => true,
(true | false, true | false, true | false, true) => false,
(true, true | false, true | false, false) => false,
}
}

fn h(x: bool, y: bool, z: bool) -> bool {
match (x, (y, (x, (z,)))) {
(true | false, (false, (true, (false,)))) => true,
(false, (true | false, (true | false, (false,)))) => true,
(true | false, (true | false, (true | false, (true,)))) => false,
(true, (true | false, (true | false, (false,)))) => false,
}
}

0 comments on commit 459dae9

Please sign in to comment.