A program like the following one:
```rust
enum E { A, B, C }
fn f(x: E) -> bool {
match x {
A | B => false,
C => true
}
}
```
is rejected by the compiler due to `E` variant paths not being in scope.
In this case `A`, `B` are resolved as pattern bindings and consequently
the pattern is considered invalid as the inner or-patterns do not bind
to the same set of identifiers.
This is expected but the compiler errors that follow could be surprising
or confusing to some users. This commit adds a help note explaining that
if the user desired to match against variants or consts, they should use
a qualified path. The note is restricted to cases where the identifier
starts with an upper-case sequence so as to reduce the false negatives.
Since this happens during resolution, there's no clean way to check what
the patterns match against. The syntactic criterium, however, is in line
with the convention that's assumed by the `non-camel-case-types` lint.
36 lines
1.1 KiB
Rust
36 lines
1.1 KiB
Rust
#![allow(non_camel_case_types)]
|
|
|
|
enum E { A, B, c }
|
|
|
|
mod m {
|
|
const CONST1: usize = 10;
|
|
const Const2: usize = 20;
|
|
}
|
|
|
|
fn main() {
|
|
let y = 1;
|
|
match y {
|
|
a | b => {} //~ ERROR variable `a` is not bound in all patterns
|
|
//~| ERROR variable `b` is not bound in all patterns
|
|
}
|
|
|
|
let x = (E::A, E::B);
|
|
match x {
|
|
(A, B) | (ref B, c) | (c, A) => ()
|
|
//~^ ERROR variable `A` is not bound in all patterns
|
|
//~| ERROR variable `B` is not bound in all patterns
|
|
//~| ERROR variable `B` is bound in inconsistent ways
|
|
//~| ERROR mismatched types
|
|
//~| ERROR variable `c` is not bound in all patterns
|
|
//~| HELP consider making the path in the pattern qualified: `?::A`
|
|
}
|
|
|
|
let z = (10, 20);
|
|
match z {
|
|
(CONST1, _) | (_, Const2) => ()
|
|
//~^ ERROR variable `CONST1` is not bound in all patterns
|
|
//~| HELP consider making the path in the pattern qualified: `?::CONST1`
|
|
//~| ERROR variable `Const2` is not bound in all patterns
|
|
//~| HELP consider making the path in the pattern qualified: `?::Const2`
|
|
}
|
|
}
|