aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-04-21 14:32:21 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-04-21 16:06:18 +0100
commitdd9e4c1e0ca0b14388a3cd43f18a4e1a7aebe6e5 (patch)
tree234a6e1ecdbb1b0a185bf94c50121959926e90cc /gcc/rust/resolve
parentfe10ca37aba8f3cb9bfaa9dd01bdb1329317cf21 (diff)
downloadgcc-dd9e4c1e0ca0b14388a3cd43f18a4e1a7aebe6e5.zip
gcc-dd9e4c1e0ca0b14388a3cd43f18a4e1a7aebe6e5.tar.gz
gcc-dd9e4c1e0ca0b14388a3cd43f18a4e1a7aebe6e5.tar.bz2
Add name and type resolution for TuplePatterns
This adds the relevant pattern resolution steps to match up the TuplePattern. This patch leaves out type resolution on TupleRange Patterns for now. Some thought is needed to figure out how do have a canonical algorithm for code-generation here so splitting this up makes sense for now. This patch extracts the type-resolution handling for HIR::LiteralExpr to have a generic function to resolve the HIR::Literal which is used within HIR::LiteralExpr and HIR::LiteralPattern. Addresses #1081
Diffstat (limited to 'gcc/rust/resolve')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-pattern.cc30
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-pattern.h2
2 files changed, 32 insertions, 0 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-pattern.cc b/gcc/rust/resolve/rust-ast-resolve-pattern.cc
index 0c7c8f3..24cd171 100644
--- a/gcc/rust/resolve/rust-ast-resolve-pattern.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-pattern.cc
@@ -100,5 +100,35 @@ PatternDeclaration::visit (AST::StructPattern &pattern)
rust_assert (!struct_pattern_elems.has_etc ());
}
+void
+PatternDeclaration::visit (AST::TuplePattern &pattern)
+{
+ std::unique_ptr<AST::TuplePatternItems> &items = pattern.get_items ();
+ switch (items->get_pattern_type ())
+ {
+ case AST::TuplePatternItems::TuplePatternItemType::MULTIPLE: {
+ AST::TuplePatternItemsMultiple &ref
+ = *static_cast<AST::TuplePatternItemsMultiple *> (
+ pattern.get_items ().get ());
+
+ for (auto &p : ref.get_patterns ())
+ p->accept_vis (*this);
+ }
+ break;
+
+ case AST::TuplePatternItems::TuplePatternItemType::RANGED: {
+ AST::TuplePatternItemsRanged &ref
+ = *static_cast<AST::TuplePatternItemsRanged *> (
+ pattern.get_items ().get ());
+
+ for (auto &p : ref.get_lower_patterns ())
+ p->accept_vis (*this);
+ for (auto &p : ref.get_upper_patterns ())
+ p->accept_vis (*this);
+ }
+ break;
+ }
+}
+
} // namespace Resolver
} // namespace Rust
diff --git a/gcc/rust/resolve/rust-ast-resolve-pattern.h b/gcc/rust/resolve/rust-ast-resolve-pattern.h
index dca8258..464e362 100644
--- a/gcc/rust/resolve/rust-ast-resolve-pattern.h
+++ b/gcc/rust/resolve/rust-ast-resolve-pattern.h
@@ -101,6 +101,8 @@ public:
void visit (AST::TupleStructPattern &pattern) override;
+ void visit (AST::TuplePattern &pattern) override;
+
private:
PatternDeclaration (NodeId parent) : ResolverBase (parent) {}
};