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;