summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-05-16 13:10:24 +0000
committerbors <bors@rust-lang.org>2023-05-16 13:10:24 +0000
commit9239760da89cd8e9a51536beeb0a23762064037d (patch)
tree322523d6608b046ba3de89b4e86e786ac64d80c6 /tests
parenta673ad6b5746a6256cb898edb8b888163df1872c (diff)
parent228225842b0345b037fa1959b99178f68ea26d6e (diff)
downloadrust-9239760da89cd8e9a51536beeb0a23762064037d.tar.gz
Auto merge of #105750 - oli-obk:valtrees, r=lcnr
Always fall back to PartialEq when a constant in a pattern is not recursively structural-eq Right now we destructure the constant as far as we can, but with this PR we just don't take it apart anymore. This is preparatory work for moving to always using valtrees, as these will just do a single conversion of the constant to a valtree at the start, and if that fails, fall back to `PartialEq`. This removes a few cases where we emitted the `unreachable pattern` lint, because we stop looking into the constant deeply enough to detect that a constant is already covered by another pattern. Previous work: https://github.com/rust-lang/rust/pull/70743 This is groundwork towards fixing https://github.com/rust-lang/rust/issues/83085 and https://github.com/rust-lang/rust/issues/105047
Diffstat (limited to 'tests')
-rw-r--r--tests/ui/pattern/usefulness/consts-opaque.rs18
-rw-r--r--tests/ui/pattern/usefulness/consts-opaque.stderr75
2 files changed, 53 insertions, 40 deletions
diff --git a/tests/ui/pattern/usefulness/consts-opaque.rs b/tests/ui/pattern/usefulness/consts-opaque.rs
index ca4fcd85bb6..c10c6205a08 100644
--- a/tests/ui/pattern/usefulness/consts-opaque.rs
+++ b/tests/ui/pattern/usefulness/consts-opaque.rs
@@ -20,11 +20,12 @@ const BAR: Bar = Bar;
#[derive(PartialEq)]
enum Baz {
Baz1,
- Baz2
+ Baz2,
}
impl Eq for Baz {}
const BAZ: Baz = Baz::Baz1;
+#[rustfmt::skip]
fn main() {
match FOO {
FOO => {}
@@ -124,8 +125,16 @@ fn main() {
match WRAPQUUX {
Wrap(_) => {}
- WRAPQUUX => {} // detected unreachable because we do inspect the `Wrap` layer
- //~^ ERROR unreachable pattern
+ WRAPQUUX => {}
+ }
+
+ match WRAPQUUX {
+ Wrap(_) => {}
+ }
+
+ match WRAPQUUX {
+ //~^ ERROR: non-exhaustive patterns: `Wrap(_)` not covered
+ WRAPQUUX => {}
}
#[derive(PartialEq, Eq)]
@@ -138,8 +147,7 @@ fn main() {
match WHOKNOWSQUUX {
WHOKNOWSQUUX => {}
WhoKnows::Yay(_) => {}
- WHOKNOWSQUUX => {} // detected unreachable because we do inspect the `WhoKnows` layer
- //~^ ERROR unreachable pattern
+ WHOKNOWSQUUX => {}
WhoKnows::Nope => {}
}
}
diff --git a/tests/ui/pattern/usefulness/consts-opaque.stderr b/tests/ui/pattern/usefulness/consts-opaque.stderr
index 3f0b4a9f26a..e01b06ccc82 100644
--- a/tests/ui/pattern/usefulness/consts-opaque.stderr
+++ b/tests/ui/pattern/usefulness/consts-opaque.stderr
@@ -1,5 +1,5 @@
error: to use a constant of type `Foo` in a pattern, `Foo` must be annotated with `#[derive(PartialEq, Eq)]`
- --> $DIR/consts-opaque.rs:30:9
+ --> $DIR/consts-opaque.rs:31:9
|
LL | FOO => {}
| ^^^
@@ -8,7 +8,7 @@ LL | FOO => {}
= note: see https://doc.rust-lang.org/stable/std/marker/trait.StructuralEq.html for details
error: to use a constant of type `Foo` in a pattern, `Foo` must be annotated with `#[derive(PartialEq, Eq)]`
- --> $DIR/consts-opaque.rs:37:9
+ --> $DIR/consts-opaque.rs:38:9
|
LL | FOO_REF => {}
| ^^^^^^^
@@ -17,7 +17,7 @@ LL | FOO_REF => {}
= note: see https://doc.rust-lang.org/stable/std/marker/trait.StructuralEq.html for details
warning: to use a constant of type `Foo` in a pattern, `Foo` must be annotated with `#[derive(PartialEq, Eq)]`
- --> $DIR/consts-opaque.rs:45:9
+ --> $DIR/consts-opaque.rs:46:9
|
LL | FOO_REF_REF => {}
| ^^^^^^^^^^^
@@ -29,7 +29,7 @@ LL | FOO_REF_REF => {}
= note: `#[warn(indirect_structural_match)]` on by default
error: to use a constant of type `Bar` in a pattern, `Bar` must be annotated with `#[derive(PartialEq, Eq)]`
- --> $DIR/consts-opaque.rs:53:9
+ --> $DIR/consts-opaque.rs:54:9
|
LL | BAR => {} // should not be emitting unreachable warning
| ^^^
@@ -38,7 +38,7 @@ LL | BAR => {} // should not be emitting unreachable warning
= note: see https://doc.rust-lang.org/stable/std/marker/trait.StructuralEq.html for details
error: to use a constant of type `Bar` in a pattern, `Bar` must be annotated with `#[derive(PartialEq, Eq)]`
- --> $DIR/consts-opaque.rs:61:9
+ --> $DIR/consts-opaque.rs:62:9
|
LL | BAR => {}
| ^^^
@@ -47,7 +47,7 @@ LL | BAR => {}
= note: see https://doc.rust-lang.org/stable/std/marker/trait.StructuralEq.html for details
error: to use a constant of type `Bar` in a pattern, `Bar` must be annotated with `#[derive(PartialEq, Eq)]`
- --> $DIR/consts-opaque.rs:70:9
+ --> $DIR/consts-opaque.rs:71:9
|
LL | BAR => {}
| ^^^
@@ -56,7 +56,7 @@ LL | BAR => {}
= note: see https://doc.rust-lang.org/stable/std/marker/trait.StructuralEq.html for details
error: to use a constant of type `Bar` in a pattern, `Bar` must be annotated with `#[derive(PartialEq, Eq)]`
- --> $DIR/consts-opaque.rs:72:9
+ --> $DIR/consts-opaque.rs:73:9
|
LL | BAR => {} // should not be emitting unreachable warning
| ^^^
@@ -65,7 +65,7 @@ LL | BAR => {} // should not be emitting unreachable warning
= note: see https://doc.rust-lang.org/stable/std/marker/trait.StructuralEq.html for details
error: to use a constant of type `Baz` in a pattern, `Baz` must be annotated with `#[derive(PartialEq, Eq)]`
- --> $DIR/consts-opaque.rs:80:9
+ --> $DIR/consts-opaque.rs:81:9
|
LL | BAZ => {}
| ^^^
@@ -74,7 +74,7 @@ LL | BAZ => {}
= note: see https://doc.rust-lang.org/stable/std/marker/trait.StructuralEq.html for details
error: to use a constant of type `Baz` in a pattern, `Baz` must be annotated with `#[derive(PartialEq, Eq)]`
- --> $DIR/consts-opaque.rs:90:9
+ --> $DIR/consts-opaque.rs:91:9
|
LL | BAZ => {}
| ^^^
@@ -83,7 +83,7 @@ LL | BAZ => {}
= note: see https://doc.rust-lang.org/stable/std/marker/trait.StructuralEq.html for details
error: to use a constant of type `Baz` in a pattern, `Baz` must be annotated with `#[derive(PartialEq, Eq)]`
- --> $DIR/consts-opaque.rs:97:9
+ --> $DIR/consts-opaque.rs:98:9
|
LL | BAZ => {}
| ^^^
@@ -92,7 +92,7 @@ LL | BAZ => {}
= note: see https://doc.rust-lang.org/stable/std/marker/trait.StructuralEq.html for details
error: unreachable pattern
- --> $DIR/consts-opaque.rs:32:9
+ --> $DIR/consts-opaque.rs:33:9
|
LL | FOO => {}
| --- matches any value
@@ -107,7 +107,7 @@ LL | #![deny(unreachable_patterns)]
| ^^^^^^^^^^^^^^^^^^^^
error: unreachable pattern
- --> $DIR/consts-opaque.rs:39:9
+ --> $DIR/consts-opaque.rs:40:9
|
LL | FOO_REF => {}
| ------- matches any value
@@ -116,7 +116,7 @@ LL | Foo(_) => {} // should not be emitting unreachable warning
| ^^^^^^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:53:9
+ --> $DIR/consts-opaque.rs:54:9
|
LL | Bar => {}
| --- matches any value
@@ -124,7 +124,7 @@ LL | BAR => {} // should not be emitting unreachable warning
| ^^^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:56:9
+ --> $DIR/consts-opaque.rs:57:9
|
LL | Bar => {}
| --- matches any value
@@ -133,7 +133,7 @@ LL | _ => {}
| ^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:63:9
+ --> $DIR/consts-opaque.rs:64:9
|
LL | BAR => {}
| --- matches any value
@@ -142,7 +142,7 @@ LL | Bar => {} // should not be emitting unreachable warning
| ^^^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:65:9
+ --> $DIR/consts-opaque.rs:66:9
|
LL | BAR => {}
| --- matches any value
@@ -151,7 +151,7 @@ LL | _ => {}
| ^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:72:9
+ --> $DIR/consts-opaque.rs:73:9
|
LL | BAR => {}
| --- matches any value
@@ -160,7 +160,7 @@ LL | BAR => {} // should not be emitting unreachable warning
| ^^^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:75:9
+ --> $DIR/consts-opaque.rs:76:9
|
LL | BAR => {}
| --- matches any value
@@ -169,7 +169,7 @@ LL | _ => {} // should not be emitting unreachable warning
| ^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:82:9
+ --> $DIR/consts-opaque.rs:83:9
|
LL | BAZ => {}
| --- matches any value
@@ -178,7 +178,7 @@ LL | Baz::Baz1 => {} // should not be emitting unreachable warning
| ^^^^^^^^^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:84:9
+ --> $DIR/consts-opaque.rs:85:9
|
LL | BAZ => {}
| --- matches any value
@@ -187,7 +187,7 @@ LL | _ => {}
| ^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:92:9
+ --> $DIR/consts-opaque.rs:93:9
|
LL | BAZ => {}
| --- matches any value
@@ -196,7 +196,7 @@ LL | _ => {}
| ^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:99:9
+ --> $DIR/consts-opaque.rs:100:9
|
LL | BAZ => {}
| --- matches any value
@@ -205,7 +205,7 @@ LL | Baz::Baz2 => {} // should not be emitting unreachable warning
| ^^^^^^^^^ unreachable pattern
error: unreachable pattern
- --> $DIR/consts-opaque.rs:101:9
+ --> $DIR/consts-opaque.rs:102:9
|
LL | BAZ => {}
| --- matches any value
@@ -213,19 +213,24 @@ LL | BAZ => {}
LL | _ => {} // should not be emitting unreachable warning
| ^ unreachable pattern
-error: unreachable pattern
- --> $DIR/consts-opaque.rs:127:9
+error[E0004]: non-exhaustive patterns: `Wrap(_)` not covered
+ --> $DIR/consts-opaque.rs:135:11
|
-LL | Wrap(_) => {}
- | ------- matches any value
-LL | WRAPQUUX => {} // detected unreachable because we do inspect the `Wrap` layer
- | ^^^^^^^^ unreachable pattern
-
-error: unreachable pattern
- --> $DIR/consts-opaque.rs:141:9
+LL | match WRAPQUUX {
+ | ^^^^^^^^ pattern `Wrap(_)` not covered
+ |
+note: `Wrap<fn(usize, usize) -> usize>` defined here
+ --> $DIR/consts-opaque.rs:117:12
+ |
+LL | struct Wrap<T>(T);
+ | ^^^^
+ = note: the matched value is of type `Wrap<fn(usize, usize) -> usize>`
+help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
+ |
+LL ~ WRAPQUUX => {},
+LL + Wrap(_) => todo!()
|
-LL | WHOKNOWSQUUX => {} // detected unreachable because we do inspect the `WhoKnows` layer
- | ^^^^^^^^^^^^
-error: aborting due to 24 previous errors; 1 warning emitted
+error: aborting due to 23 previous errors; 1 warning emitted
+For more information about this error, try `rustc --explain E0004`.