From: Owen Avery Date: Wed, 26 Apr 2023 13:29:04 +0000 (-0400) Subject: gccrs: Handle replacing stripped tail expressions X-Git-Tag: basepoints/gcc-15~2591 X-Git-Url: https://gcc.gnu.org/git/?a=commitdiff_plain;h=b181ea7289b229b1e5971ccbbdd4f74dbdacefa9;p=gcc.git gccrs: Handle replacing stripped tail expressions gcc/rust/ChangeLog: * ast/rust-ast.cc (BlockExpr::strip_tail_expr): Try to take new tail expression from statements list. * ast/rust-expr.h (BlockExpr::strip_tail_expr): Replace definition with only declaration. gcc/testsuite/ChangeLog: * rust/execute/torture/cfg-tail.rs: New test. Signed-off-by: Owen Avery --- diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc index a664a319513a..7a9dc8a008b5 100644 --- a/gcc/rust/ast/rust-ast.cc +++ b/gcc/rust/ast/rust-ast.cc @@ -4213,6 +4213,31 @@ Attribute::is_parsed_to_meta_item () const return has_attr_input () && attr_input->is_meta_item (); } +void +BlockExpr::strip_tail_expr () +{ + if (expr) + { + expr = nullptr; + + // HACK: try to turn the last statement into a tail expression + if (statements.size () && statements.back ()->is_expr ()) + { + auto &stmt = static_cast (*statements.back ()); + + if (stmt.get_type () == ExprStmt::ExprStmtType::WITH_BLOCK) + { + auto &stmt_block = static_cast (stmt); + if (!stmt_block.is_semicolon_followed ()) + { + expr = std::move (stmt_block.get_expr ()); + statements.pop_back (); + } + } + } + } +} + /* Visitor implementations - these are short but inlining can't happen anyway * due to virtual functions and I didn't want to make the ast header includes * any longer than they already are. */ diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h index abe6e03ce45b..c43baf3cadec 100644 --- a/gcc/rust/ast/rust-expr.h +++ b/gcc/rust/ast/rust-expr.h @@ -2446,7 +2446,7 @@ public: } // Removes the tail expression from the block. - void strip_tail_expr () { expr = nullptr; } + void strip_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/testsuite/rust/execute/torture/cfg-tail.rs b/gcc/testsuite/rust/execute/torture/cfg-tail.rs new file mode 100644 index 000000000000..69411a6cdbcc --- /dev/null +++ b/gcc/testsuite/rust/execute/torture/cfg-tail.rs @@ -0,0 +1,9 @@ +fn foo() -> i32 { + {54} + #[cfg(all(A, not(A)))] + {45} +} + +fn main() -> i32 { + return foo() - 54; +}