From: Yap Zhi Heng <yapz...@gmail.com>

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 <yapz...@gmail.com>
---
 .../typecheck/rust-hir-type-check-pattern.cc  | 40 ++++++++++++++++++-
 1 file changed, 38 insertions(+), 2 deletions(-)

diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc 
b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index 537c3491265..c60d7868fda 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -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
-- 
2.49.0

Reply via email to