-
Notifications
You must be signed in to change notification settings - Fork 13.8k
Open
Labels
A-borrow-checkerArea: The borrow checkerArea: The borrow checkerA-exhaustiveness-checkingRelating to exhaustiveness / usefulness checking of patternsRelating to exhaustiveness / usefulness checking of patternsA-patternsRelating to patterns and pattern matchingRelating to patterns and pattern matchingC-bugCategory: This is a bug.Category: This is a bug.I-lang-radarItems that are on lang's radar and will need eventual work or consideration.Items that are on lang's radar and will need eventual work or consideration.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.T-langRelevant to the language teamRelevant to the language team
Description
I'm not sure if this is a bug or not.
enum Never {}
fn works(x: &mut Result<Never, String>) {
match x {
&mut Ok(ref mut y) => match x {
&mut Err(ref mut z) => {
let _y = y;
let _z = z;
}
_ => {}
},
_ => {}
};
}
fn fails(x: &mut Result<String, String>) {
match x {
&mut Ok(ref mut y) => match x {
&mut Err(ref mut z) => {
let _y = y;
let _z = z;
}
_ => {}
},
_ => {}
};
}
I expected either both functions to compile or both functions to fail to compile. Instead, only the fails
function gives the following error:
error[E0503]: cannot use `*x` because it was mutably borrowed
--> src/lib.rs:18:37
|
18 | &mut Ok(ref mut y) => match x {
| --------- ^ use of borrowed `x.0`
| |
| `x.0` is borrowed here
19 | &mut Err(ref mut z) => {
20 | let _y = y;
| - borrow later used here
For more information about this error, try `rustc --explain E0503`.
In my understanding, whether &mut Never
is uninhabited is undecided. Therefore, since I'm only creating references to Never
(as opposed to actually creating Never
values) I would think that I wouldn't get any special casing for uninhabited types. Thus, the current behavior seems wrong to me.
Meta
Reproducible on the playground with version 1.92.0-nightly (2025-09-14 52618eb338609df44978)
Metadata
Metadata
Assignees
Labels
A-borrow-checkerArea: The borrow checkerArea: The borrow checkerA-exhaustiveness-checkingRelating to exhaustiveness / usefulness checking of patternsRelating to exhaustiveness / usefulness checking of patternsA-patternsRelating to patterns and pattern matchingRelating to patterns and pattern matchingC-bugCategory: This is a bug.Category: This is a bug.I-lang-radarItems that are on lang's radar and will need eventual work or consideration.Items that are on lang's radar and will need eventual work or consideration.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.T-langRelevant to the language teamRelevant to the language team