[gcc r14-7678] gccrs: Handle tail expression normalization right before lowering to HIR.
Arthur Cohen
cohenarthur@gcc.gnu.org
Tue Jan 16 17:53:01 GMT 2024
https://gcc.gnu.org/g:3d0684b2c241cf13740b8bd421a84027719e554a
commit r14-7678-g3d0684b2c241cf13740b8bd421a84027719e554a
Author: Matthew Jasper <mjjasper1@gmail.com>
Date: Thu Jun 8 19:29:44 2023 +0100
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>
Diff:
---
gcc/rust/ast/rust-ast.cc | 6 ++----
gcc/rust/ast/rust-expr.h | 4 +++-
gcc/rust/hir/rust-ast-lower-block.h | 1 +
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index 06b28e0f001..2eac09ba5d3 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -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 ())
{
diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h
index 3e7c93c5098..adf9b684527 100644
--- a/gcc/rust/ast/rust-expr.h
+++ b/gcc/rust/ast/rust-expr.h
@@ -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; }
diff --git a/gcc/rust/hir/rust-ast-lower-block.h b/gcc/rust/hir/rust-ast-lower-block.h
index a4d6069b763..300c24e0ab6 100644
--- a/gcc/rust/hir/rust-ast-lower-block.h
+++ b/gcc/rust/hir/rust-ast-lower-block.h
@@ -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)
{
More information about the Gcc-cvs
mailing list