gccrs: Handle tail expression normalization right before lowering to HIR.

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>
This commit is contained in:
Matthew Jasper
2023-06-08 19:29:44 +01:00
committed by Philip Herron
parent 3a0f10e798
commit cbca7bdde2
3 changed files with 6 additions and 5 deletions

View File

@@ -4223,12 +4223,10 @@ Attribute::is_parsed_to_meta_item () const
}
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 ())
{

View File

@@ -2488,7 +2488,9 @@ public:
}
// 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; }

View File

@@ -33,6 +33,7 @@ public:
static HIR::BlockExpr *translate (AST::BlockExpr *expr, bool *terminated)
{
ASTLoweringBlock resolver;
expr->normalize_tail_expr ();
expr->accept_vis (resolver);
if (resolver.translated != nullptr)
{