mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 01:04:03 +00:00
Stabilize proc macros generating macro_rules
items
This commit is contained in:
parent
e369d87b01
commit
b39e188dda
@ -56,7 +56,7 @@
|
||||
#![feature(test)]
|
||||
#![feature(in_band_lifetimes)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(proc_macro_hygiene)]
|
||||
#![cfg_attr(bootstrap, feature(proc_macro_hygiene))]
|
||||
#![feature(log_syntax)]
|
||||
#![feature(associated_type_bounds)]
|
||||
#![feature(rustc_attrs)]
|
||||
|
@ -10,14 +10,14 @@ use crate::ext::mbe::macro_rules::annotate_err_with_kind;
|
||||
use crate::ext::placeholders::{placeholder, PlaceholderExpander};
|
||||
use crate::feature_gate::{self, Features, GateIssue, is_builtin_attr, emit_feature_err};
|
||||
use crate::mut_visit::*;
|
||||
use crate::parse::{DirectoryOwnership, PResult, ParseSess};
|
||||
use crate::parse::{DirectoryOwnership, PResult};
|
||||
use crate::parse::token;
|
||||
use crate::parse::parser::Parser;
|
||||
use crate::print::pprust;
|
||||
use crate::ptr::P;
|
||||
use crate::symbol::{sym, Symbol};
|
||||
use crate::tokenstream::{TokenStream, TokenTree};
|
||||
use crate::visit::{self, Visitor};
|
||||
use crate::visit::Visitor;
|
||||
use crate::util::map_in_place::MapInPlace;
|
||||
|
||||
use errors::{Applicability, FatalError};
|
||||
@ -577,10 +577,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
||||
SyntaxExtensionKind::Bang(expander) => {
|
||||
self.gate_proc_macro_expansion_kind(span, fragment_kind);
|
||||
let tok_result = expander.expand(self.cx, span, mac.stream());
|
||||
let result =
|
||||
self.parse_ast_fragment(tok_result, fragment_kind, &mac.path, span);
|
||||
self.gate_proc_macro_expansion(span, &result);
|
||||
result
|
||||
self.parse_ast_fragment(tok_result, fragment_kind, &mac.path, span)
|
||||
}
|
||||
SyntaxExtensionKind::LegacyBang(expander) => {
|
||||
let prev = self.cx.current_expansion.prior_type_ascription;
|
||||
@ -624,10 +621,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
||||
})), DUMMY_SP).into();
|
||||
let input = self.extract_proc_macro_attr_input(attr.item.tokens, span);
|
||||
let tok_result = expander.expand(self.cx, span, input, item_tok);
|
||||
let res =
|
||||
self.parse_ast_fragment(tok_result, fragment_kind, &attr.item.path, span);
|
||||
self.gate_proc_macro_expansion(span, &res);
|
||||
res
|
||||
self.parse_ast_fragment(tok_result, fragment_kind, &attr.item.path, span)
|
||||
}
|
||||
SyntaxExtensionKind::LegacyAttr(expander) => {
|
||||
match attr.parse_meta(self.cx.parse_sess) {
|
||||
@ -718,41 +712,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
||||
);
|
||||
}
|
||||
|
||||
fn gate_proc_macro_expansion(&self, span: Span, fragment: &AstFragment) {
|
||||
if self.cx.ecfg.proc_macro_hygiene() {
|
||||
return
|
||||
}
|
||||
|
||||
fragment.visit_with(&mut DisallowMacros {
|
||||
span,
|
||||
parse_sess: self.cx.parse_sess,
|
||||
});
|
||||
|
||||
struct DisallowMacros<'a> {
|
||||
span: Span,
|
||||
parse_sess: &'a ParseSess,
|
||||
}
|
||||
|
||||
impl<'ast, 'a> Visitor<'ast> for DisallowMacros<'a> {
|
||||
fn visit_item(&mut self, i: &'ast ast::Item) {
|
||||
if let ast::ItemKind::MacroDef(_) = i.kind {
|
||||
emit_feature_err(
|
||||
self.parse_sess,
|
||||
sym::proc_macro_hygiene,
|
||||
self.span,
|
||||
GateIssue::Language,
|
||||
"procedural macros cannot expand to macro definitions",
|
||||
);
|
||||
}
|
||||
visit::walk_item(self, i);
|
||||
}
|
||||
|
||||
fn visit_mac(&mut self, _mac: &'ast ast::Mac) {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn gate_proc_macro_expansion_kind(&self, span: Span, kind: AstFragmentKind) {
|
||||
let kind = match kind {
|
||||
AstFragmentKind::Expr |
|
||||
|
@ -12,7 +12,7 @@
|
||||
#![feature(non_exhaustive)]
|
||||
#![feature(optin_builtin_traits)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(proc_macro_hygiene)]
|
||||
#![cfg_attr(bootstrap, feature(proc_macro_hygiene))]
|
||||
#![feature(specialization)]
|
||||
#![feature(step_trait)]
|
||||
|
||||
|
@ -4,7 +4,6 @@
|
||||
// left-hand side of a macro definition behave as if they had unique spans, and in particular that
|
||||
// they don't crash the compiler.
|
||||
|
||||
#![feature(proc_macro_hygiene)]
|
||||
#![allow(unused_macros)]
|
||||
|
||||
extern crate proc_macro_sequence;
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: `$x:expr` may be followed by `$y:tt`, which is not allowed for `expr` fragments
|
||||
--> $DIR/same-sequence-span.rs:15:18
|
||||
--> $DIR/same-sequence-span.rs:14:18
|
||||
|
|
||||
LL | (1 $x:expr $($y:tt,)*
|
||||
| ^^^^^ not allowed after `expr` fragments
|
||||
@ -7,7 +7,7 @@ LL | (1 $x:expr $($y:tt,)*
|
||||
= note: allowed there are: `=>`, `,` or `;`
|
||||
|
||||
error: `$x:expr` may be followed by `=`, which is not allowed for `expr` fragments
|
||||
--> $DIR/same-sequence-span.rs:16:18
|
||||
--> $DIR/same-sequence-span.rs:15:18
|
||||
|
|
||||
LL | $(= $z:tt)*
|
||||
| ^ not allowed after `expr` fragments
|
||||
@ -15,7 +15,7 @@ LL | $(= $z:tt)*
|
||||
= note: allowed there are: `=>`, `,` or `;`
|
||||
|
||||
error: `$x:expr` may be followed by `$y:tt`, which is not allowed for `expr` fragments
|
||||
--> $DIR/same-sequence-span.rs:20:1
|
||||
--> $DIR/same-sequence-span.rs:19:1
|
||||
|
|
||||
LL | proc_macro_sequence::make_foo!();
|
||||
| ^--------------------------------
|
||||
@ -30,7 +30,7 @@ LL | | fn main() {}
|
||||
= note: allowed there are: `=>`, `,` or `;`
|
||||
|
||||
error: `$x:expr` may be followed by `=`, which is not allowed for `expr` fragments
|
||||
--> $DIR/same-sequence-span.rs:20:1
|
||||
--> $DIR/same-sequence-span.rs:19:1
|
||||
|
|
||||
LL | proc_macro_sequence::make_foo!();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -1,35 +0,0 @@
|
||||
// force-host
|
||||
// no-prefer-dynamic
|
||||
|
||||
#![crate_type = "proc-macro"]
|
||||
|
||||
extern crate proc_macro;
|
||||
|
||||
use proc_macro::*;
|
||||
|
||||
#[proc_macro_attribute]
|
||||
pub fn attr2mac1(_: TokenStream, _: TokenStream) -> TokenStream {
|
||||
"macro_rules! foo1 { (a) => (a) }".parse().unwrap()
|
||||
}
|
||||
|
||||
#[proc_macro_attribute]
|
||||
pub fn attr2mac2(_: TokenStream, _: TokenStream) -> TokenStream {
|
||||
"macro foo2(a) { a }".parse().unwrap()
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
pub fn mac2mac1(_: TokenStream) -> TokenStream {
|
||||
"macro_rules! foo3 { (a) => (a) }".parse().unwrap()
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
pub fn mac2mac2(_: TokenStream) -> TokenStream {
|
||||
"macro foo4(a) { a }".parse().unwrap()
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
pub fn tricky(_: TokenStream) -> TokenStream {
|
||||
"fn foo() {
|
||||
macro_rules! foo { (a) => (a) }
|
||||
}".parse().unwrap()
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
// aux-build:more-gates.rs
|
||||
|
||||
#![feature(decl_macro)]
|
||||
|
||||
extern crate more_gates as foo;
|
||||
|
||||
use foo::*;
|
||||
|
||||
#[attr2mac1]
|
||||
//~^ ERROR: cannot expand to macro definitions
|
||||
pub fn a() {}
|
||||
#[attr2mac2]
|
||||
//~^ ERROR: cannot expand to macro definitions
|
||||
pub fn a() {}
|
||||
|
||||
mac2mac1!(); //~ ERROR: cannot expand to macro definitions
|
||||
mac2mac2!(); //~ ERROR: cannot expand to macro definitions
|
||||
|
||||
tricky!();
|
||||
//~^ ERROR: cannot expand to macro definitions
|
||||
|
||||
fn main() {}
|
@ -1,48 +0,0 @@
|
||||
error[E0658]: procedural macros cannot expand to macro definitions
|
||||
--> $DIR/more-gates.rs:9:1
|
||||
|
|
||||
LL | #[attr2mac1]
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/54727
|
||||
= help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: procedural macros cannot expand to macro definitions
|
||||
--> $DIR/more-gates.rs:12:1
|
||||
|
|
||||
LL | #[attr2mac2]
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/54727
|
||||
= help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: procedural macros cannot expand to macro definitions
|
||||
--> $DIR/more-gates.rs:16:1
|
||||
|
|
||||
LL | mac2mac1!();
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/54727
|
||||
= help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: procedural macros cannot expand to macro definitions
|
||||
--> $DIR/more-gates.rs:17:1
|
||||
|
|
||||
LL | mac2mac2!();
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/54727
|
||||
= help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: procedural macros cannot expand to macro definitions
|
||||
--> $DIR/more-gates.rs:19:1
|
||||
|
|
||||
LL | tricky!();
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/54727
|
||||
= help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
Loading…
Reference in New Issue
Block a user