@@ -22,7 +22,7 @@ use rustc_middle::ty::error::TypeError;
22
22
use rustc_middle:: ty:: fold:: TypeFoldable ;
23
23
use rustc_middle:: ty:: visit:: TypeVisitable ;
24
24
use rustc_middle:: ty:: {
25
- self , AdtKind , CanonicalUserType , DefIdTree , EarlyBinder , GenericParamDefKind , Ty , UserType ,
25
+ self , AdtKind , CanonicalUserType , DefIdTree , GenericParamDefKind , Ty , UserType ,
26
26
} ;
27
27
use rustc_middle:: ty:: { GenericArgKind , InternalSubsts , SubstsRef , UserSelfTy , UserSubsts } ;
28
28
use rustc_session:: lint;
@@ -333,23 +333,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
333
333
}
334
334
}
335
335
336
- /// Basically whenever we are converting from a type scheme into
337
- /// the fn body space, we always want to normalize associated
338
- /// types as well. This function combines the two.
339
- // FIXME(compiler-errors): Remove this.
340
- fn instantiate_type_scheme < T > ( & self , span : Span , substs : SubstsRef < ' tcx > , value : T ) -> T
341
- where
342
- T : TypeFoldable < ' tcx > ,
343
- {
344
- debug ! ( "instantiate_type_scheme(value={:?}, substs={:?})" , value, substs) ;
345
- let value = EarlyBinder ( value) . subst ( self . tcx , substs) ;
346
- let result = self . normalize ( span, value) ;
347
- debug ! ( "instantiate_type_scheme = {:?}" , result) ;
348
- result
349
- }
350
-
351
- /// As `instantiate_type_scheme`, but for the bounds found in a
352
- /// generic type scheme.
336
+ /// Instantiates and normalizes the bounds for a given item
353
337
pub ( in super :: super ) fn instantiate_bounds (
354
338
& self ,
355
339
span : Span ,
@@ -1161,10 +1145,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1161
1145
} ;
1162
1146
let def_id = res. def_id ( ) ;
1163
1147
1164
- // The things we are substituting into the type should not contain
1165
- // escaping late-bound regions, and nor should the base type scheme.
1166
- let ty = tcx. type_of ( def_id) ;
1167
-
1168
1148
let arg_count = GenericArgCountResult {
1169
1149
explicit_late_bound,
1170
1150
correct : if infer_args_for_err. is_empty ( ) {
@@ -1287,8 +1267,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1287
1267
} ,
1288
1268
)
1289
1269
} ) ;
1290
- assert ! ( !substs. has_escaping_bound_vars( ) ) ;
1291
- assert ! ( !ty. has_escaping_bound_vars( ) ) ;
1292
1270
1293
1271
// First, store the "user substs" for later.
1294
1272
self . write_user_type_annotation_from_substs ( hir_id, def_id, substs, user_self_ty) ;
@@ -1297,17 +1275,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1297
1275
1298
1276
// Substitute the values for the type parameters into the type of
1299
1277
// the referenced item.
1300
- let ty_substituted = self . instantiate_type_scheme ( span, & substs, ty) ;
1278
+ let ty = tcx. bound_type_of ( def_id) ;
1279
+ assert ! ( !substs. has_escaping_bound_vars( ) ) ;
1280
+ assert ! ( !ty. 0 . has_escaping_bound_vars( ) ) ;
1281
+ let ty_substituted = self . normalize ( span, ty. subst ( tcx, substs) ) ;
1301
1282
1302
1283
if let Some ( UserSelfTy { impl_def_id, self_ty } ) = user_self_ty {
1303
1284
// In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
1304
1285
// is inherent, there is no `Self` parameter; instead, the impl needs
1305
1286
// type parameters, which we can infer by unifying the provided `Self`
1306
1287
// with the substituted impl type.
1307
1288
// This also occurs for an enum variant on a type alias.
1308
- let ty = tcx. type_of ( impl_def_id) ;
1309
-
1310
- let impl_ty = self . instantiate_type_scheme ( span, & substs, ty) ;
1289
+ let impl_ty = self . normalize ( span, tcx. bound_type_of ( impl_def_id) . subst ( tcx, substs) ) ;
1311
1290
match self . at ( & self . misc ( span) , self . param_env ) . eq ( impl_ty, self_ty) {
1312
1291
Ok ( ok) => self . register_infer_ok_obligations ( ok) ,
1313
1292
Err ( _) => {
0 commit comments