Skip to content

Commit 57488f7

Browse files
committed
Add a clippy attribute #[clippy::no_dead_field_warning] to prevent certain types from propagating dead field warnings (e.g. PhantomData, PhantomPinned)
1 parent 8f99b56 commit 57488f7

4 files changed

Lines changed: 24 additions & 4 deletions

File tree

clippy_lints/src/missing_fields_in_debug.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ use std::ops::ControlFlow;
22

33
use clippy_utils::diagnostics::span_lint_and_then;
44
use clippy_utils::res::{MaybeDef, MaybeResPath};
5-
use clippy_utils::sym;
65
use clippy_utils::visitors::{Visitable, for_each_expr};
6+
use clippy_utils::{is_clippy_no_dead_field_warning_attr, sym};
77
use rustc_ast::LitKind;
88
use rustc_data_structures::fx::FxHashSet;
99
use rustc_hir::def::{DefKind, Res};
1010
use rustc_hir::{Block, Expr, ExprKind, Impl, Item, ItemKind, LangItem, Node, QPath, TyKind, VariantData};
11-
use rustc_lint::{LateContext, LateLintPass};
11+
use rustc_lint::{LateContext, LateLintPass, LintContext};
1212
use rustc_middle::ty::{Ty, TypeckResults};
1313
use rustc_session::declare_lint_pass;
1414
use rustc_span::{Span, Symbol};
@@ -185,6 +185,9 @@ fn check_struct<'tcx>(
185185
.filter_map(|field| {
186186
if field_accesses.contains(&field.ident.name)
187187
|| field.ty.basic_res().is_lang_item(cx, LangItem::PhantomData)
188+
// We exclude certain types (e.g. PhantomData, PhantomPinned) marked with
189+
// this attribute
190+
|| is_clippy_no_dead_field_warning_attr(cx.sess(), cx.tcx, field.ty.basic_res())
188191
{
189192
None
190193
} else {

clippy_lints/src/pub_underscore_fields.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use clippy_config::Conf;
22
use clippy_config::types::PubUnderscoreFieldsBehaviour;
3-
use clippy_utils::attrs::is_doc_hidden;
3+
use clippy_utils::attrs::{is_clippy_no_dead_field_warning_attr, is_doc_hidden};
44
use clippy_utils::diagnostics::span_lint_hir_and_then;
55
use clippy_utils::res::{MaybeDef, MaybeResPath};
66
use rustc_hir::{FieldDef, Item, ItemKind, LangItem};
7-
use rustc_lint::{LateContext, LateLintPass};
7+
use rustc_lint::{LateContext, LateLintPass, LintContext};
88
use rustc_session::impl_lint_pass;
99

1010
declare_clippy_lint! {
@@ -77,6 +77,7 @@ impl<'tcx> LateLintPass<'tcx> for PubUnderscoreFields {
7777
&& !is_doc_hidden(cx.tcx.hir_attrs(field.hir_id))
7878
// We ignore fields that are `PhantomData`.
7979
&& !field.ty.basic_res().is_lang_item(cx, LangItem::PhantomData)
80+
&& !is_clippy_no_dead_field_warning_attr(cx.sess(), cx.tcx, field.ty.basic_res())
8081
{
8182
span_lint_hir_and_then(
8283
cx,

clippy_utils/src/attrs.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::source::SpanRangeExt;
44
use crate::{sym, tokenize_with_text};
55
use rustc_ast::attr::AttributeExt;
66
use rustc_errors::Applicability;
7+
use rustc_hir::def::Res;
78
use rustc_hir::find_attr;
89
use rustc_lexer::TokenKind;
910
use rustc_lint::LateContext;
@@ -91,6 +92,20 @@ pub fn is_doc_hidden(attrs: &[impl AttributeExt]) -> bool {
9192
attrs.iter().any(AttributeExt::is_doc_hidden)
9293
}
9394

95+
/// Checks whether the original type is marked as `#[clippy::no_dead_field_warning]`
96+
pub fn is_clippy_no_dead_field_warning_attr(sess: &Session, tcx: TyCtxt<'_>, res: &Res) -> bool {
97+
res.opt_def_id().is_some_and(|def_id| {
98+
get_builtin_attr(
99+
sess,
100+
#[allow(deprecated)]
101+
tcx.get_all_attrs(def_id),
102+
sym::no_dead_field_warning,
103+
)
104+
.next()
105+
.is_some()
106+
})
107+
}
108+
94109
/// Checks whether the given ADT, or any of its fields/variants, are marked as `#[non_exhaustive]`
95110
pub fn has_non_exhaustive_attr(tcx: TyCtxt<'_>, adt: AdtDef<'_>) -> bool {
96111
adt.is_variant_list_non_exhaustive()

clippy_utils/src/sym.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ generate! {
440440
next_if_eq,
441441
next_multiple_of,
442442
next_tuple,
443+
no_dead_field_warning,
443444
nth,
444445
ok,
445446
ok_or,

0 commit comments

Comments
 (0)