This code (playground) causes a "variant is never constructed" lint, even though the variant is constructed in the FromStr implementation:
use std::str::FromStr;
enum Foo {
A { inner: () },
B,
}
impl FromStr for Foo {
type Err = ();
fn from_str(s: &str) -> Result<Self, ()> {
match s {
"a" => Ok(Self::A { inner: () }),
"b" => Ok(Self::B),
_ => Err(()),
}
}
}
warning: variant is never constructed: `A`
--> src/lib.rs:4:5
|
4 | A { inner: () },
| ^^^^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
Changing Self for the type name in from_str for Foo (playground) compiles with the "field is never used" lint I would expect from this code.
Tested on rustc 1.39.0-nightly (0b36e9dea 2019-09-09)
This issue has been assigned to @jakubadamw via this comment.
This is correct. Your snippet is treated as a library, where the enum Foo is not reachable, because it is not public.
If you write pub enum Foo the error will go away.
Behavoir inteded and therefore this can be closed.
The bug is that it doesn't trigger for B.
If the lint triggered for all variants, then it would just say:
Compiling playground v0.0.1 (/playground)
warning: enum is never used: `Foo`
--> src/lib.rs:3:1
|
3 | enum Foo {
| ^^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
The problem seems to manifest itself when variants with named fields are constructed using Self::.
Here is a minimal example (playground):
#[derive(Debug)]
enum Foo {
A { data: u32 },
}
impl Foo {
fn new() -> Self {
Self::A { data: 0 }
}
}
fn main() {
println!("created: {:?}", Foo::new());
}
@rustbot claim
Here is a slightly altered playground to illlustrate further.
Most helpful comment
The problem seems to manifest itself when variants with named fields are constructed using
Self::.Here is a minimal example (playground):