mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-19 18:34:08 +00:00
Stabilize unrestricted_attribute_tokens
This commit is contained in:
parent
8e1b5d897a
commit
eccc19996b
@ -123,7 +123,6 @@
|
||||
#![feature(abi_unadjusted)]
|
||||
#![feature(adx_target_feature)]
|
||||
#![feature(maybe_uninit, maybe_uninit_slice, maybe_uninit_array)]
|
||||
#![feature(unrestricted_attribute_tokens)]
|
||||
#![feature(external_doc)]
|
||||
|
||||
#[prelude_import]
|
||||
|
@ -21,8 +21,9 @@ use crate::early_buffered_lints::BufferedEarlyLintId;
|
||||
use crate::source_map::Spanned;
|
||||
use crate::edition::{ALL_EDITIONS, Edition};
|
||||
use crate::visit::{self, FnKind, Visitor};
|
||||
use crate::parse::ParseSess;
|
||||
use crate::parse::{token, ParseSess};
|
||||
use crate::symbol::Symbol;
|
||||
use crate::tokenstream::TokenTree;
|
||||
|
||||
use errors::{DiagnosticBuilder, Handler};
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
@ -431,9 +432,6 @@ declare_features! (
|
||||
// Added for testing E0705; perma-unstable.
|
||||
(active, test_2018_feature, "1.31.0", Some(0), Some(Edition::Edition2018)),
|
||||
|
||||
// support for arbitrary delimited token streams in non-macro attributes
|
||||
(active, unrestricted_attribute_tokens, "1.30.0", Some(55208), None),
|
||||
|
||||
// Allows unsized rvalues at arguments and parameters.
|
||||
(active, unsized_locals, "1.30.0", Some(48055), None),
|
||||
|
||||
@ -700,6 +698,8 @@ declare_features! (
|
||||
(accepted, cfg_target_vendor, "1.33.0", Some(29718), None),
|
||||
// `extern crate self as foo;` puts local crate root into extern prelude under name `foo`.
|
||||
(accepted, extern_crate_self, "1.34.0", Some(56409), None),
|
||||
// support for arbitrary delimited token streams in non-macro attributes
|
||||
(accepted, unrestricted_attribute_tokens, "1.34.0", Some(55208), None),
|
||||
);
|
||||
|
||||
// If you change this, please modify `src/doc/unstable-book` as well. You must
|
||||
@ -1660,13 +1660,9 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
||||
|
||||
match BUILTIN_ATTRIBUTES.iter().find(|(name, ..)| attr.path == name) {
|
||||
Some(&(name, _, template, _)) => self.check_builtin_attribute(attr, name, template),
|
||||
None => if !self.context.features.unrestricted_attribute_tokens {
|
||||
// Unfortunately, `parse_meta` cannot be called speculatively
|
||||
// because it can report errors by itself, so we have to call it
|
||||
// only if the feature is disabled.
|
||||
if let Err(mut err) = attr.parse_meta(self.context.parse_sess) {
|
||||
err.help("try enabling `#![feature(unrestricted_attribute_tokens)]`").emit()
|
||||
}
|
||||
None => if let Some(TokenTree::Token(_, token::Eq)) = attr.tokens.trees().next() {
|
||||
// All key-value attributes are restricted to meta-item syntax.
|
||||
attr.parse_meta(self.context.parse_sess).map_err(|mut err| err.emit()).ok();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,5 @@
|
||||
// aux-build:derive-b.rs
|
||||
|
||||
#![feature(unrestricted_attribute_tokens)]
|
||||
|
||||
extern crate derive_b;
|
||||
|
||||
#[derive(Debug, PartialEq, derive_b::B, Eq, Copy, Clone)]
|
||||
|
@ -1,4 +1,4 @@
|
||||
#![feature(custom_attribute, unrestricted_attribute_tokens)]
|
||||
#![feature(custom_attribute)]
|
||||
|
||||
#[my_attr = !] //~ ERROR unexpected token: `!`
|
||||
fn main() {}
|
||||
|
@ -1,7 +0,0 @@
|
||||
#![feature(custom_attribute)]
|
||||
|
||||
#[my_attr(a b c d)]
|
||||
//~^ ERROR expected one of `(`, `)`, `,`, `::`, or `=`, found `b`
|
||||
//~| ERROR expected one of `(`, `)`, `,`, `::`, or `=`, found `c`
|
||||
//~| ERROR expected one of `(`, `)`, `,`, `::`, or `=`, found `d`
|
||||
fn main() {}
|
@ -1,20 +0,0 @@
|
||||
error: expected one of `(`, `)`, `,`, `::`, or `=`, found `b`
|
||||
--> $DIR/feature-gate-unrestricted-attribute-tokens.rs:3:13
|
||||
|
|
||||
LL | #[my_attr(a b c d)]
|
||||
| ^ expected one of `(`, `)`, `,`, `::`, or `=` here
|
||||
|
||||
error: expected one of `(`, `)`, `,`, `::`, or `=`, found `c`
|
||||
--> $DIR/feature-gate-unrestricted-attribute-tokens.rs:3:15
|
||||
|
|
||||
LL | #[my_attr(a b c d)]
|
||||
| ^ expected one of `(`, `)`, `,`, `::`, or `=` here
|
||||
|
||||
error: expected one of `(`, `)`, `,`, `::`, or `=`, found `d`
|
||||
--> $DIR/feature-gate-unrestricted-attribute-tokens.rs:3:17
|
||||
|
|
||||
LL | #[my_attr(a b c d)]
|
||||
| ^ expected one of `(`, `)`, `,`, `::`, or `=` here
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
@ -1,4 +1,2 @@
|
||||
#![feature(unrestricted_attribute_tokens)]
|
||||
|
||||
#[doc = $not_there] //~ ERROR unexpected token: `$`
|
||||
fn main() { }
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: unexpected token: `$`
|
||||
--> $DIR/macro-attribute.rs:3:7
|
||||
--> $DIR/macro-attribute.rs:1:7
|
||||
|
|
||||
LL | #[doc = $not_there] //~ ERROR unexpected token: `$`
|
||||
| ^
|
||||
|
@ -17,8 +17,6 @@ LL | #[my_attr = $expr] //~ ERROR suffixed literals are not allowed in a
|
||||
...
|
||||
LL | check!(-0); // ERROR, see above
|
||||
| ----------- in this macro invocation
|
||||
|
|
||||
= help: try enabling `#![feature(unrestricted_attribute_tokens)]`
|
||||
|
||||
error: unexpected token: `0 + 0`
|
||||
--> $DIR/malformed-interpolated.rs:5:19
|
||||
@ -28,8 +26,6 @@ LL | #[my_attr = $expr] //~ ERROR suffixed literals are not allowed in a
|
||||
...
|
||||
LL | check!(0 + 0); // ERROR, see above
|
||||
| -------------- in this macro invocation
|
||||
|
|
||||
= help: try enabling `#![feature(unrestricted_attribute_tokens)]`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
#![feature(marker_trait_attr)]
|
||||
#![feature(unrestricted_attribute_tokens)]
|
||||
|
||||
#[marker(always)]
|
||||
trait Marker1 {}
|
||||
@ -9,8 +8,8 @@ trait Marker1 {}
|
||||
trait Marker2 {}
|
||||
//~^^ ERROR attribute must be of the form
|
||||
|
||||
#[marker(key = value)]
|
||||
#[marker(key = "value")]
|
||||
trait Marker3 {}
|
||||
//~^^ ERROR expected unsuffixed literal or identifier, found value
|
||||
//~^^ ERROR attribute must be of the form `#[marker]`
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,20 +1,20 @@
|
||||
error: attribute must be of the form `#[marker]`
|
||||
--> $DIR/marker-attribute-with-values.rs:4:1
|
||||
--> $DIR/marker-attribute-with-values.rs:3:1
|
||||
|
|
||||
LL | #[marker(always)]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: attribute must be of the form `#[marker]`
|
||||
--> $DIR/marker-attribute-with-values.rs:8:1
|
||||
--> $DIR/marker-attribute-with-values.rs:7:1
|
||||
|
|
||||
LL | #[marker("never")]
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: expected unsuffixed literal or identifier, found value
|
||||
--> $DIR/marker-attribute-with-values.rs:12:10
|
||||
error: attribute must be of the form `#[marker]`
|
||||
--> $DIR/marker-attribute-with-values.rs:11:1
|
||||
|
|
||||
LL | #[marker(key = value)]
|
||||
| ^^^
|
||||
LL | #[marker(key = "value")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
@ -1,4 +1,2 @@
|
||||
#![feature(unrestricted_attribute_tokens)]
|
||||
|
||||
#[path*] //~ ERROR expected one of `(`, `::`, `=`, `[`, `]`, or `{`, found `*`
|
||||
mod m {}
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: expected one of `(`, `::`, `=`, `[`, `]`, or `{`, found `*`
|
||||
--> $DIR/attr-bad-meta.rs:3:7
|
||||
--> $DIR/attr-bad-meta.rs:1:7
|
||||
|
|
||||
LL | #[path*] //~ ERROR expected one of `(`, `::`, `=`, `[`, `]`, or `{`, found `*`
|
||||
| ^ expected one of `(`, `::`, `=`, `[`, `]`, or `{` here
|
||||
|
@ -8,7 +8,6 @@ extern crate derive_b;
|
||||
#[B(D)] //~ ERROR `B` is ambiguous
|
||||
#[B(E = "foo")] //~ ERROR `B` is ambiguous
|
||||
#[B(arbitrary tokens)] //~ ERROR `B` is ambiguous
|
||||
//~^ ERROR expected one of `(`, `)`, `,`, `::`, or `=`, found `tokens`
|
||||
#[derive(B)]
|
||||
struct B;
|
||||
|
||||
|
@ -13,7 +13,7 @@ LL | #[B] //~ ERROR `B` is ambiguous
|
||||
| ^ ambiguous name
|
||||
|
|
||||
note: `B` could refer to the derive helper attribute defined here
|
||||
--> $DIR/proc-macro-attributes.rs:12:10
|
||||
--> $DIR/proc-macro-attributes.rs:11:10
|
||||
|
|
||||
LL | #[derive(B)]
|
||||
| ^
|
||||
@ -30,7 +30,7 @@ LL | #[B(D)] //~ ERROR `B` is ambiguous
|
||||
| ^ ambiguous name
|
||||
|
|
||||
note: `B` could refer to the derive helper attribute defined here
|
||||
--> $DIR/proc-macro-attributes.rs:12:10
|
||||
--> $DIR/proc-macro-attributes.rs:11:10
|
||||
|
|
||||
LL | #[derive(B)]
|
||||
| ^
|
||||
@ -47,7 +47,7 @@ LL | #[B(E = "foo")] //~ ERROR `B` is ambiguous
|
||||
| ^ ambiguous name
|
||||
|
|
||||
note: `B` could refer to the derive helper attribute defined here
|
||||
--> $DIR/proc-macro-attributes.rs:12:10
|
||||
--> $DIR/proc-macro-attributes.rs:11:10
|
||||
|
|
||||
LL | #[derive(B)]
|
||||
| ^
|
||||
@ -64,7 +64,7 @@ LL | #[B(arbitrary tokens)] //~ ERROR `B` is ambiguous
|
||||
| ^ ambiguous name
|
||||
|
|
||||
note: `B` could refer to the derive helper attribute defined here
|
||||
--> $DIR/proc-macro-attributes.rs:12:10
|
||||
--> $DIR/proc-macro-attributes.rs:11:10
|
||||
|
|
||||
LL | #[derive(B)]
|
||||
| ^
|
||||
@ -74,13 +74,7 @@ note: `B` could also refer to the derive macro imported here
|
||||
LL | #[macro_use]
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: expected one of `(`, `)`, `,`, `::`, or `=`, found `tokens`
|
||||
--> $DIR/proc-macro-attributes.rs:10:15
|
||||
|
|
||||
LL | #[B(arbitrary tokens)] //~ ERROR `B` is ambiguous
|
||||
| ^^^^^^ expected one of `(`, `)`, `,`, `::`, or `=` here
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors occurred: E0658, E0659.
|
||||
For more information about an error, try `rustc --explain E0658`.
|
||||
|
@ -1,6 +1,8 @@
|
||||
// compile-pass
|
||||
|
||||
#![feature(custom_attribute, unrestricted_attribute_tokens)]
|
||||
#![feature(custom_attribute)]
|
||||
|
||||
#[my_attr(a b c d)]
|
||||
#[my_attr[a b c d]]
|
||||
#[my_attr{a b c d}]
|
||||
fn main() {}
|
||||
|
Loading…
Reference in New Issue
Block a user