@@ -821,9 +821,9 @@ pub fn iterate_method_candidates_dyn(
821
821
822
822
let mut table = InferenceTable :: new ( db, env. clone ( ) ) ;
823
823
let ty = table. instantiate_canonical ( ty. clone ( ) ) ;
824
- let ( deref_chain, adj ) = autoderef_method_receiver ( & mut table, ty) ;
824
+ let deref_chain = autoderef_method_receiver ( & mut table, ty) ;
825
825
826
- let result = deref_chain. into_iter ( ) . zip ( adj ) . try_for_each ( |( receiver_ty, adj) | {
826
+ let result = deref_chain. into_iter ( ) . try_for_each ( |( receiver_ty, adj) | {
827
827
iterate_method_candidates_with_autoref (
828
828
& receiver_ty,
829
829
adj,
@@ -867,7 +867,7 @@ fn iterate_method_candidates_with_autoref(
867
867
return ControlFlow :: Continue ( ( ) ) ;
868
868
}
869
869
870
- let iterate_method_candidates_by_receiver = |receiver_ty, first_adjustment| {
870
+ let mut iterate_method_candidates_by_receiver = move |receiver_ty, first_adjustment| {
871
871
iterate_method_candidates_by_receiver (
872
872
receiver_ty,
873
873
first_adjustment,
@@ -1199,8 +1199,8 @@ pub fn resolve_indexing_op(
1199
1199
) -> Option < ReceiverAdjustments > {
1200
1200
let mut table = InferenceTable :: new ( db, env. clone ( ) ) ;
1201
1201
let ty = table. instantiate_canonical ( ty) ;
1202
- let ( deref_chain, adj ) = autoderef_method_receiver ( & mut table, ty) ;
1203
- for ( ty, adj) in deref_chain. into_iter ( ) . zip ( adj ) {
1202
+ let deref_chain = autoderef_method_receiver ( & mut table, ty) ;
1203
+ for ( ty, adj) in deref_chain {
1204
1204
let goal = generic_implements_goal ( db, env. clone ( ) , index_trait, & ty) ;
1205
1205
if db. trait_solve ( env. krate , goal. cast ( Interner ) ) . is_some ( ) {
1206
1206
return Some ( adj) ;
@@ -1410,25 +1410,24 @@ fn generic_implements_goal(
1410
1410
fn autoderef_method_receiver (
1411
1411
table : & mut InferenceTable < ' _ > ,
1412
1412
ty : Ty ,
1413
- ) -> ( Vec < Canonical < Ty > > , Vec < ReceiverAdjustments > ) {
1414
- let ( mut deref_chain, mut adjustments ) : ( Vec < _ > , Vec < _ > ) = ( Vec :: new ( ) , Vec :: new ( ) ) ;
1413
+ ) -> Vec < ( Canonical < Ty > , ReceiverAdjustments ) > {
1414
+ let mut deref_chain: Vec < _ > = Vec :: new ( ) ;
1415
1415
let mut autoderef = autoderef:: Autoderef :: new ( table, ty) ;
1416
1416
while let Some ( ( ty, derefs) ) = autoderef. next ( ) {
1417
- deref_chain. push ( autoderef. table . canonicalize ( ty) . value ) ;
1418
- adjustments. push ( ReceiverAdjustments {
1419
- autoref : None ,
1420
- autoderefs : derefs,
1421
- unsize_array : false ,
1422
- } ) ;
1417
+ deref_chain. push ( (
1418
+ autoderef. table . canonicalize ( ty) . value ,
1419
+ ReceiverAdjustments { autoref : None , autoderefs : derefs, unsize_array : false } ,
1420
+ ) ) ;
1423
1421
}
1424
1422
// As a last step, we can do array unsizing (that's the only unsizing that rustc does for method receivers!)
1425
- if let ( Some ( ( TyKind :: Array ( parameters, _) , binders) ) , Some ( adj) ) = (
1426
- deref_chain. last ( ) . map ( |ty| ( ty. value . kind ( Interner ) , ty. binders . clone ( ) ) ) ,
1427
- adjustments. last ( ) . cloned ( ) ,
1428
- ) {
1423
+ if let Some ( ( TyKind :: Array ( parameters, _) , binders, adj) ) =
1424
+ deref_chain. last ( ) . map ( |( ty, adj) | ( ty. value . kind ( Interner ) , ty. binders . clone ( ) , adj) )
1425
+ {
1429
1426
let unsized_ty = TyKind :: Slice ( parameters. clone ( ) ) . intern ( Interner ) ;
1430
- deref_chain. push ( Canonical { value : unsized_ty, binders } ) ;
1431
- adjustments. push ( ReceiverAdjustments { unsize_array : true , ..adj } ) ;
1427
+ deref_chain. push ( (
1428
+ Canonical { value : unsized_ty, binders } ,
1429
+ ReceiverAdjustments { unsize_array : true , ..adj. clone ( ) } ,
1430
+ ) ) ;
1432
1431
}
1433
- ( deref_chain, adjustments )
1432
+ deref_chain
1434
1433
}
0 commit comments