Rollup merge of #63667 - petrochenkov:deriveholders, r=matthewjasper
resolve: Properly integrate derives and `macro_rules` scopes So, ```rust #[derive(A, B)] struct S; m!(); ``` turns into something like ```rust struct S; A_placeholder!( struct S; ); B_placeholder!( struct S; ); m!(); ``` during expansion. And for `m!()` its "`macro_rules` scope" (aka "legacy scope") should point to the `B_placeholder` call rather than to the derive container `#[derive(A, B)]`. `fn build_reduced_graph` now makes sure the legacy scope points to the right thing. (It's still a mystery for me why this worked before https://github.com/rust-lang/rust/pull/63535.) Unfortunately, placeholders from derives are currently treated separately from placeholders from other macros and need to be passed as `extra_placeholders` rather than a part of the AST fragment. That's fixable, but I wanted to keep this PR more minimal to close the regression faster. Fixes https://github.com/rust-lang/rust/issues/63651 r? @matthewjasper
This commit is contained in:
commit
b60f245b95
10 changed files with 82 additions and 47 deletions
12
src/test/ui/proc-macro/auxiliary/gen-macro-rules.rs
Normal file
12
src/test/ui/proc-macro/auxiliary/gen-macro-rules.rs
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
// force-host
|
||||
// no-prefer-dynamic
|
||||
|
||||
#![crate_type = "proc-macro"]
|
||||
|
||||
extern crate proc_macro;
|
||||
use proc_macro::TokenStream;
|
||||
|
||||
#[proc_macro_derive(repro)]
|
||||
pub fn proc_macro_hack_expr(_input: TokenStream) -> TokenStream {
|
||||
"macro_rules! m {()=>{}}".parse().unwrap()
|
||||
}
|
||||
13
src/test/ui/proc-macro/gen-macro-rules.rs
Normal file
13
src/test/ui/proc-macro/gen-macro-rules.rs
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
// Derive macros can generate `macro_rules` items, regression test for issue #63651.
|
||||
|
||||
// check-pass
|
||||
// aux-build:gen-macro-rules.rs
|
||||
|
||||
extern crate gen_macro_rules as repro;
|
||||
|
||||
#[derive(repro::repro)]
|
||||
pub struct S;
|
||||
|
||||
m!(); // OK
|
||||
|
||||
fn main() {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue