diff --git a/gcc/rust/ast/rust-ast-builder.cc b/gcc/rust/ast/rust-ast-builder.cc index 632f9455e3b..75ad312c353 100644 --- a/gcc/rust/ast/rust-ast-builder.cc +++ b/gcc/rust/ast/rust-ast-builder.cc @@ -484,10 +484,7 @@ Builder::match (std::unique_ptr &&scrutinee, MatchArm Builder::match_arm (std::unique_ptr &&pattern) { - auto patterns = std::vector> (); - patterns.emplace_back (std::move (pattern)); - - return MatchArm (std::move (patterns), loc); + return MatchArm (std::move (pattern), loc); } MatchCase diff --git a/gcc/rust/ast/rust-ast-collector.cc b/gcc/rust/ast/rust-ast-collector.cc index 721d274a838..6aae2195276 100644 --- a/gcc/rust/ast/rust-ast-collector.cc +++ b/gcc/rust/ast/rust-ast-collector.cc @@ -1431,10 +1431,7 @@ TokenCollector::visit (WhileLetLoopExpr &expr) push (Rust::Token::make (WHILE, expr.get_locus ())); push (Rust::Token::make (LET, UNDEF_LOCATION)); // TODO: The reference mention only one Pattern - for (auto &item : expr.get_patterns ()) - { - visit (item); - } + visit (expr.get_pattern ()); push (Rust::Token::make (EQUAL, UNDEF_LOCATION)); visit (expr.get_scrutinee_expr ()); visit (expr.get_loop_block ()); @@ -1473,10 +1470,7 @@ TokenCollector::visit (IfLetExpr &expr) { push (Rust::Token::make (IF, expr.get_locus ())); push (Rust::Token::make (LET, UNDEF_LOCATION)); - for (auto &pattern : expr.get_patterns ()) - { - visit (pattern); - } + visit (expr.get_pattern ()); push (Rust::Token::make (EQUAL, UNDEF_LOCATION)); visit (expr.get_value_expr ()); visit (expr.get_if_block ()); @@ -1495,10 +1489,7 @@ void TokenCollector::visit (MatchArm &arm) { visit_items_as_lines (arm.get_outer_attrs ()); - for (auto &pattern : arm.get_patterns ()) - { - visit (pattern); - } + visit (arm.get_pattern ()); if (arm.has_match_arm_guard ()) { push (Rust::Token::make (IF, UNDEF_LOCATION)); diff --git a/gcc/rust/ast/rust-ast-pointer-visitor.cc b/gcc/rust/ast/rust-ast-pointer-visitor.cc index ee1f001e197..c3d28e83315 100644 --- a/gcc/rust/ast/rust-ast-pointer-visitor.cc +++ b/gcc/rust/ast/rust-ast-pointer-visitor.cc @@ -587,8 +587,7 @@ void PointerVisitor::visit (AST::WhileLetLoopExpr &expr) { visit_outer_attrs (expr); - for (auto &pattern : expr.get_patterns ()) - reseat (pattern); + reseat (expr.get_pattern ()); if (expr.has_loop_label ()) visit (expr.get_loop_label ()); @@ -627,8 +626,7 @@ void PointerVisitor::visit (AST::IfLetExpr &expr) { visit_outer_attrs (expr); - for (auto &pattern : expr.get_patterns ()) - reseat (pattern); + reseat (expr.get_pattern ()); reseat (expr.get_value_expr_ptr ()); visit (expr.get_if_block ()); } @@ -644,8 +642,7 @@ void PointerVisitor::visit (AST::MatchArm &arm) { visit_outer_attrs (arm); - for (auto &pattern : arm.get_patterns ()) - reseat (pattern); + reseat (arm.get_pattern ()); if (arm.has_match_arm_guard ()) reseat (arm.get_guard_expr_ptr ()); } diff --git a/gcc/rust/ast/rust-ast-visitor.cc b/gcc/rust/ast/rust-ast-visitor.cc index afdd2b19dac..3af070c2335 100644 --- a/gcc/rust/ast/rust-ast-visitor.cc +++ b/gcc/rust/ast/rust-ast-visitor.cc @@ -607,8 +607,7 @@ void DefaultASTVisitor::visit (AST::WhileLetLoopExpr &expr) { visit_outer_attrs (expr); - for (auto &pattern : expr.get_patterns ()) - visit (pattern); + visit (expr.get_pattern ()); if (expr.has_loop_label ()) visit (expr.get_loop_label ()); @@ -647,8 +646,7 @@ void DefaultASTVisitor::visit (AST::IfLetExpr &expr) { visit_outer_attrs (expr); - for (auto &pattern : expr.get_patterns ()) - visit (pattern); + visit (expr.get_pattern ()); visit (expr.get_value_expr ()); visit (expr.get_if_block ()); } @@ -664,8 +662,7 @@ void DefaultASTVisitor::visit (AST::MatchArm &arm) { visit_outer_attrs (arm); - for (auto &pattern : arm.get_patterns ()) - visit (pattern); + visit (arm.get_pattern ()); if (arm.has_match_arm_guard ()) visit (arm.get_guard_expr ()); } diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc index d8713071c4c..2c82fb48be8 100644 --- a/gcc/rust/ast/rust-ast.cc +++ b/gcc/rust/ast/rust-ast.cc @@ -1943,14 +1943,13 @@ IfLetExpr::as_string () const str += append_attributes (outer_attrs, OUTER); str += "\n Condition match arm patterns: "; - if (match_arm_patterns.empty ()) + if (match_arm_pattern == nullptr) { str += "none"; } else { - for (const auto &pattern : match_arm_patterns) - str += "\n " + pattern->as_string (); + str += "\n " + match_arm_pattern->as_string (); } str += "\n Scrutinee expr: " + value->as_string (); @@ -2167,14 +2166,13 @@ WhileLetLoopExpr::as_string () const str += get_loop_label ().as_string (); str += "\n Match arm patterns: "; - if (match_arm_patterns.empty ()) + if (match_arm_pattern == nullptr) { str += "none"; } else { - for (const auto &pattern : match_arm_patterns) - str += "\n " + pattern->as_string (); + str += "\n " + match_arm_pattern->as_string (); } str += "\n Scrutinee expr: " + scrutinee->as_string (); @@ -2253,14 +2251,13 @@ MatchArm::as_string () const std::string str = append_attributes (outer_attrs, OUTER); str += "\nPatterns: "; - if (match_arm_patterns.empty ()) + if (match_arm_pattern == nullptr) { str += "none"; } else { - for (const auto &pattern : match_arm_patterns) - str += "\n " + pattern->as_string (); + str += "\n " + match_arm_pattern->as_string (); } str += "\nGuard expr: "; diff --git a/gcc/rust/ast/rust-desugar-question-mark.cc b/gcc/rust/ast/rust-desugar-question-mark.cc index 20a49039645..b3419af0501 100644 --- a/gcc/rust/ast/rust-desugar-question-mark.cc +++ b/gcc/rust/ast/rust-desugar-question-mark.cc @@ -39,11 +39,7 @@ MatchArm make_match_arm (std::unique_ptr &&pattern) { auto loc = pattern->get_locus (); - - auto patterns = std::vector> (); - patterns.emplace_back (std::move (pattern)); - - return MatchArm (std::move (patterns), loc); + return MatchArm (std::move (pattern), loc); } MatchCase diff --git a/gcc/rust/ast/rust-desugar-while-let.cc b/gcc/rust/ast/rust-desugar-while-let.cc index 5eadc5908fd..1e24e9453d6 100644 --- a/gcc/rust/ast/rust-desugar-while-let.cc +++ b/gcc/rust/ast/rust-desugar-while-let.cc @@ -53,9 +53,9 @@ DesugarWhileLet::DesugarCtx::make_continue_arm ( std::unique_ptr DesugarWhileLet::desugar (WhileLetLoopExpr &expr) { - rust_assert (expr.get_patterns ().size () == 1); + rust_assert (expr.get_pattern () != nullptr); - auto pattern = expr.get_patterns ()[0]->clone_pattern (); + auto pattern = expr.get_pattern ()->clone_pattern (); auto body = expr.get_loop_block ().clone_block_expr (); auto scrutinee = expr.get_scrutinee_expr ().clone_expr (); diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h index 3c36238c6ee..0cbe1a30788 100644 --- a/gcc/rust/ast/rust-expr.h +++ b/gcc/rust/ast/rust-expr.h @@ -4300,14 +4300,14 @@ class WhileLoopExpr : public BaseLoopExpr class WhileLetLoopExpr : public BaseLoopExpr { // MatchArmPatterns patterns; - std::vector> match_arm_patterns; // inlined + std::unique_ptr match_arm_pattern; // inlined std::unique_ptr scrutinee; public: std::string as_string () const override; // Constructor with a loop label - WhileLetLoopExpr (std::vector> match_arm_patterns, + WhileLetLoopExpr (std::unique_ptr match_arm_pattern, std::unique_ptr scrutinee, std::unique_ptr loop_block, location_t locus, tl::optional loop_label = tl::nullopt, @@ -4315,7 +4315,7 @@ class WhileLetLoopExpr : public BaseLoopExpr = std::vector ()) : BaseLoopExpr (std::move (loop_block), locus, std::move (loop_label), std::move (outer_attribs)), - match_arm_patterns (std::move (match_arm_patterns)), + match_arm_pattern (std::move (match_arm_pattern)), scrutinee (std::move (scrutinee)) {} @@ -4325,25 +4325,15 @@ class WhileLetLoopExpr : public BaseLoopExpr /*match_arm_patterns(other.match_arm_patterns),*/ scrutinee ( other.scrutinee->clone_expr ()) { - match_arm_patterns.reserve (other.match_arm_patterns.size ()); - for (const auto &e : other.match_arm_patterns) - match_arm_patterns.push_back (e->clone_pattern ()); + match_arm_pattern = other.get_pattern ()->clone_pattern (); } // Overloaded assignment operator to clone pointers WhileLetLoopExpr &operator= (WhileLetLoopExpr const &other) { BaseLoopExpr::operator= (other); - // match_arm_patterns = other.match_arm_patterns; scrutinee = other.scrutinee->clone_expr (); - // loop_block = other.loop_block->clone_block_expr(); - // loop_label = other.loop_label; - // outer_attrs = other.outer_attrs; - - match_arm_patterns.reserve (other.match_arm_patterns.size ()); - for (const auto &e : other.match_arm_patterns) - match_arm_patterns.push_back (e->clone_pattern ()); - + match_arm_pattern = other.get_pattern ()->clone_pattern (); return *this; } @@ -4367,14 +4357,11 @@ class WhileLetLoopExpr : public BaseLoopExpr } // TODO: this mutable getter seems really dodgy. Think up better way. - const std::vector> &get_patterns () const - { - return match_arm_patterns; - } - std::vector> &get_patterns () + const std::unique_ptr &get_pattern () const { - return match_arm_patterns; + return match_arm_pattern; } + std::unique_ptr &get_pattern () { return match_arm_pattern; } BaseLoopExpr::Kind get_loop_kind () const override { @@ -4666,7 +4653,7 @@ class IfExprConseqElse : public IfExpr class IfLetExpr : public ExprWithBlock { std::vector outer_attrs; - std::vector> match_arm_patterns; // inlined + std::unique_ptr match_arm_pattern; // inlined std::unique_ptr value; std::unique_ptr if_block; location_t locus; @@ -4674,11 +4661,11 @@ class IfLetExpr : public ExprWithBlock public: std::string as_string () const override; - IfLetExpr (std::vector> match_arm_patterns, + IfLetExpr (std::unique_ptr match_arm_pattern, std::unique_ptr value, std::unique_ptr if_block, std::vector outer_attrs, location_t locus) : outer_attrs (std::move (outer_attrs)), - match_arm_patterns (std::move (match_arm_patterns)), + match_arm_pattern (std::move (match_arm_pattern)), value (std::move (value)), if_block (std::move (if_block)), locus (locus) {} @@ -4692,10 +4679,7 @@ class IfLetExpr : public ExprWithBlock value = other.value->clone_expr (); if (other.if_block != nullptr) if_block = other.if_block->clone_block_expr (); - - match_arm_patterns.reserve (other.match_arm_patterns.size ()); - for (const auto &e : other.match_arm_patterns) - match_arm_patterns.push_back (e->clone_pattern ()); + match_arm_pattern = other.match_arm_pattern->clone_pattern (); } // overload assignment operator to clone @@ -4715,10 +4699,10 @@ class IfLetExpr : public ExprWithBlock else if_block = nullptr; - match_arm_patterns.reserve (other.match_arm_patterns.size ()); - for (const auto &e : other.match_arm_patterns) - match_arm_patterns.push_back (e->clone_pattern ()); + if (other.if_block != nullptr) + if_block = other.if_block->clone_block_expr (); + match_arm_pattern = other.match_arm_pattern->clone_pattern (); return *this; } @@ -4768,14 +4752,11 @@ class IfLetExpr : public ExprWithBlock } // TODO: this mutable getter seems really dodgy. Think up better way. - const std::vector> &get_patterns () const + const std::unique_ptr &get_pattern () const { - return match_arm_patterns; - } - std::vector> &get_patterns () - { - return match_arm_patterns; + return match_arm_pattern; } + std::unique_ptr &get_pattern () { return match_arm_pattern; } void set_outer_attrs (std::vector new_attrs) override { @@ -4812,12 +4793,12 @@ class IfLetExprConseqElse : public IfLetExpr public: std::string as_string () const override; - IfLetExprConseqElse (std::vector> match_arm_patterns, + IfLetExprConseqElse (std::unique_ptr match_arm_pattern, std::unique_ptr value, std::unique_ptr if_block, std::unique_ptr else_block, std::vector outer_attrs, location_t locus) - : IfLetExpr (std::move (match_arm_patterns), std::move (value), + : IfLetExpr (std::move (match_arm_pattern), std::move (value), std::move (if_block), std::move (outer_attrs), locus), else_block (std::move (else_block)) {} @@ -4869,7 +4850,7 @@ struct MatchArm private: std::vector outer_attrs; // MatchArmPatterns patterns; - std::vector> match_arm_patterns; // inlined + std::unique_ptr match_arm_pattern; // inlined // bool has_match_arm_guard; // inlined from MatchArmGuard @@ -4882,11 +4863,11 @@ struct MatchArm bool has_match_arm_guard () const { return guard_expr != nullptr; } // Constructor for match arm with a guard expression - MatchArm (std::vector> match_arm_patterns, - location_t locus, std::unique_ptr guard_expr = nullptr, + MatchArm (std::unique_ptr match_arm_pattern, location_t locus, + std::unique_ptr guard_expr = nullptr, std::vector outer_attrs = std::vector ()) : outer_attrs (std::move (outer_attrs)), - match_arm_patterns (std::move (match_arm_patterns)), + match_arm_pattern (std::move (match_arm_pattern)), guard_expr (std::move (guard_expr)), locus (locus) {} @@ -4897,9 +4878,7 @@ struct MatchArm if (other.guard_expr != nullptr) guard_expr = other.guard_expr->clone_expr (); - match_arm_patterns.reserve (other.match_arm_patterns.size ()); - for (const auto &e : other.match_arm_patterns) - match_arm_patterns.push_back (e->clone_pattern ()); + match_arm_pattern = other.match_arm_pattern->clone_pattern (); locus = other.locus; } @@ -4916,9 +4895,7 @@ struct MatchArm else guard_expr = nullptr; - match_arm_patterns.reserve (other.match_arm_patterns.size ()); - for (const auto &e : other.match_arm_patterns) - match_arm_patterns.push_back (e->clone_pattern ()); + match_arm_pattern = other.match_arm_pattern->clone_pattern (); return *this; } @@ -4928,13 +4905,13 @@ struct MatchArm MatchArm &operator= (MatchArm &&other) = default; // Returns whether match arm is in an error state. - bool is_error () const { return match_arm_patterns.empty (); } + bool is_error () const { return match_arm_pattern == nullptr; } // Creates a match arm in an error state. static MatchArm create_error () { location_t locus = UNDEF_LOCATION; - return MatchArm (std::vector> (), locus); + return MatchArm (nullptr, locus); } std::string as_string () const; @@ -4956,14 +4933,11 @@ struct MatchArm const std::vector &get_outer_attrs () const { return outer_attrs; } std::vector &get_outer_attrs () { return outer_attrs; } - const std::vector> &get_patterns () const - { - return match_arm_patterns; - } - std::vector> &get_patterns () + const std::unique_ptr &get_pattern () const { - return match_arm_patterns; + return match_arm_pattern; } + std::unique_ptr &get_pattern () { return match_arm_pattern; } location_t get_locus () const { return locus; } }; diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc index 9a9c3159048..c875c54e9d8 100644 --- a/gcc/rust/backend/rust-compile-expr.cc +++ b/gcc/rust/backend/rust-compile-expr.cc @@ -1182,60 +1182,58 @@ CompileExpr::visit (HIR::MatchExpr &expr) { // for now lets just get single pattern's working HIR::MatchArm &kase_arm = kase.get_arm (); - rust_assert (kase_arm.get_patterns ().size () > 0); + rust_assert (kase_arm.get_pattern () != nullptr); - for (auto &kase_pattern : kase_arm.get_patterns ()) - { - // setup the match-arm-body-block - location_t start_location = UNKNOWN_LOCATION; // FIXME - location_t end_location = UNKNOWN_LOCATION; // FIXME - tree arm_body_block = Backend::block (fndecl, enclosing_scope, {}, - start_location, end_location); + auto &kase_pattern = kase_arm.get_pattern (); + // setup the match-arm-body-block + location_t start_location = UNKNOWN_LOCATION; // FIXME + location_t end_location = UNKNOWN_LOCATION; // FIXME + tree arm_body_block = Backend::block (fndecl, enclosing_scope, {}, + start_location, end_location); - ctx->push_block (arm_body_block); + ctx->push_block (arm_body_block); - // setup the bindings for the block - CompilePatternBindings::Compile (*kase_pattern, match_scrutinee_expr, - ctx); + // setup the bindings for the block + CompilePatternBindings::Compile (*kase_pattern, match_scrutinee_expr, + ctx); - // compile the expr and setup the assignment if required when tmp != - // NULL - location_t arm_locus = kase_arm.get_locus (); - tree kase_expr_tree = CompileExpr::Compile (kase.get_expr (), ctx); - tree result_reference = Backend::var_expression (tmp, arm_locus); + // compile the expr and setup the assignment if required when tmp != + // NULL + location_t arm_locus = kase_arm.get_locus (); + tree kase_expr_tree = CompileExpr::Compile (kase.get_expr (), ctx); + tree result_reference = Backend::var_expression (tmp, arm_locus); - TyTy::BaseType *actual = nullptr; - bool ok = ctx->get_tyctx ()->lookup_type ( - kase.get_expr ().get_mappings ().get_hirid (), &actual); - rust_assert (ok); + TyTy::BaseType *actual = nullptr; + bool ok = ctx->get_tyctx ()->lookup_type ( + kase.get_expr ().get_mappings ().get_hirid (), &actual); + rust_assert (ok); - tree coerced_result - = coercion_site (kase.get_expr ().get_mappings ().get_hirid (), - kase_expr_tree, actual, expr_tyty, - expr.get_locus (), arm_locus); + tree coerced_result + = coercion_site (kase.get_expr ().get_mappings ().get_hirid (), + kase_expr_tree, actual, expr_tyty, expr.get_locus (), + arm_locus); - tree assignment - = Backend::assignment_statement (result_reference, coerced_result, - arm_locus); - ctx->add_statement (assignment); + tree assignment + = Backend::assignment_statement (result_reference, coerced_result, + arm_locus); + ctx->add_statement (assignment); - // go to end label - tree goto_end_label - = build1_loc (arm_locus, GOTO_EXPR, void_type_node, end_label); - ctx->add_statement (goto_end_label); + // go to end label + tree goto_end_label + = build1_loc (arm_locus, GOTO_EXPR, void_type_node, end_label); + ctx->add_statement (goto_end_label); - ctx->pop_block (); + ctx->pop_block (); - tree check_expr - = CompilePatternCheckExpr::Compile (*kase_pattern, - match_scrutinee_expr, ctx); + tree check_expr + = CompilePatternCheckExpr::Compile (*kase_pattern, match_scrutinee_expr, + ctx); - tree check_stmt - = Backend::if_statement (NULL_TREE, check_expr, arm_body_block, - NULL_TREE, kase_pattern->get_locus ()); + tree check_stmt + = Backend::if_statement (NULL_TREE, check_expr, arm_body_block, + NULL_TREE, kase_pattern->get_locus ()); - ctx->add_statement (check_stmt); - } + ctx->add_statement (check_stmt); } // setup the switch expression diff --git a/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc b/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc index f132e04ef7b..24150a47883 100644 --- a/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc +++ b/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc @@ -1463,10 +1463,10 @@ static MatchArm lower_arm (Resolver::TypeCheckContext *ctx, HIR::MatchCase &arm, TyTy::BaseType *scrutinee_ty) { - rust_assert (arm.get_arm ().get_patterns ().size () > 0); + rust_assert (arm.get_arm ().get_pattern () != nullptr); DeconstructedPat pat - = lower_pattern (ctx, *arm.get_arm ().get_patterns ().at (0), scrutinee_ty); + = lower_pattern (ctx, *arm.get_arm ().get_pattern (), scrutinee_ty); return MatchArm (pat, arm.get_arm ().has_match_arm_guard ()); } diff --git a/gcc/rust/expand/rust-cfg-strip.cc b/gcc/rust/expand/rust-cfg-strip.cc index 3c5e74e7aae..977cbd67e73 100644 --- a/gcc/rust/expand/rust-cfg-strip.cc +++ b/gcc/rust/expand/rust-cfg-strip.cc @@ -1434,10 +1434,9 @@ CfgStrip::visit (AST::WhileLetLoopExpr &expr) AST::DefaultASTVisitor::visit (expr); - for (auto &pattern : expr.get_patterns ()) - if (pattern->is_marked_for_strip ()) - rust_error_at (pattern->get_locus (), - "cannot strip pattern in this position"); + if (expr.get_pattern ()->is_marked_for_strip ()) + rust_error_at (expr.get_pattern ()->get_locus (), + "cannot strip pattern in this position"); // can't strip scrutinee expr itself, but can strip sub-expressions auto &scrutinee_expr = expr.get_scrutinee_expr (); @@ -1564,10 +1563,9 @@ CfgStrip::visit (AST::IfLetExpr &expr) AST::DefaultASTVisitor::visit (expr); - for (auto &pattern : expr.get_patterns ()) - if (pattern->is_marked_for_strip ()) - rust_error_at (pattern->get_locus (), - "cannot strip pattern in this position"); + if (expr.get_pattern ()->is_marked_for_strip ()) + rust_error_at (expr.get_pattern ()->get_locus (), + "cannot strip pattern in this position"); // can't strip value expr itself, but can strip sub-expressions auto &value_expr = expr.get_value_expr (); @@ -1596,10 +1594,9 @@ CfgStrip::visit (AST::IfLetExprConseqElse &expr) AST::DefaultASTVisitor::visit (expr); - for (auto &pattern : expr.get_patterns ()) - if (pattern->is_marked_for_strip ()) - rust_error_at (pattern->get_locus (), - "cannot strip pattern in this position"); + if (expr.get_pattern ()->is_marked_for_strip ()) + rust_error_at (expr.get_pattern ()->get_locus (), + "cannot strip pattern in this position"); // can't strip value expr itself, but can strip sub-expressions auto &value_expr = expr.get_value_expr (); @@ -1666,10 +1663,9 @@ CfgStrip::visit (AST::MatchExpr &expr) continue; } - for (auto &pattern : match_arm.get_patterns ()) - if (pattern->is_marked_for_strip ()) - rust_error_at (pattern->get_locus (), - "cannot strip pattern in this position"); + if (match_arm.get_pattern ()->is_marked_for_strip ()) + rust_error_at (match_arm.get_pattern ()->get_locus (), + "cannot strip pattern in this position"); /* assuming that guard expression cannot be stripped as * strictly speaking you would have to strip the whole guard to diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc index 5b8e7c51437..d2e434f2307 100644 --- a/gcc/rust/hir/rust-ast-lower.cc +++ b/gcc/rust/hir/rust-ast-lower.cc @@ -230,8 +230,7 @@ ASTLoweringIfLetBlock::desugar_iflet (AST::IfLetExpr &expr, std::vector &match_arms) { HIR::Expr *kase_expr; - std::vector> match_arm_patterns; - match_arm_patterns.reserve (expr.get_patterns ().size ()); + std::unique_ptr match_arm_pattern; *branch_value = ASTLoweringExpr::translate (expr.get_value_expr ()); kase_expr = ASTLoweringExpr::translate (expr.get_if_block ()); @@ -239,13 +238,13 @@ ASTLoweringIfLetBlock::desugar_iflet (AST::IfLetExpr &expr, // (stable) if let only accepts a single pattern, but (unstable) if let chains // need more than one pattern. // We don't support if let chains, so only support a single pattern. - rust_assert (expr.get_patterns ().size () == 1); + rust_assert (expr.get_pattern () != nullptr); - for (auto &pattern : expr.get_patterns ()) - match_arm_patterns.emplace_back (ASTLoweringPattern::translate (*pattern)); + match_arm_pattern + = ASTLoweringPattern::translate (*expr.get_pattern ())->clone_pattern (); // The match arm corresponding to the if let pattern when it matches. - HIR::MatchArm arm (std::move (match_arm_patterns), expr.get_locus (), nullptr, + HIR::MatchArm arm (std::move (match_arm_pattern), expr.get_locus (), nullptr, {}); auto crate_num = mappings.get_current_crate (); @@ -257,15 +256,14 @@ ASTLoweringIfLetBlock::desugar_iflet (AST::IfLetExpr &expr, std::unique_ptr (kase_expr)); // The default match arm when the if let pattern does not match - std::vector> match_arm_patterns_wildcard; Analysis::NodeMapping mapping_default (crate_num, expr.get_node_id (), mappings.get_next_hir_id (crate_num), UNKNOWN_LOCAL_DEFID); - match_arm_patterns_wildcard.emplace_back ( + auto match_arm_pattern_wildcard = std::unique_ptr ( new HIR::WildcardPattern (mapping_default, expr.get_locus ())); - HIR::MatchArm arm_default (std::move (match_arm_patterns_wildcard), + HIR::MatchArm arm_default (std::move (match_arm_pattern_wildcard), expr.get_locus (), nullptr, {}); match_arms.emplace_back (std::move (mapping_default), std::move (arm_default), @@ -433,15 +431,13 @@ ASTLoweringExprWithBlock::visit (AST::MatchExpr &expr) match_case.get_arm ().get_guard_expr ()); } - std::vector> match_arm_patterns; - match_arm_patterns.reserve ( - match_case.get_arm ().get_patterns ().size ()); + std::unique_ptr match_arm_pattern; - for (auto &pattern : match_case.get_arm ().get_patterns ()) - match_arm_patterns.emplace_back ( - ASTLoweringPattern::translate (*pattern)); + match_arm_pattern + = ASTLoweringPattern::translate (*match_case.get_arm ().get_pattern ()) + ->clone_pattern (); - HIR::MatchArm arm (std::move (match_arm_patterns), expr.get_locus (), + HIR::MatchArm arm (std::move (match_arm_pattern), expr.get_locus (), std::unique_ptr (kase_guard_expr), match_case.get_arm ().get_outer_attrs ()); diff --git a/gcc/rust/hir/rust-hir-dump.cc b/gcc/rust/hir/rust-hir-dump.cc index 49ce1437899..4c237236583 100644 --- a/gcc/rust/hir/rust-hir-dump.cc +++ b/gcc/rust/hir/rust-hir-dump.cc @@ -366,7 +366,7 @@ Dump::do_matcharm (MatchArm &e) begin ("MatchArm"); // FIXME Can't remember how to handle that. Let's see later. // do_outer_attrs(e); - visit_collection ("match_arm_patterns", e.get_patterns ()); + visit_field ("match_arm_pattern", e.get_pattern ()); if (e.has_match_arm_guard ()) visit_field ("guard_expr", e.get_guard_expr ()); end ("MatchArm"); @@ -1461,7 +1461,7 @@ Dump::visit (WhileLetLoopExpr &e) begin ("WhileLetLoopExpr"); do_baseloopexpr (e); - visit_collection ("match_arm_patterns", e.get_patterns ()); + visit_field ("match_arm_patterns", e.get_pattern ()); visit_field ("condition", e.get_cond ()); diff --git a/gcc/rust/hir/tree/rust-hir-expr.cc b/gcc/rust/hir/tree/rust-hir-expr.cc index 14786adf6f3..04f685bcc5c 100644 --- a/gcc/rust/hir/tree/rust-hir-expr.cc +++ b/gcc/rust/hir/tree/rust-hir-expr.cc @@ -76,7 +76,6 @@ OperatorExpr::operator= (OperatorExpr const &other) ExprWithoutBlock::operator= (other); main_or_left_expr = other.main_or_left_expr->clone_expr (); locus = other.locus; - // outer_attrs = other.outer_attrs; return *this; } @@ -130,7 +129,6 @@ ArithmeticOrLogicalExpr & ArithmeticOrLogicalExpr::operator= (ArithmeticOrLogicalExpr const &other) { OperatorExpr::operator= (other); - // main_or_left_expr = other.main_or_left_expr->clone_expr(); right_expr = other.right_expr->clone_expr (); expr_type = other.expr_type; @@ -155,10 +153,8 @@ ComparisonExpr & ComparisonExpr::operator= (ComparisonExpr const &other) { OperatorExpr::operator= (other); - // main_or_left_expr = other.main_or_left_expr->clone_expr(); right_expr = other.right_expr->clone_expr (); expr_type = other.expr_type; - // outer_attrs = other.outer_attrs; return *this; } @@ -181,7 +177,6 @@ LazyBooleanExpr & LazyBooleanExpr::operator= (LazyBooleanExpr const &other) { OperatorExpr::operator= (other); - // main_or_left_expr = other.main_or_left_expr->clone_expr(); right_expr = other.right_expr->clone_expr (); expr_type = other.expr_type; @@ -206,7 +201,6 @@ TypeCastExpr & TypeCastExpr::operator= (TypeCastExpr const &other) { OperatorExpr::operator= (other); - // main_or_left_expr = other.main_or_left_expr->clone_expr(); type_to_convert_to = other.type_to_convert_to->clone_type (); return *this; @@ -229,9 +223,7 @@ AssignmentExpr & AssignmentExpr::operator= (AssignmentExpr const &other) { OperatorExpr::operator= (other); - // main_or_left_expr = other.main_or_left_expr->clone_expr(); right_expr = other.right_expr->clone_expr (); - // outer_attrs = other.outer_attrs; return *this; } @@ -254,10 +246,8 @@ CompoundAssignmentExpr & CompoundAssignmentExpr::operator= (CompoundAssignmentExpr const &other) { OperatorExpr::operator= (other); - // main_or_left_expr = other.main_or_left_expr->clone_expr(); right_expr = other.right_expr->clone_expr (); expr_type = other.expr_type; - // outer_attrs = other.outer_attrs; return *this; } @@ -283,7 +273,6 @@ GroupedExpr::operator= (GroupedExpr const &other) inner_attrs = other.inner_attrs; expr_in_parens = other.expr_in_parens->clone_expr (); locus = other.locus; - // outer_attrs = other.outer_attrs; return *this; } @@ -357,7 +346,6 @@ ArrayExpr::operator= (ArrayExpr const &other) if (other.has_array_elems ()) internal_elements = other.internal_elements->clone_array_elems (); locus = other.locus; - // outer_attrs = other.outer_attrs; return *this; } @@ -382,7 +370,6 @@ ArrayIndexExpr::operator= (ArrayIndexExpr const &other) ExprWithoutBlock::operator= (other); array_expr = other.array_expr->clone_expr (); index_expr = other.index_expr->clone_expr (); - // outer_attrs = other.outer_attrs; locus = other.locus; return *this; @@ -607,8 +594,6 @@ CallExpr::operator= (CallExpr const &other) ExprWithoutBlock::operator= (other); function = other.function->clone_expr (); locus = other.locus; - // params = other.params; - // outer_attrs = other.outer_attrs; params.reserve (other.params.size ()); for (const auto &e : other.params) @@ -642,8 +627,6 @@ MethodCallExpr::operator= (MethodCallExpr const &other) receiver = other.receiver->clone_expr (); method_name = other.method_name; locus = other.locus; - // params = other.params; - // outer_attrs = other.outer_attrs; params.reserve (other.params.size ()); for (const auto &e : other.params) @@ -673,7 +656,6 @@ FieldAccessExpr::operator= (FieldAccessExpr const &other) receiver = other.receiver->clone_expr (); field = other.field; locus = other.locus; - // outer_attrs = other.outer_attrs; return *this; } @@ -778,14 +760,12 @@ BlockExpr & BlockExpr::operator= (BlockExpr const &other) { ExprWithBlock::operator= (other); - // statements = other.statements; expr = other.expr->clone_expr (); inner_attrs = other.inner_attrs; start_locus = other.end_locus; end_locus = other.end_locus; - // outer_attrs = other.outer_attrs; - statements.reserve (other.statements.size ()); + for (const auto &e : other.statements) statements.push_back (e->clone_stmt ()); @@ -878,7 +858,6 @@ BreakExpr::operator= (BreakExpr const &other) label = other.label; break_expr = other.break_expr->clone_expr (); locus = other.locus; - // outer_attrs = other.outer_attrs; return *this; } @@ -1014,7 +993,6 @@ ReturnExpr::operator= (ReturnExpr const &other) ExprWithoutBlock::operator= (other); return_expr = other.return_expr->clone_expr (); locus = other.locus; - // outer_attrs = other.outer_attrs; return *this; } @@ -1037,7 +1015,6 @@ UnsafeBlockExpr::operator= (UnsafeBlockExpr const &other) ExprWithBlock::operator= (other); expr = other.expr->clone_block_expr (); locus = other.locus; - // outer_attrs = other.outer_attrs; return *this; } @@ -1064,7 +1041,6 @@ BaseLoopExpr::operator= (BaseLoopExpr const &other) loop_block = other.loop_block->clone_block_expr (); loop_label = other.loop_label; locus = other.locus; - // outer_attrs = other.outer_attrs; return *this; } @@ -1097,48 +1073,34 @@ WhileLoopExpr::operator= (WhileLoopExpr const &other) { BaseLoopExpr::operator= (other); condition = other.condition->clone_expr (); - // loop_block = other.loop_block->clone_block_expr(); - // loop_label = other.loop_label; - // outer_attrs = other.outer_attrs; - return *this; } -WhileLetLoopExpr::WhileLetLoopExpr ( - Analysis::NodeMapping mappings, - std::vector> match_arm_patterns, - std::unique_ptr condition, std::unique_ptr loop_block, - location_t locus, tl::optional loop_label, - AST::AttrVec outer_attribs) +WhileLetLoopExpr::WhileLetLoopExpr (Analysis::NodeMapping mappings, + std::unique_ptr match_arm_pattern, + std::unique_ptr condition, + std::unique_ptr loop_block, + location_t locus, + tl::optional loop_label, + AST::AttrVec outer_attribs) : BaseLoopExpr (std::move (mappings), std::move (loop_block), locus, std::move (loop_label), std::move (outer_attribs)), - match_arm_patterns (std::move (match_arm_patterns)), + match_arm_pattern (std::move (match_arm_pattern)), condition (std::move (condition)) {} WhileLetLoopExpr::WhileLetLoopExpr (WhileLetLoopExpr const &other) : BaseLoopExpr (other), - /*match_arm_patterns(other.match_arm_patterns),*/ condition ( - other.condition->clone_expr ()) -{ - match_arm_patterns.reserve (other.match_arm_patterns.size ()); - for (const auto &e : other.match_arm_patterns) - match_arm_patterns.push_back (e->clone_pattern ()); -} + match_arm_pattern (other.match_arm_pattern->clone_pattern ()), + condition (other.condition->clone_expr ()) +{} WhileLetLoopExpr & WhileLetLoopExpr::operator= (WhileLetLoopExpr const &other) { BaseLoopExpr::operator= (other); - // match_arm_patterns = other.match_arm_patterns; condition = other.condition->clone_expr (); - // loop_block = other.loop_block->clone_block_expr(); - // loop_label = other.loop_label; - // outer_attrs = other.outer_attrs; - - match_arm_patterns.reserve (other.match_arm_patterns.size ()); - for (const auto &e : other.match_arm_patterns) - match_arm_patterns.push_back (e->clone_pattern ()); + match_arm_pattern = other.match_arm_pattern->clone_pattern (); return *this; } @@ -1191,11 +1153,11 @@ IfExprConseqElse::operator= (IfExprConseqElse const &other) return *this; } -MatchArm::MatchArm (std::vector> match_arm_patterns, +MatchArm::MatchArm (std::unique_ptr match_arm_pattern, location_t locus, std::unique_ptr guard_expr, AST::AttrVec outer_attrs) : outer_attrs (std::move (outer_attrs)), - match_arm_patterns (std::move (match_arm_patterns)), + match_arm_pattern (std::move (match_arm_pattern)), guard_expr (std::move (guard_expr)), locus (locus) {} @@ -1205,9 +1167,7 @@ MatchArm::MatchArm (MatchArm const &other) : outer_attrs (other.outer_attrs) if (other.guard_expr != nullptr) guard_expr = other.guard_expr->clone_expr (); - match_arm_patterns.reserve (other.match_arm_patterns.size ()); - for (const auto &e : other.match_arm_patterns) - match_arm_patterns.push_back (e->clone_pattern ()); + match_arm_pattern = other.match_arm_pattern->clone_pattern (); locus = other.locus; } @@ -1220,10 +1180,7 @@ MatchArm::operator= (MatchArm const &other) if (other.guard_expr != nullptr) guard_expr = other.guard_expr->clone_expr (); - match_arm_patterns.clear (); - match_arm_patterns.reserve (other.match_arm_patterns.size ()); - for (const auto &e : other.match_arm_patterns) - match_arm_patterns.push_back (e->clone_pattern ()); + match_arm_pattern = other.match_arm_pattern->clone_pattern (); return *this; } @@ -1275,7 +1232,6 @@ MatchExpr::operator= (MatchExpr const &other) branch_value = other.branch_value->clone_expr (); inner_attrs = other.inner_attrs; match_arms = other.match_arms; - // outer_attrs = other.outer_attrs; locus = other.locus; /*match_arms.reserve (other.match_arms.size ()); diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h index 61e35905ea0..1c5511978b6 100644 --- a/gcc/rust/hir/tree/rust-hir-expr.h +++ b/gcc/rust/hir/tree/rust-hir-expr.h @@ -2502,7 +2502,7 @@ class WhileLoopExpr : public BaseLoopExpr class WhileLetLoopExpr : public BaseLoopExpr { // MatchArmPatterns patterns; - std::vector> match_arm_patterns; // inlined + std::unique_ptr match_arm_pattern; // inlined std::unique_ptr condition; public: @@ -2510,7 +2510,7 @@ class WhileLetLoopExpr : public BaseLoopExpr // Constructor with a loop label WhileLetLoopExpr (Analysis::NodeMapping mappings, - std::vector> match_arm_patterns, + std::unique_ptr match_arm_pattern, std::unique_ptr condition, std::unique_ptr loop_block, location_t locus, tl::optional loop_label, @@ -2530,10 +2530,7 @@ class WhileLetLoopExpr : public BaseLoopExpr void accept_vis (HIRExpressionVisitor &vis) override; Expr &get_cond () { return *condition; } - std::vector> &get_patterns () - { - return match_arm_patterns; - } + std::unique_ptr &get_pattern () { return match_arm_pattern; } protected: /* Use covariance to implement clone function as returning this object rather @@ -2675,7 +2672,7 @@ struct MatchArm { private: AST::AttrVec outer_attrs; - std::vector> match_arm_patterns; + std::unique_ptr match_arm_pattern; std::unique_ptr guard_expr; location_t locus; @@ -2684,8 +2681,8 @@ struct MatchArm bool has_match_arm_guard () const { return guard_expr != nullptr; } // Constructor for match arm with a guard expression - MatchArm (std::vector> match_arm_patterns, - location_t locus, std::unique_ptr guard_expr = nullptr, + MatchArm (std::unique_ptr match_arm_pattern, location_t locus, + std::unique_ptr guard_expr = nullptr, AST::AttrVec outer_attrs = AST::AttrVec ()); // Copy constructor with clone @@ -2701,21 +2698,18 @@ struct MatchArm MatchArm &operator= (MatchArm &&other) = default; // Returns whether match arm is in an error state. - bool is_error () const { return match_arm_patterns.empty (); } + bool is_error () const { return match_arm_pattern == nullptr; } // Creates a match arm in an error state. static MatchArm create_error () { location_t locus = UNDEF_LOCATION; - return MatchArm (std::vector> (), locus); + return MatchArm (nullptr, locus); } std::string as_string () const; - std::vector> &get_patterns () - { - return match_arm_patterns; - } + std::unique_ptr &get_pattern () { return match_arm_pattern; } Expr &get_guard_expr () { return *guard_expr; } diff --git a/gcc/rust/hir/tree/rust-hir-visitor.cc b/gcc/rust/hir/tree/rust-hir-visitor.cc index 1e201a5541e..015cda77240 100644 --- a/gcc/rust/hir/tree/rust-hir-visitor.cc +++ b/gcc/rust/hir/tree/rust-hir-visitor.cc @@ -479,8 +479,7 @@ void DefaultHIRVisitor::walk (WhileLetLoopExpr &expr) { visit_outer_attrs (expr); - for (auto &pattern : expr.get_patterns ()) - pattern->accept_vis (*this); + expr.get_pattern ()->accept_vis (*this); if (expr.has_loop_label ()) visit_loop_label (expr.get_loop_label ()); expr.get_cond ().accept_vis (*this); @@ -506,8 +505,7 @@ void DefaultHIRVisitor::visit_match_arm (MatchArm &arm) { // visit_outer_attrs (arm); - for (auto &pattern : arm.get_patterns ()) - pattern->accept_vis (*this); + arm.get_pattern ()->accept_vis (*this); if (arm.has_match_arm_guard ()) arm.get_guard_expr ().accept_vis (*this); } diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc index 57f560b06d3..2d88f4b97cf 100644 --- a/gcc/rust/hir/tree/rust-hir.cc +++ b/gcc/rust/hir/tree/rust-hir.cc @@ -1762,16 +1762,13 @@ WhileLetLoopExpr::as_string () const } str += "\n Match arm patterns: "; - if (match_arm_patterns.empty ()) + if (match_arm_pattern == nullptr) { str += "none"; } else { - for (const auto &pattern : match_arm_patterns) - { - str += "\n " + pattern->as_string (); - } + str += "\n " + match_arm_pattern->as_string (); } str += "\n Scrutinee expr: " + condition->as_string (); @@ -1885,17 +1882,10 @@ MatchArm::as_string () const } str += "\nPatterns: "; - if (match_arm_patterns.empty ()) - { - str += "none"; - } + if (match_arm_pattern == nullptr) + str += "none"; else - { - for (const auto &pattern : match_arm_patterns) - { - str += "\n " + pattern->as_string (); - } - } + str += "\n " + match_arm_pattern->as_string (); str += "\nGuard expr: "; if (!has_match_arm_guard ()) diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 64554f5e9e4..765e6ad2f5d 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -7930,9 +7930,9 @@ Parser::parse_if_let_expr (AST::AttrVec outer_attrs, lexer.skip_token (); // parse match arm patterns (which are required) - std::vector> match_arm_patterns - = parse_match_arm_patterns (EQUAL); - if (match_arm_patterns.empty ()) + std::unique_ptr match_arm_pattern + = parse_match_arm_pattern (EQUAL); + if (match_arm_pattern == nullptr) { Error error ( lexer.peek_token ()->get_locus (), @@ -7983,7 +7983,7 @@ Parser::parse_if_let_expr (AST::AttrVec outer_attrs, { // single selection - end of if let expression return std::unique_ptr ( - new AST::IfLetExpr (std::move (match_arm_patterns), + new AST::IfLetExpr (std::move (match_arm_pattern), std::move (scrutinee_expr), std::move (if_let_body), std::move (outer_attrs), locus)); } @@ -8015,7 +8015,7 @@ Parser::parse_if_let_expr (AST::AttrVec outer_attrs, } return std::unique_ptr ( - new AST::IfLetExprConseqElse (std::move (match_arm_patterns), + new AST::IfLetExprConseqElse (std::move (match_arm_pattern), std::move (scrutinee_expr), std::move (if_let_body), std::move (else_body), @@ -8043,7 +8043,7 @@ Parser::parse_if_let_expr (AST::AttrVec outer_attrs, return std::unique_ptr ( new AST::IfLetExprConseqElse ( - std::move (match_arm_patterns), std::move (scrutinee_expr), + std::move (match_arm_pattern), std::move (scrutinee_expr), std::move (if_let_body), std::move (if_let_expr), std::move (outer_attrs), locus)); } @@ -8064,7 +8064,7 @@ Parser::parse_if_let_expr (AST::AttrVec outer_attrs, return std::unique_ptr ( new AST::IfLetExprConseqElse ( - std::move (match_arm_patterns), std::move (scrutinee_expr), + std::move (match_arm_pattern), std::move (scrutinee_expr), std::move (if_let_body), std::move (if_expr), std::move (outer_attrs), locus)); } @@ -8232,10 +8232,10 @@ Parser::parse_while_let_loop_expr ( lexer.skip_token (); // parse predicate patterns - std::vector> predicate_patterns - = parse_match_arm_patterns (EQUAL); + std::unique_ptr predicate_pattern + = parse_match_arm_pattern (EQUAL); // ensure that there is at least 1 pattern - if (predicate_patterns.empty ()) + if (predicate_pattern == nullptr) { Error error (lexer.peek_token ()->get_locus (), "should be at least 1 pattern"); @@ -8279,8 +8279,8 @@ Parser::parse_while_let_loop_expr ( } return std::unique_ptr (new AST::WhileLetLoopExpr ( - std::move (predicate_patterns), std::move (predicate_expr), - std::move (body), locus, std::move (label), std::move (outer_attrs))); + std::move (predicate_pattern), std::move (predicate_expr), std::move (body), + locus, std::move (label), std::move (outer_attrs))); } /* Parses a "for" iterative loop. Label is not parsed and should be parsed via @@ -8566,9 +8566,9 @@ Parser::parse_match_arm () } // parse match arm patterns - at least 1 is required - std::vector> match_arm_patterns - = parse_match_arm_patterns (RIGHT_CURLY); - if (match_arm_patterns.empty ()) + std::unique_ptr match_arm_pattern + = parse_match_arm_pattern (RIGHT_CURLY); + if (match_arm_pattern == nullptr) { Error error (lexer.peek_token ()->get_locus (), "failed to parse any patterns in match arm"); @@ -8602,7 +8602,7 @@ Parser::parse_match_arm () // DEBUG rust_debug ("successfully parsed match arm"); - return AST::MatchArm (std::move (match_arm_patterns), + return AST::MatchArm (std::move (match_arm_pattern), lexer.peek_token ()->get_locus (), std::move (guard_expr), std::move (outer_attrs)); } @@ -8611,66 +8611,17 @@ Parser::parse_match_arm () * token that would exist after the patterns are done (e.g. '}' for match * expr, '=' for if let and while let). */ template -std::vector> -Parser::parse_match_arm_patterns (TokenId end_token_id) +std::unique_ptr +Parser::parse_match_arm_pattern (TokenId end_token_id) { - // skip optional leading '|' - if (lexer.peek_token ()->get_id () == PIPE) - lexer.skip_token (); - /* TODO: do I even need to store the result of this? can't be used. - * If semantically different, I need a wrapped "match arm patterns" object - * for this. */ - - std::vector> patterns; + /* skip optional starting pipe */ + maybe_skip_token (PIPE); // quick break out if end_token_id if (lexer.peek_token ()->get_id () == end_token_id) - return patterns; - - // parse required pattern - if doesn't exist, return empty - std::unique_ptr initial_pattern = parse_pattern (); - if (initial_pattern == nullptr) - { - // FIXME: should this be an error? - return patterns; - } - patterns.push_back (std::move (initial_pattern)); - - // DEBUG - rust_debug ("successfully parsed initial match arm pattern"); - - // parse new patterns as long as next char is '|' - const_TokenPtr t = lexer.peek_token (); - while (t->get_id () == PIPE) - { - // skip pipe token - lexer.skip_token (); - - // break if hit end token id - if (lexer.peek_token ()->get_id () == end_token_id) - break; - - // parse pattern - std::unique_ptr pattern = parse_pattern (); - if (pattern == nullptr) - { - // this is an error - Error error (lexer.peek_token ()->get_locus (), - "failed to parse pattern in match arm patterns"); - add_error (std::move (error)); - - // skip somewhere? - return {}; - } - - patterns.push_back (std::move (pattern)); - - t = lexer.peek_token (); - } - - patterns.shrink_to_fit (); + return nullptr; - return patterns; + return parse_pattern (); } // Parses an async block expression. diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h index 7b4046365dd..4d156b0d677 100644 --- a/gcc/rust/parse/rust-parse.h +++ b/gcc/rust/parse/rust-parse.h @@ -637,8 +637,7 @@ template class Parser parse_match_expr (AST::AttrVec outer_attrs = AST::AttrVec (), location_t pratt_parsed_loc = UNKNOWN_LOCATION); AST::MatchArm parse_match_arm (); - std::vector> - parse_match_arm_patterns (TokenId end_token_id); + std::unique_ptr parse_match_arm_pattern (TokenId end_token_id); std::unique_ptr parse_labelled_loop_expr (const_TokenPtr tok, AST::AttrVec outer_attrs = AST::AttrVec ()); diff --git a/gcc/rust/resolve/rust-default-resolver.cc b/gcc/rust/resolve/rust-default-resolver.cc index f1c0e5caffe..434f4c9459e 100644 --- a/gcc/rust/resolve/rust-default-resolver.cc +++ b/gcc/rust/resolve/rust-default-resolver.cc @@ -91,8 +91,7 @@ DefaultResolver::visit (AST::ForLoopExpr &expr) void DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr) { - for (auto &pattern : expr.get_patterns ()) - visit (pattern); + visit (expr.get_pattern ()); } void diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc index 96b38f48e4e..48e5b7b22bc 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc @@ -93,8 +93,7 @@ Late::visit (AST::MatchArm &arm) ctx.bindings.enter (BindingSource::Match); - for (auto &pattern : arm.get_patterns ()) - visit (pattern); + visit (arm.get_pattern ()); ctx.bindings.exit (); @@ -153,8 +152,7 @@ Late::visit (AST::WhileLetLoopExpr &while_let) ctx.bindings.enter (BindingSource::WhileLet); - for (auto &pattern : while_let.get_patterns ()) - visit (pattern); + visit (while_let.get_pattern ()); ctx.bindings.exit (); diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc index 1c00fd96d94..199289d376f 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc @@ -1738,27 +1738,25 @@ TypeCheckExpr::visit (HIR::MatchExpr &expr) { // lets check the arms HIR::MatchArm &kase_arm = kase.get_arm (); - for (auto &pattern : kase_arm.get_patterns ()) + auto &pattern = kase_arm.get_pattern (); + TyTy::BaseType *kase_arm_ty + = TypeCheckPattern::Resolve (*pattern, scrutinee_tyty); + if (kase_arm_ty->get_kind () == TyTy ::TypeKind::ERROR) { - TyTy::BaseType *kase_arm_ty - = TypeCheckPattern::Resolve (*pattern, scrutinee_tyty); - if (kase_arm_ty->get_kind () == TyTy ::TypeKind::ERROR) - { - saw_error = true; - continue; - } + saw_error = true; + continue; + } - TyTy::BaseType *checked_kase = unify_site ( - expr.get_mappings ().get_hirid (), - TyTy::TyWithLocation (scrutinee_tyty, - expr.get_scrutinee_expr ().get_locus ()), - TyTy::TyWithLocation (kase_arm_ty, pattern->get_locus ()), - expr.get_locus ()); - if (checked_kase->get_kind () == TyTy::TypeKind::ERROR) - { - saw_error = true; - continue; - } + TyTy::BaseType *checked_kase = unify_site ( + expr.get_mappings ().get_hirid (), + TyTy::TyWithLocation (scrutinee_tyty, + expr.get_scrutinee_expr ().get_locus ()), + TyTy::TyWithLocation (kase_arm_ty, pattern->get_locus ()), + expr.get_locus ()); + if (checked_kase->get_kind () == TyTy::TypeKind::ERROR) + { + saw_error = true; + continue; } // check the kase type