From e19e30ed0e7853b06d53371ec272b51c79386e2b Mon Sep 17 00:00:00 2001 From: Owen Avery Date: Sat, 9 Aug 2025 19:01:55 -0400 Subject: [PATCH] Improve macro expansion for libcore This should prevent issues like https://github.com/Rust-GCC/gccrs/issues/3444 from affecting compilation of libcore 1.49. gcc/rust/ChangeLog: * ast/rust-expr.h (BorrowExpr::get_borrowed_expr_ptr): New member function. (ErrorPropagationExpr::get_propagating_expr_ptr): Likewise. (MethodCallExpr::get_receiver_expr_ptr): Likewise. (MatchExpr::get_scrutinee_expr_ptr): Likewise. * expand/rust-expand-visitor.cc (ExpandVisitor::visit): Improve handling of expression child nodes. * expand/rust-expand-visitor.h (ExpandVisitor::visit): Add overloads. Signed-off-by: Owen Avery --- gcc/rust/ast/rust-expr.h | 24 ++++++++++++++++++++++++ gcc/rust/expand/rust-expand-visitor.cc | 20 +++++++++++++++++--- gcc/rust/expand/rust-expand-visitor.h | 2 ++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h index 03cad86de3d0..2b8dead541b6 100644 --- a/gcc/rust/ast/rust-expr.h +++ b/gcc/rust/ast/rust-expr.h @@ -414,6 +414,12 @@ class BorrowExpr : public OperatorExpr return *main_or_left_expr; } + std::unique_ptr &get_borrowed_expr_ptr () + { + rust_assert (main_or_left_expr != nullptr); + return main_or_left_expr; + } + bool has_borrow_expr () const { return main_or_left_expr != nullptr; } bool get_is_mut () const { return mutability == Mutability::Mut; } @@ -488,6 +494,12 @@ class ErrorPropagationExpr : public OperatorExpr return *main_or_left_expr; } + std::unique_ptr &get_propagating_expr_ptr () + { + rust_assert (main_or_left_expr != nullptr); + return main_or_left_expr; + } + Expr::Kind get_expr_kind () const override { return Expr::Kind::ErrorPropagation; @@ -2293,6 +2305,12 @@ class MethodCallExpr : public ExprWithoutBlock return *receiver; } + std::unique_ptr &get_receiver_expr_ptr () + { + rust_assert (receiver != nullptr); + return receiver; + } + const PathExprSegment &get_method_name () const { return method_name; } PathExprSegment &get_method_name () { return method_name; } @@ -4892,6 +4910,12 @@ class MatchExpr : public ExprWithBlock return *branch_value; } + std::unique_ptr &get_scrutinee_expr_ptr () + { + rust_assert (branch_value != nullptr); + return branch_value; + } + const std::vector &get_match_cases () const { return match_arms; } std::vector &get_match_cases () { return match_arms; } diff --git a/gcc/rust/expand/rust-expand-visitor.cc b/gcc/rust/expand/rust-expand-visitor.cc index 8f6e7faa0c45..cc90223666d4 100644 --- a/gcc/rust/expand/rust-expand-visitor.cc +++ b/gcc/rust/expand/rust-expand-visitor.cc @@ -541,10 +541,16 @@ void ExpandVisitor::visit (AST::MetaItemPathExpr &) {} +void +ExpandVisitor::visit (AST::BorrowExpr &expr) +{ + maybe_expand_expr (expr.get_borrowed_expr_ptr ()); +} + void ExpandVisitor::visit (AST::ErrorPropagationExpr &expr) { - visit (expr.get_propagating_expr ()); + maybe_expand_expr (expr.get_propagating_expr_ptr ()); } void @@ -588,6 +594,14 @@ ExpandVisitor::visit (AST::GroupedExpr &expr) maybe_expand_expr (expr.get_expr_in_parens_ptr ()); } +void +ExpandVisitor::visit (AST::TupleExpr &expr) +{ + // TODO: expand as multiple expressions? + for (auto &elem : expr.get_tuple_elems ()) + maybe_expand_expr (elem); +} + void ExpandVisitor::visit (AST::StructExprStruct &expr) {} @@ -604,7 +618,7 @@ ExpandVisitor::visit (AST::CallExpr &expr) void ExpandVisitor::visit (AST::MethodCallExpr &expr) { - visit (expr.get_receiver_expr ()); + maybe_expand_expr (expr.get_receiver_expr_ptr ()); for (auto ¶m : expr.get_params ()) maybe_expand_expr (param); @@ -679,7 +693,7 @@ ExpandVisitor::visit (AST::IfLetExprConseqElse &expr) void ExpandVisitor::visit (AST::MatchExpr &expr) { - visit (expr.get_scrutinee_expr ()); + maybe_expand_expr (expr.get_scrutinee_expr_ptr ()); for (auto &match_case : expr.get_match_cases ()) { diff --git a/gcc/rust/expand/rust-expand-visitor.h b/gcc/rust/expand/rust-expand-visitor.h index 845e10cfec78..b3e971f69009 100644 --- a/gcc/rust/expand/rust-expand-visitor.h +++ b/gcc/rust/expand/rust-expand-visitor.h @@ -210,6 +210,7 @@ class ExpandVisitor : public AST::DefaultASTVisitor void visit (AST::AttrInputMacro &) override; void visit (AST::MetaItemLitExpr &) override; void visit (AST::MetaItemPathExpr &) override; + void visit (AST::BorrowExpr &) override; void visit (AST::ErrorPropagationExpr &expr) override; void visit (AST::ArithmeticOrLogicalExpr &expr) override; void visit (AST::ComparisonExpr &expr) override; @@ -217,6 +218,7 @@ class ExpandVisitor : public AST::DefaultASTVisitor void visit (AST::AssignmentExpr &expr) override; void visit (AST::CompoundAssignmentExpr &expr) override; void visit (AST::GroupedExpr &expr) override; + void visit (AST::TupleExpr &expr) override; void visit (AST::StructExprStruct &expr) override; void visit (AST::CallExpr &expr) override;