PRINT-BANG INPUT (DISPLAY): struct S; PRINT-BANG RE-COLLECTED (DISPLAY): struct S ; PRINT-BANG INPUT (DEBUG): TokenStream [ Group { delimiter: None, stream: TokenStream [ Ident { ident: "struct", span: $DIR/nonterminal-token-hygiene.rs:31:5: 31:11 (#5), }, Ident { ident: "S", span: $DIR/nonterminal-token-hygiene.rs:31:12: 31:13 (#5), }, Punct { ch: ';', spacing: Alone, span: $DIR/nonterminal-token-hygiene.rs:31:13: 31:14 (#5), }, ], span: $DIR/nonterminal-token-hygiene.rs:21:27: 21:32 (#6), }, ] #![feature /* 0#0 */(prelude_import)] #![no_std /* 0#0 */] // Make sure that marks from declarative macros are applied to tokens in nonterminal. // check-pass // compile-flags: -Z span-debug -Z macro-backtrace -Z unpretty=expanded,hygiene // compile-flags: -Z trim-diagnostic-paths=no // normalize-stdout-test "\d+#" -> "0#" // normalize-stdout-test "expn\d{3,}" -> "expnNNN" // aux-build:test-macros.rs #![feature /* 0#0 */(decl_macro)] #![no_std /* 0#0 */] #[prelude_import /* 0#1 */] use ::core /* 0#1 */::prelude /* 0#1 */::rust_2015 /* 0#1 */::*; #[macro_use /* 0#1 */] extern crate core /* 0#2 */; #[macro_use /* 0#1 */] extern crate compiler_builtins /* 0#2 */; // Don't load unnecessary hygiene information from std extern crate std /* 0#0 */; #[macro_use /* 0#0 */] extern crate test_macros /* 0#0 */; macro_rules! outer /* 0#0 */ { ($item : item) => { macro inner() { print_bang! { $item } } inner! () ; } ; } struct S /* 0#0 */; macro inner /* 0#4 */ { () => { print_bang! { struct S; } } } struct S /* 0#5 */; // OK, not a duplicate definition of `S` fn main /* 0#0 */() {} /* Expansions: crate0::{{expn0}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: Root crate0::{{expn1}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: AstPass(StdImports) crate0::{{expn2}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: Macro(Bang, "outer") crate0::{{expn3}}: parent: crate0::{{expn2}}, call_site_ctxt: #4, def_site_ctxt: #4, kind: Macro(Bang, "inner") crate0::{{expn4}}: parent: crate0::{{expn3}}, call_site_ctxt: #6, def_site_ctxt: #0, kind: Macro(Bang, "print_bang") crate1::{{expnNNN}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: Macro(Attr, "derive") crate1::{{expnNNN}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: Macro(Attr, "derive") crate1::{{expnNNN}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: Macro(Bang, "include") crate2::{{expn1}}: parent: crate0::{{expn0}}, call_site_ctxt: #0, def_site_ctxt: #0, kind: AstPass(StdImports) SyntaxContexts: #0: parent: #0, outer_mark: (crate0::{{expn0}}, Opaque) #1: parent: #0, outer_mark: (crate0::{{expn1}}, Opaque) #2: parent: #0, outer_mark: (crate0::{{expn1}}, Transparent) #3: parent: #0, outer_mark: (crate2::{{expn1}}, Opaque) #4: parent: #0, outer_mark: (crate0::{{expn2}}, SemiTransparent) #5: parent: #0, outer_mark: (crate0::{{expn3}}, Opaque) #6: parent: #4, outer_mark: (crate0::{{expn3}}, Opaque) #7: parent: #0, outer_mark: (crate0::{{expn4}}, Opaque) #8: parent: #6, outer_mark: (crate0::{{expn4}}, Transparent) #9: parent: #5, outer_mark: (crate0::{{expn4}}, SemiTransparent) */