mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 20:01:22 -05:00
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:
committed by
Philip Herron
parent
3a0f10e798
commit
cbca7bdde2
@@ -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 ())
|
||||
{
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user