Unrolled build for #128104 ยท rust-lang/rust@dc46839 (original) (raw)
5 files changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -73,24 +73,26 @@ fn adt_of<'tcx>(ty: &hir::Ty<'tcx>) -> Option<(LocalDefId, DefKind)> { | ||
73 | 73 | } |
74 | 74 | |
75 | 75 | fn struct_all_fields_are_public(tcx: TyCtxt<'_>, id: LocalDefId) -> bool { |
76 | -// treat PhantomData and positional ZST as public, | |
77 | -// we don't want to lint types which only have them, | |
78 | -// cause it's a common way to use such types to check things like well-formedness | |
79 | - tcx.adt_def(id).all_fields().all(|field | |
76 | +let adt_def = tcx.adt_def(id); | |
77 | + | |
78 | +// skip types contain fields of unit and never type, | |
79 | +// it's usually intentional to make the type not constructible | |
80 | +let not_require_constructor = adt_def.all_fields().any(|field | |
80 | 81 | let field_type = tcx.type_of(field.did).instantiate_identity(); |
81 | -if field_type.is_phantom_data() { | |
82 | -return true; | |
83 | -} | |
84 | -let is_positional = field.name.as_str().starts_with(|c: char | |
85 | -if is_positional | |
86 | - && tcx | |
87 | -.layout_of(tcx.param_env(field.did).and(field_type)) | |
88 | -.map_or(true, |layout | |
89 | -{ | |
90 | -return true; | |
91 | -} | |
92 | - field.vis.is_public() | |
93 | -}) | |
82 | + field_type.is_unit() | | |
83 | +}); | |
84 | + | |
85 | + not_require_constructor | |
86 | + | | |
87 | +let field_type = tcx.type_of(field.did).instantiate_identity(); | |
88 | +// skip fields of PhantomData, | |
89 | +// cause it's a common way to check things like well-formedness | |
90 | +if field_type.is_phantom_data() { | |
91 | +return true; | |
92 | +} | |
93 | + | |
94 | + field.vis.is_public() | |
95 | +}) | |
94 | 96 | } |
95 | 97 | |
96 | 98 | /// check struct and its fields are public or not, |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,9 @@ | ||
1 | 1 | #![forbid(dead_code)] |
2 | 2 | |
3 | 3 | #[derive(Debug)] |
4 | -pub struct Whatever { //~ ERROR struct `Whatever` is never constructed | |
4 | +pub struct Whatever { | |
5 | 5 | pub field0: (), |
6 | -field1: (), | |
6 | +field1: (), //~ ERROR fields `field1`, `field2`, `field3`, and `field4` are never read | |
7 | 7 | field2: (), |
8 | 8 | field3: (), |
9 | 9 | field4: (), |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,19 @@ | ||
1 | -error: struct `Whatever` is never constructed | |
2 | - --> $DIR/clone-debug-dead-code-in-the-same-struct.rs:4:12 | |
1 | +error: fields `field1`, `field2`, `field3`, and `field4` are never read | |
2 | + --> $DIR/clone-debug-dead-code-in-the-same-struct.rs:6:5 | |
3 | 3 | | |
4 | 4 | LL | pub struct Whatever { |
5 | - | ^^^^^^^^ | |
5 | + | -------- fields in this struct | |
6 | +LL | pub field0: (), | |
7 | +LL | field1: (), | |
8 | + | ^^^^^^ | |
9 | +LL | field2: (), | |
10 | + | ^^^^^^ | |
11 | +LL | field3: (), | |
12 | + | ^^^^^^ | |
13 | +LL | field4: (), | |
14 | + | ^^^^^^ | |
6 | 15 | | |
16 | + = note: `Whatever` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis | |
7 | 17 | note: the lint level is defined here |
8 | 18 | --> $DIR/clone-debug-dead-code-in-the-same-struct.rs:1:11 |
9 | 19 | | |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
1 | +#![feature(never_type)] | |
2 | +#![deny(dead_code)] | |
3 | + | |
4 | +pub struct T1(!); | |
5 | +pub struct T2(()); | |
6 | +pub struct T3<X>(std:๐:PhantomData<X>); | |
7 | + | |
8 | +pub struct T4 { | |
9 | +_x: !, | |
10 | +} | |
11 | + | |
12 | +pub struct T5<X> { | |
13 | +_x: !, | |
14 | +_y: X, | |
15 | +} | |
16 | + | |
17 | +pub struct T6 { | |
18 | +_x: (), | |
19 | +} | |
20 | + | |
21 | +pub struct T7<X> { | |
22 | +_x: (), | |
23 | +_y: X, | |
24 | +} | |
25 | + | |
26 | +pub struct T8<X> { | |
27 | +_x: std:๐:PhantomData<X>, | |
28 | +} | |
29 | + | |
30 | +pub struct T9<X> { //~ ERROR struct `T9` is never constructed | |
31 | +_x: std:๐:PhantomData<X>, | |
32 | +_y: i32, | |
33 | +} | |
34 | + | |
35 | +fn main() {} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
1 | +error: struct `T9` is never constructed | |
2 | + --> $DIR/unconstructible-pub-struct.rs:30:12 | |
3 | + | | |
4 | +LL | pub struct T9 { | |
5 | + | ^^ | |
6 | + | | |
7 | +note: the lint level is defined here | |
8 | + --> $DIR/unconstructible-pub-struct.rs:2:9 | |
9 | + | | |
10 | +LL | #![deny(dead_code)] | |
11 | + | ^^^^^^^^^ | |
12 | + | |
13 | +error: aborting due to 1 previous error | |
14 | + |