[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