Synthesize a TokenStream for StmtKind::Empty

Fixes #80760
This commit is contained in:
Aaron Hill 2021-01-07 11:43:21 -05:00
parent c8915eebea
commit 3ed6caae60
No known key found for this signature in database
GPG Key ID: B4087E510E98B164
3 changed files with 50 additions and 1 deletions

View File

@ -257,7 +257,16 @@ pub fn nt_to_tokenstream(
let tokens = match *nt {
Nonterminal::NtItem(ref item) => prepend_attrs(sess, &item.attrs, nt, item.tokens.as_ref()),
Nonterminal::NtBlock(ref block) => convert_tokens(block.tokens.as_ref()),
Nonterminal::NtStmt(ref stmt) => prepend_attrs(sess, stmt.attrs(), nt, stmt.tokens()),
Nonterminal::NtStmt(ref stmt) => {
let do_prepend = |tokens| prepend_attrs(sess, stmt.attrs(), nt, tokens);
if let ast::StmtKind::Empty = stmt.kind {
let tokens: TokenStream =
tokenstream::TokenTree::token(token::Semi, stmt.span).into();
do_prepend(Some(&LazyTokenStream::new(tokens)))
} else {
do_prepend(stmt.tokens())
}
}
Nonterminal::NtPat(ref pat) => convert_tokens(pat.tokens.as_ref()),
Nonterminal::NtTy(ref ty) => convert_tokens(ty.tokens.as_ref()),
Nonterminal::NtIdent(ident, is_raw) => {

View File

@ -0,0 +1,26 @@
// check-pass
// aux-build:test-macros.rs
// compile-flags: -Z span-debug
#![no_std] // Don't load unnecessary hygiene information from std
extern crate std;
#[macro_use]
extern crate test_macros;
macro_rules! empty_stmt {
($s:stmt) => {
print_bang!($s);
// Currently, all attributes are ignored
// on an empty statement
#[print_attr]
#[rustc_dummy(first)]
#[rustc_dummy(second)]
$s
}
}
fn main() {
empty_stmt!(;);
}

View File

@ -0,0 +1,14 @@
PRINT-BANG INPUT (DISPLAY): ;
PRINT-BANG INPUT (DEBUG): TokenStream [
Group {
delimiter: None,
stream: TokenStream [
Punct {
ch: ';',
spacing: Alone,
span: $DIR/issue-80760-empty-stmt.rs:25:17: 25:18 (#0),
},
],
span: $DIR/issue-80760-empty-stmt.rs:13:21: 13:23 (#4),
},
]