[gcc r14-8007] gccrs: Fix typechecking (and compilation) error for alt patterns in match expressions.

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 18:12:59 GMT 2024


https://gcc.gnu.org/g:15648d5b8dc5a8cab1b11e14e5e5c178e32ed366

commit r14-8007-g15648d5b8dc5a8cab1b11e14e5e5c178e32ed366
Author: Dave Evans <dave@dmetwo.org>
Date:   Thu Aug 24 14:10:42 2023 -0500

    gccrs: Fix typechecking (and compilation) error for alt patterns in match expressions.
    
    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>

Diff:
---
 gcc/rust/backend/rust-compile-pattern.cc          | 11 +++++++++++
 gcc/rust/backend/rust-compile-pattern.h           | 16 ++-------------
 gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 24 +++++++++++++++++++++--
 gcc/testsuite/rust/compile/issue-2431.rs          |  6 ++++++
 4 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-pattern.cc b/gcc/rust/backend/rust-compile-pattern.cc
index 38fcedb011d..66726d20d42 100644
--- a/gcc/rust/backend/rust-compile-pattern.cc
+++ b/gcc/rust/backend/rust-compile-pattern.cc
@@ -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,
diff --git a/gcc/rust/backend/rust-compile-pattern.h b/gcc/rust/backend/rust-compile-pattern.h
index e8e4e5d2edd..23c0d1b8e74 100644
--- a/gcc/rust/backend/rust-compile-pattern.h
+++ b/gcc/rust/backend/rust-compile-pattern.h
@@ -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 {}
diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index 9a74e159f1b..eacdd7cf1a2 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -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
index 00000000000..b1bae0dbfcd
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-2431.rs
@@ -0,0 +1,6 @@
+pub fn main() {
+    match 12 {
+        12 | 13 | 14 => {}
+        _ => {}
+    }
+}


More information about the Gcc-cvs mailing list