Stabilize feature(macro_attributes_in_derive_output)

This commit is contained in:
Vadim Petrochenkov 2021-07-17 17:50:33 +03:00
parent 92804cd490
commit 85f02901a3
7 changed files with 40 additions and 142 deletions

View File

@ -295,6 +295,8 @@ macro_rules! declare_features {
(accepted, const_fn_union, "1.56.0", Some(51909), None),
/// Allows explicit discriminants on non-unit enum variants.
(accepted, arbitrary_enum_discriminant, "1.56.0", Some(60553), None),
/// Allows macro attributes to observe output of `#[derive]`.
(accepted, macro_attributes_in_derive_output, "1.57.0", Some(81119), None),
// -------------------------------------------------------------------------
// feature-group-end: accepted features

View File

@ -592,9 +592,6 @@ pub fn set(&self, features: &mut Features, span: Span) {
/// Lessens the requirements for structs to implement `Unsize`.
(active, relaxed_struct_unsize, "1.51.0", Some(81793), None),
/// Allows macro attributes to observe output of `#[derive]`.
(active, macro_attributes_in_derive_output, "1.51.0", Some(81119), None),
/// Allows associated types in inherent impls.
(incomplete, inherent_associated_types, "1.52.0", Some(8995), None),

View File

@ -311,38 +311,6 @@ fn resolve_macro_invocation(
self.create_stable_hashing_context(),
);
if let Res::Def(_, _) = res {
// Gate macro attributes in `#[derive]` output.
if !self.session.features_untracked().macro_attributes_in_derive_output
&& kind == MacroKind::Attr
&& ext.builtin_name != Some(sym::derive)
{
let mut expn_id = parent_scope.expansion;
loop {
// Helper attr table is a quick way to determine whether the attr is `derive`.
if self.helper_attrs.contains_key(&expn_id) {
feature_err(
&self.session.parse_sess,
sym::macro_attributes_in_derive_output,
path.span,
"macro attributes in `#[derive]` output are unstable",
)
.emit();
break;
} else {
let expn_data = expn_id.expn_data();
match expn_data.kind {
ExpnKind::Root
| ExpnKind::Macro(MacroKind::Bang | MacroKind::Derive, _) => {
break;
}
_ => expn_id = expn_data.parent.expect_local(),
}
}
}
}
}
Ok(ext)
}

View File

@ -1,37 +0,0 @@
// gate-test-macro_attributes_in_derive_output
// aux-build: test-macros.rs
#![feature(proc_macro_hygiene)]
#![feature(stmt_expr_attributes)]
#[macro_use]
extern crate test_macros;
#[derive(Empty)]
#[empty_attr] //~ ERROR macro attributes in `#[derive]` output are unstable
struct S1 {
field: [u8; 10],
}
#[derive(Empty)]
#[empty_helper]
#[empty_attr] //~ ERROR macro attributes in `#[derive]` output are unstable
struct S2 {
field: [u8; 10],
}
#[derive(Empty)]
struct S3 {
field: [u8; #[identity_attr] 10], //~ ERROR macro attributes in `#[derive]` output are unstable
}
#[derive(Empty)]
struct S4 {
field: [u8; {
#[derive(Empty)] // OK, not gated
struct Inner;
10
}]
}
fn main() {}

View File

@ -1,30 +0,0 @@
error[E0658]: macro attributes in `#[derive]` output are unstable
--> $DIR/attribute-after-derive-feature-gate.rs:11:3
|
LL | #[empty_attr]
| ^^^^^^^^^^
|
= note: see issue #81119 <https://github.com/rust-lang/rust/issues/81119> for more information
= help: add `#![feature(macro_attributes_in_derive_output)]` to the crate attributes to enable
error[E0658]: macro attributes in `#[derive]` output are unstable
--> $DIR/attribute-after-derive-feature-gate.rs:18:3
|
LL | #[empty_attr]
| ^^^^^^^^^^
|
= note: see issue #81119 <https://github.com/rust-lang/rust/issues/81119> for more information
= help: add `#![feature(macro_attributes_in_derive_output)]` to the crate attributes to enable
error[E0658]: macro attributes in `#[derive]` output are unstable
--> $DIR/attribute-after-derive-feature-gate.rs:25:19
|
LL | field: [u8; #[identity_attr] 10],
| ^^^^^^^^^^^^^
|
= note: see issue #81119 <https://github.com/rust-lang/rust/issues/81119> for more information
= help: add `#![feature(macro_attributes_in_derive_output)]` to the crate attributes to enable
error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0658`.

View File

@ -5,8 +5,6 @@
// compile-flags: -Z span-debug
// aux-build: test-macros.rs
#![feature(macro_attributes_in_derive_output)]
#![no_std] // Don't load unnecessary hygiene information from std
extern crate std;

View File

@ -3,35 +3,35 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attribute-after-derive.rs:17:1: 17:2 (#0),
span: $DIR/attribute-after-derive.rs:15:1: 15:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "derive",
span: $DIR/attribute-after-derive.rs:17:3: 17:9 (#0),
span: $DIR/attribute-after-derive.rs:15:3: 15:9 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "Print",
span: $DIR/attribute-after-derive.rs:17:10: 17:15 (#0),
span: $DIR/attribute-after-derive.rs:15:10: 15:15 (#0),
},
],
span: $DIR/attribute-after-derive.rs:17:9: 17:16 (#0),
span: $DIR/attribute-after-derive.rs:15:9: 15:16 (#0),
},
],
span: $DIR/attribute-after-derive.rs:17:2: 17:17 (#0),
span: $DIR/attribute-after-derive.rs:15:2: 15:17 (#0),
},
Ident {
ident: "struct",
span: $DIR/attribute-after-derive.rs:18:1: 18:7 (#0),
span: $DIR/attribute-after-derive.rs:16:1: 16:7 (#0),
},
Ident {
ident: "AttributeDerive",
span: $DIR/attribute-after-derive.rs:18:8: 18:23 (#0),
span: $DIR/attribute-after-derive.rs:16:8: 16:23 (#0),
},
Group {
delimiter: Brace,
@ -39,64 +39,64 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attribute-after-derive.rs:19:5: 19:6 (#0),
span: $DIR/attribute-after-derive.rs:17:5: 17:6 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "cfg",
span: $DIR/attribute-after-derive.rs:19:7: 19:10 (#0),
span: $DIR/attribute-after-derive.rs:17:7: 17:10 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "FALSE",
span: $DIR/attribute-after-derive.rs:19:11: 19:16 (#0),
span: $DIR/attribute-after-derive.rs:17:11: 17:16 (#0),
},
],
span: $DIR/attribute-after-derive.rs:19:10: 19:17 (#0),
span: $DIR/attribute-after-derive.rs:17:10: 17:17 (#0),
},
],
span: $DIR/attribute-after-derive.rs:19:6: 19:18 (#0),
span: $DIR/attribute-after-derive.rs:17:6: 17:18 (#0),
},
Ident {
ident: "field",
span: $DIR/attribute-after-derive.rs:20:5: 20:10 (#0),
span: $DIR/attribute-after-derive.rs:18:5: 18:10 (#0),
},
Punct {
ch: ':',
spacing: Alone,
span: $DIR/attribute-after-derive.rs:20:10: 20:11 (#0),
span: $DIR/attribute-after-derive.rs:18:10: 18:11 (#0),
},
Ident {
ident: "u8",
span: $DIR/attribute-after-derive.rs:20:12: 20:14 (#0),
span: $DIR/attribute-after-derive.rs:18:12: 18:14 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/attribute-after-derive.rs:20:14: 20:15 (#0),
span: $DIR/attribute-after-derive.rs:18:14: 18:15 (#0),
},
],
span: $DIR/attribute-after-derive.rs:18:24: 21:2 (#0),
span: $DIR/attribute-after-derive.rs:16:24: 19:2 (#0),
},
]
PRINT-DERIVE INPUT (DISPLAY): struct AttributeDerive { }
PRINT-DERIVE INPUT (DEBUG): TokenStream [
Ident {
ident: "struct",
span: $DIR/attribute-after-derive.rs:18:1: 18:7 (#0),
span: $DIR/attribute-after-derive.rs:16:1: 16:7 (#0),
},
Ident {
ident: "AttributeDerive",
span: $DIR/attribute-after-derive.rs:18:8: 18:23 (#0),
span: $DIR/attribute-after-derive.rs:16:8: 16:23 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/attribute-after-derive.rs:18:24: 21:2 (#0),
span: $DIR/attribute-after-derive.rs:16:24: 19:2 (#0),
},
]
PRINT-DERIVE INPUT (DISPLAY): #[print_attr] struct DeriveAttribute { }
@ -104,41 +104,41 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attribute-after-derive.rs:24:1: 24:2 (#0),
span: $DIR/attribute-after-derive.rs:22:1: 22:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "print_attr",
span: $DIR/attribute-after-derive.rs:24:3: 24:13 (#0),
span: $DIR/attribute-after-derive.rs:22:3: 22:13 (#0),
},
],
span: $DIR/attribute-after-derive.rs:24:2: 24:14 (#0),
span: $DIR/attribute-after-derive.rs:22:2: 22:14 (#0),
},
Ident {
ident: "struct",
span: $DIR/attribute-after-derive.rs:25:1: 25:7 (#0),
span: $DIR/attribute-after-derive.rs:23:1: 23:7 (#0),
},
Ident {
ident: "DeriveAttribute",
span: $DIR/attribute-after-derive.rs:25:8: 25:23 (#0),
span: $DIR/attribute-after-derive.rs:23:8: 23:23 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/attribute-after-derive.rs:25:24: 28:2 (#0),
span: $DIR/attribute-after-derive.rs:23:24: 26:2 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): struct DeriveAttribute { #[cfg(FALSE)] field : u8, }
PRINT-ATTR INPUT (DEBUG): TokenStream [
Ident {
ident: "struct",
span: $DIR/attribute-after-derive.rs:25:1: 25:7 (#0),
span: $DIR/attribute-after-derive.rs:23:1: 23:7 (#0),
},
Ident {
ident: "DeriveAttribute",
span: $DIR/attribute-after-derive.rs:25:8: 25:23 (#0),
span: $DIR/attribute-after-derive.rs:23:8: 23:23 (#0),
},
Group {
delimiter: Brace,
@ -146,47 +146,47 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attribute-after-derive.rs:26:5: 26:6 (#0),
span: $DIR/attribute-after-derive.rs:24:5: 24:6 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "cfg",
span: $DIR/attribute-after-derive.rs:26:7: 26:10 (#0),
span: $DIR/attribute-after-derive.rs:24:7: 24:10 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "FALSE",
span: $DIR/attribute-after-derive.rs:26:11: 26:16 (#0),
span: $DIR/attribute-after-derive.rs:24:11: 24:16 (#0),
},
],
span: $DIR/attribute-after-derive.rs:26:10: 26:17 (#0),
span: $DIR/attribute-after-derive.rs:24:10: 24:17 (#0),
},
],
span: $DIR/attribute-after-derive.rs:26:6: 26:18 (#0),
span: $DIR/attribute-after-derive.rs:24:6: 24:18 (#0),
},
Ident {
ident: "field",
span: $DIR/attribute-after-derive.rs:27:5: 27:10 (#0),
span: $DIR/attribute-after-derive.rs:25:5: 25:10 (#0),
},
Punct {
ch: ':',
spacing: Alone,
span: $DIR/attribute-after-derive.rs:27:10: 27:11 (#0),
span: $DIR/attribute-after-derive.rs:25:10: 25:11 (#0),
},
Ident {
ident: "u8",
span: $DIR/attribute-after-derive.rs:27:12: 27:14 (#0),
span: $DIR/attribute-after-derive.rs:25:12: 25:14 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/attribute-after-derive.rs:27:14: 27:15 (#0),
span: $DIR/attribute-after-derive.rs:25:14: 25:15 (#0),
},
],
span: $DIR/attribute-after-derive.rs:25:24: 28:2 (#0),
span: $DIR/attribute-after-derive.rs:23:24: 26:2 (#0),
},
]