| An "or" pattern was used where the variable bindings are not consistently bound | |
| across patterns. | |
| Erroneous code example: | |
| ```compile_fail,E0408 | |
| match x { | |
| Some(y) | None => { /* use y */ } // error: variable `y` from pattern #1 is | |
| // not bound in pattern #2 | |
| _ => () | |
| } | |
| ``` | |
| Here, `y` is bound to the contents of the `Some` and can be used within the | |
| block corresponding to the match arm. However, in case `x` is `None`, we have | |
| not specified what `y` is, and the block will use a nonexistent variable. | |
| To fix this error, either split into multiple match arms: | |
| ``` | |
| let x = Some(1); | |
| match x { | |
| Some(y) => { /* use y */ } | |
| None => { /* ... */ } | |
| } | |
| ``` | |
| or, bind the variable to a field of the same type in all sub-patterns of the | |
| or pattern: | |
| ``` | |
| let x = (0, 2); | |
| match x { | |
| (0, y) | (y, 0) => { /* use y */} | |
| _ => {} | |
| } | |
| ``` | |
| In this example, if `x` matches the pattern `(0, _)`, the second field is set | |
| to `y`. If it matches `(_, 0)`, the first field is set to `y`; so in all | |
| cases `y` is set to some value. |