@@ -16,6 +16,7 @@ use rustc_hash::{FxHashMap, FxHashSet};
1616
1717use crate :: {
1818 autoderef,
19+ consteval:: { self , ConstExt } ,
1920 db:: HirDatabase ,
2021 from_foreign_def_id,
2122 primitive:: { self , FloatTy , IntTy , UintTy } ,
@@ -725,7 +726,27 @@ fn iterate_inherent_methods(
725726 for krate in def_crates {
726727 let impls = db. inherent_impls_in_crate ( krate) ;
727728
728- for & impl_def in impls. for_self_ty ( & self_ty. value ) {
729+ let impls_for_self_ty = impls. for_self_ty ( & self_ty. value ) . iter ( ) . chain (
730+ {
731+ if let TyKind :: Array ( parameters, array_len) = self_ty. value . kind ( & Interner ) {
732+ if !array_len. is_unknown ( ) {
733+ let unknown_array_len_ty =
734+ TyKind :: Array ( parameters. clone ( ) , consteval:: usize_const ( None ) )
735+ . intern ( & Interner ) ;
736+
737+ Some ( impls. for_self_ty ( & unknown_array_len_ty) )
738+ } else {
739+ None
740+ }
741+ } else {
742+ None
743+ }
744+ }
745+ . into_iter ( )
746+ . flatten ( ) ,
747+ ) ;
748+
749+ for & impl_def in impls_for_self_ty {
729750 for & item in db. impl_data ( impl_def) . items . iter ( ) {
730751 if !is_valid_candidate (
731752 db,
@@ -803,7 +824,20 @@ fn is_valid_candidate(
803824 None => return false ,
804825 } ;
805826 if transformed_receiver_ty != receiver_ty. value {
806- return false ;
827+ match (
828+ transformed_receiver_ty. kind ( & Interner ) ,
829+ receiver_ty. value . kind ( & Interner ) ,
830+ ) {
831+ (
832+ TyKind :: Array ( transformed_array_ty, transformed_array_len) ,
833+ TyKind :: Array ( receiver_array_ty, receiver_array_len) ,
834+ ) if transformed_array_ty == receiver_array_ty
835+ && transformed_array_len. is_unknown ( )
836+ && !receiver_array_len. is_unknown ( ) => { }
837+ _ => {
838+ return false ;
839+ }
840+ }
807841 }
808842 }
809843 if let Some ( from_module) = visible_from_module {
0 commit comments