]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Fix typechecking (and compilation) error for alt patterns in match expressions.
authorDave Evans <dave@dmetwo.org>
Thu, 24 Aug 2023 19:10:42 +0000 (14:10 -0500)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:04:35 +0000 (19:04 +0100)
gcc/rust/ChangeLog:

* backend/rust-compile-pattern.cc (CompilePatternCaseLabelExpr::visit):
Add AltPattern visitor function
* backend/rust-compile-pattern.h:
Update CompilePatternCaseLabelExpr::visit(AltPattern&).
* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit):
Update AltPattern visitor

gcc/testsuite/ChangeLog:

* rust/compile/issue-2431.rs: New test.

Signed-off-by: Dave Evans <dave@dmetwo.org>
gcc/rust/backend/rust-compile-pattern.cc
gcc/rust/backend/rust-compile-pattern.h
gcc/rust/typecheck/rust-hir-type-check-pattern.cc
gcc/testsuite/rust/compile/issue-2431.rs [new file with mode: 0644]

index 38fcedb011d80d522e0aacf9cae552ea81875418..66726d20d4223b6d51509cbbbc64d6c22dcaa8aa 100644 (file)
@@ -104,6 +104,17 @@ CompilePatternCaseLabelExpr::visit (HIR::LiteralPattern &pattern)
   case_label_expr = build_case_label (lit, NULL_TREE, associated_case_label);
 }
 
+void
+CompilePatternCaseLabelExpr::visit (HIR::AltPattern &pattern)
+{
+  const auto &alts = pattern.get_alts ();
+  for (auto &alt_pattern : alts)
+    {
+      CompilePatternCaseLabelExpr::Compile (alt_pattern.get (),
+                                           associated_case_label, ctx);
+    }
+}
+
 static tree
 compile_range_pattern_bound (HIR::RangePatternBound *bound,
                             Analysis::NodeMapping mappings, location_t locus,
index e8e4e5d2edda1f04b29c51773554e2d4686d3b60..23c0d1b8e7479765aea481be7c2de94046903276 100644 (file)
@@ -39,13 +39,7 @@ public:
   void visit (HIR::TupleStructPattern &pattern) override;
   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");
-  }
+  void visit (HIR::AltPattern &pattern) override;
 
   // Empty visit for unused Pattern HIR nodes.
   void visit (HIR::IdentifierPattern &) override {}
@@ -80,14 +74,8 @@ public:
   void visit (HIR::ReferencePattern &pattern) override;
   void visit (HIR::IdentifierPattern &) 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::AltPattern &) override {}
   void visit (HIR::LiteralPattern &) override {}
   void visit (HIR::PathInExpression &) override {}
   void visit (HIR::QualifiedPathInExpression &) override {}
index 9a74e159f1b246d83cbccff7231eb8b7a78bddd7..eacdd7cf1a2b4b915ccc6e7cb085d7179a3e878a 100644 (file)
@@ -473,8 +473,28 @@ TypeCheckPattern::typecheck_range_pattern_bound (
 void
 TypeCheckPattern::visit (HIR::AltPattern &pattern)
 {
-  rust_sorry_at (pattern.get_locus (),
-                "type checking alternate patterns not supported");
+  const auto &alts = pattern.get_alts ();
+
+  // lub - taken from TypeCheckExpr::visit(ArrayExpr)
+  std::vector<TyTy::BaseType *> types;
+  for (auto &alt_pattern : alts)
+    {
+      types.push_back (TypeCheckPattern::Resolve (alt_pattern.get (), parent));
+    }
+
+  TyTy::BaseType *alt_pattern_type
+    = TyTy::TyVar::get_implicit_infer_var (pattern.get_locus ()).get_tyty ();
+
+  for (auto &type : types)
+    {
+      alt_pattern_type
+       = unify_site (pattern.get_pattern_mappings ().get_hirid (),
+                     TyTy::TyWithLocation (alt_pattern_type),
+                     TyTy::TyWithLocation (type, type->get_locus ()),
+                     pattern.get_locus ());
+    }
+
+  infered = alt_pattern_type;
 }
 
 TyTy::BaseType *
diff --git a/gcc/testsuite/rust/compile/issue-2431.rs b/gcc/testsuite/rust/compile/issue-2431.rs
new file mode 100644 (file)
index 0000000..b1bae0d
--- /dev/null
@@ -0,0 +1,6 @@
+pub fn main() {
+    match 12 {
+        12 | 13 | 14 => {}
+        _ => {}
+    }
+}