Auto merge of #84016 - Aaron1011:new-preexp-tests, r=petrochenkov

Add some proc-macro attribute token handling tests

Split out from https://github.com/rust-lang/rust/pull/82608

r? `@petrochenkov`
This commit is contained in:
bors 2021-04-10 19:20:16 +00:00
commit a836d9b641
10 changed files with 1199 additions and 66 deletions

View File

@ -10,6 +10,7 @@ use proc_macro::{TokenStream, quote};
#[proc_macro_attribute]
pub fn first_attr(_: TokenStream, input: TokenStream) -> TokenStream {
let recollected: TokenStream = input.into_iter().collect();
println!("First recollected: {:#?}", recollected);
quote! {
#[second_attr]
$recollected
@ -18,6 +19,7 @@ pub fn first_attr(_: TokenStream, input: TokenStream) -> TokenStream {
#[proc_macro_attribute]
pub fn second_attr(_: TokenStream, input: TokenStream) -> TokenStream {
let _recollected: TokenStream = input.into_iter().collect();
let recollected: TokenStream = input.into_iter().collect();
println!("Second recollected: {:#?}", recollected);
TokenStream::new()
}

View File

@ -0,0 +1,39 @@
// compile-flags: -Z span-debug
// aux-build:test-macros.rs
// check-pass
#![feature(cfg_eval)]
#![feature(custom_inner_attributes)]
#![feature(stmt_expr_attributes)]
#![feature(rustc_attrs)]
#![no_std] // Don't load unnecessary hygiene information from std
extern crate std;
#[macro_use]
extern crate test_macros;
struct Foo<T>(T);
impl Foo<[u8; {
#![cfg_attr(not(FALSE), rustc_dummy(cursed_inner))]
#![allow(unused)]
struct Inner {
field: [u8; {
#![cfg_attr(not(FALSE), rustc_dummy(another_cursed_inner))]
1
}]
}
0
}]> {
#![cfg_eval]
#![print_attr]
#![cfg_attr(not(FALSE), rustc_dummy(evaluated_attr))]
fn bar() {
#[cfg(FALSE)] let a = 1;
}
}
fn main() {}

View File

@ -0,0 +1,252 @@
PRINT-ATTR INPUT (DISPLAY): impl Foo <
[u8 ;
{
# ! [rustc_dummy(cursed_inner)] # ! [allow(unused)] struct Inner
{ field : [u8 ; { # ! [rustc_dummy(another_cursed_inner)] 1 }], } 0
}] > { # ! [rustc_dummy(evaluated_attr)] fn bar() { } }
PRINT-ATTR INPUT (DEBUG): TokenStream [
Ident {
ident: "impl",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Ident {
ident: "Foo",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: '<',
spacing: Alone,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "u8",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "rustc_dummy",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "cursed_inner",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: '#',
spacing: Joint,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "allow",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "unused",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Ident {
ident: "struct",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Ident {
ident: "Inner",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Ident {
ident: "field",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: ':',
spacing: Alone,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "u8",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "rustc_dummy",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "another_cursed_inner",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Literal {
kind: Integer,
symbol: "1",
suffix: None,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Literal {
kind: Integer,
symbol: "0",
suffix: None,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: '>',
spacing: Alone,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "rustc_dummy",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "evaluated_attr",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Ident {
ident: "fn",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Ident {
ident: "bar",
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
],
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
},
]

View File

@ -5,7 +5,7 @@
#![feature(cfg_eval)]
#![feature(proc_macro_hygiene)]
#![feature(stmt_expr_attributes)]
#![feature(rustc_attrs)]
#![no_std] // Don't load unnecessary hygiene information from std
extern crate std;
@ -28,5 +28,10 @@ struct S1 {
struct S2 {}
fn main() {
let _ = #[cfg_eval] #[print_attr](#[cfg(FALSE)] 0, #[cfg(all(/*true*/))] 1);
// Subtle - we need a trailing comma after the '1' - otherwise, `#[cfg_eval]` will
// turn this into `(#[cfg(all())] 1)`, which is a parenthesized expression, not a tuple
// expression. `#[cfg]` is not supported inside parenthesized expressions, so this will
// produce an error when attribute collection runs.
let _ = #[cfg_eval] #[print_attr] #[cfg_attr(not(FALSE), rustc_dummy)]
(#[cfg(FALSE)] 0, #[cfg(all(/*true*/))] 1,);
}

View File

@ -83,53 +83,68 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
span: $DIR/cfg-eval.rs:17:1: 24:2 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): (#[cfg(all())] 1,)
PRINT-ATTR INPUT (DISPLAY): #[rustc_dummy] (#[cfg(all())] 1,)
PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "rustc_dummy",
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
],
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "cfg",
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "all",
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [],
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
],
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
],
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
Literal {
kind: Integer,
symbol: "1",
suffix: None,
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
],
span: $DIR/cfg-eval.rs:31:38: 31:80 (#0),
span: $DIR/cfg-eval.rs:36:5: 36:48 (#0),
},
]

View File

@ -1,6 +1,6 @@
// compile-flags: -Z span-debug --error-format human
// aux-build:test-macros.rs
// edition:2018
#![feature(custom_inner_attributes)]
#![feature(proc_macro_hygiene)]
#![feature(stmt_expr_attributes)]
@ -19,10 +19,32 @@ fn foo() {
#![print_target_and_args(fourth)]
}
#[print_target_and_args(mod_first)]
#[print_target_and_args(mod_second)]
mod inline_mod {
#![print_target_and_args(mod_third)]
#![print_target_and_args(mod_fourth)]
}
struct MyStruct {
field: bool
}
#[derive(Print)]
struct MyDerivePrint {
field: [u8; {
match true {
#![cfg_attr(not(FALSE), rustc_dummy(first))]
#![cfg_attr(not(FALSE), rustc_dummy(second))]
_ => {
#![cfg_attr(not(FALSE), rustc_dummy(second))]
true
}
};
0
}]
}
fn bar() {
(#![print_target_and_args(fifth)] 1, 2);
//~^ ERROR expected non-macro inner attribute, found attribute macro
@ -40,6 +62,19 @@ fn bar() {
true; 0
];
#[print_target_and_args(tuple_attrs)] (
#![cfg_attr(FALSE, rustc_dummy)]
3, 4, {
#![cfg_attr(not(FALSE), rustc_dummy(innermost))]
5
}
);
#[print_target_and_args(array_attrs)] [
#![rustc_dummy(inner)]
true; 0
];
[#![print_target_and_args(sixth)] 1 , 2];
//~^ ERROR expected non-macro inner attribute, found attribute macro
[#![print_target_and_args(seventh)] true ; 5];
@ -53,8 +88,25 @@ fn bar() {
MyStruct { #![print_target_and_args(ninth)] field: true };
//~^ ERROR expected non-macro inner attribute, found attribute macro
for _ in &[true] {
#![print_attr] //~ ERROR expected non-macro inner attribute
}
let _ = {
#![print_attr] //~ ERROR expected non-macro inner attribute
};
let _ = async {
#![print_attr] //~ ERROR expected non-macro inner attribute
};
{
#![print_attr] //~ ERROR expected non-macro inner attribute
};
}
extern {
fn weird_extern() {
#![print_target_and_args_consume(tenth)]

View File

@ -1,32 +1,56 @@
error: expected non-macro inner attribute, found attribute macro `print_target_and_args`
--> $DIR/inner-attrs.rs:27:9
--> $DIR/inner-attrs.rs:49:9
|
LL | (#![print_target_and_args(fifth)] 1, 2);
| ^^^^^^^^^^^^^^^^^^^^^ not a non-macro inner attribute
error: expected non-macro inner attribute, found attribute macro `print_target_and_args`
--> $DIR/inner-attrs.rs:43:9
--> $DIR/inner-attrs.rs:78:9
|
LL | [#![print_target_and_args(sixth)] 1 , 2];
| ^^^^^^^^^^^^^^^^^^^^^ not a non-macro inner attribute
error: expected non-macro inner attribute, found attribute macro `print_target_and_args`
--> $DIR/inner-attrs.rs:45:9
--> $DIR/inner-attrs.rs:80:9
|
LL | [#![print_target_and_args(seventh)] true ; 5];
| ^^^^^^^^^^^^^^^^^^^^^ not a non-macro inner attribute
error: expected non-macro inner attribute, found attribute macro `print_target_and_args`
--> $DIR/inner-attrs.rs:49:12
--> $DIR/inner-attrs.rs:84:12
|
LL | #![print_target_and_args(eighth)]
| ^^^^^^^^^^^^^^^^^^^^^ not a non-macro inner attribute
error: expected non-macro inner attribute, found attribute macro `print_target_and_args`
--> $DIR/inner-attrs.rs:54:19
--> $DIR/inner-attrs.rs:89:19
|
LL | MyStruct { #![print_target_and_args(ninth)] field: true };
| ^^^^^^^^^^^^^^^^^^^^^ not a non-macro inner attribute
error: aborting due to 5 previous errors
error: expected non-macro inner attribute, found attribute macro `print_attr`
--> $DIR/inner-attrs.rs:93:12
|
LL | #![print_attr]
| ^^^^^^^^^^ not a non-macro inner attribute
error: expected non-macro inner attribute, found attribute macro `print_attr`
--> $DIR/inner-attrs.rs:97:12
|
LL | #![print_attr]
| ^^^^^^^^^^ not a non-macro inner attribute
error: expected non-macro inner attribute, found attribute macro `print_attr`
--> $DIR/inner-attrs.rs:101:12
|
LL | #![print_attr]
| ^^^^^^^^^^ not a non-macro inner attribute
error: expected non-macro inner attribute, found attribute macro `print_attr`
--> $DIR/inner-attrs.rs:105:12
|
LL | #![print_attr]
| ^^^^^^^^^^ not a non-macro inner attribute
error: aborting due to 9 previous errors

View File

@ -290,11 +290,459 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
span: $DIR/inner-attrs.rs:17:1: 20:2 (#0),
},
]
PRINT-ATTR_ARGS INPUT (DISPLAY): mod_first
PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
Ident {
ident: "mod_first",
span: $DIR/inner-attrs.rs:22:25: 22:34 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): #[print_target_and_args(mod_second)] mod inline_mod
{
# ! [print_target_and_args(mod_third)] # !
[print_target_and_args(mod_fourth)]
}
PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "print_target_and_args",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "mod_second",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Ident {
ident: "mod",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Ident {
ident: "inline_mod",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "print_target_and_args",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "mod_third",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "print_target_and_args",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "mod_fourth",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
]
PRINT-ATTR_ARGS INPUT (DISPLAY): mod_second
PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
Ident {
ident: "mod_second",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): mod inline_mod
{
# ! [print_target_and_args(mod_third)] # !
[print_target_and_args(mod_fourth)]
}
PRINT-ATTR INPUT (DEBUG): TokenStream [
Ident {
ident: "mod",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Ident {
ident: "inline_mod",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "print_target_and_args",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "mod_third",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "print_target_and_args",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "mod_fourth",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
]
PRINT-ATTR_ARGS INPUT (DISPLAY): mod_third
PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
Ident {
ident: "mod_third",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): mod inline_mod { # ! [print_target_and_args(mod_fourth)] }
PRINT-ATTR INPUT (DEBUG): TokenStream [
Ident {
ident: "mod",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Ident {
ident: "inline_mod",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "print_target_and_args",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "mod_fourth",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
]
PRINT-ATTR_ARGS INPUT (DISPLAY): mod_fourth
PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
Ident {
ident: "mod_fourth",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): mod inline_mod { }
PRINT-ATTR INPUT (DEBUG): TokenStream [
Ident {
ident: "mod",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Ident {
ident: "inline_mod",
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/inner-attrs.rs:24:1: 27:2 (#0),
},
]
PRINT-DERIVE INPUT (DISPLAY): struct MyDerivePrint
{
field :
[u8 ;
{
match true
{ # ! [rustc_dummy(first)] # ! [rustc_dummy(second)] _ => { true } }
; 0
}],
}
PRINT-DERIVE INPUT (DEBUG): TokenStream [
Ident {
ident: "struct",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Ident {
ident: "MyDerivePrint",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Ident {
ident: "field",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Punct {
ch: ':',
spacing: Alone,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "u8",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Ident {
ident: "match",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Ident {
ident: "true",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "rustc_dummy",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "first",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
],
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
],
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "rustc_dummy",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "second",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
],
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
],
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Ident {
ident: "_",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Punct {
ch: '=',
spacing: Joint,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Punct {
ch: '>',
spacing: Alone,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Ident {
ident: "true",
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
],
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
],
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Literal {
kind: Integer,
symbol: "0",
suffix: None,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
],
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
],
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
],
span: $DIR/inner-attrs.rs:34:1: 46:2 (#0),
},
]
PRINT-ATTR_ARGS INPUT (DISPLAY): tuple_attrs
PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
Ident {
ident: "tuple_attrs",
span: $DIR/inner-attrs.rs:30:29: 30:40 (#0),
span: $DIR/inner-attrs.rs:52:29: 52:40 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): (# ! [cfg_attr(FALSE, rustc_dummy)] 3, 4,
@ -306,63 +754,63 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:31:9: 31:10 (#0),
span: $DIR/inner-attrs.rs:53:9: 53:10 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:31:10: 31:11 (#0),
span: $DIR/inner-attrs.rs:53:10: 53:11 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "cfg_attr",
span: $DIR/inner-attrs.rs:31:12: 31:20 (#0),
span: $DIR/inner-attrs.rs:53:12: 53:20 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "FALSE",
span: $DIR/inner-attrs.rs:31:21: 31:26 (#0),
span: $DIR/inner-attrs.rs:53:21: 53:26 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/inner-attrs.rs:31:26: 31:27 (#0),
span: $DIR/inner-attrs.rs:53:26: 53:27 (#0),
},
Ident {
ident: "rustc_dummy",
span: $DIR/inner-attrs.rs:31:28: 31:39 (#0),
span: $DIR/inner-attrs.rs:53:28: 53:39 (#0),
},
],
span: $DIR/inner-attrs.rs:31:20: 31:40 (#0),
span: $DIR/inner-attrs.rs:53:20: 53:40 (#0),
},
],
span: $DIR/inner-attrs.rs:31:11: 31:41 (#0),
span: $DIR/inner-attrs.rs:53:11: 53:41 (#0),
},
Literal {
kind: Integer,
symbol: "3",
suffix: None,
span: $DIR/inner-attrs.rs:32:9: 32:10 (#0),
span: $DIR/inner-attrs.rs:54:9: 54:10 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/inner-attrs.rs:32:10: 32:11 (#0),
span: $DIR/inner-attrs.rs:54:10: 54:11 (#0),
},
Literal {
kind: Integer,
symbol: "4",
suffix: None,
span: $DIR/inner-attrs.rs:32:12: 32:13 (#0),
span: $DIR/inner-attrs.rs:54:12: 54:13 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/inner-attrs.rs:32:13: 32:14 (#0),
span: $DIR/inner-attrs.rs:54:13: 54:14 (#0),
},
Group {
delimiter: Brace,
@ -370,85 +818,85 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:33:13: 33:14 (#0),
span: $DIR/inner-attrs.rs:55:13: 55:14 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:33:14: 33:15 (#0),
span: $DIR/inner-attrs.rs:55:14: 55:15 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "cfg_attr",
span: $DIR/inner-attrs.rs:33:16: 33:24 (#0),
span: $DIR/inner-attrs.rs:55:16: 55:24 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "not",
span: $DIR/inner-attrs.rs:33:25: 33:28 (#0),
span: $DIR/inner-attrs.rs:55:25: 55:28 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "FALSE",
span: $DIR/inner-attrs.rs:33:29: 33:34 (#0),
span: $DIR/inner-attrs.rs:55:29: 55:34 (#0),
},
],
span: $DIR/inner-attrs.rs:33:28: 33:35 (#0),
span: $DIR/inner-attrs.rs:55:28: 55:35 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/inner-attrs.rs:33:35: 33:36 (#0),
span: $DIR/inner-attrs.rs:55:35: 55:36 (#0),
},
Ident {
ident: "rustc_dummy",
span: $DIR/inner-attrs.rs:33:37: 33:48 (#0),
span: $DIR/inner-attrs.rs:55:37: 55:48 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "innermost",
span: $DIR/inner-attrs.rs:33:49: 33:58 (#0),
span: $DIR/inner-attrs.rs:55:49: 55:58 (#0),
},
],
span: $DIR/inner-attrs.rs:33:48: 33:59 (#0),
span: $DIR/inner-attrs.rs:55:48: 55:59 (#0),
},
],
span: $DIR/inner-attrs.rs:33:24: 33:60 (#0),
span: $DIR/inner-attrs.rs:55:24: 55:60 (#0),
},
],
span: $DIR/inner-attrs.rs:33:15: 33:61 (#0),
span: $DIR/inner-attrs.rs:55:15: 55:61 (#0),
},
Literal {
kind: Integer,
symbol: "5",
suffix: None,
span: $DIR/inner-attrs.rs:34:13: 34:14 (#0),
span: $DIR/inner-attrs.rs:56:13: 56:14 (#0),
},
],
span: $DIR/inner-attrs.rs:32:15: 35:10 (#0),
span: $DIR/inner-attrs.rs:54:15: 57:10 (#0),
},
],
span: $DIR/inner-attrs.rs:30:43: 36:6 (#0),
span: $DIR/inner-attrs.rs:52:43: 58:6 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/inner-attrs.rs:36:6: 36:7 (#0),
span: $DIR/inner-attrs.rs:58:6: 58:7 (#0),
},
]
PRINT-ATTR_ARGS INPUT (DISPLAY): array_attrs
PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
Ident {
ident: "array_attrs",
span: $DIR/inner-attrs.rs:38:29: 38:40 (#0),
span: $DIR/inner-attrs.rs:60:29: 60:40 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): [# ! [rustc_dummy(inner)] true ; 0] ;
@ -459,82 +907,302 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "rustc_dummy",
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "inner",
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
],
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
],
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
Ident {
ident: "true",
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
Literal {
kind: Integer,
symbol: "0",
suffix: None,
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
],
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/inner-attrs.rs:38:43: 41:7 (#0),
span: $DIR/inner-attrs.rs:60:43: 63:7 (#0),
},
]
PRINT-ATTR_ARGS INPUT (DISPLAY): tuple_attrs
PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
Ident {
ident: "tuple_attrs",
span: $DIR/inner-attrs.rs:65:29: 65:40 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): (# ! [cfg_attr(FALSE, rustc_dummy)] 3, 4,
{ # ! [cfg_attr(not(FALSE), rustc_dummy(innermost))] 5 }) ;
PRINT-ATTR INPUT (DEBUG): TokenStream [
Group {
delimiter: Parenthesis,
stream: TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:66:9: 66:10 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:66:10: 66:11 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "cfg_attr",
span: $DIR/inner-attrs.rs:66:12: 66:20 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "FALSE",
span: $DIR/inner-attrs.rs:66:21: 66:26 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/inner-attrs.rs:66:26: 66:27 (#0),
},
Ident {
ident: "rustc_dummy",
span: $DIR/inner-attrs.rs:66:28: 66:39 (#0),
},
],
span: $DIR/inner-attrs.rs:66:20: 66:40 (#0),
},
],
span: $DIR/inner-attrs.rs:66:11: 66:41 (#0),
},
Literal {
kind: Integer,
symbol: "3",
suffix: None,
span: $DIR/inner-attrs.rs:67:9: 67:10 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/inner-attrs.rs:67:10: 67:11 (#0),
},
Literal {
kind: Integer,
symbol: "4",
suffix: None,
span: $DIR/inner-attrs.rs:67:12: 67:13 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/inner-attrs.rs:67:13: 67:14 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:68:13: 68:14 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:68:14: 68:15 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "cfg_attr",
span: $DIR/inner-attrs.rs:68:16: 68:24 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "not",
span: $DIR/inner-attrs.rs:68:25: 68:28 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "FALSE",
span: $DIR/inner-attrs.rs:68:29: 68:34 (#0),
},
],
span: $DIR/inner-attrs.rs:68:28: 68:35 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/inner-attrs.rs:68:35: 68:36 (#0),
},
Ident {
ident: "rustc_dummy",
span: $DIR/inner-attrs.rs:68:37: 68:48 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "innermost",
span: $DIR/inner-attrs.rs:68:49: 68:58 (#0),
},
],
span: $DIR/inner-attrs.rs:68:48: 68:59 (#0),
},
],
span: $DIR/inner-attrs.rs:68:24: 68:60 (#0),
},
],
span: $DIR/inner-attrs.rs:68:15: 68:61 (#0),
},
Literal {
kind: Integer,
symbol: "5",
suffix: None,
span: $DIR/inner-attrs.rs:69:13: 69:14 (#0),
},
],
span: $DIR/inner-attrs.rs:67:15: 70:10 (#0),
},
],
span: $DIR/inner-attrs.rs:65:43: 71:6 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/inner-attrs.rs:71:6: 71:7 (#0),
},
]
PRINT-ATTR_ARGS INPUT (DISPLAY): array_attrs
PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
Ident {
ident: "array_attrs",
span: $DIR/inner-attrs.rs:73:29: 73:40 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): [# ! [rustc_dummy(inner)] true ; 0] ;
PRINT-ATTR INPUT (DEBUG): TokenStream [
Group {
delimiter: Bracket,
stream: TokenStream [
Punct {
ch: '#',
spacing: Joint,
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "rustc_dummy",
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "inner",
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
],
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
],
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
Ident {
ident: "true",
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
Literal {
kind: Integer,
symbol: "0",
suffix: None,
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
],
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/inner-attrs.rs:73:43: 76:7 (#0),
},
]
PRINT-ATTR_ARGS INPUT (DISPLAY): tenth
PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [
Ident {
ident: "tenth",
span: $DIR/inner-attrs.rs:60:42: 60:47 (#0),
span: $DIR/inner-attrs.rs:112:42: 112:47 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): fn weird_extern() { }
PRINT-ATTR INPUT (DEBUG): TokenStream [
Ident {
ident: "fn",
span: $DIR/inner-attrs.rs:59:5: 61:6 (#0),
span: $DIR/inner-attrs.rs:111:5: 113:6 (#0),
},
Ident {
ident: "weird_extern",
span: $DIR/inner-attrs.rs:59:5: 61:6 (#0),
span: $DIR/inner-attrs.rs:111:5: 113:6 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [],
span: $DIR/inner-attrs.rs:59:5: 61:6 (#0),
span: $DIR/inner-attrs.rs:111:5: 113:6 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/inner-attrs.rs:59:5: 61:6 (#0),
span: $DIR/inner-attrs.rs:111:5: 113:6 (#0),
},
]

View File

@ -1,6 +1,10 @@
// check-pass
// compile-flags: -Z span-debug
// aux-build:nonterminal-recollect-attr.rs
#![no_std] // Don't load unnecessary hygiene information from std
extern crate std;
extern crate nonterminal_recollect_attr;
use nonterminal_recollect_attr::*;

View File

@ -0,0 +1,72 @@
First recollected: TokenStream [
Group {
delimiter: None,
stream: TokenStream [
Ident {
ident: "pub",
span: $DIR/nonterminal-recollect-attr.rs:20:11: 20:14 (#0),
},
],
span: $DIR/nonterminal-recollect-attr.rs:14:9: 14:11 (#4),
},
Ident {
ident: "struct",
span: $DIR/nonterminal-recollect-attr.rs:14:12: 14:18 (#4),
},
Ident {
ident: "Foo",
span: $DIR/nonterminal-recollect-attr.rs:14:19: 14:22 (#4),
},
Group {
delimiter: Brace,
stream: TokenStream [
Ident {
ident: "field",
span: $DIR/nonterminal-recollect-attr.rs:15:13: 15:18 (#4),
},
Punct {
ch: ':',
spacing: Alone,
span: $DIR/nonterminal-recollect-attr.rs:15:18: 15:19 (#4),
},
Ident {
ident: "u8",
span: $DIR/nonterminal-recollect-attr.rs:15:20: 15:22 (#4),
},
],
span: $DIR/nonterminal-recollect-attr.rs:14:23: 16:10 (#4),
},
]
Second recollected: TokenStream [
Ident {
ident: "pub",
span: $DIR/nonterminal-recollect-attr.rs:20:11: 20:14 (#0),
},
Ident {
ident: "struct",
span: $DIR/nonterminal-recollect-attr.rs:14:12: 14:18 (#4),
},
Ident {
ident: "Foo",
span: $DIR/nonterminal-recollect-attr.rs:14:19: 14:22 (#4),
},
Group {
delimiter: Brace,
stream: TokenStream [
Ident {
ident: "field",
span: $DIR/nonterminal-recollect-attr.rs:15:13: 15:18 (#4),
},
Punct {
ch: ':',
spacing: Alone,
span: $DIR/nonterminal-recollect-attr.rs:15:18: 15:19 (#4),
},
Ident {
ident: "u8",
span: $DIR/nonterminal-recollect-attr.rs:15:20: 15:22 (#4),
},
],
span: $DIR/nonterminal-recollect-attr.rs:14:23: 16:10 (#4),
},
]