From: Matthew Jasper Date: Thu, 8 Jun 2023 18:29:44 +0000 (+0100) Subject: gccrs: Handle tail expression normalization right before lowering to HIR. X-Git-Tag: basepoints/gcc-15~2461 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3d0684b2c241cf13740b8bd421a84027719e554a;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc index 06b28e0f0018..2eac09ba5d37 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 3e7c93c5098f..adf9b684527e 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 &get_outer_attrs () const { return outer_attrs; } std::vector &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 a4d6069b7634..300c24e0ab6d 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) {