Add note to non-exhaustive match on reference to empty
Rust prints "type `&A` is non-empty" even is A is empty. This is the intended behavior, but can be confusing. This commit adds a note to non-exhaustive pattern errors if they are a reference to something uninhabited. I did not add tests to check that the note is not shown for non-references or inhabited references, because this is already done in other tests. Maybe the added test is superfluous, because `always-inhabited-union-ref` already checks for this case. This does not handle &&Void or &&&void etc. I could add those as special cases as well and ignore people who need quadruple references. Fixes #78123
This commit is contained in:
parent
18cb4ad3b9
commit
998bf0ab88
@ -503,6 +503,11 @@ fn non_exhaustive_match<'p, 'tcx>(
|
||||
));
|
||||
}
|
||||
}
|
||||
if let ty::Ref(_, sub_ty, _) = scrut_ty.kind() {
|
||||
if cx.tcx.is_ty_uninhabited_from(cx.module, sub_ty, cx.param_env) {
|
||||
err.note("references are always considered inhabited");
|
||||
}
|
||||
}
|
||||
err.emit();
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@ LL | match uninhab_ref() {
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
= note: the matched value is of type `&!`
|
||||
= note: references are always considered inhabited
|
||||
|
||||
error[E0004]: non-exhaustive patterns: type `Foo` is non-empty
|
||||
--> $DIR/always-inhabited-union-ref.rs:27:11
|
||||
|
@ -0,0 +1,7 @@
|
||||
enum A {}
|
||||
|
||||
fn f(a: &A) {
|
||||
match a {} //~ ERROR non-exhaustive patterns: type `&A` is non-empty
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,16 @@
|
||||
error[E0004]: non-exhaustive patterns: type `&A` is non-empty
|
||||
--> $DIR/issue-78123-non-exhaustive-reference.rs:4:11
|
||||
|
|
||||
LL | enum A {}
|
||||
| --------- `A` defined here
|
||||
...
|
||||
LL | match a {}
|
||||
| ^
|
||||
|
|
||||
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
|
||||
= note: the matched value is of type `&A`
|
||||
= note: references are always considered inhabited
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0004`.
|
Loading…
Reference in New Issue
Block a user