From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id CFA5B385841C; Tue, 14 Mar 2023 11:44:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CFA5B385841C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1678794249; bh=m31vJxSZoOsJtbzUsDk4lfXg9DWEGyVU9Hsfygre5UA=; h=From:To:Subject:Date:From; b=Pau7tk105mD8aoBMUYyiOsGam17s/IdkhqfyzEAOt0J0ot+qgoum3K8k45X7Mj80W 6LkKn1ehTr4jjUXN2OlWvZAZqdZyOrZFecBPuhi7DPjlvKiRl0D9N6Q/X75jJA2cRd RYwDFcXf4YVA5et69QuQ67zqdJDw9H8Ze3bBCvyA= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/rust/master] hir: add a helper function for visit X-Act-Checkin: gcc X-Git-Author: vincent X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: 5bd4b19068c8ab8b8324fd3b8f20c4c3cb5cd277 X-Git-Newrev: 6f9938c712d6d8645714ee21d5850342281022e1 Message-Id: <20230314114409.CFA5B385841C@sourceware.org> Date: Tue, 14 Mar 2023 11:44:09 +0000 (GMT) List-Id: https://gcc.gnu.org/g:6f9938c712d6d8645714ee21d5850342281022e1 commit 6f9938c712d6d8645714ee21d5850342281022e1 Author: vincent Date: Tue Mar 7 20:32:04 2023 +0000 hir: add a helper function for visit This commit adds a helper function for TypeCheckPattern::visit (HIR::RangePattern &pattern) to remove redundancy gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): rewrite part code to helper function (TypeCheckPattern::typecheck_range_pattern_bound): helper function * typecheck/rust-hir-type-check-pattern.h (TypeCheckPattern::typecheck_range_pattern_bound): change the parameter of the function Signed-off-by: Jiakun Fan Diff: --- gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 110 +++++++++------------- gcc/rust/typecheck/rust-hir-type-check-pattern.h | 7 +- 2 files changed, 47 insertions(+), 70 deletions(-) diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc index e7ed54250a0..cd0dbef40fe 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc @@ -321,73 +321,13 @@ TypeCheckPattern::visit (HIR::RangePattern &pattern) // Resolve the upper and lower bounds, and ensure they are compatible types TyTy::BaseType *upper = nullptr, *lower = nullptr; - // TODO: It would be nice to factor this out into a helper since the logic for - // both bounds is exactly the same... - switch (pattern.get_upper_bound ()->get_bound_type ()) - { - case HIR::RangePatternBound::RangePatternBoundType::LITERAL: { - HIR::RangePatternBoundLiteral &ref - = *static_cast ( - pattern.get_upper_bound ().get ()); - - HIR::Literal lit = ref.get_literal (); - - upper = resolve_literal (pattern.get_pattern_mappings (), lit, - pattern.get_locus ()); - } - break; - - case HIR::RangePatternBound::RangePatternBoundType::PATH: { - HIR::RangePatternBoundPath &ref - = *static_cast ( - pattern.get_upper_bound ().get ()); - - upper = TypeCheckExpr::Resolve (&ref.get_path ()); - } - break; - - case HIR::RangePatternBound::RangePatternBoundType::QUALPATH: { - HIR::RangePatternBoundQualPath &ref - = *static_cast ( - pattern.get_upper_bound ().get ()); - - upper = TypeCheckExpr::Resolve (&ref.get_qualified_path ()); - } - break; - } - - switch (pattern.get_lower_bound ()->get_bound_type ()) - { - case HIR::RangePatternBound::RangePatternBoundType::LITERAL: { - HIR::RangePatternBoundLiteral &ref - = *static_cast ( - pattern.get_lower_bound ().get ()); - - HIR::Literal lit = ref.get_literal (); - - lower = resolve_literal (pattern.get_pattern_mappings (), lit, - pattern.get_locus ()); - } - break; - - case HIR::RangePatternBound::RangePatternBoundType::PATH: { - HIR::RangePatternBoundPath &ref - = *static_cast ( - pattern.get_lower_bound ().get ()); - - lower = TypeCheckExpr::Resolve (&ref.get_path ()); - } - break; + upper = typecheck_range_pattern_bound (pattern.get_upper_bound (), + pattern.get_pattern_mappings (), + pattern.get_locus ()); - case HIR::RangePatternBound::RangePatternBoundType::QUALPATH: { - HIR::RangePatternBoundQualPath &ref - = *static_cast ( - pattern.get_lower_bound ().get ()); - - lower = TypeCheckExpr::Resolve (&ref.get_qualified_path ()); - } - break; - } + lower = typecheck_range_pattern_bound (pattern.get_lower_bound (), + pattern.get_pattern_mappings (), + pattern.get_locus ()); infered = unify_site (pattern.get_pattern_mappings ().get_hirid (), TyTy::TyWithLocation (upper), @@ -442,6 +382,44 @@ TypeCheckPattern::emit_pattern_size_error (const HIR::Pattern &pattern, got_field_count == 1 ? "element" : "elements"); } +TyTy::BaseType * +TypeCheckPattern::typecheck_range_pattern_bound ( + std::unique_ptr &bound, + Analysis::NodeMapping mappings, Location locus) +{ + TyTy::BaseType *resolved_bound = nullptr; + switch (bound->get_bound_type ()) + { + case HIR::RangePatternBound::RangePatternBoundType::LITERAL: { + HIR::RangePatternBoundLiteral &ref + = *static_cast (bound.get ()); + + HIR::Literal lit = ref.get_literal (); + + resolved_bound = resolve_literal (mappings, lit, locus); + } + break; + + case HIR::RangePatternBound::RangePatternBoundType::PATH: { + HIR::RangePatternBoundPath &ref + = *static_cast (bound.get ()); + + resolved_bound = TypeCheckExpr::Resolve (&ref.get_path ()); + } + break; + + case HIR::RangePatternBound::RangePatternBoundType::QUALPATH: { + HIR::RangePatternBoundQualPath &ref + = *static_cast (bound.get ()); + + resolved_bound = TypeCheckExpr::Resolve (&ref.get_qualified_path ()); + } + break; + } + + return resolved_bound; +} + void TypeCheckPattern::visit (HIR::AltPattern &pattern) { diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.h b/gcc/rust/typecheck/rust-hir-type-check-pattern.h index 3b392b552d5..d5d0fd00de5 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-pattern.h +++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.h @@ -47,10 +47,9 @@ public: private: TypeCheckPattern (TyTy::BaseType *parent); - static TyTy::BaseType * - typecheck_range_pattern_bound (HIR::RangePatternBound *bound, - Analysis::NodeMapping mappings, - Location locus); + TyTy::BaseType *typecheck_range_pattern_bound ( + std::unique_ptr &bound, + Analysis::NodeMapping mappings, Location locus); void emit_pattern_size_error (const HIR::Pattern &pattern, size_t expected_field_count,