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 +