Skip to content

We should lint when !-fallback results in questionable code #46162

Open
@canndrew

Description

@canndrew

An example is the following code:

#![feature(never_type)]

use std::error::Error;

pub trait Deserialize: Sized {
  fn deserialize() -> Result<Self, Box<Error>>;
}

impl Deserialize for ! {
  fn deserialize() -> Result<!, Box<Error>> {
    Err("oh geez")?;
    panic!()
  }
}

fn foo() -> Result<usize, Box<Error>> {
  Deserialize::deserialize()?;
  Ok(22)
}

Here, the type of Deserialize::deserialize()? defaults to !, making the Ok(22) unreachable. It might be unclear to users why the Ok(22) is unreachable since the !-fallback happens implicitly, so it would be good to point at it with an auxiliary note on the warning. eg. something like note: unconstrained type variable fell back to !

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.C-enhancementCategory: An issue proposing an enhancement or a PR with one.F-never_type`#![feature(never_type)]`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions