]> git.ipfire.org Git - people/ms/gcc.git/commitdiff
Add AltPattern HIR node
authorOwen Avery <powerboat9.gamer@gmail.com>
Mon, 20 Feb 2023 19:46:03 +0000 (14:46 -0500)
committerPhilip Herron <philip.herron@embecosm.com>
Tue, 7 Mar 2023 10:11:10 +0000 (10:11 +0000)
Example:
match x {
    0 | 1 => true,
    _ => false
}

gcc/rust/ChangeLog:

* backend/rust-compile-fnparam.h:
(CompileFnParam::visit): Add AltPattern visitor.
* backend/rust-compile-pattern.h:
(CompilePatternCaseLabelExpr::visit): Add AltPattern visitor.
(CompilePatternBindings::visit): Add AltPattern visitor.
(CompilePatternLet::visit): Add AltPattern visitor.
* backend/rust-compile-resolve-path.h:
(ResolvePathRef::visit): Add AltPattern visitor.
* backend/rust-compile-var-decl.h:
(CompileVarDecl::visit): Add AltPattern visitor.
* checks/errors/rust-const-checker.cc
(ConstChecker::visit): Add AltPattern visitor.
* checks/errors/rust-const-checker.h:
(ConstChecker::visit): Add AltPattern visitor.
* checks/errors/rust-unsafe-checker.cc
(UnsafeChecker::visit): Add AltPattern visitor.
* checks/errors/rust-unsafe-checker.h:
(UnsafeChecker::visit): Add AltPattern visitor.
* hir/rust-hir-dump.cc
(Dump::visit): Add AltPattern visitor.
* hir/rust-hir-dump.h:
(Dump::visit): Add AltPattern visitor.
* hir/tree/rust-hir-full-decls.h
(class AltPattern): Add forward declaration.
* hir/tree/rust-hir-pattern.h
(class AltPattern): New class.
* hir/tree/rust-hir-visitor.h:
(HIRFullVisitor::visit): Add AltPattern visitor.
(HIRFullVisitorBase::visit): Add AltPattern visitor.
(HIRPatternVisitor::visit): Add AltPattern visitor.
* hir/tree/rust-hir.h:
(Pattern::PatternType::ALT): New enumerator.
* typecheck/rust-hir-type-check-pattern.cc
(TypeCheckPattern::visit): Add AltPattern visitor.
* typecheck/rust-hir-type-check-pattern.h:
(TypeCheckPattern::visit): Add AltPattern visitor.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
16 files changed:
gcc/rust/backend/rust-compile-fnparam.h
gcc/rust/backend/rust-compile-pattern.h
gcc/rust/backend/rust-compile-resolve-path.h
gcc/rust/backend/rust-compile-var-decl.h
gcc/rust/checks/errors/rust-const-checker.cc
gcc/rust/checks/errors/rust-const-checker.h
gcc/rust/checks/errors/rust-unsafe-checker.cc
gcc/rust/checks/errors/rust-unsafe-checker.h
gcc/rust/hir/rust-hir-dump.cc
gcc/rust/hir/rust-hir-dump.h
gcc/rust/hir/tree/rust-hir-full-decls.h
gcc/rust/hir/tree/rust-hir-pattern.h
gcc/rust/hir/tree/rust-hir-visitor.h
gcc/rust/hir/tree/rust-hir.h
gcc/rust/typecheck/rust-hir-type-check-pattern.cc
gcc/rust/typecheck/rust-hir-type-check-pattern.h

index 10e8b67c140b458116fb566e67bc5fcf0dffb178..c5b08e3a0190549aba9431dd125758186d52f64c 100644 (file)
@@ -39,6 +39,7 @@ public:
   void visit (HIR::TupleStructPattern &) override;
 
   // Empty visit for unused Pattern HIR nodes.
+  void visit (HIR::AltPattern &) override {}
   void visit (HIR::LiteralPattern &) override {}
   void visit (HIR::PathInExpression &) override {}
   void visit (HIR::QualifiedPathInExpression &) override {}
index 8f44b7b5dbbe31a38a50ab663f31224aac8bb742..93faeeae8d1167db1adb558ce80ce6f3de285986 100644 (file)
@@ -39,6 +39,13 @@ public:
   void visit (HIR::WildcardPattern &pattern) override;
   void visit (HIR::RangePattern &pattern) override;
 
+  // unsupported
+  void visit (HIR::AltPattern &pattern) override
+  {
+    rust_sorry_at (pattern.get_locus (),
+                  "alternate pattern case labels not supported");
+  }
+
   // Empty visit for unused Pattern HIR nodes.
   void visit (HIR::IdentifierPattern &) override {}
   void visit (HIR::LiteralPattern &) override;
@@ -70,6 +77,13 @@ public:
   void visit (HIR::StructPattern &pattern) override;
   void visit (HIR::TupleStructPattern &pattern) override;
 
+  // unsupported
+  void visit (HIR::AltPattern &pattern) override
+  {
+    rust_sorry_at (pattern.get_locus (),
+                  "alternate pattern bindings not supported");
+  }
+
   // Empty visit for unused Pattern HIR nodes.
   void visit (HIR::IdentifierPattern &) override {}
   void visit (HIR::LiteralPattern &) override {}
