@@ -16,6 +16,7 @@ use rustc_hash::{FxHashMap, FxHashSet};
16
16
17
17
use crate :: {
18
18
autoderef,
19
+ consteval:: { self , ConstExt } ,
19
20
db:: HirDatabase ,
20
21
from_foreign_def_id,
21
22
primitive:: { self , FloatTy , IntTy , UintTy } ,
@@ -725,7 +726,27 @@ fn iterate_inherent_methods(
725
726
for krate in def_crates {
726
727
let impls = db. inherent_impls_in_crate ( krate) ;
727
728
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 {
729
750
for & item in db. impl_data ( impl_def) . items . iter ( ) {
730
751
if !is_valid_candidate (
731
752
db,
@@ -803,7 +824,20 @@ fn is_valid_candidate(
803
824
None => return false ,
804
825
} ;
805
826
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
+ }
807
841
}
808
842
}
809
843
if let Some ( from_module) = visible_from_module {
0 commit comments