diff --git a/src/doc/unstable-book/src/language-features/proc-macro.md b/src/doc/unstable-book/src/language-features/proc-macro.md
deleted file mode 100644
index 1bd8c41629eea..0000000000000
--- a/src/doc/unstable-book/src/language-features/proc-macro.md
+++ /dev/null
@@ -1,241 +0,0 @@
-# `proc_macro`
-
-The tracking issue for this feature is: [#38356]
-
-[#38356]: https://github.com/rust-lang/rust/issues/38356
-
-------------------------
-
-This feature flag guards the new procedural macro features as laid out by [RFC 1566], which alongside the now-stable
-[custom derives], provide stabilizable alternatives to the compiler plugin API (which requires the use of
-perma-unstable internal APIs) for programmatically modifying Rust code at compile-time.
-
-The two new procedural macro kinds are:
-
-* Function-like procedural macros which are invoked like regular declarative macros, and:
-
-* Attribute-like procedural macros which can be applied to any item which built-in attributes can
-be applied to, and which can take arguments in their invocation as well.
-
-Additionally, this feature flag implicitly enables the [`use_extern_macros`](language-features/use-extern-macros.html) feature,
-which allows macros to be imported like any other item with `use` statements, as compared to
-applying `#[macro_use]` to an `extern crate` declaration. It is important to note that procedural macros may
-**only** be imported in this manner, and will throw an error otherwise.
-
-You **must** declare the `proc_macro` feature in both the crate declaring these new procedural macro kinds as well as
-in any crates that use them.
-
-### Common Concepts
-
-As with custom derives, procedural macros may only be declared in crates of the `proc-macro` type, and must be public
-functions. No other public items may be declared in `proc-macro` crates, but private items are fine.
-
-To declare your crate as a `proc-macro` crate, simply add:
-
-```toml
-[lib]
-proc-macro = true
-```
-
-to your `Cargo.toml`.
-
-Unlike custom derives, however, the name of the function implementing the procedural macro is used directly as the
-procedural macro's name, so choose carefully.
-
-Additionally, both new kinds of procedural macros return a `TokenStream` which *wholly* replaces the original
-invocation and its input.
-
-#### Importing
-
-As referenced above, the new procedural macros are not meant to be imported via `#[macro_use]` and will throw an
-error if they are. Instead, they are meant to be imported like any other item in Rust, with `use` statements:
-
-```rust,ignore
-#![feature(proc_macro)]
-
-// Where `my_proc_macros` is some crate of type `proc_macro`
-extern crate my_proc_macros;
-
-// And declares a `#[proc_macro] pub fn my_bang_macro()` at its root.
-use my_proc_macros::my_bang_macro;
-
-fn main() {
- println!("{}", my_bang_macro!());
-}
-```
-
-#### Error Reporting
-
-Any panics in a procedural macro implementation will be caught by the compiler and turned into an error message pointing
-to the problematic invocation. Thus, it is important to make your panic messages as informative as possible: use
-`Option::expect` instead of `Option::unwrap` and `Result::expect` instead of `Result::unwrap`, and inform the user of
-the error condition as unambiguously as you can.
-
-#### `TokenStream`
-
-The `proc_macro::TokenStream` type is hardcoded into the signatures of procedural macro functions for both input and
-output. It is a wrapper around the compiler's internal representation for a given chunk of Rust code.
-
-### Function-like Procedural Macros
-
-These are procedural macros that are invoked like regular declarative macros. They are declared as public functions in
-crates of the `proc_macro` type and using the `#[proc_macro]` attribute. The name of the declared function becomes the
-name of the macro as it is to be imported and used. The function must be of the kind `fn(TokenStream) -> TokenStream`
-where the sole argument is the input to the macro and the return type is the macro's output.
-
-This kind of macro can expand to anything that is valid for the context it is invoked in, including expressions and
-statements, as well as items.
-
-**Note**: invocations of this kind of macro require a wrapping `[]`, `{}` or `()` like regular macros, but these do not
-appear in the input, only the tokens between them. The tokens between the braces do not need to be valid Rust syntax.
-
-my_macro_crate/src/lib.rs
-
-```rust,ignore
-#![feature(proc_macro)]
-
-// This is always necessary to get the `TokenStream` typedef.
-extern crate proc_macro;
-
-use proc_macro::TokenStream;
-
-#[proc_macro]
-pub fn say_hello(_input: TokenStream) -> TokenStream {
- // This macro will accept any input because it ignores it.
- // To enforce correctness in macros which don't take input,
- // you may want to add `assert!(_input.to_string().is_empty());`.
- "println!(\"Hello, world!\")".parse().unwrap()
-}
-```
-
-my_macro_user/Cargo.toml
-
-```toml
-[dependencies]
-my_macro_crate = { path = "" }
-```
-
-my_macro_user/src/lib.rs
-
-```rust,ignore
-#![feature(proc_macro)]
-
-extern crate my_macro_crate;
-
-use my_macro_crate::say_hello;
-
-fn main() {
- say_hello!();
-}
-```
-
-As expected, this prints `Hello, world!`.
-
-### Attribute-like Procedural Macros
-
-These are arguably the most powerful flavor of procedural macro as they can be applied anywhere attributes are allowed.
-
-They are declared as public functions in crates of the `proc-macro` type, using the `#[proc_macro_attribute]` attribute.
-The name of the function becomes the name of the attribute as it is to be imported and used. The function must be of the
-kind `fn(TokenStream, TokenStream) -> TokenStream` where:
-
-The first argument represents any metadata for the attribute (see [the reference chapter on attributes][refr-attr]).
-Only the metadata itself will appear in this argument, for example:
-
- * `#[my_macro]` will get an empty string.
- * `#[my_macro = "string"]` will get `= "string"`.
- * `#[my_macro(ident)]` will get `(ident)`.
- * etc.
-
-The second argument is the item that the attribute is applied to. It can be a function, a type definition,
-an impl block, an `extern` block, or a module—attribute invocations can take the inner form (`#![my_attr]`)
-or outer form (`#[my_attr]`).
-
-The return type is the output of the macro which *wholly* replaces the item it was applied to. Thus, if your intention
-is to merely modify an item, it *must* be copied to the output. The output must be an item; expressions, statements
-and bare blocks are not allowed.
-
-There is no restriction on how many items an attribute-like procedural macro can emit as long as they are valid in
-the given context.
-
-my_macro_crate/src/lib.rs
-
-```rust,ignore
-#![feature(proc_macro)]
-
-extern crate proc_macro;
-
-use proc_macro::TokenStream;
-
-/// Adds a `/// ### Panics` docstring to the end of the input's documentation
-///
-/// Does not assert that its receiver is a function or method.
-#[proc_macro_attribute]
-pub fn panics_note(args: TokenStream, input: TokenStream) -> TokenStream {
- let args = args.to_string();
- let mut input = input.to_string();
-
- assert!(args.starts_with("= \""), "`#[panics_note]` requires an argument of the form \
- `#[panics_note = \"panic note here\"]`");
-
- // Get just the bare note string
- let panics_note = args.trim_matches(&['=', ' ', '"'][..]);
-
- // The input will include all docstrings regardless of where the attribute is placed,
- // so we need to find the last index before the start of the item
- let insert_idx = idx_after_last_docstring(&input);
-
- // And insert our `### Panics` note there so it always appears at the end of an item's docs
- input.insert_str(insert_idx, &format!("/// # Panics \n/// {}\n", panics_note));
-
- input.parse().unwrap()
-}
-
-// `proc-macro` crates can contain any kind of private item still
-fn idx_after_last_docstring(input: &str) -> usize {
- // Skip docstring lines to find the start of the item proper
- input.lines().skip_while(|line| line.trim_left().starts_with("///")).next()
- // Find the index of the first non-docstring line in the input
- // Note: assumes this exact line is unique in the input
- .and_then(|line_after| input.find(line_after))
- // No docstrings in the input
- .unwrap_or(0)
-}
-```
-
-my_macro_user/Cargo.toml
-
-```toml
-[dependencies]
-my_macro_crate = { path = "" }
-```
-
-my_macro_user/src/lib.rs
-
-```rust,ignore
-#![feature(proc_macro)]
-
-extern crate my_macro_crate;
-
-use my_macro_crate::panics_note;
-
-/// Do the `foo` thing.
-#[panics_note = "Always."]
-pub fn foo() {
- panic!()
-}
-```
-
-Then the rendered documentation for `pub fn foo` will look like this:
-
-> `pub fn foo()`
->
-> ----
-> Do the `foo` thing.
-> # Panics
-> Always.
-
-[RFC 1566]: https://github.com/rust-lang/rfcs/blob/master/text/1566-proc-macros.md
-[custom derives]: https://doc.rust-lang.org/book/procedural-macros.html
-[rust-lang/rust#41430]: https://github.com/rust-lang/rust/issues/41430
-[refr-attr]: https://doc.rust-lang.org/reference/attributes.html
diff --git a/src/libproc_macro/diagnostic.rs b/src/libproc_macro/diagnostic.rs
index a82e3dcb0600c..06939a9d1e1cb 100644
--- a/src/libproc_macro/diagnostic.rs
+++ b/src/libproc_macro/diagnostic.rs
@@ -13,7 +13,7 @@ use Span;
use rustc_errors as rustc;
/// An enum representing a diagnostic level.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_diagnostic", issue = "38356")]
#[derive(Copy, Clone, Debug)]
pub enum Level {
/// An error.
@@ -30,7 +30,7 @@ pub enum Level {
/// A structure representing a diagnostic message and associated children
/// messages.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_diagnostic", issue = "38356")]
#[derive(Clone, Debug)]
pub struct Diagnostic {
level: Level,
@@ -43,7 +43,7 @@ macro_rules! diagnostic_child_methods {
($spanned:ident, $regular:ident, $level:expr) => (
/// Add a new child diagnostic message to `self` with the level
/// identified by this methods name with the given `span` and `message`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_diagnostic", issue = "38356")]
pub fn $spanned>(mut self, span: Span, message: T) -> Diagnostic {
self.children.push(Diagnostic::spanned(span, $level, message));
self
@@ -51,7 +51,7 @@ macro_rules! diagnostic_child_methods {
/// Add a new child diagnostic message to `self` with the level
/// identified by this method's name with the given `message`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_diagnostic", issue = "38356")]
pub fn $regular>(mut self, message: T) -> Diagnostic {
self.children.push(Diagnostic::new($level, message));
self
@@ -61,7 +61,7 @@ macro_rules! diagnostic_child_methods {
impl Diagnostic {
/// Create a new diagnostic with the given `level` and `message`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_diagnostic", issue = "38356")]
pub fn new>(level: Level, message: T) -> Diagnostic {
Diagnostic {
level: level,
@@ -73,7 +73,7 @@ impl Diagnostic {
/// Create a new diagnostic with the given `level` and `message` pointing to
/// the given `span`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_diagnostic", issue = "38356")]
pub fn spanned>(span: Span, level: Level, message: T) -> Diagnostic {
Diagnostic {
level: level,
@@ -89,13 +89,13 @@ impl Diagnostic {
diagnostic_child_methods!(span_help, help, Level::Help);
/// Returns the diagnostic `level` for `self`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_diagnostic", issue = "38356")]
pub fn level(&self) -> Level {
self.level
}
/// Emit the diagnostic.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_diagnostic", issue = "38356")]
pub fn emit(self) {
::__internal::with_sess(move |sess, _| {
let handler = &sess.span_diagnostic;
diff --git a/src/libproc_macro/lib.rs b/src/libproc_macro/lib.rs
index ecc66e869ae7a..f5a7c88a1b71a 100644
--- a/src/libproc_macro/lib.rs
+++ b/src/libproc_macro/lib.rs
@@ -46,7 +46,7 @@ extern crate rustc_data_structures;
mod diagnostic;
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_diagnostic", issue = "38356")]
pub use diagnostic::{Diagnostic, Level};
use std::{ascii, fmt, iter};
@@ -94,13 +94,13 @@ impl !Sync for LexError {}
impl TokenStream {
/// Returns an empty `TokenStream` containing no token trees.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn new() -> TokenStream {
TokenStream(tokenstream::TokenStream::empty())
}
/// Checks if this `TokenStream` is empty.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
@@ -146,7 +146,7 @@ impl fmt::Debug for TokenStream {
}
/// Creates a token stream containing a single token tree.
-#[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl From for TokenStream {
fn from(tree: TokenTree) -> TokenStream {
TokenStream(tree.to_internal())
@@ -154,7 +154,7 @@ impl From for TokenStream {
}
/// Collects a number of token trees into a single stream.
-#[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl iter::FromIterator for TokenStream {
fn from_iter>(trees: I) -> Self {
trees.into_iter().map(TokenStream::from).collect()
@@ -175,7 +175,7 @@ impl iter::FromIterator for TokenStream {
}
/// Public implementation details for the `TokenStream` type, such as iterators.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub mod token_stream {
use syntax::tokenstream;
use {TokenTree, TokenStream, Delimiter};
@@ -184,13 +184,13 @@ pub mod token_stream {
/// The iteration is "shallow", e.g. the iterator doesn't recurse into delimited groups,
/// and returns whole groups as token trees.
#[derive(Clone)]
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub struct IntoIter {
cursor: tokenstream::Cursor,
stack: Vec,
}
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl Iterator for IntoIter {
type Item = TokenTree;
@@ -219,7 +219,7 @@ pub mod token_stream {
}
}
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl IntoIterator for TokenStream {
type Item = TokenTree;
type IntoIter = IntoIter;
@@ -238,7 +238,7 @@ pub mod token_stream {
/// To quote `$` itself, use `$$`.
///
/// This is a dummy macro, the actual implementation is in quote::Quoter
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_quote", issue = "38356")]
#[macro_export]
macro_rules! quote { () => {} }
@@ -248,26 +248,26 @@ mod quote;
/// Quote a `Span` into a `TokenStream`.
/// This is needed to implement a custom quoter.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_quote", issue = "38356")]
pub fn quote_span(span: Span) -> TokenStream {
quote::Quote::quote(span)
}
/// A region of source code, along with macro expansion information.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
#[derive(Copy, Clone)]
pub struct Span(syntax_pos::Span);
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Send for Span {}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Sync for Span {}
macro_rules! diagnostic_method {
($name:ident, $level:expr) => (
/// Create a new `Diagnostic` with the given `message` at the span
/// `self`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_diagnostic", issue = "38356")]
pub fn $name>(self, message: T) -> Diagnostic {
Diagnostic::spanned(self, $level, message)
}
@@ -276,7 +276,7 @@ macro_rules! diagnostic_method {
impl Span {
/// A span that resolves at the macro definition site.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn def_site() -> Span {
::__internal::with_sess(|_, data| data.def_site)
}
@@ -285,13 +285,13 @@ impl Span {
/// Identifiers created with this span will be resolved as if they were written
/// directly at the macro call location (call-site hygiene) and other code
/// at the macro call site will be able to refer to them as well.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn call_site() -> Span {
::__internal::with_sess(|_, data| data.call_site)
}
/// The original source file into which this span points.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn source_file(&self) -> SourceFile {
SourceFile {
filemap: __internal::lookup_char_pos(self.0.lo()).file,
@@ -300,7 +300,7 @@ impl Span {
/// The `Span` for the tokens in the previous macro expansion from which
/// `self` was generated from, if any.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn parent(&self) -> Option {
self.0.parent().map(Span)
}
@@ -308,13 +308,13 @@ impl Span {
/// The span for the origin source code that `self` was generated from. If
/// this `Span` wasn't generated from other macro expansions then the return
/// value is the same as `*self`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn source(&self) -> Span {
Span(self.0.source_callsite())
}
/// Get the starting line/column in the source file for this span.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn start(&self) -> LineColumn {
let loc = __internal::lookup_char_pos(self.0.lo());
LineColumn {
@@ -324,7 +324,7 @@ impl Span {
}
/// Get the ending line/column in the source file for this span.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn end(&self) -> LineColumn {
let loc = __internal::lookup_char_pos(self.0.hi());
LineColumn {
@@ -336,7 +336,7 @@ impl Span {
/// Create a new span encompassing `self` and `other`.
///
/// Returns `None` if `self` and `other` are from different files.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn join(&self, other: Span) -> Option {
let self_loc = __internal::lookup_char_pos(self.0.lo());
let other_loc = __internal::lookup_char_pos(other.0.lo());
@@ -348,20 +348,20 @@ impl Span {
/// Creates a new span with the same line/column information as `self` but
/// that resolves symbols as though it were at `other`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn resolved_at(&self, other: Span) -> Span {
Span(self.0.with_ctxt(other.0.ctxt()))
}
/// Creates a new span with the same name resolution behavior as `self` but
/// with the line/column information of `other`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn located_at(&self, other: Span) -> Span {
other.resolved_at(*self)
}
/// Compares to spans to see if they're equal.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn eq(&self, other: &Span) -> bool {
self.0 == other.0
}
@@ -373,7 +373,7 @@ impl Span {
}
/// Prints a span in a form convenient for debugging.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl fmt::Debug for Span {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?} bytes({}..{})",
@@ -384,33 +384,33 @@ impl fmt::Debug for Span {
}
/// A line-column pair representing the start or end of a `Span`.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct LineColumn {
/// The 1-indexed line in the source file on which the span starts or ends (inclusive).
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub line: usize,
/// The 0-indexed column (in UTF-8 characters) in the source file on which
/// the span starts or ends (inclusive).
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub column: usize
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
impl !Send for LineColumn {}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
impl !Sync for LineColumn {}
/// The source file of a given `Span`.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
#[derive(Clone)]
pub struct SourceFile {
filemap: Lrc,
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
impl !Send for SourceFile {}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
impl !Sync for SourceFile {}
impl SourceFile {
@@ -424,14 +424,14 @@ impl SourceFile {
/// the command line, the path as given may not actually be valid.
///
/// [`is_real`]: #method.is_real
- # [unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn path(&self) -> &FileName {
&self.filemap.name
}
/// Returns `true` if this source file is a real source file, and not generated by an external
/// macro's expansion.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_span", issue = "38356")]
pub fn is_real(&self) -> bool {
// This is a hack until intercrate spans are implemented and we can have real source files
// for spans generated in external macros.
@@ -440,14 +440,14 @@ impl SourceFile {
}
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
impl AsRef for SourceFile {
fn as_ref(&self) -> &FileName {
self.path()
}
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
impl fmt::Debug for SourceFile {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("SourceFile")
@@ -457,17 +457,17 @@ impl fmt::Debug for SourceFile {
}
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
impl PartialEq for SourceFile {
fn eq(&self, other: &Self) -> bool {
Lrc::ptr_eq(&self.filemap, &other.filemap)
}
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
impl Eq for SourceFile {}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[unstable(feature = "proc_macro_span", issue = "38356")]
impl PartialEq for SourceFile {
fn eq(&self, other: &FileName) -> bool {
self.as_ref() == other
@@ -475,28 +475,44 @@ impl PartialEq for SourceFile {
}
/// A single token or a delimited sequence of token trees (e.g. `[1, (), ..]`).
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
#[derive(Clone)]
pub enum TokenTree {
/// A token stream surrounded by bracket delimiters.
- Group(Group),
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
+ Group(
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
+ Group
+ ),
/// An identifier.
- Ident(Ident),
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
+ Ident(
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
+ Ident
+ ),
/// A single punctuation character (`+`, `,`, `$`, etc.).
- Punct(Punct),
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
+ Punct(
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
+ Punct
+ ),
/// A literal character (`'a'`), string (`"hello"`), number (`2.3`), etc.
- Literal(Literal),
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
+ Literal(
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
+ Literal
+ ),
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Send for TokenTree {}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Sync for TokenTree {}
impl TokenTree {
/// Returns the span of this tree, delegating to the `span` method of
/// the contained token or a delimited stream.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn span(&self) -> Span {
match *self {
TokenTree::Group(ref t) => t.span(),
@@ -511,7 +527,7 @@ impl TokenTree {
/// Note that if this token is a `Group` then this method will not configure
/// the span of each of the internal tokens, this will simply delegate to
/// the `set_span` method of each variant.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn set_span(&mut self, span: Span) {
match *self {
TokenTree::Group(ref mut t) => t.set_span(span),
@@ -523,7 +539,7 @@ impl TokenTree {
}
/// Prints token treee in a form convenient for debugging.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl fmt::Debug for TokenTree {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// Each of these has the name in the struct type in the derived debug,
@@ -537,28 +553,28 @@ impl fmt::Debug for TokenTree {
}
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl From for TokenTree {
fn from(g: Group) -> TokenTree {
TokenTree::Group(g)
}
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl From for TokenTree {
fn from(g: Ident) -> TokenTree {
TokenTree::Ident(g)
}
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl From for TokenTree {
fn from(g: Punct) -> TokenTree {
TokenTree::Punct(g)
}
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl From for TokenTree {
fn from(g: Literal) -> TokenTree {
TokenTree::Literal(g)
@@ -568,7 +584,7 @@ impl From for TokenTree {
/// Prints the token tree as a string that is supposed to be losslessly convertible back
/// into the same token tree (modulo spans), except for possibly `TokenTree::Group`s
/// with `Delimiter::None` delimiters and negative numeric literals.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl fmt::Display for TokenTree {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
@@ -584,33 +600,37 @@ impl fmt::Display for TokenTree {
///
/// A `Group` internally contains a `TokenStream` which is surrounded by `Delimiter`s.
#[derive(Clone, Debug)]
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub struct Group {
delimiter: Delimiter,
stream: TokenStream,
span: Span,
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Send for Group {}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Sync for Group {}
/// Describes how a sequence of token trees is delimited.
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub enum Delimiter {
/// `( ... )`
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
Parenthesis,
/// `{ ... }`
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
Brace,
/// `[ ... ]`
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
Bracket,
/// `Ø ... Ø`
/// An implicit delimiter, that may, for example, appear around tokens coming from a
/// "macro variable" `$var`. It is important to preserve operator priorities in cases like
/// `$var * 3` where `$var` is `1 + 2`.
/// Implicit delimiters may not survive roundtrip of a token stream through a string.
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
None,
}
@@ -620,7 +640,7 @@ impl Group {
/// This constructor will set the span for this group to
/// `Span::call_site()`. To change the span you can use the `set_span`
/// method below.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn new(delimiter: Delimiter, stream: TokenStream) -> Group {
Group {
delimiter: delimiter,
@@ -630,7 +650,7 @@ impl Group {
}
/// Returns the delimiter of this `Group`
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn delimiter(&self) -> Delimiter {
self.delimiter
}
@@ -639,14 +659,14 @@ impl Group {
///
/// Note that the returned token stream does not include the delimiter
/// returned above.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn stream(&self) -> TokenStream {
self.stream.clone()
}
/// Returns the span for the delimiters of this token stream, spanning the
/// entire `Group`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn span(&self) -> Span {
self.span
}
@@ -657,7 +677,7 @@ impl Group {
/// This method will **not** set the span of all the internal tokens spanned
/// by this group, but rather it will only set the span of the delimiter
/// tokens at the level of the `Group`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn set_span(&mut self, span: Span) {
self.span = span;
}
@@ -666,7 +686,7 @@ impl Group {
/// Prints the group as a string that should be losslessly convertible back
/// into the same group (modulo spans), except for possibly `TokenTree::Group`s
/// with `Delimiter::None` delimiters.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl fmt::Display for Group {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
TokenStream::from(TokenTree::from(self.clone())).fmt(f)
@@ -677,7 +697,7 @@ impl fmt::Display for Group {
///
/// Multicharacter operators like `+=` are represented as two instances of `Punct` with different
/// forms of `Spacing` returned.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
#[derive(Clone, Debug)]
pub struct Punct {
ch: char,
@@ -685,20 +705,22 @@ pub struct Punct {
span: Span,
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Send for Punct {}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Sync for Punct {}
/// Whether an `Punct` is followed immediately by another `Punct` or
/// followed by another token or whitespace.
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub enum Spacing {
/// E.g. `+` is `Alone` in `+ =`, `+ident` or `+()`.
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
Alone,
/// E.g. `+` is `Joint` in `+=` or `'#`.
/// Additionally, single quote `'` can join with identifiers to form lifetimes `'ident`.
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
Joint,
}
@@ -709,7 +731,7 @@ impl Punct {
///
/// The returned `Punct` will have the default span of `Span::call_site()`
/// which can be further configured with the `set_span` method below.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn new(ch: char, spacing: Spacing) -> Punct {
const LEGAL_CHARS: &[char] = &['=', '<', '>', '!', '~', '+', '-', '*', '/', '%', '^',
'&', '|', '@', '.', ',', ';', ':', '#', '$', '?', '\''];
@@ -724,7 +746,7 @@ impl Punct {
}
/// Returns the value of this punctuation character as `char`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn as_char(&self) -> char {
self.ch
}
@@ -733,19 +755,19 @@ impl Punct {
/// followed by another `Punct` in the token stream, so they can potentially be combined into
/// a multicharacter operator (`Joint`), or it's followed by some other token or whitespace
/// (`Alone`) so the operator has certainly ended.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn spacing(&self) -> Spacing {
self.spacing
}
/// Returns the span for this punctuation character.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn span(&self) -> Span {
self.span
}
/// Configure the span for this punctuation character.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn set_span(&mut self, span: Span) {
self.span = span;
}
@@ -753,7 +775,7 @@ impl Punct {
/// Prints the punctuation character as a string that should be losslessly convertible
/// back into the same character.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl fmt::Display for Punct {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
TokenStream::from(TokenTree::from(self.clone())).fmt(f)
@@ -762,16 +784,16 @@ impl fmt::Display for Punct {
/// An identifier (`ident`).
#[derive(Clone, Debug)]
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub struct Ident {
sym: Symbol,
span: Span,
is_raw: bool,
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Send for Ident {}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Sync for Ident {}
impl Ident {
@@ -794,7 +816,7 @@ impl Ident {
///
/// Due to the current importance of hygiene this constructor, unlike other
/// tokens, requires a `Span` to be specified at construction.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn new(string: &str, span: Span) -> Ident {
if !lexer::is_valid_ident(string) {
panic!("`{:?}` is not a valid identifier", string)
@@ -807,7 +829,7 @@ impl Ident {
}
/// Same as `Ident::new`, but creates a raw identifier (`r#ident`).
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[unstable(feature = "proc_macro_raw_ident", issue = "38356")]
pub fn new_raw(string: &str, span: Span) -> Ident {
let mut ident = Ident::new(string, span);
if ident.sym == keywords::Underscore.name() ||
@@ -820,13 +842,13 @@ impl Ident {
/// Returns the span of this `Ident`, encompassing the entire string returned
/// by `as_str`.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn span(&self) -> Span {
self.span
}
/// Configures the span of this `Ident`, possibly changing its hygiene context.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn set_span(&mut self, span: Span) {
self.span = span;
}
@@ -834,7 +856,7 @@ impl Ident {
/// Prints the identifier as a string that should be losslessly convertible
/// back into the same identifier.
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl fmt::Display for Ident {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.is_raw {
@@ -849,16 +871,16 @@ impl fmt::Display for Ident {
/// with or without a suffix (`1`, `1u8`, `2.3`, `2.3f32`).
/// Boolean literals like `true` and `false` do not belong here, they are `Ident`s.
#[derive(Clone, Debug)]
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub struct Literal {
lit: token::Lit,
suffix: Option,
span: Span,
}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Send for Literal {}
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl !Sync for Literal {}
macro_rules! suffixed_int_literals {
@@ -874,7 +896,7 @@ macro_rules! suffixed_int_literals {
/// Literals created through this method have the `Span::call_site()`
/// span by default, which can be configured with the `set_span` method
/// below.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn $name(n: $kind) -> Literal {
Literal {
lit: token::Lit::Integer(Symbol::intern(&n.to_string())),
@@ -900,7 +922,7 @@ macro_rules! unsuffixed_int_literals {
/// Literals created through this method have the `Span::call_site()`
/// span by default, which can be configured with the `set_span` method
/// below.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn $name(n: $kind) -> Literal {
Literal {
lit: token::Lit::Integer(Symbol::intern(&n.to_string())),
@@ -954,7 +976,7 @@ impl Literal {
///
/// This function requires that the specified float is finite, for
/// example if it is infinity or NaN this function will panic.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn f32_unsuffixed(n: f32) -> Literal {
if !n.is_finite() {
panic!("Invalid float literal {}", n);
@@ -979,7 +1001,7 @@ impl Literal {
///
/// This function requires that the specified float is finite, for
/// example if it is infinity or NaN this function will panic.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn f32_suffixed(n: f32) -> Literal {
if !n.is_finite() {
panic!("Invalid float literal {}", n);
@@ -1003,7 +1025,7 @@ impl Literal {
///
/// This function requires that the specified float is finite, for
/// example if it is infinity or NaN this function will panic.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn f64_unsuffixed(n: f64) -> Literal {
if !n.is_finite() {
panic!("Invalid float literal {}", n);
@@ -1028,7 +1050,7 @@ impl Literal {
///
/// This function requires that the specified float is finite, for
/// example if it is infinity or NaN this function will panic.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn f64_suffixed(n: f64) -> Literal {
if !n.is_finite() {
panic!("Invalid float literal {}", n);
@@ -1041,7 +1063,7 @@ impl Literal {
}
/// String literal.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn string(string: &str) -> Literal {
let mut escaped = String::new();
for ch in string.chars() {
@@ -1055,7 +1077,7 @@ impl Literal {
}
/// Character literal.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn character(ch: char) -> Literal {
let mut escaped = String::new();
escaped.extend(ch.escape_unicode());
@@ -1067,7 +1089,7 @@ impl Literal {
}
/// Byte string literal.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn byte_string(bytes: &[u8]) -> Literal {
let string = bytes.iter().cloned().flat_map(ascii::escape_default)
.map(Into::::into).collect::();
@@ -1079,13 +1101,13 @@ impl Literal {
}
/// Returns the span encompassing this literal.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn span(&self) -> Span {
self.span
}
/// Configures the span associated for this literal.
- #[unstable(feature = "proc_macro", issue = "38356")]
+ #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn set_span(&mut self, span: Span) {
self.span = span;
}
@@ -1093,7 +1115,7 @@ impl Literal {
/// Prints the literal as a string that should be losslessly convertible
/// back into the same literal (except for possible rounding for floating point literals).
-#[unstable(feature = "proc_macro", issue = "38356")]
+#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
impl fmt::Display for Literal {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
TokenStream::from(TokenTree::from(self.clone())).fmt(f)
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index f3086d3ab2b1b..f388b911feb6a 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -1412,9 +1412,6 @@ pub struct Resolver<'a> {
/// Avoid duplicated errors for "name already defined".
name_already_seen: FxHashMap,
- /// If `#![feature(proc_macro)]` is set
- proc_macro_enabled: bool,
-
/// A set of procedural macros imported by `#[macro_use]` that have already been warned about
warned_proc_macros: FxHashSet,
@@ -1713,7 +1710,7 @@ impl<'a> Resolver<'a> {
// The `proc_macro` and `decl_macro` features imply `use_extern_macros`
use_extern_macros:
- features.use_extern_macros || features.proc_macro || features.decl_macro,
+ features.use_extern_macros || features.decl_macro,
crate_loader,
macro_names: FxHashSet(),
@@ -1727,7 +1724,6 @@ impl<'a> Resolver<'a> {
local_macro_def_scopes: FxHashMap(),
name_already_seen: FxHashMap(),
whitelisted_legacy_custom_derives: Vec::new(),
- proc_macro_enabled: features.proc_macro,
warned_proc_macros: FxHashSet(),
potentially_unused_imports: Vec::new(),
struct_constructors: DefIdMap(),
@@ -4509,7 +4505,7 @@ impl<'a> Resolver<'a> {
}
fn check_proc_macro_attrs(&mut self, attrs: &[ast::Attribute]) {
- if self.proc_macro_enabled { return; }
+ if self.use_extern_macros { return; }
for attr in attrs {
if attr.path.segments.len() > 1 {
diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs
index c99172efc7c5e..f076d884f6099 100644
--- a/src/librustc_resolve/macros.rs
+++ b/src/librustc_resolve/macros.rs
@@ -429,7 +429,7 @@ impl<'a> Resolver<'a> {
*item = mem::replace(item, dummy_item).map_attrs(|mut attrs| {
let inert_attr = attr.take().unwrap();
attr::mark_known(&inert_attr);
- if self.proc_macro_enabled {
+ if self.use_extern_macros {
*attr = expand::find_attr_invoc(&mut attrs);
}
attrs.push(inert_attr);
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index 281ebaff27286..1241e230b26d6 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -1073,7 +1073,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
return attrs;
}
- if self.cx.ecfg.proc_macro_enabled() {
+ if self.cx.ecfg.use_extern_macros_enabled() {
attr = find_attr_invoc(&mut attrs);
}
traits = collect_derives(&mut self.cx, &mut attrs);
@@ -1096,7 +1096,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
return attrs;
}
- if self.cx.ecfg.proc_macro_enabled() {
+ if self.cx.ecfg.use_extern_macros_enabled() {
attr = find_attr_invoc(&mut attrs);
}
attrs
@@ -1406,7 +1406,7 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
foreign_item: ast::ForeignItem) -> SmallVector {
let (attr, traits, foreign_item) = self.classify_item(foreign_item);
- let explain = if self.cx.ecfg.proc_macro_enabled() {
+ let explain = if self.cx.ecfg.use_extern_macros_enabled() {
feature_gate::EXPLAIN_PROC_MACROS_IN_EXTERN
} else {
feature_gate::EXPLAIN_MACROS_IN_EXTERN
@@ -1592,7 +1592,7 @@ impl<'feat> ExpansionConfig<'feat> {
fn enable_trace_macros = trace_macros,
fn enable_allow_internal_unstable = allow_internal_unstable,
fn enable_custom_derive = custom_derive,
- fn proc_macro_enabled = proc_macro,
+ fn use_extern_macros_enabled = use_extern_macros,
fn macros_in_extern_enabled = macros_in_extern,
fn proc_macro_mod = proc_macro_mod,
fn proc_macro_gen = proc_macro_gen,
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index f033c5006c53a..1a73096505f45 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -39,13 +39,6 @@ use symbol::{keywords, Symbol};
use std::{env, path};
macro_rules! set {
- (proc_macro) => {{
- fn f(features: &mut Features, span: Span) {
- features.declared_lib_features.push((Symbol::intern("proc_macro"), span));
- features.proc_macro = true;
- }
- f as fn(&mut Features, Span)
- }};
($field: ident) => {{
fn f(features: &mut Features, _: Span) {
features.$field = true;
@@ -303,9 +296,6 @@ declare_features! (
// rustc internal
(active, abi_unadjusted, "1.16.0", None, None),
- // Procedural macros 2.0.
- (active, proc_macro, "1.16.0", Some(38356), Some(Edition::Edition2018)),
-
// Declarative macros 2.0 (`macro`).
(active, decl_macro, "1.17.0", Some(39412), None),
@@ -626,6 +616,8 @@ declare_features! (
(accepted, global_allocator, "1.28.0", Some(27389), None),
// Allows `#[repr(transparent)]` attribute on newtype structs
(accepted, repr_transparent, "1.28.0", Some(43036), None),
+ // Defining procedural macros in `proc-macro` crates
+ (accepted, proc_macro, "1.29.0", Some(38356), None),
);
// If you change this, please modify src/doc/unstable-book as well. You must
@@ -1033,15 +1025,8 @@ pub const BUILTIN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeG
("windows_subsystem", Whitelisted, Ungated),
- ("proc_macro_attribute", Normal, Gated(Stability::Unstable,
- "proc_macro",
- "attribute proc macros are currently unstable",
- cfg_fn!(proc_macro))),
-
- ("proc_macro", Normal, Gated(Stability::Unstable,
- "proc_macro",
- "function-like proc macros are currently unstable",
- cfg_fn!(proc_macro))),
+ ("proc_macro_attribute", Normal, Ungated),
+ ("proc_macro", Normal, Ungated),
("rustc_derive_registrar", Normal, Gated(Stability::Unstable,
"rustc_derive_registrar",
@@ -1542,7 +1527,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
}
}
- if self.context.features.proc_macro && attr::is_known(attr) {
+ if self.context.features.use_extern_macros && attr::is_known(attr) {
return
}
@@ -1990,7 +1975,7 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute],
/// A collector for mutually exclusive and interdependent features and their flag spans.
#[derive(Default)]
struct FeatureChecker {
- proc_macro: Option,
+ use_extern_macros: Option,
custom_attribute: Option,
}
@@ -1999,9 +1984,9 @@ impl FeatureChecker {
// the branching can be eliminated by modifying `set!()` to set these spans
// only for the features that need to be checked for mutual exclusion.
fn collect(&mut self, features: &Features, span: Span) {
- if features.proc_macro {
- // If self.proc_macro is None, set to Some(span)
- self.proc_macro = self.proc_macro.or(Some(span));
+ if features.use_extern_macros {
+ // If self.use_extern_macros is None, set to Some(span)
+ self.use_extern_macros = self.use_extern_macros.or(Some(span));
}
if features.custom_attribute {
@@ -2010,8 +1995,8 @@ impl FeatureChecker {
}
fn check(self, handler: &Handler) {
- if let (Some(pm_span), Some(ca_span)) = (self.proc_macro, self.custom_attribute) {
- handler.struct_span_err(pm_span, "Cannot use `#![feature(proc_macro)]` and \
+ if let (Some(pm_span), Some(ca_span)) = (self.use_extern_macros, self.custom_attribute) {
+ handler.struct_span_err(pm_span, "Cannot use `#![feature(use_extern_macros)]` and \
`#![feature(custom_attribute)] at the same time")
.span_note(ca_span, "`#![feature(custom_attribute)]` declared here")
.emit();
diff --git a/src/test/compile-fail-fulldeps/issue-15778-fail.rs b/src/test/compile-fail-fulldeps/issue-15778-fail.rs
index 8c6889f715fc0..d56571ee1aca5 100644
--- a/src/test/compile-fail-fulldeps/issue-15778-fail.rs
+++ b/src/test/compile-fail-fulldeps/issue-15778-fail.rs
@@ -12,7 +12,7 @@
// ignore-stage1
// compile-flags: -D crate-not-okay
-#![feature(plugin, custom_attribute)] //~ ERROR crate is not marked with #![crate_okay]
+#![feature(plugin)] //~ ERROR crate is not marked with #![crate_okay]
#![plugin(lint_for_crate)]
pub fn main() { }
diff --git a/src/test/compile-fail-fulldeps/proc-macro/attr-invalid-exprs.rs b/src/test/compile-fail-fulldeps/proc-macro/attr-invalid-exprs.rs
index 749d87e37b559..64af21dbe10dc 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/attr-invalid-exprs.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/attr-invalid-exprs.rs
@@ -13,7 +13,7 @@
//! Attributes producing expressions in invalid locations
-#![feature(proc_macro, stmt_expr_attributes, proc_macro_expr)]
+#![feature(use_extern_macros, stmt_expr_attributes, proc_macro_expr)]
extern crate attr_stmt_expr;
use attr_stmt_expr::{duplicate, no_output};
diff --git a/src/test/compile-fail-fulldeps/proc-macro/attr-stmt-expr.rs b/src/test/compile-fail-fulldeps/proc-macro/attr-stmt-expr.rs
index ce04fdfb976d4..05b5c918ef015 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/attr-stmt-expr.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/attr-stmt-expr.rs
@@ -11,7 +11,7 @@
// aux-build:attr-stmt-expr.rs
// ignore-stage1
-#![feature(proc_macro, proc_macro_expr)]
+#![feature(use_extern_macros, proc_macro_expr)]
extern crate attr_stmt_expr;
use attr_stmt_expr::{expect_let, expect_print_stmt, expect_expr, expect_print_expr};
diff --git a/src/test/compile-fail-fulldeps/proc-macro/attribute-with-error.rs b/src/test/compile-fail-fulldeps/proc-macro/attribute-with-error.rs
index edfedebf870cf..9e7bbb2b8f7ff 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/attribute-with-error.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/attribute-with-error.rs
@@ -11,7 +11,7 @@
// aux-build:attribute-with-error.rs
// ignore-stage1
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
extern crate attribute_with_error;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/attributes-included.rs b/src/test/compile-fail-fulldeps/proc-macro/attributes-included.rs
index 9947e8f66ceda..ea66d3c0ef6bb 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/attributes-included.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/attributes-included.rs
@@ -10,23 +10,25 @@
// aux-build:attributes-included.rs
// ignore-stage1
+// compile-pass
-#![feature(proc_macro, rustc_attrs, proc_macro_path_invoc)]
+#![feature(use_extern_macros)]
#![warn(unused)]
extern crate attributes_included;
-#[attributes_included::bar]
+use attributes_included::*;
+
+#[bar]
#[inline]
/// doc
-#[attributes_included::foo]
+#[foo]
#[inline]
/// doc
fn foo() {
let a: i32 = "foo"; //~ WARN: unused variable
}
-#[rustc_error]
-fn main() { //~ ERROR: compilation successful
+fn main() {
foo()
}
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr-stmt-expr.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr-stmt-expr.rs
index 8bae1697dcbec..22ddc91399553 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr-stmt-expr.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr-stmt-expr.rs
@@ -10,7 +10,6 @@
// no-prefer-dynamic
-#![feature(proc_macro)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr_proc_macro.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr_proc_macro.rs
index db0c19e96f821..679cb7728680d 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr_proc_macro.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attr_proc_macro.rs
@@ -10,7 +10,7 @@
// force-host
// no-prefer-dynamic
-#![feature(proc_macro)]
+
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attribute-with-error.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attribute-with-error.rs
index 85a7a0bf6336f..1428409266944 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attribute-with-error.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attribute-with-error.rs
@@ -12,7 +12,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attributes-included.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attributes-included.rs
index f3f7cb1406cbd..a1f4209662d86 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attributes-included.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/attributes-included.rs
@@ -11,7 +11,6 @@
// force-host
// no-prefer-dynamic
-#![feature(proc_macro)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro.rs
index 89ac11b309d75..6484725814a10 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro.rs
@@ -10,7 +10,7 @@
// force-host
// no-prefer-dynamic
-#![feature(proc_macro)]
+
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro2.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro2.rs
index 5fc20bcda8856..3f0a45743671c 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro2.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/bang_proc_macro2.rs
@@ -10,7 +10,7 @@
// force-host
// no-prefer-dynamic
-#![feature(proc_macro)]
+
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/issue-41211.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/issue-41211.rs
index 99400bd147c20..5365e8238e99f 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/issue-41211.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/issue-41211.rs
@@ -12,7 +12,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
use proc_macro::TokenStream;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/issue_50493.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/issue_50493.rs
index 7d36517d9704b..e71b792a48a14 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/issue_50493.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/issue_50493.rs
@@ -11,7 +11,6 @@
// force-host
// no-prefer-dynamic
-#![feature(proc_macro, proc_macro_lib)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/more-gates.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/more-gates.rs
index def12f8e4ec85..4d89384137b80 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/more-gates.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/more-gates.rs
@@ -11,7 +11,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/proc-macro-gates.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/proc-macro-gates.rs
index 25579f1fc83d5..0f8fd5b5709c7 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/proc-macro-gates.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/proc-macro-gates.rs
@@ -12,7 +12,6 @@
// force-host
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/test-macros.rs b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/test-macros.rs
index d1c5b9050aa87..581c7cb15a59c 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/auxiliary/test-macros.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/auxiliary/test-macros.rs
@@ -11,7 +11,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/feature-gate-proc_macro.rs b/src/test/compile-fail-fulldeps/proc-macro/feature-gate-proc_macro.rs
deleted file mode 100644
index eeede4b8aa13c..0000000000000
--- a/src/test/compile-fail-fulldeps/proc-macro/feature-gate-proc_macro.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 or the MIT license
-// , at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// aux-build:attr_proc_macro.rs
-#![feature(use_extern_macros)]
-
-extern crate attr_proc_macro;
-use attr_proc_macro::attr_proc_macro;
-
-#[attr_proc_macro]
-//~^ ERROR: attribute procedural macros are experimental
-struct Foo;
-
-fn main() {
- let _ = Foo;
-}
diff --git a/src/test/compile-fail-fulldeps/proc-macro/issue-41211.rs b/src/test/compile-fail-fulldeps/proc-macro/issue-41211.rs
index 17237912be49b..8fced7d8c70da 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/issue-41211.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/issue-41211.rs
@@ -13,7 +13,7 @@
// FIXME: https://github.com/rust-lang/rust/issues/41430
// This is a temporary regression test for the ICE reported in #41211
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
#![emit_unchanged]
//~^ ERROR: cannot find attribute macro `emit_unchanged` in this scope
extern crate issue_41211;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/macro-use-attr.rs b/src/test/compile-fail-fulldeps/proc-macro/macro-use-attr.rs
index 76253487b51fc..bb7f341f96786 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/macro-use-attr.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/macro-use-attr.rs
@@ -9,7 +9,7 @@
// except according to those terms.
// aux-build:attr_proc_macro.rs
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
#[macro_use] extern crate attr_proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/macros-in-extern.rs b/src/test/compile-fail-fulldeps/proc-macro/macros-in-extern.rs
index 75d5ac6495ae8..9a35dc0edc448 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/macros-in-extern.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/macros-in-extern.rs
@@ -12,7 +12,7 @@
// ignore-stage1
// ignore-wasm32
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
extern crate test_macros;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/more-gates.rs b/src/test/compile-fail-fulldeps/proc-macro/more-gates.rs
index a799f79ef70f3..ff9f1705c5b84 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/more-gates.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/more-gates.rs
@@ -10,7 +10,7 @@
// aux-build:more-gates.rs
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
extern crate more_gates as foo;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/proc-macro-custom-attr-mutex.rs b/src/test/compile-fail-fulldeps/proc-macro/proc-macro-custom-attr-mutex.rs
index 288cab71ff49c..9ed665b6e68f6 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/proc-macro-custom-attr-mutex.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/proc-macro-custom-attr-mutex.rs
@@ -9,9 +9,10 @@
// except according to those terms.
// aux-build:attr_proc_macro.rs
+// ignore-tidy-linelength
-#![feature(proc_macro, custom_attribute)]
-//~^ ERROR Cannot use `#![feature(proc_macro)]` and `#![feature(custom_attribute)] at the same time
+#![feature(use_extern_macros, custom_attribute)]
+//~^ ERROR Cannot use `#![feature(use_extern_macros)]` and `#![feature(custom_attribute)] at the same time
extern crate attr_proc_macro;
use attr_proc_macro::attr_proc_macro;
diff --git a/src/test/compile-fail-fulldeps/proc-macro/proc-macro-gates.rs b/src/test/compile-fail-fulldeps/proc-macro/proc-macro-gates.rs
index 70b2b5fdd336d..51b1bfca294e4 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/proc-macro-gates.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/proc-macro-gates.rs
@@ -16,7 +16,7 @@
// gate-test-proc_macro_mod
// gate-test-proc_macro_gen
-#![feature(proc_macro, stmt_expr_attributes)]
+#![feature(use_extern_macros, stmt_expr_attributes)]
extern crate proc_macro_gates as foo;
diff --git a/src/test/run-pass-fulldeps/auxiliary/custom_derive_plugin_attr.rs b/src/test/run-pass-fulldeps/auxiliary/custom_derive_plugin_attr.rs
index 0f90cb3752cf5..7eafd834c4913 100644
--- a/src/test/run-pass-fulldeps/auxiliary/custom_derive_plugin_attr.rs
+++ b/src/test/run-pass-fulldeps/auxiliary/custom_derive_plugin_attr.rs
@@ -35,7 +35,7 @@ use rustc_plugin::Registry;
#[plugin_registrar]
pub fn plugin_registrar(reg: &mut Registry) {
reg.register_syntax_extension(
- Symbol::intern("derive_TotalSum"),
+ Symbol::intern("rustc_derive_TotalSum"),
MultiDecorator(box expand));
}
diff --git a/src/test/run-pass-fulldeps/auxiliary/hello_macro.rs b/src/test/run-pass-fulldeps/auxiliary/hello_macro.rs
index f026d8e2365d9..545eabe00ff2e 100644
--- a/src/test/run-pass-fulldeps/auxiliary/hello_macro.rs
+++ b/src/test/run-pass-fulldeps/auxiliary/hello_macro.rs
@@ -11,7 +11,7 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro, proc_macro_non_items)]
+#![feature(use_extern_macros, proc_macro_non_items, proc_macro_quote)]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/auxiliary/lint_for_crate.rs b/src/test/run-pass-fulldeps/auxiliary/lint_for_crate.rs
index e3246673fabaf..fa208e14b7d1c 100644
--- a/src/test/run-pass-fulldeps/auxiliary/lint_for_crate.rs
+++ b/src/test/run-pass-fulldeps/auxiliary/lint_for_crate.rs
@@ -57,19 +57,19 @@ declare_lint!(CRATE_NOT_GREEN, Warn, "crate not marked with #![crate_green]");
fake_lint_pass! {
PassOkay,
lint_array!(CRATE_NOT_OKAY), // Single lint
- "crate_okay"
+ "rustc_crate_okay"
}
fake_lint_pass! {
PassRedBlue,
lint_array!(CRATE_NOT_RED, CRATE_NOT_BLUE), // Multiple lints
- "crate_red", "crate_blue"
+ "rustc_crate_red", "rustc_crate_blue"
}
fake_lint_pass! {
PassGreyGreen,
lint_array!(CRATE_NOT_GREY, CRATE_NOT_GREEN, ), // Trailing comma
- "crate_grey", "crate_green"
+ "rustc_crate_grey", "rustc_crate_green"
}
#[plugin_registrar]
diff --git a/src/test/run-pass-fulldeps/auxiliary/macro_crate_test.rs b/src/test/run-pass-fulldeps/auxiliary/macro_crate_test.rs
index d698af50579ad..64fdd7f9a95a6 100644
--- a/src/test/run-pass-fulldeps/auxiliary/macro_crate_test.rs
+++ b/src/test/run-pass-fulldeps/auxiliary/macro_crate_test.rs
@@ -37,13 +37,13 @@ pub fn plugin_registrar(reg: &mut Registry) {
reg.register_macro("make_a_1", expand_make_a_1);
reg.register_macro("identity", expand_identity);
reg.register_syntax_extension(
- Symbol::intern("into_multi_foo"),
+ Symbol::intern("rustc_into_multi_foo"),
MultiModifier(Box::new(expand_into_foo_multi)));
reg.register_syntax_extension(
- Symbol::intern("duplicate"),
+ Symbol::intern("rustc_duplicate"),
MultiDecorator(Box::new(expand_duplicate)));
reg.register_syntax_extension(
- Symbol::intern("caller"),
+ Symbol::intern("rustc_caller"),
MultiDecorator(Box::new(expand_caller)));
}
diff --git a/src/test/run-pass-fulldeps/derive-totalsum-attr.rs b/src/test/run-pass-fulldeps/derive-totalsum-attr.rs
index ef5198b9ae038..e088f5e426263 100644
--- a/src/test/run-pass-fulldeps/derive-totalsum-attr.rs
+++ b/src/test/run-pass-fulldeps/derive-totalsum-attr.rs
@@ -11,7 +11,7 @@
// aux-build:custom_derive_plugin_attr.rs
// ignore-stage1
-#![feature(plugin, custom_derive, custom_attribute)]
+#![feature(plugin, custom_derive, rustc_attrs)]
#![plugin(custom_derive_plugin_attr)]
trait TotalSum {
@@ -32,7 +32,7 @@ impl TotalSum for Seven {
}
}
-#[derive(TotalSum)]
+#[rustc_derive_TotalSum]
struct Foo {
seven: Seven,
bar: Bar,
@@ -41,7 +41,7 @@ struct Foo {
nan: NaN,
}
-#[derive(TotalSum)]
+#[rustc_derive_TotalSum]
struct Bar {
quux: isize,
bleh: isize,
diff --git a/src/test/run-pass-fulldeps/issue-15778-pass.rs b/src/test/run-pass-fulldeps/issue-15778-pass.rs
index 25800d40e71ae..6fcf0a0450c84 100644
--- a/src/test/run-pass-fulldeps/issue-15778-pass.rs
+++ b/src/test/run-pass-fulldeps/issue-15778-pass.rs
@@ -12,12 +12,12 @@
// ignore-stage1
// compile-flags: -D crate-not-okay
-#![feature(plugin, custom_attribute)]
+#![feature(plugin, rustc_attrs)]
#![plugin(lint_for_crate)]
-#![crate_okay]
-#![crate_blue]
-#![crate_red]
-#![crate_grey]
-#![crate_green]
+#![rustc_crate_okay]
+#![rustc_crate_blue]
+#![rustc_crate_red]
+#![rustc_crate_grey]
+#![rustc_crate_green]
pub fn main() { }
diff --git a/src/test/run-pass-fulldeps/macro-crate-multi-decorator-literals.rs b/src/test/run-pass-fulldeps/macro-crate-multi-decorator-literals.rs
index 6dc651bb653a3..ce552d3ab7dd6 100644
--- a/src/test/run-pass-fulldeps/macro-crate-multi-decorator-literals.rs
+++ b/src/test/run-pass-fulldeps/macro-crate-multi-decorator-literals.rs
@@ -11,7 +11,7 @@
// aux-build:macro_crate_test.rs
// ignore-stage1
-#![feature(plugin, custom_attribute, attr_literals)]
+#![feature(plugin, rustc_attrs, attr_literals)]
#![plugin(macro_crate_test)]
#[macro_use]
@@ -30,16 +30,16 @@ extern crate macro_crate_test;
// This results in a function named `simple` that calls `f(1, "hello", 3.14)`.
// As a result, the expression `simple()` evaluates to `(1, "helllo", 3.14)`.
-#[caller(simple, 1, "hello", 3.14)]
-#[caller(simple1, 2, "bye", 6.28)]
-#[caller(simple2, 3, "hi", 1.01)]
+#[rustc_caller(simple, 1, "hello", 3.14)]
+#[rustc_caller(simple1, 2, "bye", 6.28)]
+#[rustc_caller(simple2, 3, "hi", 1.01)]
fn f(num: isize, string: &'static str, float: f32) -> (isize, &'static str, f32) {
(num, string, float)
}
-#[caller(complex, true, 10)]
-#[caller(complex1, false, 15)]
-#[caller(complex2, true, 20)]
+#[rustc_caller(complex, true, 10)]
+#[rustc_caller(complex1, false, 15)]
+#[rustc_caller(complex2, true, 20)]
fn g(emit: bool, num: i32) -> Option {
match emit {
true => Some(num),
diff --git a/src/test/run-pass-fulldeps/macro-crate-multi-decorator.rs b/src/test/run-pass-fulldeps/macro-crate-multi-decorator.rs
index 3c215b6ca48dd..9245e85edd6dd 100644
--- a/src/test/run-pass-fulldeps/macro-crate-multi-decorator.rs
+++ b/src/test/run-pass-fulldeps/macro-crate-multi-decorator.rs
@@ -11,7 +11,7 @@
// aux-build:macro_crate_test.rs
// ignore-stage1
-#![feature(plugin, custom_attribute)]
+#![feature(plugin, rustc_attrs)]
#![plugin(macro_crate_test)]
#[macro_use]
@@ -20,27 +20,27 @@ extern crate macro_crate_test;
// The duplicate macro will create a copy of the item with the given identifier.
-#[duplicate(MyCopy)]
+#[rustc_duplicate(MyCopy)]
struct MyStruct {
number: i32
}
trait TestTrait {
- #[duplicate(TestType2)]
+ #[rustc_duplicate(TestType2)]
type TestType;
- #[duplicate(required_fn2)]
+ #[rustc_duplicate(required_fn2)]
fn required_fn(&self);
- #[duplicate(provided_fn2)]
+ #[rustc_duplicate(provided_fn2)]
fn provided_fn(&self) { }
}
impl TestTrait for MyStruct {
- #[duplicate(TestType2)]
+ #[rustc_duplicate(TestType2)]
type TestType = f64;
- #[duplicate(required_fn2)]
+ #[rustc_duplicate(required_fn2)]
fn required_fn(&self) { }
}
diff --git a/src/test/run-pass-fulldeps/macro-crate.rs b/src/test/run-pass-fulldeps/macro-crate.rs
index 9b2e36c8cea15..06f78b10e5e93 100644
--- a/src/test/run-pass-fulldeps/macro-crate.rs
+++ b/src/test/run-pass-fulldeps/macro-crate.rs
@@ -11,26 +11,26 @@
// aux-build:macro_crate_test.rs
// ignore-stage1
-#![feature(plugin, custom_attribute)]
+#![feature(plugin, rustc_attrs)]
#![plugin(macro_crate_test)]
#[macro_use] #[no_link]
extern crate macro_crate_test;
#[derive(PartialEq, Clone, Debug)]
-#[into_multi_foo]
+#[rustc_into_multi_foo]
fn foo() -> AnotherFakeTypeThatHadBetterGoAway {}
// Check that the `#[into_multi_foo]`-generated `foo2` is configured away
fn foo2() {}
trait Qux {
- #[into_multi_foo]
+ #[rustc_into_multi_foo]
fn bar();
}
impl Qux for i32 {
- #[into_multi_foo]
+ #[rustc_into_multi_foo]
fn bar() {}
}
diff --git a/src/test/run-pass-fulldeps/proc-macro/attr-args.rs b/src/test/run-pass-fulldeps/proc-macro/attr-args.rs
index bf7ac507ea570..26522396d6b33 100644
--- a/src/test/run-pass-fulldeps/proc-macro/attr-args.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/attr-args.rs
@@ -12,14 +12,13 @@
// ignore-stage1
#![allow(warnings)]
-#![feature(proc_macro, proc_macro_path_invoc)]
+#![feature(use_extern_macros)]
extern crate attr_args;
-use attr_args::attr_with_args;
+use attr_args::{attr_with_args, identity};
#[attr_with_args(text = "Hello, world!")]
fn foo() {}
-#[::attr_args::identity(
- fn main() { assert_eq!(foo(), "Hello, world!"); })]
+#[identity(fn main() { assert_eq!(foo(), "Hello, world!"); })]
struct Dummy;
diff --git a/src/test/run-pass-fulldeps/proc-macro/attr-cfg.rs b/src/test/run-pass-fulldeps/proc-macro/attr-cfg.rs
index 5a28d756df5a5..4ee30b8252baa 100644
--- a/src/test/run-pass-fulldeps/proc-macro/attr-cfg.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/attr-cfg.rs
@@ -12,7 +12,7 @@
// ignore-stage1
// revisions: foo bar
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
extern crate attr_cfg;
use attr_cfg::attr_cfg;
diff --git a/src/test/run-pass-fulldeps/proc-macro/attr-on-trait.rs b/src/test/run-pass-fulldeps/proc-macro/attr-on-trait.rs
index 95e4f2211c637..256096f118aa4 100644
--- a/src/test/run-pass-fulldeps/proc-macro/attr-on-trait.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/attr-on-trait.rs
@@ -11,12 +11,14 @@
// aux-build:attr-on-trait.rs
// ignore-stage1
-#![feature(proc_macro, proc_macro_path_invoc)]
+#![feature(use_extern_macros)]
extern crate attr_on_trait;
+use attr_on_trait::foo;
+
trait Foo {
- #[attr_on_trait::foo]
+ #[foo]
fn foo() {}
}
diff --git a/src/test/run-pass-fulldeps/proc-macro/attr-stmt-expr.rs b/src/test/run-pass-fulldeps/proc-macro/attr-stmt-expr.rs
index d928f8e557303..021b10e033fe9 100644
--- a/src/test/run-pass-fulldeps/proc-macro/attr-stmt-expr.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/attr-stmt-expr.rs
@@ -11,7 +11,7 @@
// aux-build:attr-stmt-expr.rs
// ignore-stage1
-#![feature(proc_macro, stmt_expr_attributes, proc_macro_stmt, proc_macro_expr)]
+#![feature(use_extern_macros, stmt_expr_attributes, proc_macro_stmt, proc_macro_expr)]
extern crate attr_stmt_expr;
use attr_stmt_expr::{expect_let, expect_print_stmt, expect_expr, expect_print_expr,
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-args.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-args.rs
index 5f12cc96e9fb3..655bfa3ff6312 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-args.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-args.rs
@@ -9,7 +9,7 @@
// except according to those terms.
// no-prefer-dynamic
-#![feature(proc_macro)]
+
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-cfg.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-cfg.rs
index 9145c46cfc7c9..f9037aa8bf94d 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-cfg.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-cfg.rs
@@ -9,7 +9,7 @@
// except according to those terms.
// no-prefer-dynamic
-#![feature(proc_macro)]
+
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-on-trait.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-on-trait.rs
index 8e9770340276b..5e5c775b1ffbd 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-on-trait.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-on-trait.rs
@@ -10,7 +10,6 @@
// no-prefer-dynamic
-#![feature(proc_macro)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-stmt-expr.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-stmt-expr.rs
index 972368b7b532a..4d5e22b4eb6c2 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-stmt-expr.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/attr-stmt-expr.rs
@@ -10,7 +10,6 @@
// no-prefer-dynamic
-#![feature(proc_macro)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/bang-macro.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/bang-macro.rs
index 122a47aff7198..8b7c6cd10b860 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/bang-macro.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/bang-macro.rs
@@ -9,7 +9,7 @@
// except according to those terms.
// no-prefer-dynamic
-#![feature(proc_macro)]
+
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/call-site.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/call-site.rs
index ab4e082ed74fc..65eb8f4bec2d0 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/call-site.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/call-site.rs
@@ -11,7 +11,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
use proc_macro::*;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/count_compound_ops.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/count_compound_ops.rs
index 55c4c32a94d80..c6bcc37ac4a54 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/count_compound_ops.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/count_compound_ops.rs
@@ -10,7 +10,7 @@
// no-prefer-dynamic
-#![feature(proc_macro, proc_macro_non_items)]
+#![feature(proc_macro_non_items, proc_macro_quote, use_extern_macros)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/gen-lifetime-token.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/gen-lifetime-token.rs
index e288050a928b0..978de27b70aad 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/gen-lifetime-token.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/gen-lifetime-token.rs
@@ -11,7 +11,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example_codegen.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example_codegen.rs
index b8562ffc344de..8f95bdd9c3919 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example_codegen.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example_codegen.rs
@@ -10,7 +10,7 @@
// no-prefer-dynamic
-#![feature(proc_macro, proc_macro_non_items)]
+#![feature(use_extern_macros, proc_macro_quote, proc_macro_non_items)]
#![crate_type = "proc-macro"]
extern crate proc_macro as proc_macro_renamed; // This does not break `quote!`
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-40001-plugin.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-40001-plugin.rs
index 63b4a6a1c62df..56c163b8ce3d5 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-40001-plugin.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-40001-plugin.rs
@@ -7,6 +7,7 @@
// , at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+
#![feature(box_syntax, plugin, plugin_registrar, rustc_private)]
#![feature(macro_vis_matcher)]
#![feature(macro_at_most_once_rep)]
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-42708.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-42708.rs
index 58b4b2a5293b3..906caceb8696b 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-42708.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-42708.rs
@@ -11,7 +11,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-50061.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-50061.rs
index b3cd3758e654b..6de17522fc9a7 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-50061.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/issue-50061.rs
@@ -11,7 +11,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
use proc_macro::TokenStream;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/lifetimes.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/lifetimes.rs
index f31f57b442a6e..0ee26b6a1b9ee 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/lifetimes.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/lifetimes.rs
@@ -10,7 +10,6 @@
// no-prefer-dynamic
-#![feature(proc_macro)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/modify-ast.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/modify-ast.rs
index c37682220da33..498c6811d9c20 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/modify-ast.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/modify-ast.rs
@@ -11,7 +11,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/negative-token.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/negative-token.rs
index e76e4d585f497..fd639696991f6 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/negative-token.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/negative-token.rs
@@ -10,7 +10,6 @@
// no-prefer-dynamic
-#![feature(proc_macro)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/not-joint.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/not-joint.rs
index a640fabe04fac..e00a4d89e8d62 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/not-joint.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/not-joint.rs
@@ -11,7 +11,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/span-api-tests.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/span-api-tests.rs
index 6ab9d6d0b8a7c..8e2c5c0a088d2 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/span-api-tests.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/span-api-tests.rs
@@ -12,7 +12,7 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
+#![feature(proc_macro_span)]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/test-macros.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/test-macros.rs
index d1c5b9050aa87..581c7cb15a59c 100644
--- a/src/test/run-pass-fulldeps/proc-macro/auxiliary/test-macros.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/test-macros.rs
@@ -11,7 +11,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
diff --git a/src/test/run-pass-fulldeps/proc-macro/call-site.rs b/src/test/run-pass-fulldeps/proc-macro/call-site.rs
index f0d48972894ae..505994f66e7e5 100644
--- a/src/test/run-pass-fulldeps/proc-macro/call-site.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/call-site.rs
@@ -11,7 +11,7 @@
// aux-build:call-site.rs
// ignore-stage1
-#![feature(proc_macro, proc_macro_non_items)]
+#![feature(proc_macro_non_items, use_extern_macros)]
extern crate call_site;
use call_site::*;
diff --git a/src/test/run-pass-fulldeps/proc-macro/derive-b.rs b/src/test/run-pass-fulldeps/proc-macro/derive-b.rs
index d4176c0efbf10..35d5084d9f650 100644
--- a/src/test/run-pass-fulldeps/proc-macro/derive-b.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/derive-b.rs
@@ -11,7 +11,7 @@
// aux-build:derive-b.rs
// ignore-stage1
-#![feature(proc_macro, proc_macro_path_invoc)]
+#![feature(use_extern_macros, proc_macro_path_invoc)]
extern crate derive_b;
diff --git a/src/test/run-pass-fulldeps/proc-macro/gen-lifetime-token.rs b/src/test/run-pass-fulldeps/proc-macro/gen-lifetime-token.rs
index 539e3aa8ecbb2..c8a9bea3631cb 100644
--- a/src/test/run-pass-fulldeps/proc-macro/gen-lifetime-token.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/gen-lifetime-token.rs
@@ -10,7 +10,7 @@
// aux-build:gen-lifetime-token.rs
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
extern crate gen_lifetime_token as bar;
diff --git a/src/test/run-pass-fulldeps/proc-macro/issue-42708.rs b/src/test/run-pass-fulldeps/proc-macro/issue-42708.rs
index a6b7d93c279d9..df4a1d8994b54 100644
--- a/src/test/run-pass-fulldeps/proc-macro/issue-42708.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/issue-42708.rs
@@ -11,7 +11,7 @@
// aux-build:issue-42708.rs
// ignore-stage1
-#![feature(decl_macro, proc_macro, proc_macro_path_invoc)]
+#![feature(decl_macro, use_extern_macros, proc_macro_path_invoc)]
#![allow(unused)]
extern crate issue_42708;
diff --git a/src/test/run-pass-fulldeps/proc-macro/issue-50061.rs b/src/test/run-pass-fulldeps/proc-macro/issue-50061.rs
index 03f69c092775f..15dff94c88c18 100644
--- a/src/test/run-pass-fulldeps/proc-macro/issue-50061.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/issue-50061.rs
@@ -11,7 +11,7 @@
// aux-build:issue-50061.rs
// ignore-stage1
-#![feature(proc_macro, proc_macro_path_invoc, decl_macro)]
+#![feature(use_extern_macros, proc_macro_path_invoc, decl_macro)]
extern crate issue_50061;
diff --git a/src/test/run-pass-fulldeps/proc-macro/lifetimes.rs b/src/test/run-pass-fulldeps/proc-macro/lifetimes.rs
index 0bcb23cc8bb7d..cfe0ce19a4606 100644
--- a/src/test/run-pass-fulldeps/proc-macro/lifetimes.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/lifetimes.rs
@@ -11,7 +11,7 @@
// aux-build:lifetimes.rs
// ignore-stage1
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
extern crate lifetimes;
use lifetimes::*;
diff --git a/src/test/run-pass-fulldeps/proc-macro/macros-in-extern.rs b/src/test/run-pass-fulldeps/proc-macro/macros-in-extern.rs
index 59b9b0baa8a45..e5f8c844b6b70 100644
--- a/src/test/run-pass-fulldeps/proc-macro/macros-in-extern.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/macros-in-extern.rs
@@ -12,7 +12,7 @@
// ignore-stage1
// ignore-wasm32
-#![feature(proc_macro, macros_in_extern)]
+#![feature(use_extern_macros, macros_in_extern)]
extern crate test_macros;
diff --git a/src/test/run-pass-fulldeps/proc-macro/modify-ast.rs b/src/test/run-pass-fulldeps/proc-macro/modify-ast.rs
index 13a6dbd2ae576..0b584fdd44d47 100644
--- a/src/test/run-pass-fulldeps/proc-macro/modify-ast.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/modify-ast.rs
@@ -10,7 +10,7 @@
// aux-build:modify-ast.rs
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
extern crate modify_ast;
diff --git a/src/test/run-pass-fulldeps/proc-macro/not-joint.rs b/src/test/run-pass-fulldeps/proc-macro/not-joint.rs
index 34dfae9f1580a..8a59d57a938aa 100644
--- a/src/test/run-pass-fulldeps/proc-macro/not-joint.rs
+++ b/src/test/run-pass-fulldeps/proc-macro/not-joint.rs
@@ -10,7 +10,7 @@
// aux-build:not-joint.rs
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
extern crate not_joint as bar;
use bar::{tokens, nothing};
diff --git a/src/test/run-pass-fulldeps/proc_macro.rs b/src/test/run-pass-fulldeps/proc_macro.rs
index aad94c89f2ae3..46b62d7e34a52 100644
--- a/src/test/run-pass-fulldeps/proc_macro.rs
+++ b/src/test/run-pass-fulldeps/proc_macro.rs
@@ -12,7 +12,7 @@
// ignore-stage1
// ignore-cross-compile
-#![feature(proc_macro, proc_macro_non_items)]
+#![feature(use_extern_macros, proc_macro_non_items)]
extern crate proc_macro_def;
diff --git a/src/test/ui-fulldeps/auxiliary/invalid-punct-ident.rs b/src/test/ui-fulldeps/auxiliary/invalid-punct-ident.rs
index 6bdfe5f86aadb..cc899fa610d13 100644
--- a/src/test/ui-fulldeps/auxiliary/invalid-punct-ident.rs
+++ b/src/test/ui-fulldeps/auxiliary/invalid-punct-ident.rs
@@ -11,8 +11,8 @@
// force-host
// no-prefer-dynamic
-#![feature(proc_macro)]
#![crate_type = "proc-macro"]
+#![feature(proc_macro_raw_ident)]
extern crate proc_macro;
use proc_macro::*;
diff --git a/src/test/ui-fulldeps/lifetimes.rs b/src/test/ui-fulldeps/lifetimes.rs
index 6e88143d637f1..3200e8fb2b162 100644
--- a/src/test/ui-fulldeps/lifetimes.rs
+++ b/src/test/ui-fulldeps/lifetimes.rs
@@ -10,7 +10,7 @@
// aux-build:lifetimes.rs
-#![feature(proc_macro, proc_macro_non_items)]
+#![feature(use_extern_macros, proc_macro_non_items)]
extern crate lifetimes;
diff --git a/src/test/ui-fulldeps/proc-macro/auxiliary/macro-brackets.rs b/src/test/ui-fulldeps/proc-macro/auxiliary/macro-brackets.rs
index ab1cfe1dbd67b..be1777f3ebd05 100644
--- a/src/test/ui-fulldeps/proc-macro/auxiliary/macro-brackets.rs
+++ b/src/test/ui-fulldeps/proc-macro/auxiliary/macro-brackets.rs
@@ -11,7 +11,6 @@
// no-prefer-dynamic
#![crate_type = "proc-macro"]
-#![feature(proc_macro)]
extern crate proc_macro;
use proc_macro::*;
diff --git a/src/test/ui-fulldeps/proc-macro/auxiliary/parent-source-spans.rs b/src/test/ui-fulldeps/proc-macro/auxiliary/parent-source-spans.rs
index ed11b2db2f5ff..f5590405e61e3 100644
--- a/src/test/ui-fulldeps/proc-macro/auxiliary/parent-source-spans.rs
+++ b/src/test/ui-fulldeps/proc-macro/auxiliary/parent-source-spans.rs
@@ -9,7 +9,8 @@
// except according to those terms.
// no-prefer-dynamic
-#![feature(proc_macro)]
+
+#![feature(proc_macro_diagnostic, proc_macro_span)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/ui-fulldeps/proc-macro/auxiliary/three-equals.rs b/src/test/ui-fulldeps/proc-macro/auxiliary/three-equals.rs
index 5b8fcab0baaa7..70151278947dd 100644
--- a/src/test/ui-fulldeps/proc-macro/auxiliary/three-equals.rs
+++ b/src/test/ui-fulldeps/proc-macro/auxiliary/three-equals.rs
@@ -9,8 +9,9 @@
// except according to those terms.
// no-prefer-dynamic
-#![feature(proc_macro)]
+
#![crate_type = "proc-macro"]
+#![feature(proc_macro_diagnostic, proc_macro_span)]
extern crate proc_macro;
diff --git a/src/test/ui-fulldeps/proc-macro/generate-mod.rs b/src/test/ui-fulldeps/proc-macro/generate-mod.rs
index ff64421047fb8..168df906ad698 100644
--- a/src/test/ui-fulldeps/proc-macro/generate-mod.rs
+++ b/src/test/ui-fulldeps/proc-macro/generate-mod.rs
@@ -12,7 +12,7 @@
// aux-build:generate-mod.rs
-#![feature(proc_macro, proc_macro_gen, proc_macro_path_invoc)]
+#![feature(use_extern_macros, proc_macro_gen, proc_macro_path_invoc)]
extern crate generate_mod;
diff --git a/src/test/ui-fulldeps/proc-macro/macro-brackets.rs b/src/test/ui-fulldeps/proc-macro/macro-brackets.rs
index cb734e2d10b7f..1c16faa9986a5 100644
--- a/src/test/ui-fulldeps/proc-macro/macro-brackets.rs
+++ b/src/test/ui-fulldeps/proc-macro/macro-brackets.rs
@@ -10,7 +10,7 @@
// aux-build:macro-brackets.rs
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
extern crate macro_brackets as bar;
use bar::doit;
diff --git a/src/test/ui-fulldeps/proc-macro/macro-namespace-reserved-2.rs b/src/test/ui-fulldeps/proc-macro/macro-namespace-reserved-2.rs
index 89d5f22da912a..9cfd486606abf 100644
--- a/src/test/ui-fulldeps/proc-macro/macro-namespace-reserved-2.rs
+++ b/src/test/ui-fulldeps/proc-macro/macro-namespace-reserved-2.rs
@@ -10,7 +10,7 @@
// no-prefer-dynamic
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
diff --git a/src/test/ui-fulldeps/resolve-error.rs b/src/test/ui-fulldeps/resolve-error.rs
index 9cc825fcddd7a..df9b263534f60 100644
--- a/src/test/ui-fulldeps/resolve-error.rs
+++ b/src/test/ui-fulldeps/resolve-error.rs
@@ -13,7 +13,7 @@
// aux-build:attr_proc_macro.rs
// aux-build:bang_proc_macro.rs
-#![feature(proc_macro)]
+#![feature(use_extern_macros)]
#[macro_use]
extern crate derive_foo;