@@ -104,6 +118,12 @@ public:
   void visit (HIR::TuplePattern &) override;
 
   // check for unimplemented Pattern HIR nodes.
+  void visit (HIR::AltPattern &pattern) override
+  {
+    rust_sorry_at (pattern.get_locus (),
+                  "alternate pattern let statements not supported");
+  }
+
   void visit (HIR::LiteralPattern &pattern) override
   {
     rust_sorry_at (pattern.get_locus (),
index 6aec7be472f0650c98846ad7e65dcc62a15d2174..ad7a67fe91158af5144abf13d60b59431876fd20 100644 (file)
@@ -50,6 +50,7 @@ public:
   void visit (HIR::RangePattern &) override {}
   void visit (HIR::ReferencePattern &) override {}
   void visit (HIR::SlicePattern &) override {}
+  void visit (HIR::AltPattern &) override {}
   void visit (HIR::StructPattern &) override {}
   void visit (HIR::TuplePattern &) override {}
   void visit (HIR::TupleStructPattern &) override {}
index 13b429d41e1207a603599a9377b8a86b1096b270..bc838167b2b1433f594406d169572c243be6b886 100644 (file)
@@ -54,6 +54,7 @@ public:
   }
 
   // Empty visit for unused Pattern HIR nodes.
+  void visit (HIR::AltPattern &) override {}
   void visit (HIR::LiteralPattern &) override {}
   void visit (HIR::PathInExpression &) override {}
   void visit (HIR::QualifiedPathInExpression &) override {}
index 3752cf3671655b729712b6b319970b5a48941ace..d0ca5cf1c8a0a37413df0edb0f1faba25852f5f5 100644 (file)
@@ -838,6 +838,10 @@ void
 ConstChecker::visit (SlicePattern &)
 {}
 
+void
+ConstChecker::visit (AltPattern &)
+{}
+
 void
 ConstChecker::visit (EmptyStmt &)
 {}
index e040236136795ffe7f6f1a179caac0f8ceac0d16..2183992b7d374b5b9731cf6290594a26d0e270b8 100644 (file)
@@ -187,6 +187,7 @@ private:
   virtual void visit (TuplePatternItemsRanged &tuple_items) override;
   virtual void visit (TuplePattern &pattern) override;
   virtual void visit (SlicePattern &pattern) override;
+  virtual void visit (AltPattern &pattern) override;
   virtual void visit (EmptyStmt &stmt) override;
   virtual void visit (LetStmt &stmt) override;
   virtual void visit (ExprStmtWithoutBlock &stmt) override;
index ff7a0b3f85a61788266aaa262fb41d3dad340fd4..be85c90c7ad05680ae1d9313f74cb867d86132b0 100644 (file)
@@ -905,6 +905,10 @@ void
 UnsafeChecker::visit (SlicePattern &)
 {}
 
+void
+UnsafeChecker::visit (AltPattern &)
+{}
+
 void
 UnsafeChecker::visit (EmptyStmt &)
 {}
index ce270c0e7ef426b371be15cb291fe776b441a321..2e6719a5d6e5fcdabbdbd95c7eec2422b8373c24 100644 (file)
@@ -169,6 +169,7 @@ private:
   virtual void visit (TuplePatternItemsRanged &tuple_items) override;
   virtual void visit (TuplePattern &pattern) override;
   virtual void visit (SlicePattern &pattern) override;
+  virtual void visit (AltPattern &pattern) override;
   virtual void visit (EmptyStmt &stmt) override;
   virtual void visit (LetStmt &stmt) override;
   virtual void visit (ExprStmtWithoutBlock &stmt) override;
index d6b458b72d3ebb8c0d8a60ce1536c223d27f5d77..9975a1e66b1b2f0d0d3a0424f7a4ac67b69b0362 100644 (file)
@@ -580,6 +580,9 @@ Dump::visit (TuplePattern &)
 void
 Dump::visit (SlicePattern &)
 {}
+void
+Dump::visit (AltPattern &)
+{}
 
 void
 Dump::visit (EmptyStmt &)
index b66e6b13f7c83e6c9e93f5b60259ce446b69a9a4..c1ef9849b46a05fee8d0122f60c26aabdd34e36f 100644 (file)
@@ -164,6 +164,7 @@ private:
   virtual void visit (TuplePatternItemsRanged &) override;
   virtual void visit (TuplePattern &) override;
   virtual void visit (SlicePattern &) override;
+  virtual void visit (AltPattern &) override;
 
   virtual void visit (EmptyStmt &) override;
   virtual void visit (LetStmt &) override;
index 30adda6a1f39e7ddca94bd5d1a42f029902a5aa6..d486d91818639893434be91c96254c5102f930aa 100644 (file)
@@ -207,6 +207,7 @@ class TuplePatternItemsMultiple;
 class TuplePatternItemsRanged;
 class TuplePattern;
 class SlicePattern;
+class AltPattern;
 
 // rust-type.h
 class TraitBound;
index 47a38cc075cf6692d343088588f9456264d326e7..69faed1643e597f01a8ff7a8cb3efa9bacb70cc6 100644 (file)
@@ -1300,6 +1300,73 @@ protected:
   }
 };
 
