aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/rust/hir/rust-ast-lower-base.cc45
-rw-r--r--gcc/rust/hir/rust-ast-lower-base.h3
-rw-r--r--gcc/rust/hir/rust-ast-lower-pattern.cc18
-rw-r--r--gcc/rust/hir/rust-ast-lower-pattern.h2
4 files changed, 68 insertions, 0 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc
index e4b3e1e..7afe75c 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -950,6 +950,51 @@ ASTLoweringBase::lower_tuple_pattern_ranged (
std::move (upper_patterns)));
}
+std::unique_ptr<HIR::RangePatternBound>
+ASTLoweringBase::lower_range_pattern_bound (AST::RangePatternBound *bound)
+{
+ std::unique_ptr<HIR::RangePatternBound> hir_bound = nullptr;
+ switch (bound->get_bound_type ())
+ {
+ case AST::RangePatternBound::RangePatternBoundType::LITERAL: {
+ AST::RangePatternBoundLiteral &ref
+ = *static_cast<AST::RangePatternBoundLiteral *> (bound);
+
+ HIR::Literal literal = lower_literal (ref.get_literal ());
+
+ hir_bound = std::unique_ptr<HIR::RangePatternBound> (
+ new HIR::RangePatternBoundLiteral (literal, ref.get_locus (),
+ ref.get_has_minus ()));
+ }
+ break;
+ case AST::RangePatternBound::RangePatternBoundType::PATH: {
+ AST::RangePatternBoundPath &ref
+ = *static_cast<AST::RangePatternBoundPath *> (bound);
+
+ HIR::PathInExpression *path
+ = ASTLowerPathInExpression::translate (&ref.get_path ());
+
+ hir_bound = std::unique_ptr<HIR::RangePatternBound> (
+ new HIR::RangePatternBoundPath (*path));
+ }
+ break;
+ case AST::RangePatternBound::RangePatternBoundType::QUALPATH: {
+ AST::RangePatternBoundQualPath &ref
+ = *static_cast<AST::RangePatternBoundQualPath *> (bound);
+
+ HIR::QualifiedPathInExpression *qualpath
+ = ASTLowerQualPathInExpression::translate (
+ &ref.get_qualified_path ());
+
+ hir_bound = std::unique_ptr<HIR::RangePatternBound> (
+ new HIR::RangePatternBoundQualPath (*qualpath));
+ }
+ break;
+ }
+
+ return hir_bound;
+}
+
HIR::Literal
ASTLoweringBase::lower_literal (const AST::Literal &literal)
{
diff --git a/gcc/rust/hir/rust-ast-lower-base.h b/gcc/rust/hir/rust-ast-lower-base.h
index 0041a8f..7e3eee1 100644
--- a/gcc/rust/hir/rust-ast-lower-base.h
+++ b/gcc/rust/hir/rust-ast-lower-base.h
@@ -282,6 +282,9 @@ protected:
std::unique_ptr<TuplePatternItems>
lower_tuple_pattern_ranged (AST::TuplePatternItemsRanged &pattern);
+ std::unique_ptr<HIR::RangePatternBound>
+ lower_range_pattern_bound (AST::RangePatternBound *bound);
+
HIR::Literal lower_literal (const AST::Literal &literal);
};
diff --git a/gcc/rust/hir/rust-ast-lower-pattern.cc b/gcc/rust/hir/rust-ast-lower-pattern.cc
index 957f8cd..1c08bf1 100644
--- a/gcc/rust/hir/rust-ast-lower-pattern.cc
+++ b/gcc/rust/hir/rust-ast-lower-pattern.cc
@@ -208,5 +208,23 @@ ASTLoweringPattern::visit (AST::LiteralPattern &pattern)
= new HIR::LiteralPattern (mapping, std::move (l), pattern.get_locus ());
}
+void
+ASTLoweringPattern::visit (AST::RangePattern &pattern)
+{
+ auto upper_bound
+ = lower_range_pattern_bound (pattern.get_upper_bound ().get ());
+ auto lower_bound
+ = lower_range_pattern_bound (pattern.get_lower_bound ().get ());
+
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, pattern.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ UNKNOWN_LOCAL_DEFID);
+
+ translated
+ = new HIR::RangePattern (mapping, std::move (lower_bound),
+ std::move (upper_bound), pattern.get_locus ());
+}
+
} // namespace HIR
} // namespace Rust
diff --git a/gcc/rust/hir/rust-ast-lower-pattern.h b/gcc/rust/hir/rust-ast-lower-pattern.h
index 32e9dac..dfd3dc0 100644
--- a/gcc/rust/hir/rust-ast-lower-pattern.h
+++ b/gcc/rust/hir/rust-ast-lower-pattern.h
@@ -62,6 +62,8 @@ public:
void visit (AST::LiteralPattern &pattern) override;
+ void visit (AST::RangePattern &pattern) override;
+
private:
ASTLoweringPattern () : translated (nullptr) {}