Skip to content

Commit d99ba60

Browse files
Revert "Rollup merge of #127107 - mu001999-contrib:dead/enhance-2, r=pnkfelix"
This reverts commit 31fe962, reversing changes made to f203078.
1 parent 08328a3 commit d99ba60

20 files changed

+52
-164
lines changed

compiler/rustc_passes/src/dead.rs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -277,10 +277,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> {
277277
pats: &[hir::PatField<'_>],
278278
) {
279279
let variant = match self.typeck_results().node_type(lhs.hir_id).kind() {
280-
ty::Adt(adt, _) => {
281-
self.check_def_id(adt.did());
282-
adt.variant_of_res(res)
283-
}
280+
ty::Adt(adt, _) => adt.variant_of_res(res),
284281
_ => span_bug!(lhs.span, "non-ADT in struct pattern"),
285282
};
286283
for pat in pats {
@@ -300,10 +297,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> {
300297
dotdot: hir::DotDotPos,
301298
) {
302299
let variant = match self.typeck_results().node_type(lhs.hir_id).kind() {
303-
ty::Adt(adt, _) => {
304-
self.check_def_id(adt.did());
305-
adt.variant_of_res(res)
306-
}
300+
ty::Adt(adt, _) => adt.variant_of_res(res),
307301
_ => {
308302
self.tcx.dcx().span_delayed_bug(lhs.span, "non-ADT in tuple struct pattern");
309303
return;
@@ -408,6 +402,31 @@ impl<'tcx> MarkSymbolVisitor<'tcx> {
408402
return false;
409403
}
410404

405+
// don't ignore impls for Enums and pub Structs whose methods don't have self receiver,
406+
// cause external crate may call such methods to construct values of these types
407+
if let Some(local_impl_of) = impl_of.as_local()
408+
&& let Some(local_def_id) = def_id.as_local()
409+
&& let Some(fn_sig) =
410+
self.tcx.hir().fn_sig_by_hir_id(self.tcx.local_def_id_to_hir_id(local_def_id))
411+
&& matches!(fn_sig.decl.implicit_self, hir::ImplicitSelfKind::None)
412+
&& let TyKind::Path(hir::QPath::Resolved(_, path)) =
413+
self.tcx.hir().expect_item(local_impl_of).expect_impl().self_ty.kind
414+
&& let Res::Def(def_kind, did) = path.res
415+
{
416+
match def_kind {
417+
// for example, #[derive(Default)] pub struct T(i32);
418+
// external crate can call T::default() to construct T,
419+
// so that don't ignore impl Default for pub Enum and Structs
420+
DefKind::Struct | DefKind::Union if self.tcx.visibility(did).is_public() => {
421+
return false;
422+
}
423+
// don't ignore impl Default for Enums,
424+
// cause we don't know which variant is constructed
425+
DefKind::Enum => return false,
426+
_ => (),
427+
};
428+
}
429+
411430
if let Some(trait_of) = self.tcx.trait_id_of_impl(impl_of)
412431
&& self.tcx.has_attr(trait_of, sym::rustc_trivial_field_reads)
413432
{
@@ -671,9 +690,6 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> {
671690
self.handle_field_pattern_match(pat, res, fields);
672691
}
673692
PatKind::Path(ref qpath) => {
674-
if let ty::Adt(adt, _) = self.typeck_results().node_type(pat.hir_id).kind() {
675-
self.check_def_id(adt.did());
676-
}
677693
let res = self.typeck_results().qpath_res(qpath, pat.hir_id);
678694
self.handle_res(res);
679695
}
@@ -829,7 +845,7 @@ fn check_item<'tcx>(
829845
// mark the method live if the self_ty is public,
830846
// or the method is public and may construct self
831847
if tcx.visibility(local_def_id).is_public()
832-
&& (ty_and_all_fields_are_public || (ty_is_public && may_construct_self))
848+
&& (ty_and_all_fields_are_public || may_construct_self)
833849
{
834850
// if the impl item is public,
835851
// and the ty may be constructed or can be constructed in foreign crates,

library/core/src/default.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ use crate::ascii::Char as AsciiChar;
103103
/// ```
104104
#[cfg_attr(not(test), rustc_diagnostic_item = "Default")]
105105
#[stable(feature = "rust1", since = "1.0.0")]
106+
#[cfg_attr(not(bootstrap), rustc_trivial_field_reads)]
106107
pub trait Default: Sized {
107108
/// Returns the "default value" for a type.
108109
///

tests/ui-fulldeps/deriving-global.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,18 @@ mod submod {
1717
// if any of these are implemented without global calls for any
1818
// function calls, then being in a submodule will (correctly)
1919
// cause errors about unrecognised module `std` (or `extra`)
20-
#[allow(dead_code)]
2120
#[derive(PartialEq, PartialOrd, Eq, Ord, Hash, Clone, Debug, Encodable, Decodable)]
2221
enum A {
2322
A1(usize),
2423
A2(isize),
2524
}
2625

27-
#[allow(dead_code)]
2826
#[derive(PartialEq, PartialOrd, Eq, Ord, Hash, Clone, Debug, Encodable, Decodable)]
2927
struct B {
3028
x: usize,
3129
y: isize,
3230
}
3331

34-
#[allow(dead_code)]
3532
#[derive(PartialEq, PartialOrd, Eq, Ord, Hash, Clone, Debug, Encodable, Decodable)]
3633
struct C(usize, isize);
3734
}

tests/ui-fulldeps/deriving-hygiene.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ pub const s: u8 = 1;
2020
pub const state: u8 = 1;
2121
pub const cmp: u8 = 1;
2222

23-
#[allow(dead_code)]
2423
#[derive(Ord, Eq, PartialOrd, PartialEq, Debug, Decodable, Encodable, Hash)]
2524
struct Foo {}
2625

tests/ui/const-generics/issues/issue-86535-2.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ pub trait Foo {
77
fn foo() where [(); Self::ASSOC_C]:;
88
}
99

10-
#[allow(dead_code)]
1110
struct Bar<const N: &'static ()>;
1211
impl<const N: &'static ()> Foo for Bar<N> {
1312
const ASSOC_C: usize = 3;

tests/ui/const-generics/issues/issue-86535.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#![feature(adt_const_params, generic_const_exprs)]
33
#![allow(incomplete_features, unused_variables)]
44

5-
#[allow(dead_code)]
65
struct F<const S: &'static str>;
76
impl<const S: &'static str> X for F<{ S }> {
87
const W: usize = 3;

tests/ui/impl-trait/extra-impl-in-trait-impl.fixed

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
//@ run-rustfix
22

3-
#[allow(dead_code)]
43
struct S<T>(T);
5-
#[allow(dead_code)]
64
struct S2;
75

86
impl<T: Default> Default for S<T> {

tests/ui/impl-trait/extra-impl-in-trait-impl.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
//@ run-rustfix
22

3-
#[allow(dead_code)]
43
struct S<T>(T);
5-
#[allow(dead_code)]
64
struct S2;
75

86
impl<T: Default> impl Default for S<T> {

tests/ui/impl-trait/extra-impl-in-trait-impl.stderr

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
error: unexpected `impl` keyword
2-
--> $DIR/extra-impl-in-trait-impl.rs:8:18
2+
--> $DIR/extra-impl-in-trait-impl.rs:6:18
33
|
44
LL | impl<T: Default> impl Default for S<T> {
55
| ^^^^^ help: remove the extra `impl`
66
|
77
note: this is parsed as an `impl Trait` type, but a trait is expected at this position
8-
--> $DIR/extra-impl-in-trait-impl.rs:8:18
8+
--> $DIR/extra-impl-in-trait-impl.rs:6:18
99
|
1010
LL | impl<T: Default> impl Default for S<T> {
1111
| ^^^^^^^^^^^^
1212

1313
error: unexpected `impl` keyword
14-
--> $DIR/extra-impl-in-trait-impl.rs:14:6
14+
--> $DIR/extra-impl-in-trait-impl.rs:12:6
1515
|
1616
LL | impl impl Default for S2 {
1717
| ^^^^^ help: remove the extra `impl`
1818
|
1919
note: this is parsed as an `impl Trait` type, but a trait is expected at this position
20-
--> $DIR/extra-impl-in-trait-impl.rs:14:6
20+
--> $DIR/extra-impl-in-trait-impl.rs:12:6
2121
|
2222
LL | impl impl Default for S2 {
2323
| ^^^^^^^^^^^^

tests/ui/lint/dead-code/issue-59003.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
#![deny(dead_code)]
66

7-
#[allow(dead_code)]
87
struct Foo {
8+
#[allow(dead_code)]
99
inner: u32,
1010
}
1111

0 commit comments

Comments
 (0)