https://gcc.gnu.org/g:495765758a3c434c6767610f377cace4bba8ff1c

commit r16-2959-g495765758a3c434c6767610f377cace4bba8ff1c
Author: Yap Zhi Heng <yapz...@gmail.com>
Date:   Sun Jul 20 15:55:51 2025 +0800

    gccrs: Update SlicePattern typechecking against slice reference parents
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-hir-type-check-pattern.cc 
(TypeCheckPattern::visit(SlicePattern)):
                    Add new type check case for SliceType wrapped in 
ReferenceType.
            * backend/rust-compile-pattern.cc: Adjusted the asserts accordingly 
for
                    CompilePatternCheckExpr(SlicePattern) & 
CompilePatternBindings(SlicePattern).
    
    Signed-off-by: Yap Zhi Heng <yapz...@gmail.com>

Diff:
---
 gcc/rust/backend/rust-compile-pattern.cc          |  6 ++++--
 gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 17 +++++++++++++++--
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-pattern.cc 
b/gcc/rust/backend/rust-compile-pattern.cc
index 6d889baa1992..e00de4f467f3 100644
--- a/gcc/rust/backend/rust-compile-pattern.cc
+++ b/gcc/rust/backend/rust-compile-pattern.cc
@@ -529,7 +529,8 @@ CompilePatternCheckExpr::visit (HIR::SlicePattern &pattern)
   // pattern must either be ArrayType or SliceType, should be already confirmed
   // by type checking
   rust_assert (lookup->get_kind () == TyTy::TypeKind::ARRAY
-              || lookup->get_kind () == TyTy::TypeKind::SLICE);
+              || lookup->get_kind () == TyTy::TypeKind::SLICE
+              || lookup->get_kind () == TyTy::REF);
 
   size_t array_element_index = 0;
   switch (lookup->get_kind ())
@@ -895,7 +896,8 @@ CompilePatternBindings::visit (HIR::SlicePattern &pattern)
   rust_assert (ok);
 
   rust_assert (lookup->get_kind () == TyTy::TypeKind::ARRAY
-              || lookup->get_kind () == TyTy::TypeKind::SLICE);
+              || lookup->get_kind () == TyTy::TypeKind::SLICE
+              || lookup->get_kind () == TyTy::REF);
 
   size_t array_element_index = 0;
   switch (lookup->get_kind ())
diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc 
b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
index bb0e27bb2a6c..13fc9c85cc86 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -675,8 +675,21 @@ TypeCheckPattern::visit (HIR::SlicePattern &pattern)
       }
     case TyTy::SLICE:
       {
-       auto &array_ty_ty = static_cast<TyTy::SliceType &> (*parent);
-       parent_element_ty = array_ty_ty.get_element_type ();
+       auto &slice_ty_ty = static_cast<TyTy::SliceType &> (*parent);
+       parent_element_ty = slice_ty_ty.get_element_type ();
+       break;
+      }
+    case TyTy::REF:
+      {
+       auto &ref_ty_ty = static_cast<TyTy::ReferenceType &> (*parent);
+       const TyTy::SliceType *slice = nullptr;
+       if (!ref_ty_ty.is_dyn_slice_type (&slice))
+         {
+           rust_error_at (pattern.get_locus (), "expected %s, found slice",
+                          parent->as_string ().c_str ());
+           return;
+         }
+       parent_element_ty = slice->get_element_type ();
        break;
       }
     default:

Reply via email to