Skip to content

Commit 91b18a0

Browse files
authoredJul 29, 2024
Rollup merge of #128104 - mu001999-contrib:fix/128053, r=petrochenkov
Not lint pub structs without pub constructors intentionally Fixes #128053
2 parents 9aedec9 + adf0dff commit 91b18a0

5 files changed

+83
-22
lines changed
 

‎compiler/rustc_passes/src/dead.rs

+19-17
Original file line numberDiff line numberDiff line change
@@ -73,24 +73,26 @@ fn adt_of<'tcx>(ty: &hir::Ty<'tcx>) -> Option<(LocalDefId, DefKind)> {
7373
}
7474

7575
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| {
8081
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| c.is_ascii_digit());
85-
if is_positional
86-
&& tcx
87-
.layout_of(tcx.param_env(field.did).and(field_type))
88-
.map_or(true, |layout| layout.is_zst())
89-
{
90-
return true;
91-
}
92-
field.vis.is_public()
93-
})
82+
field_type.is_unit() || field_type.is_never()
83+
});
84+
85+
not_require_constructor
86+
|| adt_def.all_fields().all(|field| {
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+
})
9496
}
9597

9698
/// check struct and its fields are public or not,

‎tests/ui/derives/clone-debug-dead-code-in-the-same-struct.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#![forbid(dead_code)]
22

33
#[derive(Debug)]
4-
pub struct Whatever { //~ ERROR struct `Whatever` is never constructed
4+
pub struct Whatever {
55
pub field0: (),
6-
field1: (),
6+
field1: (), //~ ERROR fields `field1`, `field2`, `field3`, and `field4` are never read
77
field2: (),
88
field3: (),
99
field4: (),

‎tests/ui/derives/clone-debug-dead-code-in-the-same-struct.stderr

+13-3
Original file line numberDiff line numberDiff 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
33
|
44
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+
| ^^^^^^
615
|
16+
= note: `Whatever` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
717
note: the lint level is defined here
818
--> $DIR/clone-debug-dead-code-in-the-same-struct.rs:1:11
919
|
Original file line numberDiff line numberDiff 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::marker::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::marker::PhantomData<X>,
28+
}
29+
30+
pub struct T9<X> { //~ ERROR struct `T9` is never constructed
31+
_x: std::marker::PhantomData<X>,
32+
_y: i32,
33+
}
34+
35+
fn main() {}
Original file line numberDiff line numberDiff 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<X> {
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+

0 commit comments

Comments
 (0)
Please sign in to comment.