Skip to content

Commit 6963800

Browse files
authored
Unrolled build for #142964
Rollup merge of #142964 - GrigorenkoPV:attributes/argless, r=oli-obk Attribute rework: a parser for single attributes without arguments Part of #131229 r? `@jdonszelmann` I think code (with comments) speaks for itself. The only subtlety: now `#[cold]`, `#[no_mangle]`, & `#[track_caller]` do not get thrown away when malformed (i.e. have arguments). This doesn't matter too much (I think), because an error gets emitted either way, so the compilation will not finish.
2 parents 6677875 + 8bb7fdb commit 6963800

File tree

8 files changed

+91
-132
lines changed

8 files changed

+91
-132
lines changed

compiler/rustc_attr_parsing/src/attributes/codegen_attrs.rs

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use rustc_feature::{AttributeTemplate, template};
33
use rustc_session::parse::feature_err;
44
use rustc_span::{Span, Symbol, sym};
55

6-
use super::{AcceptMapping, AttributeOrder, AttributeParser, OnDuplicate, SingleAttributeParser};
6+
use super::{
7+
AcceptMapping, AttributeOrder, AttributeParser, NoArgsAttributeParser, OnDuplicate,
8+
SingleAttributeParser,
9+
};
710
use crate::context::{AcceptContext, FinalizeContext, Stage};
811
use crate::parser::ArgParser;
912
use crate::session_diagnostics::{NakedFunctionIncompatibleAttribute, NullOnExport};
@@ -43,20 +46,10 @@ impl<S: Stage> SingleAttributeParser<S> for OptimizeParser {
4346

4447
pub(crate) struct ColdParser;
4548

46-
impl<S: Stage> SingleAttributeParser<S> for ColdParser {
49+
impl<S: Stage> NoArgsAttributeParser<S> for ColdParser {
4750
const PATH: &[Symbol] = &[sym::cold];
48-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepLast;
4951
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
50-
const TEMPLATE: AttributeTemplate = template!(Word);
51-
52-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
53-
if let Err(span) = args.no_args() {
54-
cx.expected_no_args(span);
55-
return None;
56-
}
57-
58-
Some(AttributeKind::Cold(cx.attr_span))
59-
}
52+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::Cold;
6053
}
6154

6255
pub(crate) struct ExportNameParser;
@@ -194,39 +187,17 @@ impl<S: Stage> AttributeParser<S> for NakedParser {
194187
}
195188

196189
pub(crate) struct TrackCallerParser;
197-
198-
impl<S: Stage> SingleAttributeParser<S> for TrackCallerParser {
190+
impl<S: Stage> NoArgsAttributeParser<S> for TrackCallerParser {
199191
const PATH: &[Symbol] = &[sym::track_caller];
200-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepLast;
201192
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
202-
const TEMPLATE: AttributeTemplate = template!(Word);
203-
204-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
205-
if let Err(span) = args.no_args() {
206-
cx.expected_no_args(span);
207-
return None;
208-
}
209-
210-
Some(AttributeKind::TrackCaller(cx.attr_span))
211-
}
193+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::TrackCaller;
212194
}
213195

214196
pub(crate) struct NoMangleParser;
215-
216-
impl<S: Stage> SingleAttributeParser<S> for NoMangleParser {
217-
const PATH: &[rustc_span::Symbol] = &[sym::no_mangle];
218-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepLast;
197+
impl<S: Stage> NoArgsAttributeParser<S> for NoMangleParser {
198+
const PATH: &[Symbol] = &[sym::no_mangle];
219199
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
220-
const TEMPLATE: AttributeTemplate = template!(Word);
221-
222-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
223-
if let Err(span) = args.no_args() {
224-
cx.expected_no_args(span);
225-
return None;
226-
}
227-
228-
Some(AttributeKind::NoMangle(cx.attr_span))
229-
}
200+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::NoMangle;
230201
}
231202

232203
#[derive(Default)]
Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,19 @@
11
use rustc_attr_data_structures::AttributeKind;
2-
use rustc_feature::{AttributeTemplate, template};
3-
use rustc_span::{Symbol, sym};
2+
use rustc_span::{Span, Symbol, sym};
43

5-
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
6-
use crate::context::{AcceptContext, Stage};
7-
use crate::parser::ArgParser;
4+
use crate::attributes::{NoArgsAttributeParser, OnDuplicate};
5+
use crate::context::Stage;
86

97
pub(crate) struct AsPtrParser;
10-
11-
impl<S: Stage> SingleAttributeParser<S> for AsPtrParser {
8+
impl<S: Stage> NoArgsAttributeParser<S> for AsPtrParser {
129
const PATH: &[Symbol] = &[sym::rustc_as_ptr];
13-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
1410
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
15-
const TEMPLATE: AttributeTemplate = template!(Word);
16-
17-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
18-
if let Err(span) = args.no_args() {
19-
cx.expected_no_args(span);
20-
}
21-
Some(AttributeKind::AsPtr(cx.attr_span))
22-
}
11+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::AsPtr;
2312
}
2413

2514
pub(crate) struct PubTransparentParser;
26-
impl<S: Stage> SingleAttributeParser<S> for PubTransparentParser {
15+
impl<S: Stage> NoArgsAttributeParser<S> for PubTransparentParser {
2716
const PATH: &[Symbol] = &[sym::rustc_pub_transparent];
28-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
2917
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
30-
const TEMPLATE: AttributeTemplate = template!(Word);
31-
32-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
33-
if let Err(span) = args.no_args() {
34-
cx.expected_no_args(span);
35-
}
36-
Some(AttributeKind::PubTransparent(cx.attr_span))
37-
}
18+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::PubTransparent;
3819
}
Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,19 @@
11
use rustc_attr_data_structures::AttributeKind;
2-
use rustc_feature::{AttributeTemplate, template};
3-
use rustc_span::{Symbol, sym};
2+
use rustc_span::{Span, Symbol, sym};
43

5-
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
6-
use crate::context::{AcceptContext, Stage};
7-
use crate::parser::ArgParser;
4+
use crate::attributes::{NoArgsAttributeParser, OnDuplicate};
5+
use crate::context::Stage;
86

97
pub(crate) struct LoopMatchParser;
10-
impl<S: Stage> SingleAttributeParser<S> for LoopMatchParser {
8+
impl<S: Stage> NoArgsAttributeParser<S> for LoopMatchParser {
119
const PATH: &[Symbol] = &[sym::loop_match];
12-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
1310
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
14-
const TEMPLATE: AttributeTemplate = template!(Word);
15-
16-
fn convert(cx: &mut AcceptContext<'_, '_, S>, _args: &ArgParser<'_>) -> Option<AttributeKind> {
17-
Some(AttributeKind::LoopMatch(cx.attr_span))
18-
}
11+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::LoopMatch;
1912
}
2013

2114
pub(crate) struct ConstContinueParser;
22-
impl<S: Stage> SingleAttributeParser<S> for ConstContinueParser {
15+
impl<S: Stage> NoArgsAttributeParser<S> for ConstContinueParser {
2316
const PATH: &[Symbol] = &[sym::const_continue];
24-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
2517
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
26-
const TEMPLATE: AttributeTemplate = template!(Word);
27-
28-
fn convert(cx: &mut AcceptContext<'_, '_, S>, _args: &ArgParser<'_>) -> Option<AttributeKind> {
29-
Some(AttributeKind::ConstContinue(cx.attr_span))
30-
}
18+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::ConstContinue;
3119
}

compiler/rustc_attr_parsing/src/attributes/mod.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use std::marker::PhantomData;
1818

1919
use rustc_attr_data_structures::AttributeKind;
20-
use rustc_feature::AttributeTemplate;
20+
use rustc_feature::{AttributeTemplate, template};
2121
use rustc_span::{Span, Symbol};
2222
use thin_vec::ThinVec;
2323

@@ -229,6 +229,41 @@ pub(crate) enum AttributeOrder {
229229
KeepLast,
230230
}
231231

232+
/// An even simpler version of [`SingleAttributeParser`]:
233+
/// now automatically check that there are no arguments provided to the attribute.
234+
///
235+
/// [`WithoutArgs<T> where T: NoArgsAttributeParser`](WithoutArgs) implements [`SingleAttributeParser`].
236+
//
237+
pub(crate) trait NoArgsAttributeParser<S: Stage>: 'static {
238+
const PATH: &[Symbol];
239+
const ON_DUPLICATE: OnDuplicate<S>;
240+
241+
/// Create the [`AttributeKind`] given attribute's [`Span`].
242+
const CREATE: fn(Span) -> AttributeKind;
243+
}
244+
245+
pub(crate) struct WithoutArgs<T: NoArgsAttributeParser<S>, S: Stage>(PhantomData<(S, T)>);
246+
247+
impl<T: NoArgsAttributeParser<S>, S: Stage> Default for WithoutArgs<T, S> {
248+
fn default() -> Self {
249+
Self(Default::default())
250+
}
251+
}
252+
253+
impl<T: NoArgsAttributeParser<S>, S: Stage> SingleAttributeParser<S> for WithoutArgs<T, S> {
254+
const PATH: &[Symbol] = T::PATH;
255+
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepLast;
256+
const ON_DUPLICATE: OnDuplicate<S> = T::ON_DUPLICATE;
257+
const TEMPLATE: AttributeTemplate = template!(Word);
258+
259+
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
260+
if let Err(span) = args.no_args() {
261+
cx.expected_no_args(span);
262+
}
263+
Some(T::CREATE(cx.attr_span))
264+
}
265+
}
266+
232267
type ConvertFn<E> = fn(ThinVec<E>) -> AttributeKind;
233268

234269
/// Alternative to [`AttributeParser`] that automatically handles state management.
Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,12 @@
11
use rustc_attr_data_structures::AttributeKind;
2-
use rustc_feature::{AttributeTemplate, template};
3-
use rustc_span::{Symbol, sym};
2+
use rustc_span::{Span, Symbol, sym};
43

5-
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
6-
use crate::context::{AcceptContext, Stage};
7-
use crate::parser::ArgParser;
4+
use crate::attributes::{NoArgsAttributeParser, OnDuplicate};
5+
use crate::context::Stage;
86

97
pub(crate) struct MayDangleParser;
10-
impl<S: Stage> SingleAttributeParser<S> for MayDangleParser {
8+
impl<S: Stage> NoArgsAttributeParser<S> for MayDangleParser {
119
const PATH: &[Symbol] = &[sym::may_dangle];
12-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
1310
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
14-
const TEMPLATE: AttributeTemplate = template!(Word);
15-
16-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
17-
if let Err(span) = args.no_args() {
18-
cx.expected_no_args(span);
19-
}
20-
Some(AttributeKind::MayDangle(cx.attr_span))
21-
}
11+
const CREATE: fn(span: Span) -> AttributeKind = AttributeKind::MayDangle;
2212
}

compiler/rustc_attr_parsing/src/attributes/stability.rs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ use rustc_attr_data_structures::{
55
StableSince, UnstableReason, VERSION_PLACEHOLDER,
66
};
77
use rustc_errors::ErrorGuaranteed;
8-
use rustc_feature::{AttributeTemplate, template};
8+
use rustc_feature::template;
99
use rustc_span::{Ident, Span, Symbol, sym};
1010

1111
use super::util::parse_version;
12-
use super::{AcceptMapping, AttributeOrder, AttributeParser, OnDuplicate, SingleAttributeParser};
12+
use super::{AcceptMapping, AttributeParser, OnDuplicate};
13+
use crate::attributes::NoArgsAttributeParser;
1314
use crate::context::{AcceptContext, FinalizeContext, Stage};
1415
use crate::parser::{ArgParser, MetaItemParser};
1516
use crate::session_diagnostics::{self, UnsupportedLiteralReason};
@@ -132,19 +133,10 @@ impl<S: Stage> AttributeParser<S> for BodyStabilityParser {
132133
}
133134

134135
pub(crate) struct ConstStabilityIndirectParser;
135-
// FIXME(jdonszelmann): single word attribute group when we have these
136-
impl<S: Stage> SingleAttributeParser<S> for ConstStabilityIndirectParser {
136+
impl<S: Stage> NoArgsAttributeParser<S> for ConstStabilityIndirectParser {
137137
const PATH: &[Symbol] = &[sym::rustc_const_stable_indirect];
138-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
139138
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Ignore;
140-
const TEMPLATE: AttributeTemplate = template!(Word);
141-
142-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
143-
if let Err(span) = args.no_args() {
144-
cx.expected_no_args(span);
145-
}
146-
Some(AttributeKind::ConstStabilityIndirect)
147-
}
139+
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::ConstStabilityIndirect;
148140
}
149141

150142
#[derive(Default)]

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use crate::attributes::stability::{
3737
};
3838
use crate::attributes::traits::SkipDuringMethodDispatchParser;
3939
use crate::attributes::transparency::TransparencyParser;
40-
use crate::attributes::{AttributeParser as _, Combine, Single};
40+
use crate::attributes::{AttributeParser as _, Combine, Single, WithoutArgs};
4141
use crate::parser::{ArgParser, MetaItemParser, PathParser};
4242
use crate::session_diagnostics::{AttributeParseError, AttributeParseErrorReason, UnknownMetaItem};
4343

@@ -58,13 +58,15 @@ macro_rules! attribute_parsers {
5858
use super::*;
5959
type Combine<T> = super::Combine<T, Early>;
6060
type Single<T> = super::Single<T, Early>;
61+
type WithoutArgs<T> = super::WithoutArgs<T, Early>;
6162

6263
attribute_parsers!(@[Early] pub(crate) static $name = [$($names),*];);
6364
}
6465
mod late {
6566
use super::*;
6667
type Combine<T> = super::Combine<T, Late>;
6768
type Single<T> = super::Single<T, Late>;
69+
type WithoutArgs<T> = super::WithoutArgs<T, Late>;
6870

6971
attribute_parsers!(@[Late] pub(crate) static $name = [$($names),*];);
7072
}
@@ -119,28 +121,28 @@ attribute_parsers!(
119121
// tidy-alphabetical-end
120122

121123
// tidy-alphabetical-start
122-
Single<AsPtrParser>,
123-
Single<ColdParser>,
124-
Single<ConstContinueParser>,
125-
Single<ConstStabilityIndirectParser>,
126124
Single<DeprecationParser>,
127125
Single<ExportNameParser>,
128126
Single<InlineParser>,
129127
Single<LinkNameParser>,
130128
Single<LinkSectionParser>,
131-
Single<LoopMatchParser>,
132-
Single<MayDangleParser>,
133129
Single<MustUseParser>,
134-
Single<NoMangleParser>,
135130
Single<OptimizeParser>,
136-
Single<PubTransparentParser>,
137131
Single<RustcForceInlineParser>,
138132
Single<RustcLayoutScalarValidRangeEnd>,
139133
Single<RustcLayoutScalarValidRangeStart>,
140134
Single<RustcObjectLifetimeDefaultParser>,
141135
Single<SkipDuringMethodDispatchParser>,
142-
Single<TrackCallerParser>,
143136
Single<TransparencyParser>,
137+
Single<WithoutArgs<AsPtrParser>>,
138+
Single<WithoutArgs<ColdParser>>,
139+
Single<WithoutArgs<ConstContinueParser>>,
140+
Single<WithoutArgs<ConstStabilityIndirectParser>>,
141+
Single<WithoutArgs<LoopMatchParser>>,
142+
Single<WithoutArgs<MayDangleParser>>,
143+
Single<WithoutArgs<NoMangleParser>>,
144+
Single<WithoutArgs<PubTransparentParser>>,
145+
Single<WithoutArgs<TrackCallerParser>>,
144146
// tidy-alphabetical-end
145147
];
146148
);

tests/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -387,14 +387,6 @@ LL | #![link()]
387387
|
388388
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
389389

390-
warning: attribute should be applied to a function definition
391-
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:62:1
392-
|
393-
LL | #![cold]
394-
| ^^^^^^^^ cannot be applied to crates
395-
|
396-
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
397-
398390
warning: attribute should be applied to a foreign function or static
399391
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:66:1
400392
|
@@ -417,6 +409,14 @@ warning: `#[must_use]` has no effect when applied to a module
417409
LL | #![must_use]
418410
| ^^^^^^^^^^^^
419411

412+
warning: attribute should be applied to a function definition
413+
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:62:1
414+
|
415+
LL | #![cold]
416+
| ^^^^^^^^ cannot be applied to crates
417+
|
418+
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
419+
420420
warning: `#[macro_use]` only has an effect on `extern crate` and modules
421421
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:176:5
422422
|

0 commit comments

Comments
 (0)