Skip to content

Commit f705d64

Browse files
Remove instantiate_type_scheme
1 parent 5dea1d1 commit f705d64

File tree

3 files changed

+13
-34
lines changed

3 files changed

+13
-34
lines changed

compiler/rustc_hir_typeck/src/fn_ctxt/_impl.rs

+7-28
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use rustc_middle::ty::error::TypeError;
2222
use rustc_middle::ty::fold::TypeFoldable;
2323
use rustc_middle::ty::visit::TypeVisitable;
2424
use rustc_middle::ty::{
25-
self, AdtKind, CanonicalUserType, DefIdTree, EarlyBinder, GenericParamDefKind, Ty, UserType,
25+
self, AdtKind, CanonicalUserType, DefIdTree, GenericParamDefKind, Ty, UserType,
2626
};
2727
use rustc_middle::ty::{GenericArgKind, InternalSubsts, SubstsRef, UserSelfTy, UserSubsts};
2828
use rustc_session::lint;
@@ -333,23 +333,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
333333
}
334334
}
335335

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
353337
pub(in super::super) fn instantiate_bounds(
354338
&self,
355339
span: Span,
@@ -1161,10 +1145,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
11611145
};
11621146
let def_id = res.def_id();
11631147

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-
11681148
let arg_count = GenericArgCountResult {
11691149
explicit_late_bound,
11701150
correct: if infer_args_for_err.is_empty() {
@@ -1287,8 +1267,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
12871267
},
12881268
)
12891269
});
1290-
assert!(!substs.has_escaping_bound_vars());
1291-
assert!(!ty.has_escaping_bound_vars());
12921270

12931271
// First, store the "user substs" for later.
12941272
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> {
12971275

12981276
// Substitute the values for the type parameters into the type of
12991277
// 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));
13011282

13021283
if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
13031284
// In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
13041285
// is inherent, there is no `Self` parameter; instead, the impl needs
13051286
// type parameters, which we can infer by unifying the provided `Self`
13061287
// with the substituted impl type.
13071288
// 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));
13111290
match self.at(&self.misc(span), self.param_env).eq(impl_ty, self_ty) {
13121291
Ok(ok) => self.register_infer_ok_obligations(ok),
13131292
Err(_) => {

compiler/rustc_hir_typeck/src/method/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -456,9 +456,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
456456
// Instantiate late-bound regions and substitute the trait
457457
// parameters into the method type to get the actual method type.
458458
//
459-
// N.B., instantiate late-bound regions first so that
460-
// `instantiate_type_scheme` can normalize associated types that
461-
// may reference those regions.
459+
// N.B., instantiate late-bound regions before normalizing the
460+
// function signature so that normalization does not need to deal
461+
// with bound regions.
462462
let fn_sig = tcx.bound_fn_sig(def_id);
463463
let fn_sig = fn_sig.subst(self.tcx, substs);
464464
let fn_sig = self.replace_bound_vars_with_fresh_vars(span, infer::FnCall, fn_sig);

compiler/rustc_middle/src/ty/util.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
use crate::middle::codegen_fn_attrs::CodegenFnAttrFlags;
44
use crate::mir;
55
use crate::ty::layout::IntegerExt;
6+
use crate::ty::query::TyCtxtAt;
67
use crate::ty::{
7-
self, DefIdTree, FallibleTypeFolder, Ty, TyCtxt, TypeFoldable, TypeFolder,
8-
TypeSuperFoldable, TypeVisitable,
8+
self, DefIdTree, FallibleTypeFolder, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperFoldable,
9+
TypeVisitable,
910
};
10-
use crate::ty::query::TyCtxtAt;
1111
use crate::ty::{GenericArgKind, SubstsRef};
1212
use rustc_apfloat::Float as _;
1313
use rustc_data_structures::fx::{FxHashMap, FxHashSet};

0 commit comments

Comments
 (0)