From 495765758a3c434c6767610f377cace4bba8ff1c Mon Sep 17 00:00:00 2001 From: Yap Zhi Heng Date: Sun, 20 Jul 2025 15:55:51 +0800 Subject: [PATCH] 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 --- gcc/rust/backend/rust-compile-pattern.cc | 6 ++++-- .../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 6d889baa199..e00de4f467f 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 bb0e27bb2a6..13fc9c85cc8 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 (*parent); - parent_element_ty = array_ty_ty.get_element_type (); + auto &slice_ty_ty = static_cast (*parent); + parent_element_ty = slice_ty_ty.get_element_type (); + break; + } + case TyTy::REF: + { + auto &ref_ty_ty = static_cast (*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: -- 2.47.2