| A generic parameter or `static` has been referenced in a pattern. | |
| Erroneous code example: | |
| ```compile_fail,E0158 | |
| enum Foo { | |
| One, | |
| Two | |
| } | |
| trait Bar { | |
| const X: Foo; | |
| } | |
| fn test<A: Bar>(arg: Foo) { | |
| match arg { | |
| A::X => println!("A::X"), // error: E0158: constant pattern depends | |
| // on a generic parameter | |
| Foo::Two => println!("Two") | |
| } | |
| } | |
| ``` | |
| Generic parameters cannot be referenced in patterns because it is impossible | |
| for the compiler to prove exhaustiveness (that some pattern will always match). | |
| Take the above example, because Rust does type checking in the *generic* | |
| method, not the *monomorphized* specific instance. So because `Bar` could have | |
| theoretically arbitrary implementations, there's no way to always be sure that | |
| `A::X` is `Foo::One`. So this code must be rejected. Even if code can be | |
| proven exhaustive by a programmer, the compiler cannot currently prove this. | |
| The same holds true of `static`s. | |
| If you want to match against a `const` that depends on a generic parameter or a | |
| `static`, consider using a guard instead: | |
| ``` | |
| trait Trait { | |
| const X: char; | |
| } | |
| static FOO: char = 'j'; | |
| fn test<A: Trait, const Y: char>(arg: char) { | |
| match arg { | |
| c if c == A::X => println!("A::X"), | |
| c if c == Y => println!("Y"), | |
| c if c == FOO => println!("FOO"), | |
| _ => () | |
| } | |
| } | |
| ``` |