--- /dev/null
+//~ ERROR expected type, found `$`
+
+// edition:2018
+// aux-build:test-macros.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)"
+
+#![feature(proc_macro_hygiene)]
+
+#[macro_use]
+extern crate test_macros;
+
+type S = u8;
+
+macro_rules! m { () => {
+ #[print_attr]
+ struct A(identity!($crate::S));
+}}
+
+m!();
+
+fn main() {}
--- /dev/null
+PRINT-ATTR INPUT (DISPLAY): struct A(identity!($crate :: S));
+PRINT-ATTR RE-COLLECTED (DISPLAY): struct A ( identity ! ( $ crate :: S ) ) ;
+PRINT-ATTR INPUT (DEBUG): TokenStream [
+ Ident {
+ ident: "struct",
+ span: #0 bytes(0..0),
+ },
+ Ident {
+ ident: "A",
+ span: #0 bytes(0..0),
+ },
+ Group {
+ delimiter: Parenthesis,
+ stream: TokenStream [
+ Ident {
+ ident: "identity",
+ span: #0 bytes(0..0),
+ },
+ Punct {
+ ch: '!',
+ spacing: Alone,
+ 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),
+ },
+ ],
+ span: #0 bytes(0..0),
+ },
+ Punct {
+ ch: ';',
+ spacing: Alone,
+ span: #0 bytes(0..0),
+ },
+]