Rollup merge of #34436 - jseyfried:no_block_expr, r=eddyb
To allow these braced macro invocation, this PR removes the optional expression from `ast::Block` and instead uses a `StmtKind::Expr` at the end of the statement list.
Currently, braced macro invocations in blocks can expand into statements (and items) except when they are last in a block, in which case they can only expand into expressions.
For example,
```rust
macro_rules! make_stmt {
() => { let x = 0; }
}
fn f() {
make_stmt! {} //< This is OK...
let x = 0; //< ... unless this line is commented out.
}
```
Fixes #34418.
This commit is contained in:
@@ -611,23 +611,14 @@ pub fn expand_block(blk: P<Block>, fld: &mut MacroExpander) -> P<Block> {
|
||||
|
||||
// expand the elements of a block.
|
||||
pub fn expand_block_elts(b: P<Block>, fld: &mut MacroExpander) -> P<Block> {
|
||||
b.map(|Block {id, stmts, expr, rules, span}| {
|
||||
b.map(|Block {id, stmts, rules, span}| {
|
||||
let new_stmts = stmts.into_iter().flat_map(|x| {
|
||||
// perform pending renames and expand macros in the statement
|
||||
fld.fold_stmt(x).into_iter()
|
||||
}).collect();
|
||||
let new_expr = expr.map(|x| {
|
||||
let expr = {
|
||||
let pending_renames = &mut fld.cx.syntax_env.info().pending_renames;
|
||||
let mut rename_fld = IdentRenamer{renames:pending_renames};
|
||||
rename_fld.fold_expr(x)
|
||||
};
|
||||
fld.fold_expr(expr)
|
||||
});
|
||||
Block {
|
||||
id: fld.new_id(id),
|
||||
stmts: new_stmts,
|
||||
expr: new_expr,
|
||||
rules: rules,
|
||||
span: span
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user