]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add type checking for SlicePattern
authorYap Zhi Heng <yapzhhg@gmail.com>
Tue, 8 Jul 2025 14:10:46 +0000 (22:10 +0800)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 5 Aug 2025 14:36:54 +0000 (16:36 +0200)
This commit implements basic type checking support for SlicePattern, based on rustc's
check_pat_slice function.

gcc/rust/ChangeLog:

* typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit(SlicePattern)):
Implement initial type checking for SlicePattern.

Signed-off-by: Yap Zhi Heng <yapzhhg@gmail.com>
gcc/rust/typecheck/rust-hir-type-check-pattern.cc

index 537c3491265ba8b47792390cf517900f9b6f2e33..c60d7868fdae695fea8ed5a9d2486adb81eae422 100644 (file)
@@ -636,8 +636,44 @@ TypeCheckPattern::visit (HIR::ReferencePattern &pattern)
 void
 TypeCheckPattern::visit (HIR::SlicePattern &pattern)
 {
-  rust_sorry_at (pattern.get_locus (),
-                "type checking qualified path patterns not supported");
+  auto resolved_parent = parent->destructure ();
+  TyTy::BaseType *parent_element_ty = nullptr;
+  switch (resolved_parent->get_kind ())
+    {
+    case TyTy::ARRAY:
+      {
+       // FIXME: implement compile-time size checks when ArrayType's capacity
+       // is updated to be evaluated in compile-time
+       // https://github.com/Rust-GCC/gccrs/issues/3882
+       auto &array_ty_ty = static_cast<TyTy::ArrayType &> (*parent);
+       parent_element_ty = array_ty_ty.get_element_type ();
+       break;
+      }
+    case TyTy::SLICE:
+      {
+       auto &array_ty_ty = static_cast<TyTy::SliceType &> (*parent);
+       parent_element_ty = array_ty_ty.get_element_type ();
+       break;
+      }
+    default:
+      {
+       rust_error_at (pattern.get_locus (), "expected %s, found slice",
+                      parent->as_string ().c_str ());
+       return;
+      }
+    }
+
+  rust_assert (parent_element_ty != nullptr);
+  // infered inherits array/slice typing from parent
+  infered = parent->clone ();
+  infered->set_ref (pattern.get_mappings ().get_hirid ());
+
+  // Type check every item in the SlicePattern against parent's element ty
+  // TODO update this after adding support for RestPattern in SlicePattern
+  for (const auto &item : pattern.get_items ())
+    {
+      TypeCheckPattern::Resolve (*item, parent_element_ty);
+    }
 }
 
 void