@@ -42,6 +42,7 @@ use syntax::ast_map::NodeItem;
42
42
use syntax:: ast_map;
43
43
use syntax:: ast_util:: { def_id_of_def, local_def} ;
44
44
use syntax:: codemap:: Span ;
45
+ use syntax:: owned_slice:: OwnedSlice ;
45
46
use syntax:: parse:: token;
46
47
use syntax:: visit;
47
48
@@ -346,7 +347,8 @@ impl<'a> CoherenceChecker<'a> {
346
347
Rc :: new ( Vec :: from_slice ( impl_poly_type. generics . type_param_defs ( ) ) . append (
347
348
new_method_ty. generics . type_param_defs ( ) ) ) ,
348
349
region_param_defs :
349
- impl_poly_type. generics . region_param_defs . clone ( )
350
+ Rc :: new ( Vec :: from_slice ( impl_poly_type. generics . region_param_defs ( ) ) . append (
351
+ new_method_ty. generics . region_param_defs ( ) ) )
350
352
} ;
351
353
let new_polytype = ty:: ty_param_bounds_and_ty {
352
354
generics : new_generics,
@@ -741,39 +743,35 @@ pub fn make_substs_for_receiver_types(tcx: &ty::ctxt,
741
743
* receiver and method generics.
742
744
*/
743
745
744
- // determine how many type parameters were declared on the impl
745
- let num_impl_type_parameters = {
746
- let impl_polytype = ty:: lookup_item_type ( tcx, impl_id) ;
747
- impl_polytype. generics . type_param_defs ( ) . len ( )
748
- } ;
749
-
750
- // determine how many type parameters appear on the trait
751
- let num_trait_type_parameters = trait_ref. substs . tps . len ( ) ;
752
-
753
- // the current method type has the type parameters from the trait + method
754
- let num_method_type_parameters =
755
- num_trait_type_parameters + method. generics . type_param_defs ( ) . len ( ) ;
756
-
757
- // the new method type will have the type parameters from the impl + method
758
- let combined_tps = Vec :: from_fn ( num_method_type_parameters, |i| {
759
- if i < num_trait_type_parameters {
760
- // replace type parameters that come from trait with new value
761
- * trait_ref. substs . tps . get ( i)
762
- } else {
763
- // replace type parameters that belong to method with another
764
- // type parameter, this time with the index adjusted
765
- let method_index = i - num_trait_type_parameters;
766
- let type_param_def = & method. generics . type_param_defs ( ) [ method_index] ;
767
- let new_index = num_impl_type_parameters + method_index;
768
- ty:: mk_param ( tcx, new_index, type_param_def. def_id )
746
+ let impl_polytype = ty:: lookup_item_type ( tcx, impl_id) ;
747
+ let num_impl_tps = impl_polytype. generics . type_param_defs ( ) . len ( ) ;
748
+ let num_impl_regions = impl_polytype. generics . region_param_defs ( ) . len ( ) ;
749
+ let meth_tps: Vec < ty:: t > =
750
+ method. generics . type_param_defs ( ) . iter ( ) . enumerate ( )
751
+ . map ( |( i, t) | ty:: mk_param ( tcx, i + num_impl_tps, t. def_id ) )
752
+ . collect ( ) ;
753
+ let meth_regions: Vec < ty:: Region > =
754
+ method. generics . region_param_defs ( ) . iter ( ) . enumerate ( )
755
+ . map ( |( i, l) | ty:: ReEarlyBound ( l. def_id . node , i + num_impl_regions, l. name ) )
756
+ . collect ( ) ;
757
+ let mut combined_tps = trait_ref. substs . tps . clone ( ) ;
758
+ combined_tps. push_all_move ( meth_tps) ;
759
+ let combined_regions = match & trait_ref. substs . regions {
760
+ & ty:: ErasedRegions =>
761
+ fail ! ( "make_substs_for_receiver_types: unexpected ErasedRegions" ) ,
762
+
763
+ & ty:: NonerasedRegions ( ref rs) => {
764
+ let mut rs = rs. clone ( ) . into_vec ( ) ;
765
+ rs. push_all_move ( meth_regions) ;
766
+ ty:: NonerasedRegions ( OwnedSlice :: from_vec ( rs) )
769
767
}
770
- } ) ;
768
+ } ;
771
769
772
- return ty:: substs {
773
- regions : trait_ref . substs . regions . clone ( ) ,
770
+ ty:: substs {
771
+ regions : combined_regions ,
774
772
self_ty : trait_ref. substs . self_ty ,
775
773
tps : combined_tps
776
- } ;
774
+ }
777
775
}
778
776
779
777
fn subst_receiver_types_in_method_ty ( tcx : & ty:: ctxt ,
0 commit comments