4347: Fix usefulness check for never type r=flodiebold a=MikailBag



Co-authored-by: Mikail Bagishov <bagishov.mikail@yandex.ru>
This commit is contained in:
bors[bot] 2020-05-06 15:11:26 +00:00 committed by GitHub
commit e99447ffbf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -573,14 +573,20 @@ pub(crate) fn is_useful(
matrix: &Matrix, matrix: &Matrix,
v: &PatStack, v: &PatStack,
) -> MatchCheckResult<Usefulness> { ) -> MatchCheckResult<Usefulness> {
// Handle the special case of enums with no variants. In that case, no match // Handle two special cases:
// arm is useful. // - enum with no variants
if let Ty::Apply(ApplicationTy { ctor: TypeCtor::Adt(AdtId::EnumId(enum_id)), .. }) = // - `!` type
cx.infer[cx.match_expr].strip_references() // In those cases, no match arm is useful.
{ match cx.infer[cx.match_expr].strip_references() {
if cx.db.enum_data(*enum_id).variants.is_empty() { Ty::Apply(ApplicationTy { ctor: TypeCtor::Adt(AdtId::EnumId(enum_id)), .. }) => {
if cx.db.enum_data(*enum_id).variants.is_empty() {
return Ok(Usefulness::NotUseful);
}
}
Ty::Apply(ApplicationTy { ctor: TypeCtor::Never, .. }) => {
return Ok(Usefulness::NotUseful); return Ok(Usefulness::NotUseful);
} }
_ => (),
} }
if v.is_empty() { if v.is_empty() {
@ -1917,6 +1923,17 @@ mod tests {
check_no_diagnostic(content); check_no_diagnostic(content);
} }
#[test]
fn type_never() {
let content = r"
fn test_fn(never: !) {
match never {}
}
";
check_no_diagnostic(content);
}
#[test] #[test]
fn enum_never_ref() { fn enum_never_ref() {
let content = r" let content = r"