Skip to content

Commit d5adb7b

Browse files
Rollup merge of #150127 - Bryntet:parse_rustc_lint_untracked_query_information, r=JonathanBrouwer
Port `#[rustc_lint_untracked_query_information]` and `#[rustc_lint_diagnostics]` to using attribute parsers r? `@JonathanBrouwer`
2 parents 114d457 + 44cfed7 commit d5adb7b

File tree

10 files changed

+67
-59
lines changed

10 files changed

+67
-59
lines changed

‎compiler/rustc_attr_parsing/src/attributes/rustc_internal.rs‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,21 @@ impl<S: Stage> SingleAttributeParser<S> for RustcLegacyConstGenericsParser {
117117
}
118118
}
119119

120+
pub(crate) struct RustcLintDiagnosticsParser;
121+
122+
impl<S: Stage> NoArgsAttributeParser<S> for RustcLintDiagnosticsParser {
123+
const PATH: &[Symbol] = &[sym::rustc_lint_diagnostics];
124+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
125+
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
126+
Allow(Target::Fn),
127+
Allow(Target::Method(MethodKind::Inherent)),
128+
Allow(Target::Method(MethodKind::Trait { body: false })),
129+
Allow(Target::Method(MethodKind::Trait { body: true })),
130+
Allow(Target::Method(MethodKind::TraitImpl)),
131+
]);
132+
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcLintDiagnostics;
133+
}
134+
120135
pub(crate) struct RustcLintOptDenyFieldAccessParser;
121136

122137
impl<S: Stage> SingleAttributeParser<S> for RustcLintOptDenyFieldAccessParser {
@@ -165,6 +180,22 @@ impl<S: Stage> NoArgsAttributeParser<S> for RustcLintQueryInstabilityParser {
165180
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcLintQueryInstability;
166181
}
167182

183+
pub(crate) struct RustcLintUntrackedQueryInformationParser;
184+
185+
impl<S: Stage> NoArgsAttributeParser<S> for RustcLintUntrackedQueryInformationParser {
186+
const PATH: &[Symbol] = &[sym::rustc_lint_untracked_query_information];
187+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
188+
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
189+
Allow(Target::Fn),
190+
Allow(Target::Method(MethodKind::Inherent)),
191+
Allow(Target::Method(MethodKind::Trait { body: false })),
192+
Allow(Target::Method(MethodKind::Trait { body: true })),
193+
Allow(Target::Method(MethodKind::TraitImpl)),
194+
]);
195+
196+
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcLintUntrackedQueryInformation;
197+
}
198+
168199
pub(crate) struct RustcObjectLifetimeDefaultParser;
169200

