Skip to content

Commit 459dae9

Browse files
committedNov 8, 2020
fix #72680 by explicitly checking for or-pattern before test
1 parent b2d115f commit 459dae9

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed
 

‎compiler/rustc_mir_build/src/build/matches/test.rs

+10
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
671671
(&TestKind::Range { .. }, _) => None,
672672

673673
(&TestKind::Eq { .. } | &TestKind::Len { .. }, _) => {
674+
// We do call `test()` below to see what kind of test `match_pair` would require.
675+
// If it is the same test as `test`, then we can just use `test`.
676+
//
677+
// However, `test()` assumes that there won't be any or-patterns, so we need to
678+
// specially handle that here and return `None` (since the `test` clearly doesn't
679+
// apply to an or-pattern).
680+
if let PatKind::Or { .. } = &*match_pair.pattern.kind {
681+
return None;
682+
}
683+
674684
// These are all binary tests.
675685
//
676686
// FIXME(#29623) we can be more clever here

‎src/test/ui/match/issue-72680.rs

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// run-pass
2+
3+
#![feature(or_patterns)]
4+
5+
fn main() {
6+
assert_eq!(f("", 0), true);
7+
assert_eq!(f("a", 1), true);
8+
assert_eq!(f("b", 1), true);
9+
10+
assert_eq!(f("", 1), false);
11+
assert_eq!(f("a", 0), false);
12+
assert_eq!(f("b", 0), false);
13+
14+
assert_eq!(f("asdf", 032), false);
15+
16+
////
17+
18+
assert_eq!(g(true, true, true), false);
19+
assert_eq!(g(false, true, true), false);
20+
assert_eq!(g(true, false, true), false);
21+
assert_eq!(g(false, false, true), false);
22+
assert_eq!(g(true, true, false), false);
23+
24+
assert_eq!(g(false, true, false), true);
25+
assert_eq!(g(true, false, false), true);
26+
assert_eq!(g(false, false, false), true);
27+
28+
////
29+
30+
assert_eq!(h(true, true, true), false);
31+
assert_eq!(h(false, true, true), false);
32+
assert_eq!(h(true, false, true), false);
33+
assert_eq!(h(false, false, true), false);
34+
assert_eq!(h(true, true, false), false);
35+
36+
assert_eq!(h(false, true, false), true);
37+
assert_eq!(h(true, false, false), true);
38+
assert_eq!(h(false, false, false), true);
39+
}
40+
41+
fn f(s: &str, num: usize) -> bool {
42+
match (s, num) {
43+
("", 0) | ("a" | "b", 1) => true,
44+
45+
_ => false,
46+
}
47+
}
48+
49+
fn g(x: bool, y: bool, z: bool) -> bool {
50+
match (x, y, x, z) {
51+
(true | false, false, true, false) => true,
52+
(false, true | false, true | false, false) => true,
53+
(true | false, true | false, true | false, true) => false,
54+
(true, true | false, true | false, false) => false,
55+
}
56+
}
57+
58+
fn h(x: bool, y: bool, z: bool) -> bool {
59+
match (x, (y, (x, (z,)))) {
60+
(true | false, (false, (true, (false,)))) => true,
61+
(false, (true | false, (true | false, (false,)))) => true,
62+
(true | false, (true | false, (true | false, (true,)))) => false,
63+
(true, (true | false, (true | false, (false,)))) => false,
64+
}
65+
}

0 commit comments

Comments
 (0)
Please sign in to comment.