detect when variants have the same name as an associated function
This commit is contained in:
@@ -290,6 +290,9 @@ passes_duplicate_lang_item_crate_depends =
|
|||||||
.first_definition_path = first definition in `{$orig_crate_name}` loaded from {$orig_path}
|
.first_definition_path = first definition in `{$orig_crate_name}` loaded from {$orig_path}
|
||||||
.second_definition_path = second definition in `{$crate_name}` loaded from {$path}
|
.second_definition_path = second definition in `{$crate_name}` loaded from {$path}
|
||||||
|
|
||||||
|
passes_enum_variant_same_name =
|
||||||
|
it is impossible to refer to the {$descr} `{$dead_name}` because it is shadowed by this enum variant with the same name
|
||||||
|
|
||||||
passes_export_name =
|
passes_export_name =
|
||||||
attribute should be applied to a free function, impl method or static
|
attribute should be applied to a free function, impl method or static
|
||||||
.label = not a free function, impl method or static
|
.label = not a free function, impl method or static
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ use rustc_errors::MultiSpan;
|
|||||||
use rustc_hir::def::{CtorOf, DefKind, Res};
|
use rustc_hir::def::{CtorOf, DefKind, Res};
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId, LocalModDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId, LocalModDefId};
|
||||||
use rustc_hir::intravisit::{self, Visitor};
|
use rustc_hir::intravisit::{self, Visitor};
|
||||||
use rustc_hir::{self as hir, Node, PatKind, QPath, TyKind};
|
use rustc_hir::{self as hir, ImplItem, ImplItemKind, Node, PatKind, QPath, TyKind};
|
||||||
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
||||||
use rustc_middle::middle::privacy::Level;
|
use rustc_middle::middle::privacy::Level;
|
||||||
use rustc_middle::query::Providers;
|
use rustc_middle::query::Providers;
|
||||||
@@ -936,7 +936,9 @@ enum ShouldWarnAboutField {
|
|||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
enum ReportOn {
|
enum ReportOn {
|
||||||
|
/// Report on something that hasn't got a proper name to refer to
|
||||||
TupleField,
|
TupleField,
|
||||||
|
/// Report on something that has got a name, which could be a field but also a method
|
||||||
NamedField,
|
NamedField,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1061,6 +1063,31 @@ impl<'tcx> DeadVisitor<'tcx> {
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let enum_variants_with_same_name = dead_codes
|
||||||
|
.iter()
|
||||||
|
.filter_map(|dead_item| {
|
||||||
|
if let Node::ImplItem(ImplItem {
|
||||||
|
kind: ImplItemKind::Fn(..) | ImplItemKind::Const(..),
|
||||||
|
..
|
||||||
|
}) = tcx.hir_node_by_def_id(dead_item.def_id)
|
||||||
|
&& let Some(impl_did) = tcx.opt_parent(dead_item.def_id.to_def_id())
|
||||||
|
&& let DefKind::Impl { of_trait: false } = tcx.def_kind(impl_did)
|
||||||
|
&& let ty::Adt(maybe_enum, _) = tcx.type_of(impl_did).skip_binder().kind()
|
||||||
|
&& maybe_enum.is_enum()
|
||||||
|
&& let Some(variant) =
|
||||||
|
maybe_enum.variants().iter().find(|i| i.name == dead_item.name)
|
||||||
|
{
|
||||||
|
Some(crate::errors::EnumVariantSameName {
|
||||||
|
descr: tcx.def_descr(dead_item.def_id.to_def_id()),
|
||||||
|
dead_name: dead_item.name,
|
||||||
|
variant_span: tcx.def_span(variant.def_id),
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
let diag = match report_on {
|
let diag = match report_on {
|
||||||
ReportOn::TupleField => {
|
ReportOn::TupleField => {
|
||||||
let tuple_fields = if let Some(parent_id) = parent_item
|
let tuple_fields = if let Some(parent_id) = parent_item
|
||||||
@@ -1114,6 +1141,7 @@ impl<'tcx> DeadVisitor<'tcx> {
|
|||||||
name_list,
|
name_list,
|
||||||
parent_info,
|
parent_info,
|
||||||
ignored_derived_impls,
|
ignored_derived_impls,
|
||||||
|
enum_variants_with_same_name,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1478,6 +1478,9 @@ pub(crate) enum MultipleDeadCodes<'tcx> {
|
|||||||
participle: &'tcx str,
|
participle: &'tcx str,
|
||||||
name_list: DiagSymbolList,
|
name_list: DiagSymbolList,
|
||||||
#[subdiagnostic]
|
#[subdiagnostic]
|
||||||
|
// only on DeadCodes since it's never a problem for tuple struct fields
|
||||||
|
enum_variants_with_same_name: Vec<EnumVariantSameName<'tcx>>,
|
||||||
|
#[subdiagnostic]
|
||||||
parent_info: Option<ParentInfo<'tcx>>,
|
parent_info: Option<ParentInfo<'tcx>>,
|
||||||
#[subdiagnostic]
|
#[subdiagnostic]
|
||||||
ignored_derived_impls: Option<IgnoredDerivedImpls>,
|
ignored_derived_impls: Option<IgnoredDerivedImpls>,
|
||||||
@@ -1498,6 +1501,15 @@ pub(crate) enum MultipleDeadCodes<'tcx> {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Subdiagnostic)]
|
||||||
|
#[note(passes_enum_variant_same_name)]
|
||||||
|
pub(crate) struct EnumVariantSameName<'tcx> {
|
||||||
|
#[primary_span]
|
||||||
|
pub variant_span: Span,
|
||||||
|
pub dead_name: Symbol,
|
||||||
|
pub descr: &'tcx str,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Subdiagnostic)]
|
#[derive(Subdiagnostic)]
|
||||||
#[label(passes_parent_info)]
|
#[label(passes_parent_info)]
|
||||||
pub(crate) struct ParentInfo<'tcx> {
|
pub(crate) struct ParentInfo<'tcx> {
|
||||||
|
|||||||
@@ -10,6 +10,16 @@ LL | fn F() {}
|
|||||||
LL | const C: () = ();
|
LL | const C: () = ();
|
||||||
| ^
|
| ^
|
||||||
|
|
|
|
||||||
|
note: it is impossible to refer to the associated function `F` because it is shadowed by this enum variant with the same name
|
||||||
|
--> $DIR/dead-code-associated-function.rs:5:5
|
||||||
|
|
|
||||||
|
LL | F(),
|
||||||
|
| ^
|
||||||
|
note: it is impossible to refer to the associated constant `C` because it is shadowed by this enum variant with the same name
|
||||||
|
--> $DIR/dead-code-associated-function.rs:6:5
|
||||||
|
|
|
||||||
|
LL | C(),
|
||||||
|
| ^
|
||||||
note: the lint level is defined here
|
note: the lint level is defined here
|
||||||
--> $DIR/dead-code-associated-function.rs:2:9
|
--> $DIR/dead-code-associated-function.rs:2:9
|
||||||
|
|
|
|
||||||
|
|||||||
Reference in New Issue
Block a user