diff --git a/src/test/ui/proc-macro/auxiliary/dollar-crate.rs b/src/test/ui/proc-macro/auxiliary/dollar-crate.rs index d0ea850d4e3..c5347d2e81a 100644 --- a/src/test/ui/proc-macro/auxiliary/dollar-crate.rs +++ b/src/test/ui/proc-macro/auxiliary/dollar-crate.rs @@ -6,6 +6,13 @@ extern crate proc_macro; use proc_macro::TokenStream; +#[proc_macro] +pub fn m_empty(input: TokenStream) -> TokenStream { + println!("PROC MACRO INPUT (PRETTY-PRINTED): {}", input); + println!("PROC MACRO INPUT: {:#?}", input); + TokenStream::new() +} + #[proc_macro] pub fn m(input: TokenStream) -> TokenStream { println!("PROC MACRO INPUT (PRETTY-PRINTED): {}", input); diff --git a/src/test/ui/proc-macro/dollar-crate-issue-57089.rs b/src/test/ui/proc-macro/dollar-crate-issue-57089.rs new file mode 100644 index 00000000000..c38b2782cd6 --- /dev/null +++ b/src/test/ui/proc-macro/dollar-crate-issue-57089.rs @@ -0,0 +1,25 @@ +// edition:2018 +// aux-build:dollar-crate.rs + +// Anonymize unstable non-dummy spans while still showing dummy spans `0..0`. +// normalize-stdout-test "bytes\([^0]\w*\.\.(\w+)\)" -> "bytes(LO..$1)" +// normalize-stdout-test "bytes\((\w+)\.\.[^0]\w*\)" -> "bytes($1..HI)" + +extern crate dollar_crate; + +type S = u8; + +macro_rules! m { + () => { + dollar_crate::m_empty! { + struct M($crate::S); + } + + #[dollar_crate::a] //~ ERROR expected type, found `$` + struct A($crate::S); + }; +} + +m!(); + +fn main() {} diff --git a/src/test/ui/proc-macro/dollar-crate-issue-57089.stderr b/src/test/ui/proc-macro/dollar-crate-issue-57089.stderr new file mode 100644 index 00000000000..f82cf22a9ce --- /dev/null +++ b/src/test/ui/proc-macro/dollar-crate-issue-57089.stderr @@ -0,0 +1,11 @@ +error: expected type, found `$` + --> $DIR/dollar-crate-in-tokens.rs:18:9 + | +LL | #[dollar_crate::a] //~ ERROR expected type, found `$` + | ^^^^^^^^^^^^^^^^^^ +... +LL | m!(); + | ----- in this macro invocation + +error: aborting due to previous error + diff --git a/src/test/ui/proc-macro/dollar-crate-issue-57089.stdout b/src/test/ui/proc-macro/dollar-crate-issue-57089.stdout new file mode 100644 index 00000000000..f599a7f45b1 --- /dev/null +++ b/src/test/ui/proc-macro/dollar-crate-issue-57089.stdout @@ -0,0 +1,85 @@ +PROC MACRO INPUT (PRETTY-PRINTED): struct M ( $crate :: S ) ; +PROC MACRO INPUT: TokenStream [ + Ident { + ident: "struct", + span: #2 bytes(LO..HI) + }, + Ident { + ident: "M", + span: #2 bytes(LO..HI) + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "$crate", + span: #2 bytes(LO..HI) + }, + Punct { + ch: ':', + spacing: Joint, + span: #2 bytes(LO..HI) + }, + Punct { + ch: ':', + spacing: Alone, + span: #2 bytes(LO..HI) + }, + Ident { + ident: "S", + span: #2 bytes(LO..HI) + } + ], + span: #2 bytes(LO..HI) + }, + Punct { + ch: ';', + spacing: Alone, + span: #2 bytes(LO..HI) + } +] +ATTRIBUTE INPUT (PRETTY-PRINTED): struct A($crate::S); +ATTRIBUTE INPUT: TokenStream [ + Ident { + ident: "struct", + span: #0 bytes(0..0) + }, + Ident { + ident: "A", + span: #0 bytes(0..0) + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Punct { + ch: '$', + spacing: Alone, + span: #0 bytes(0..0) + }, + Ident { + ident: "crate", + span: #0 bytes(0..0) + }, + Punct { + ch: ':', + spacing: Joint, + span: #0 bytes(0..0) + }, + Punct { + ch: ':', + spacing: Alone, + span: #0 bytes(0..0) + }, + Ident { + ident: "S", + span: #0 bytes(0..0) + } + ], + span: #0 bytes(0..0) + }, + Punct { + ch: ';', + spacing: Alone, + span: #0 bytes(0..0) + } +]