170201
impl<S: Stage> SingleAttributeParser<S> for RustcObjectLifetimeDefaultParser {

‎compiler/rustc_attr_parsing/src/context.rs‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,9 @@ use crate::attributes::prototype::CustomMirParser;
6161
use crate::attributes::repr::{AlignParser, AlignStaticParser, ReprParser};
6262
use crate::attributes::rustc_internal::{
6363
RustcLayoutScalarValidRangeEndParser, RustcLayoutScalarValidRangeStartParser,
64-
RustcLegacyConstGenericsParser, RustcLintOptDenyFieldAccessParser, RustcLintOptTyParser,
65-
RustcLintQueryInstabilityParser, RustcMainParser, RustcNeverReturnsNullPointerParser,
64+
RustcLegacyConstGenericsParser, RustcLintDiagnosticsParser, RustcLintOptDenyFieldAccessParser,
65+
RustcLintOptTyParser, RustcLintQueryInstabilityParser,
66+
RustcLintUntrackedQueryInformationParser, RustcMainParser, RustcNeverReturnsNullPointerParser,
6667
RustcNoImplicitAutorefsParser, RustcObjectLifetimeDefaultParser, RustcScalableVectorParser,
6768
RustcSimdMonomorphizeLaneLimitParser,
6869
};
@@ -257,8 +258,10 @@ attribute_parsers!(
257258
Single<WithoutArgs<ProcMacroParser>>,
258259
Single<WithoutArgs<PubTransparentParser>>,
259260
Single<WithoutArgs<RustcCoherenceIsCoreParser>>,
261+
Single<WithoutArgs<RustcLintDiagnosticsParser>>,
260262
Single<WithoutArgs<RustcLintOptTyParser>>,
261263
Single<WithoutArgs<RustcLintQueryInstabilityParser>>,
264+
Single<WithoutArgs<RustcLintUntrackedQueryInformationParser>>,
262265
Single<WithoutArgs<RustcMainParser>>,
263266
Single<WithoutArgs<RustcNeverReturnsNullPointerParser>>,
264267
Single<WithoutArgs<RustcNoImplicitAutorefsParser>>,

‎compiler/rustc_hir/src/attrs/data_structures.rs‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,9 @@ pub enum AttributeKind {
931931
/// Represents `#[rustc_legacy_const_generics]`
932932
RustcLegacyConstGenerics { fn_indexes: ThinVec<(usize, Span)>, attr_span: Span },
933933

934+
/// Represents `#[rustc_lint_diagnostics]`
935+
RustcLintDiagnostics,
936+
934937
/// Represents `#[rustc_lint_opt_deny_field_access]`
935938
RustcLintOptDenyFieldAccess { lint_message: Symbol },
936939

@@ -940,6 +943,9 @@ pub enum AttributeKind {
940943
/// Represents `#[rustc_lint_query_instability]`
941944
RustcLintQueryInstability,
942945

946+
/// Represents `#[rustc_lint_untracked_query_information]`
947+
RustcLintUntrackedQueryInformation,
948+
943949
/// Represents `#[rustc_main]`.
944950
RustcMain,
945951

‎compiler/rustc_hir/src/attrs/encode_cross_crate.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,11 @@ impl AttributeKind {
9494
RustcLayoutScalarValidRangeEnd(..) => Yes,
9595
RustcLayoutScalarValidRangeStart(..) => Yes,
9696
RustcLegacyConstGenerics { .. } => Yes,
97+
RustcLintDiagnostics => Yes,
9798
RustcLintOptDenyFieldAccess { .. } => Yes,
9899
RustcLintOptTy => Yes,
99100
RustcLintQueryInstability => Yes,
101+
RustcLintUntrackedQueryInformation => Yes,
100102
RustcMain => No,
101103
RustcNeverReturnsNullPointer => Yes,
102104
RustcNoImplicitAutorefs => Yes,

‎compiler/rustc_lint/src/internal.rs‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,10 @@ impl<'tcx> LateLintPass<'tcx> for QueryStability {
106106
);
107107
}
108108

109-
if cx.tcx.has_attr(def_id, sym::rustc_lint_untracked_query_information) {
109+
if find_attr!(
110+
cx.tcx.get_all_attrs(def_id),
111+
AttributeKind::RustcLintUntrackedQueryInformation
112+
) {
110113
cx.emit_span_lint(
111114
UNTRACKED_QUERY_INFORMATION,
112115
span,
@@ -606,14 +609,14 @@ impl Diagnostics {
606609
else {
607610
return;
608611
};
609-
let has_attr = cx.tcx.has_attr(inst.def_id(), sym::rustc_lint_diagnostics);
610-
if !has_attr {
612+
613+
if !find_attr!(cx.tcx.get_all_attrs(inst.def_id()), AttributeKind::RustcLintDiagnostics) {
611614
return;
612615
};
613616

614617
for (hir_id, _parent) in cx.tcx.hir_parent_iter(current_id) {
615618
if let Some(owner_did) = hir_id.as_owner()
616-
&& cx.tcx.has_attr(owner_did, sym::rustc_lint_diagnostics)
619+
&& find_attr!(cx.tcx.get_all_attrs(owner_did), AttributeKind::RustcLintDiagnostics)
617620
{
618621
// The parent method is marked with `#[rustc_lint_diagnostics]`
619622
return;

‎compiler/rustc_passes/messages.ftl‎

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -484,13 +484,6 @@ passes_sanitize_attribute_not_allowed =
484484
.no_body = function has no body
485485
.help = sanitize attribute can be applied to a function (with body), impl block, or module
486486
487-
passes_should_be_applied_to_fn =
488-
attribute should be applied to a function definition
489-
.label = {$on_crate ->
490-
[true] cannot be applied to crates
491-
*[false] not a function definition
492-
}
493-
494487
passes_should_be_applied_to_static =
495488
attribute should be applied to a static
496489
.label = not a static

‎compiler/rustc_passes/src/check_attr.rs‎

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,11 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
258258
| AttributeKind::RustcNoImplicitAutorefs
259259
| AttributeKind::RustcLayoutScalarValidRangeStart(..)
260260
| AttributeKind::RustcLayoutScalarValidRangeEnd(..)
261+
| AttributeKind::RustcLintDiagnostics
261262
| AttributeKind::RustcLintOptDenyFieldAccess { .. }
262263
| AttributeKind::RustcLintOptTy
263264
| AttributeKind::RustcLintQueryInstability
265+
| AttributeKind::RustcLintUntrackedQueryInformation
264266
| AttributeKind::RustcNeverReturnsNullPointer
265267
| AttributeKind::RustcScalableVector { .. }
266268
| AttributeKind::RustcSimdMonomorphizeLaneLimit(..)
@@ -309,12 +311,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
309311
self.check_diagnostic_on_const(attr.span(), hir_id, target, item)
310312
}
311313
[sym::thread_local, ..] => self.check_thread_local(attr, span, target),
312-
[sym::rustc_lint_untracked_query_information, ..] => {
313-
self.check_applied_to_fn_or_method(hir_id, attr.span(), span, target)
314-
}
315-
[sym::rustc_lint_diagnostics, ..] => {
316-
self.check_applied_to_fn_or_method(hir_id, attr.span(), span, target)
317-
}
318314
[sym::rustc_clean, ..]
319315
| [sym::rustc_dirty, ..]
320316
| [sym::rustc_if_this_changed, ..]
@@ -1230,25 +1226,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
12301226
}
12311227
}
12321228

1233-
/// Helper function for checking that the provided attribute is only applied to a function or
1234-
/// method.
1235-
fn check_applied_to_fn_or_method(
1236-
&self,
1237-
hir_id: HirId,
1238-
attr_span: Span,
1239-
defn_span: Span,
1240-
target: Target,
1241-
) {
1242-
let is_function = matches!(target, Target::Fn | Target::Method(..));
1243-
if !is_function {
1244-
self.dcx().emit_err(errors::AttrShouldBeAppliedToFn {
1245-
attr_span,
1246-
defn_span,
1247-
on_crate: hir_id == CRATE_HIR_ID,
1248-
});
1249-
}
1250-
}
1251-
12521229
/// Checks that the dep-graph debugging attributes are only present when the query-dep-graph
12531230
/// option is passed to the compiler.
12541231
fn check_rustc_dirty_clean(&self, attr: &Attribute) {

‎compiler/rustc_passes/src/errors.rs‎

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,6 @@ pub(crate) struct OuterCrateLevelAttrSuggestion {
8080
#[diag(passes_inner_crate_level_attr)]
8181
pub(crate) struct InnerCrateLevelAttr;
8282

83-
#[derive(Diagnostic)]
84-
#[diag(passes_should_be_applied_to_fn)]
85-
pub(crate) struct AttrShouldBeAppliedToFn {
86-
#[primary_span]
87-
pub attr_span: Span,
88-
#[label]
89-
pub defn_span: Span,
90-
pub on_crate: bool,
91-
}
92-
9383
#[derive(Diagnostic)]
9484
#[diag(passes_non_exhaustive_with_default_field_values)]
9585
pub(crate) struct NonExhaustiveWithDefaultFieldValues {

‎tests/ui/internal-lints/diagnostics_incorrect.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#![feature(rustc_attrs)]
44

55
#[rustc_lint_diagnostics]
6-
//~^ ERROR attribute should be applied to a function
6+
//~^ ERROR `#[rustc_lint_diagnostics]` attribute cannot be used on structs
77
struct Foo;
88

99
impl Foo {
Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
1-
error: malformed `rustc_lint_diagnostics` attribute input
2-
--> $DIR/diagnostics_incorrect.rs:10:5
3-
|
4-
LL | #[rustc_lint_diagnostics(a)]
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: must be of the form: `#[rustc_lint_diagnostics]`
6-
7-
error: attribute should be applied to a function definition
1+
error: `#[rustc_lint_diagnostics]` attribute cannot be used on structs
82
--> $DIR/diagnostics_incorrect.rs:5:1
93
|
104
LL | #[rustc_lint_diagnostics]
115
| ^^^^^^^^^^^^^^^^^^^^^^^^^
12-
LL |
13-
LL | struct Foo;
14-
| ----------- not a function definition
6+
|
7+
= help: `#[rustc_lint_diagnostics]` can only be applied to functions
8+
9+
error[E0565]: malformed `rustc_lint_diagnostics` attribute input
10+
--> $DIR/diagnostics_incorrect.rs:10:5
11+
|
12+
LL | #[rustc_lint_diagnostics(a)]
13+
| ^^^^^^^^^^^^^^^^^^^^^^^^---^
14+
| | |
15+
| | didn't expect any arguments here
16+
| help: must be of the form: `#[rustc_lint_diagnostics]`
1517

1618
error: aborting due to 2 previous errors
1719

20+
For more information about this error, try `rustc --explain E0565`.

0 commit comments

Comments
 (0)