+// HIR node for alternative patterns
+class AltPattern : public Pattern
+{
+  std::vector<std::unique_ptr<Pattern>> alts;
+  Location locus;
+  Analysis::NodeMapping mappings;
+
+public:
+public:
+  std::string as_string () const override;
+
+  AltPattern (Analysis::NodeMapping mappings,
+             std::vector<std::unique_ptr<Pattern>> alts, Location locus)
+    : alts (std::move (alts)), locus (locus), mappings (mappings)
+  {}
+
+  // Copy constructor with vector clone
+  AltPattern (AltPattern const &other)
+    : locus (other.locus), mappings (other.mappings)
+  {
+    alts.reserve (other.alts.size ());
+    for (const auto &e : other.alts)
+      alts.push_back (e->clone_pattern ());
+  }
+
+  // Overloaded assignment operator to vector clone
+  AltPattern &operator= (AltPattern const &other)
+  {
+    locus = other.locus;
+    mappings = other.mappings;
+
+    alts.clear ();
+    alts.reserve (other.alts.size ());
+    for (const auto &e : other.alts)
+      alts.push_back (e->clone_pattern ());
+
+    return *this;
+  }
+
+  // move constructors
+  AltPattern (AltPattern &&other) = default;
+  AltPattern &operator= (AltPattern &&other) = default;
+
+  Location get_locus () const override { return locus; }
+
+  void accept_vis (HIRFullVisitor &vis) override;
+  void accept_vis (HIRPatternVisitor &vis) override;
+
+  Analysis::NodeMapping get_pattern_mappings () const override final
+  {
+    return mappings;
+  }
+
+  PatternType get_pattern_type () const override final
+  {
+    return PatternType::ALT;
+  }
+
+protected:
+  /* Use covariance to implement clone function as returning this object rather
+   * than base */
+  AltPattern *clone_pattern_impl () const override
+  {
+    return new AltPattern (*this);
+  }
+};
+
 // Moved definition to rust-path.h
 class PathPattern;
 
index a635f9079f198068853e36710d9d958e22485e8b..fa6f5923f2fbf184d55b9d3343cd9f26cc2b5008 100644 (file)
@@ -139,6 +139,7 @@ public:
   virtual void visit (TuplePatternItemsRanged &tuple_items) = 0;
   virtual void visit (TuplePattern &pattern) = 0;
   virtual void visit (SlicePattern &pattern) = 0;
+  virtual void visit (AltPattern &pattern) = 0;
   virtual void visit (EmptyStmt &stmt) = 0;
   virtual void visit (LetStmt &stmt) = 0;
   virtual void visit (ExprStmtWithoutBlock &stmt) = 0;
@@ -290,6 +291,7 @@ public:
   virtual void visit (TuplePatternItemsRanged &) override {}
   virtual void visit (TuplePattern &) override {}
   virtual void visit (SlicePattern &) override {}
+  virtual void visit (AltPattern &) override {}
 
   virtual void visit (EmptyStmt &) override {}
   virtual void visit (LetStmt &) override {}
@@ -475,6 +477,7 @@ public:
   virtual void visit (RangePattern &) = 0;
   virtual void visit (ReferencePattern &) = 0;
   virtual void visit (SlicePattern &) = 0;
+  virtual void visit (AltPattern &) = 0;
   virtual void visit (StructPattern &) = 0;
   virtual void visit (TuplePattern &) = 0;
   virtual void visit (TupleStructPattern &) = 0;
index 28f1f21a6bb4b2ef5e01756e09483b54508bc747..6ed74428356465cb24511c2c42a3ad685b0b27b7 100644 (file)
@@ -384,6 +384,7 @@ public:
     TUPLE,
     GROUPED,
     SLICE,
+    ALT
   };
 
   BaseKind get_hir_kind () override final { return PATTERN; }
index b7412bc405d5d7c48988c11fe34670692594962e..3dca07baf9cac2b8b111640052a2cd663759d1c2 100644 (file)
@@ -437,5 +437,12 @@ TypeCheckPattern::emit_pattern_size_error (const HIR::Pattern &pattern,
                 got_field_count == 1 ? "element" : "elements");
 }
 
+void
+TypeCheckPattern::visit (HIR::AltPattern &pattern)
+{
+  rust_sorry_at (pattern.get_locus (),
+                "type checking alternate patterns not supported");
+}
+
 } // namespace Resolver
 } // namespace Rust
index a4fbf888213d1eb4711b9c4661debb593c4b837d..3b392b552d5d4120cf67197422671865d9e3045a 100644 (file)
@@ -42,6 +42,7 @@ public:
   void visit (HIR::QualifiedPathInExpression &pattern) override;
   void visit (HIR::ReferencePattern &pattern) override;
   void visit (HIR::SlicePattern &pattern) override;
+  void visit (HIR::AltPattern &pattern) override;
 
 private:
   TypeCheckPattern (TyTy::BaseType *parent);