Skip to content

Commit 9fcf9c1

Browse files
committed
Merge unused_tuple_struct_fields into dead_code
This implicitly upgrades the lint from `allow` to `warn` and places it into the `unused` lint group.
1 parent 2f6fc05 commit 9fcf9c1

File tree

3 files changed

+43
-52
lines changed

3 files changed

+43
-52
lines changed

compiler/rustc_lint/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ fn register_builtins(store: &mut LintStore) {
328328
store.register_renamed("disjoint_capture_migration", "rust_2021_incompatible_closure_captures");
329329
store.register_renamed("or_patterns_back_compat", "rust_2021_incompatible_or_patterns");
330330
store.register_renamed("non_fmt_panic", "non_fmt_panics");
331+
store.register_renamed("unused_tuple_struct_fields", "dead_code");
331332

332333
// These were moved to tool lints, but rustc still sees them when compiling normally, before
333334
// tool lints are registered, so `check_tool_name_for_backwards_compat` doesn't work. Use

compiler/rustc_lint_defs/src/builtin.rs

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ declare_lint_pass! {
125125
UNUSED_MACROS,
126126
UNUSED_MUT,
127127
UNUSED_QUALIFICATIONS,
128-
UNUSED_TUPLE_STRUCT_FIELDS,
129128
UNUSED_UNSAFE,
130129
UNUSED_VARIABLES,
131130
USELESS_DEPRECATED,
@@ -697,8 +696,13 @@ declare_lint! {
697696
/// Dead code may signal a mistake or unfinished code. To silence the
698697
/// warning for individual items, prefix the name with an underscore such
699698
/// as `_foo`. If it was intended to expose the item outside of the crate,
700-
/// consider adding a visibility modifier like `pub`. Otherwise consider
701-
/// removing the unused code.
699+
/// consider adding a visibility modifier like `pub`.
700+
///
701+
/// To preserve the numbering of tuple structs with unused fields,
702+
/// change the unused fields to have unit type or use
703+
/// `PhantomData`.
704+
///
705+
/// Otherwise consider removing the unused code.
702706
pub DEAD_CODE,
703707
Warn,
704708
"detect unused, unexported items"
@@ -732,32 +736,6 @@ declare_lint! {
732736
"detects attributes that were not used by the compiler"
733737
}
734738

735-
declare_lint! {
736-
/// The `unused_tuple_struct_fields` lint detects fields of tuple structs
737-
/// that are never read.
738-
///
739-
/// ### Example
740-
///
741-
/// ```rust
742-
/// #[warn(unused_tuple_struct_fields)]
743-
/// struct S(i32, i32, i32);
744-
/// let s = S(1, 2, 3);
745-
/// let _ = (s.0, s.2);
746-
/// ```
747-
///
748-
/// {{produces}}
749-
///
750-
/// ### Explanation
751-
///
752-
/// Tuple struct fields that are never read anywhere may indicate a
753-
/// mistake or unfinished code. To silence this warning, consider
754-
/// removing the unused field(s) or, to preserve the numbering of the
755-
/// remaining fields, change the unused field(s) to have unit type.
756-
pub UNUSED_TUPLE_STRUCT_FIELDS,
757-
Allow,
758-
"detects tuple struct fields that are never read"
759-
}
760-
761739
declare_lint! {
762740
/// The `unreachable_code` lint detects unreachable code paths.
763741
///

compiler/rustc_passes/src/dead.rs

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
1515
use rustc_middle::middle::privacy::Level;
1616
use rustc_middle::query::Providers;
1717
use rustc_middle::ty::{self, TyCtxt};
18-
use rustc_session::lint::builtin::{DEAD_CODE, UNUSED_TUPLE_STRUCT_FIELDS};
19-
use rustc_session::lint::{self, Lint, LintId};
18+
use rustc_session::lint;
19+
use rustc_session::lint::builtin::DEAD_CODE;
2020
use rustc_span::symbol::{sym, Symbol};
2121
use rustc_target::abi::FieldIdx;
2222
use std::mem;
@@ -766,6 +766,12 @@ enum ShouldWarnAboutField {
766766
No,
767767
}
768768

769+
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
770+
enum ReportOn {
771+
TupleField,
772+
NamedField,
773+
}
774+
769775
impl<'tcx> DeadVisitor<'tcx> {
770776
fn should_warn_about_field(&mut self, field: &ty::FieldDef) -> ShouldWarnAboutField {
771777
if self.live_symbols.contains(&field.did.expect_local()) {
@@ -787,9 +793,9 @@ impl<'tcx> DeadVisitor<'tcx> {
787793
ShouldWarnAboutField::Yes
788794
}
789795

790-
fn def_lint_level(&self, lint: &'static Lint, id: LocalDefId) -> lint::Level {
796+
fn def_lint_level(&self, id: LocalDefId) -> lint::Level {
791797
let hir_id = self.tcx.local_def_id_to_hir_id(id);
792-
self.tcx.lint_level_at_node(lint, hir_id).0
798+
self.tcx.lint_level_at_node(DEAD_CODE, hir_id).0
793799
}
794800

795801
// # Panics
@@ -803,7 +809,7 @@ impl<'tcx> DeadVisitor<'tcx> {
803809
dead_codes: &[&DeadItem],
804810
participle: &str,
805811
parent_item: Option<LocalDefId>,
806-
lint: &'static Lint,
812+
report_on: ReportOn,
807813
) {
808814
let Some(&first_item) = dead_codes.first() else {
809815
return;
@@ -864,8 +870,8 @@ impl<'tcx> DeadVisitor<'tcx> {
864870
None
865871
};
866872

867-
let diag = if LintId::of(lint) == LintId::of(UNUSED_TUPLE_STRUCT_FIELDS) {
868-
MultipleDeadCodes::UnusedTupleStructFields {
873+
let diag = match report_on {
874+
ReportOn::TupleField => MultipleDeadCodes::UnusedTupleStructFields {
869875
multiple,
870876
num,
871877
descr,
@@ -874,29 +880,29 @@ impl<'tcx> DeadVisitor<'tcx> {
874880
change_fields_suggestion: ChangeFieldsToBeOfUnitType { num, spans: spans.clone() },
875881
parent_info,
876882
ignored_derived_impls,
877-
}
878-
} else {
879-
MultipleDeadCodes::DeadCodes {
883+
},
884+
885+
ReportOn::NamedField => MultipleDeadCodes::DeadCodes {
880886
multiple,
881887
num,
882888
descr,
883889
participle,
884890
name_list,
885891
parent_info,
886892
ignored_derived_impls,
887-
}
893+
},
888894
};
889895

890896
let hir_id = tcx.local_def_id_to_hir_id(first_item.def_id);
891-
self.tcx.emit_spanned_lint(lint, hir_id, MultiSpan::from_spans(spans), diag);
897+
self.tcx.emit_spanned_lint(DEAD_CODE, hir_id, MultiSpan::from_spans(spans), diag);
892898
}
893899

894900
fn warn_multiple(
895901
&self,
896902
def_id: LocalDefId,
897903
participle: &str,
898904
dead_codes: Vec<DeadItem>,
899-
lint: &'static Lint,
905+
report_on: ReportOn,
900906
) {
901907
let mut dead_codes = dead_codes
902908
.iter()
@@ -907,17 +913,17 @@ impl<'tcx> DeadVisitor<'tcx> {
907913
}
908914
dead_codes.sort_by_key(|v| v.level);
909915
for group in dead_codes[..].group_by(|a, b| a.level == b.level) {
910-
self.lint_at_single_level(&group, participle, Some(def_id), lint);
916+
self.lint_at_single_level(&group, participle, Some(def_id), report_on);
911917
}
912918
}
913919

914920
fn warn_dead_code(&mut self, id: LocalDefId, participle: &str) {
915921
let item = DeadItem {
916922
def_id: id,
917923
name: self.tcx.item_name(id.to_def_id()),
918-
level: self.def_lint_level(DEAD_CODE, id),
924+
level: self.def_lint_level(id),
919925
};
920-
self.lint_at_single_level(&[&item], participle, None, DEAD_CODE);
926+
self.lint_at_single_level(&[&item], participle, None, ReportOn::NamedField);
921927
}
922928

923929
fn check_definition(&mut self, def_id: LocalDefId) {
@@ -964,12 +970,12 @@ fn check_mod_deathness(tcx: TyCtxt<'_>, module: LocalModDefId) {
964970
let def_id = item.id.owner_id.def_id;
965971
if !visitor.is_live_code(def_id) {
966972
let name = tcx.item_name(def_id.to_def_id());
967-
let level = visitor.def_lint_level(DEAD_CODE, def_id);
973+
let level = visitor.def_lint_level(def_id);
968974

969975
dead_items.push(DeadItem { def_id, name, level })
970976
}
971977
}
972-
visitor.warn_multiple(item.owner_id.def_id, "used", dead_items, DEAD_CODE);
978+
visitor.warn_multiple(item.owner_id.def_id, "used", dead_items, ReportOn::NamedField);
973979
}
974980

975981
if !live_symbols.contains(&item.owner_id.def_id) {
@@ -991,32 +997,38 @@ fn check_mod_deathness(tcx: TyCtxt<'_>, module: LocalModDefId) {
991997
let def_id = variant.def_id.expect_local();
992998
if !live_symbols.contains(&def_id) {
993999
// Record to group diagnostics.
994-
let level = visitor.def_lint_level(DEAD_CODE, def_id);
1000+
let level = visitor.def_lint_level(def_id);
9951001
dead_variants.push(DeadItem { def_id, name: variant.name, level });
9961002
continue;
9971003
}
9981004

9991005
let is_positional = variant.fields.raw.first().map_or(false, |field| {
10001006
field.name.as_str().starts_with(|c: char| c.is_ascii_digit())
10011007
});
1002-
let lint = if is_positional { UNUSED_TUPLE_STRUCT_FIELDS } else { DEAD_CODE };
1008+
let report_on =
1009+
if is_positional { ReportOn::TupleField } else { ReportOn::NamedField };
10031010
let dead_fields = variant
10041011
.fields
10051012
.iter()
10061013
.filter_map(|field| {
10071014
let def_id = field.did.expect_local();
10081015
if let ShouldWarnAboutField::Yes = visitor.should_warn_about_field(field) {
1009-
let level = visitor.def_lint_level(lint, def_id);
1016+
let level = visitor.def_lint_level(def_id);
10101017
Some(DeadItem { def_id, name: field.name, level })
10111018
} else {
10121019
None
10131020
}
10141021
})
10151022
.collect();
1016-
visitor.warn_multiple(def_id, "read", dead_fields, lint);
1023+
visitor.warn_multiple(def_id, "read", dead_fields, report_on);
10171024
}
10181025

1019-
visitor.warn_multiple(item.owner_id.def_id, "constructed", dead_variants, DEAD_CODE);
1026+
visitor.warn_multiple(
1027+
item.owner_id.def_id,
1028+
"constructed",
1029+
dead_variants,
1030+
ReportOn::NamedField,
1031+
);
10201032
}
10211033
}
10221034

0 commit comments

Comments
 (0)