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: