Properly handle attributes on statements

We now collect tokens for the underlying node wrapped by `StmtKind`
instead of storing tokens directly in `Stmt`.

`LazyTokenStream` now supports capturing a trailing semicolon after it
is initially constructed. This allows us to avoid refactoring statement
parsing to wrap the parsing of the semicolon in `parse_tokens`.

Attributes on item statements
(e.g. `fn foo() { #[bar] struct MyStruct; }`) are now treated as
item attributes, not statement attributes, which is consistent with how
we handle attributes on other kinds of statements. The feature-gating
code is adjusted so that proc-macro attributes are still allowed on item
statements on stable.

Two built-in macros (`#[global_allocator]` and `#[test]`) needed to be
adjusted to support being passed `Annotatable::Stmt`.
This commit is contained in:
Aaron Hill 2020-11-17 14:27:44 -05:00
parent 72da5a9d85
commit de88bf148b
No known key found for this signature in database
GPG key ID: B4087E510E98B164
20 changed files with 485 additions and 187 deletions

View file

@ -25,6 +25,8 @@ fn print_str(string: &'static str) {
macro_rules! make_stmt {
($stmt:stmt) => {
#[print_attr]
#[allow(unused)]
$stmt
}
}

View file

@ -1,43 +1,84 @@
PRINT-ATTR INPUT (DISPLAY): #[allow(unused)] struct Foo { }
PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:29:9: 29:10 (#12),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "allow",
span: $DIR/allowed-attr-stmt-expr.rs:29:11: 29:16 (#12),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "unused",
span: $DIR/allowed-attr-stmt-expr.rs:29:17: 29:23 (#12),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:29:16: 29:24 (#12),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:29:10: 29:25 (#12),
},
Ident {
ident: "struct",
span: $DIR/allowed-attr-stmt-expr.rs:42:16: 42:22 (#0),
},
Ident {
ident: "Foo",
span: $DIR/allowed-attr-stmt-expr.rs:42:23: 42:26 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/allowed-attr-stmt-expr.rs:42:27: 42:29 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): #[expect_let] let string = "Hello, world!" ;
PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:45:5: 45:6 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "expect_let",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:45:7: 45:17 (#0),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:45:6: 45:18 (#0),
},
Ident {
ident: "let",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:46:5: 46:8 (#0),
},
Ident {
ident: "string",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:46:9: 46:15 (#0),
},
Punct {
ch: '=',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:46:16: 46:17 (#0),
},
Literal {
kind: Str,
symbol: "Hello, world!",
suffix: None,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:46:18: 46:33 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:46:33: 46:34 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): #[expect_print_stmt] println ! ("{}", string) ;
@ -45,26 +86,26 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:49:5: 49:6 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "expect_print_stmt",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:49:7: 49:24 (#0),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:49:6: 49:25 (#0),
},
Ident {
ident: "println",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:50:5: 50:12 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:50:12: 50:13 (#0),
},
Group {
delimiter: Parenthesis,
@ -73,36 +114,36 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
kind: Str,
symbol: "{}",
suffix: None,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:50:14: 50:18 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:50:18: 50:19 (#0),
},
Ident {
ident: "string",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:50:20: 50:26 (#0),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:50:13: 50:27 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:50:27: 50:28 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): second_make_stmt ! (#[allow(dead_code)] struct Bar { }) ;
PRINT-ATTR INPUT (DEBUG): TokenStream [
Ident {
ident: "second_make_stmt",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:5: 53:21 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:21: 53:22 (#0),
},
Group {
delimiter: Parenthesis,
@ -110,78 +151,149 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:23: 53:24 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "allow",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:25: 53:30 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "dead_code",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:31: 53:40 (#0),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:30: 53:41 (#0),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:24: 53:42 (#0),
},
Ident {
ident: "struct",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:43: 53:49 (#0),
},
Ident {
ident: "Bar",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:50: 53:53 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:54: 53:56 (#0),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:22: 53:57 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:53:57: 53:58 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): #[rustc_dummy] struct Other { }
PRINT-ATTR INPUT (DISPLAY): #[allow(unused)] #[allow(dead_code)] struct Bar { }
PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:29:9: 29:10 (#34),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "allow",
span: $DIR/allowed-attr-stmt-expr.rs:29:11: 29:16 (#34),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "unused",
span: $DIR/allowed-attr-stmt-expr.rs:29:17: 29:23 (#34),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:29:16: 29:24 (#34),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:29:10: 29:25 (#34),
},
Punct {
ch: '#',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:53:23: 53:24 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "allow",
span: $DIR/allowed-attr-stmt-expr.rs:53:25: 53:30 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "dead_code",
span: $DIR/allowed-attr-stmt-expr.rs:53:31: 53:40 (#0),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:53:30: 53:41 (#0),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:53:24: 53:42 (#0),
},
Ident {
ident: "struct",
span: $DIR/allowed-attr-stmt-expr.rs:53:43: 53:49 (#0),
},
Ident {
ident: "Bar",
span: $DIR/allowed-attr-stmt-expr.rs:53:50: 53:53 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/allowed-attr-stmt-expr.rs:53:54: 53:56 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): #[rustc_dummy] struct Other { } ;
PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:56:5: 56:6 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "rustc_dummy",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:56:7: 56:18 (#0),
},
],
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:56:6: 56:19 (#0),
},
Ident {
ident: "struct",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:57:5: 57:11 (#0),
},
Ident {
ident: "Other",
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:57:12: 57:17 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/allowed-attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/allowed-attr-stmt-expr.rs:57:18: 57:20 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/allowed-attr-stmt-expr.rs:57:20: 57:21 (#0),
},
]

View file

@ -24,6 +24,8 @@ fn print_str(string: &'static str) {
macro_rules! make_stmt {
($stmt:stmt) => {
#[print_attr]
#[allow(unused)]
$stmt
}
}

View file

@ -8,7 +8,7 @@ LL | #[expect_print_expr]
= help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable
error[E0658]: attributes on expressions are experimental
--> $DIR/attr-stmt-expr.rs:55:5
--> $DIR/attr-stmt-expr.rs:57:5
|
LL | #[expect_expr]
| ^^^^^^^^^^^^^^

View file

@ -1,43 +1,84 @@
PRINT-ATTR INPUT (DISPLAY): #[allow(unused)] struct Foo { }
PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:28:9: 28:10 (#12),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "allow",
span: $DIR/attr-stmt-expr.rs:28:11: 28:16 (#12),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "unused",
span: $DIR/attr-stmt-expr.rs:28:17: 28:23 (#12),
},
],
span: $DIR/attr-stmt-expr.rs:28:16: 28:24 (#12),
},
],
span: $DIR/attr-stmt-expr.rs:28:10: 28:25 (#12),
},
Ident {
ident: "struct",
span: $DIR/attr-stmt-expr.rs:40:16: 40:22 (#0),
},
Ident {
ident: "Foo",
span: $DIR/attr-stmt-expr.rs:40:23: 40:26 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/attr-stmt-expr.rs:40:27: 40:29 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): #[expect_let] let string = "Hello, world!" ;
PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:43:5: 43:6 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "expect_let",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:43:7: 43:17 (#0),
},
],
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:43:6: 43:18 (#0),
},
Ident {
ident: "let",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:44:5: 44:8 (#0),
},
Ident {
ident: "string",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:44:9: 44:15 (#0),
},
Punct {
ch: '=',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:44:16: 44:17 (#0),
},
Literal {
kind: Str,
symbol: "Hello, world!",
suffix: None,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:44:18: 44:33 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:44:33: 44:34 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): #[expect_print_stmt] println ! ("{}", string) ;
@ -45,26 +86,26 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:47:5: 47:6 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "expect_print_stmt",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:47:7: 47:24 (#0),
},
],
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:47:6: 47:25 (#0),
},
Ident {
ident: "println",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:48:5: 48:12 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:48:12: 48:13 (#0),
},
Group {
delimiter: Parenthesis,
@ -73,36 +114,36 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
kind: Str,
symbol: "{}",
suffix: None,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:48:14: 48:18 (#0),
},
Punct {
ch: ',',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:48:18: 48:19 (#0),
},
Ident {
ident: "string",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:48:20: 48:26 (#0),
},
],
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:48:13: 48:27 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:48:27: 48:28 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): second_make_stmt ! (#[allow(dead_code)] struct Bar { }) ;
PRINT-ATTR INPUT (DEBUG): TokenStream [
Ident {
ident: "second_make_stmt",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:5: 51:21 (#0),
},
Punct {
ch: '!',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:21: 51:22 (#0),
},
Group {
delimiter: Parenthesis,
@ -110,48 +151,114 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:23: 51:24 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "allow",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:25: 51:30 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "dead_code",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:31: 51:40 (#0),
},
],
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:30: 51:41 (#0),
},
],
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:24: 51:42 (#0),
},
Ident {
ident: "struct",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:43: 51:49 (#0),
},
Ident {
ident: "Bar",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:50: 51:53 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:54: 51:56 (#0),
},
],
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:22: 51:57 (#0),
},
Punct {
ch: ';',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:51:57: 51:58 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): #[allow(unused)] #[allow(dead_code)] struct Bar { }
PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:28:9: 28:10 (#34),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "allow",
span: $DIR/attr-stmt-expr.rs:28:11: 28:16 (#34),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "unused",
span: $DIR/attr-stmt-expr.rs:28:17: 28:23 (#34),
},
],
span: $DIR/attr-stmt-expr.rs:28:16: 28:24 (#34),
},
],
span: $DIR/attr-stmt-expr.rs:28:10: 28:25 (#34),
},
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:51:23: 51:24 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "allow",
span: $DIR/attr-stmt-expr.rs:51:25: 51:30 (#0),
},
Group {
delimiter: Parenthesis,
stream: TokenStream [
Ident {
ident: "dead_code",
span: $DIR/attr-stmt-expr.rs:51:31: 51:40 (#0),
},
],
span: $DIR/attr-stmt-expr.rs:51:30: 51:41 (#0),
},
],
span: $DIR/attr-stmt-expr.rs:51:24: 51:42 (#0),
},
Ident {
ident: "struct",
span: $DIR/attr-stmt-expr.rs:51:43: 51:49 (#0),
},
Ident {
ident: "Bar",
span: $DIR/attr-stmt-expr.rs:51:50: 51:53 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/attr-stmt-expr.rs:51:54: 51:56 (#0),
},
]
PRINT-ATTR INPUT (DISPLAY): #[rustc_dummy] struct Other { }
@ -159,29 +266,29 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
Punct {
ch: '#',
spacing: Alone,
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:54:5: 54:6 (#0),
},
Group {
delimiter: Bracket,
stream: TokenStream [
Ident {
ident: "rustc_dummy",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:54:7: 54:18 (#0),
},
],
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:54:6: 54:19 (#0),
},
Ident {
ident: "struct",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:55:5: 55:11 (#0),
},
Ident {
ident: "Other",
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:55:12: 55:17 (#0),
},
Group {
delimiter: Brace,
stream: TokenStream [],
span: $DIR/attr-stmt-expr.rs:1:1: 1:1 (#0),
span: $DIR/attr-stmt-expr.rs:55:18: 55:20 (#0),
},
]