This allows braced macros at the end of blocks to correctly expand to
zero or more statements followed by a tail expression. Parsing still
creates a tail expression for now.
gcc/rust/ChangeLog:
* ast/rust-ast.cc (BlockExpr::strip_tail_expr):
Don't normalize tail expression in this method.
(BlockExpr::normalize_tail_expr): New method that only does the normalization.
* ast/rust-expr.h: Declare new method.
* hir/rust-ast-lower-block.h: Normalize tail expressions on blocks before lowering.
Signed-off-by: Matthew Jasper <mjjasper1@gmail.com>
}
void
-BlockExpr::strip_tail_expr ()
+BlockExpr::normalize_tail_expr ()
{
- if (expr)
+ if (!expr)
{
- expr = nullptr;
-
// HACK: try to turn the last statement into a tail expression
if (statements.size () && statements.back ()->is_expr ())
{
}
// Removes the tail expression from the block.
- void strip_tail_expr ();
+ void strip_tail_expr () { expr = nullptr; }
+ // Normalizes a trailing statement without a semicolon to a tail expression.
+ void normalize_tail_expr ();
const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
std::vector<Attribute> &get_outer_attrs () override { return outer_attrs; }
static HIR::BlockExpr *translate (AST::BlockExpr *expr, bool *terminated)
{
ASTLoweringBlock resolver;
+ expr->normalize_tail_expr ();
expr->accept_vis (resolver);
if (resolver.translated != nullptr)
{