Skip to content

Commit

Permalink
Rollup merge of rust-lang#63931 - petrochenkov:stabmac, r=Centril
Browse files Browse the repository at this point in the history
Stabilize macros in some more positions

- Fn-like macros and attribute macros in `extern` blocks
- Fn-like procedural macros in type positions
- ~Attribute macros on inline modules~ (moved to rust-lang#64273)

Stabilization report: rust-lang#63931 (comment).

Closes rust-lang#49476
cc rust-lang#54727
  • Loading branch information
Centril authored Oct 1, 2019
2 parents 3ca5804 + 5ae38bb commit 8bae91d
Show file tree
Hide file tree
Showing 24 changed files with 60 additions and 363 deletions.
1 change: 0 additions & 1 deletion src/librustc_macros/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#![feature(proc_macro_hygiene)]
#![allow(rustc::default_hash_types)]

#![recursion_limit="128"]
Expand Down
23 changes: 6 additions & 17 deletions src/libsyntax/ext/expand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -555,15 +555,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
}

fn expand_invoc(&mut self, invoc: Invocation, ext: &SyntaxExtensionKind) -> AstFragment {
let (fragment_kind, span) = (invoc.fragment_kind, invoc.span());
if fragment_kind == AstFragmentKind::ForeignItems && !self.cx.ecfg.macros_in_extern() {
if let SyntaxExtensionKind::NonMacroAttr { .. } = ext {} else {
emit_feature_err(&self.cx.parse_sess, sym::macros_in_extern,
span, GateIssue::Language,
"macro invocations in `extern {}` blocks are experimental");
}
}

if self.cx.current_expansion.depth > self.cx.ecfg.recursion_limit {
let expn_data = self.cx.current_expansion.id.expn_data();
let suggested_limit = self.cx.ecfg.recursion_limit * 2;
Expand All @@ -578,6 +569,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
FatalError.raise();
}

let (fragment_kind, span) = (invoc.fragment_kind, invoc.span());
match invoc.kind {
InvocationKind::Bang { mac, .. } => match ext {
SyntaxExtensionKind::Bang(expander) => {
Expand Down Expand Up @@ -758,14 +750,14 @@ impl<'a, 'b> MacroExpander<'a, 'b> {

fn gate_proc_macro_expansion_kind(&self, span: Span, kind: AstFragmentKind) {
let kind = match kind {
AstFragmentKind::Expr => "expressions",
AstFragmentKind::Expr |
AstFragmentKind::OptExpr => "expressions",
AstFragmentKind::Pat => "patterns",
AstFragmentKind::Ty => "types",
AstFragmentKind::Stmts => "statements",
AstFragmentKind::Items => return,
AstFragmentKind::TraitItems => return,
AstFragmentKind::ImplItems => return,
AstFragmentKind::Ty |
AstFragmentKind::Items |
AstFragmentKind::TraitItems |
AstFragmentKind::ImplItems |
AstFragmentKind::ForeignItems => return,
AstFragmentKind::Arms
| AstFragmentKind::Fields
Expand Down Expand Up @@ -1578,9 +1570,6 @@ impl<'feat> ExpansionConfig<'feat> {
}
}

fn macros_in_extern(&self) -> bool {
self.features.map_or(false, |features| features.macros_in_extern)
}
fn proc_macro_hygiene(&self) -> bool {
self.features.map_or(false, |features| features.proc_macro_hygiene)
}
Expand Down
2 changes: 2 additions & 0 deletions src/libsyntax/feature_gate/accepted.rs
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,8 @@ declare_features! (
(accepted, bind_by_move_pattern_guards, "1.39.0", Some(15287), None),
/// Allows attributes in formal function parameters.
(accepted, param_attrs, "1.39.0", Some(60406), None),
// Allows macro invocations in `extern {}` blocks.
(accepted, macros_in_extern, "1.40.0", Some(49476), None),

// -------------------------------------------------------------------------
// feature-group-end: accepted features
Expand Down
3 changes: 0 additions & 3 deletions src/libsyntax/feature_gate/active.rs
Original file line number Diff line number Diff line change
Expand Up @@ -402,9 +402,6 @@ declare_features! (
/// Allows infering `'static` outlives requirements (RFC 2093).
(active, infer_static_outlives_requirements, "1.26.0", Some(54185), None),

/// Allows macro invocations in `extern {}` blocks.
(active, macros_in_extern, "1.27.0", Some(49476), None),

/// Allows accessing fields of unions inside `const` functions.
(active, const_fn_union, "1.27.0", Some(51909), None),

Expand Down
30 changes: 0 additions & 30 deletions src/test/ui/abi/macros/macros-in-extern.stderr

This file was deleted.

112 changes: 0 additions & 112 deletions src/test/ui/abi/proc-macro/auxiliary/test-macros.rs

This file was deleted.

30 changes: 0 additions & 30 deletions src/test/ui/abi/proc-macro/macros-in-extern.stderr

This file was deleted.

27 changes: 0 additions & 27 deletions src/test/ui/feature-gates/feature-gate-macros_in_extern.rs

This file was deleted.

30 changes: 0 additions & 30 deletions src/test/ui/feature-gates/feature-gate-macros_in_extern.stderr

This file was deleted.

2 changes: 0 additions & 2 deletions src/test/ui/macros/issue-54441.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
#![feature(macros_in_extern)]

macro_rules! m {
() => {
let //~ ERROR expected
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/macros/issue-54441.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: expected one of `crate`, `fn`, `pub`, `static`, or `type`, found `let`
--> $DIR/issue-54441.rs:5:9
--> $DIR/issue-54441.rs:3:9
|
LL | let
| ^^^ unexpected token
Expand Down
30 changes: 0 additions & 30 deletions src/test/ui/macros/macros-in-extern-rpass.rs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// run-pass
// ignore-wasm32

#![feature(decl_macro)]
Expand All @@ -16,17 +17,29 @@ macro_rules! emits_nothing(
() => ()
);

macro_rules! emits_multiple(
() => {
fn f1() -> u32;
fn f2() -> u32;
}
);

mod defs {
#[no_mangle] extern fn f1() -> u32 { 1 }
#[no_mangle] extern fn f2() -> u32 { 2 }
}

fn main() {
assert_eq!(unsafe { rust_get_test_int() }, 0isize);
assert_eq!(unsafe { rust_get_test_int() }, 1);
assert_eq!(unsafe { rust_dbg_extern_identity_u32(0xDEADBEEF) }, 0xDEADBEEFu32);
assert_eq!(unsafe { f1() }, 1);
assert_eq!(unsafe { f2() }, 2);
}

#[link(name = "rust_test_helpers", kind = "static")]
extern {
returns_isize!(rust_get_test_int);
//~^ ERROR macro invocations in `extern {}` blocks are experimental
takes_u32_returns_u32!(rust_dbg_extern_identity_u32);
//~^ ERROR macro invocations in `extern {}` blocks are experimental
emits_nothing!();
//~^ ERROR macro invocations in `extern {}` blocks are experimental
emits_multiple!();
}
Loading

0 comments on commit 8bae91d

Please sign in to comment.