Remove instantiate_type_scheme
This commit is contained in:
parent
5dea1d1c6e
commit
f705d64673
@ -22,7 +22,7 @@
|
|||||||
use rustc_middle::ty::fold::TypeFoldable;
|
use rustc_middle::ty::fold::TypeFoldable;
|
||||||
use rustc_middle::ty::visit::TypeVisitable;
|
use rustc_middle::ty::visit::TypeVisitable;
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, AdtKind, CanonicalUserType, DefIdTree, EarlyBinder, GenericParamDefKind, Ty, UserType,
|
self, AdtKind, CanonicalUserType, DefIdTree, GenericParamDefKind, Ty, UserType,
|
||||||
};
|
};
|
||||||
use rustc_middle::ty::{GenericArgKind, InternalSubsts, SubstsRef, UserSelfTy, UserSubsts};
|
use rustc_middle::ty::{GenericArgKind, InternalSubsts, SubstsRef, UserSelfTy, UserSubsts};
|
||||||
use rustc_session::lint;
|
use rustc_session::lint;
|
||||||
@ -333,23 +333,7 @@ pub fn apply_adjustments(&self, expr: &hir::Expr<'_>, adj: Vec<Adjustment<'tcx>>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Basically whenever we are converting from a type scheme into
|
/// Instantiates and normalizes the bounds for a given item
|
||||||
/// the fn body space, we always want to normalize associated
|
|
||||||
/// types as well. This function combines the two.
|
|
||||||
// FIXME(compiler-errors): Remove this.
|
|
||||||
fn instantiate_type_scheme<T>(&self, span: Span, substs: SubstsRef<'tcx>, value: T) -> T
|
|
||||||
where
|
|
||||||
T: TypeFoldable<'tcx>,
|
|
||||||
{
|
|
||||||
debug!("instantiate_type_scheme(value={:?}, substs={:?})", value, substs);
|
|
||||||
let value = EarlyBinder(value).subst(self.tcx, substs);
|
|
||||||
let result = self.normalize(span, value);
|
|
||||||
debug!("instantiate_type_scheme = {:?}", result);
|
|
||||||
result
|
|
||||||
}
|
|
||||||
|
|
||||||
/// As `instantiate_type_scheme`, but for the bounds found in a
|
|
||||||
/// generic type scheme.
|
|
||||||
pub(in super::super) fn instantiate_bounds(
|
pub(in super::super) fn instantiate_bounds(
|
||||||
&self,
|
&self,
|
||||||
span: Span,
|
span: Span,
|
||||||
@ -1161,10 +1145,6 @@ pub fn instantiate_value_path(
|
|||||||
};
|
};
|
||||||
let def_id = res.def_id();
|
let def_id = res.def_id();
|
||||||
|
|
||||||
// The things we are substituting into the type should not contain
|
|
||||||
// escaping late-bound regions, and nor should the base type scheme.
|
|
||||||
let ty = tcx.type_of(def_id);
|
|
||||||
|
|
||||||
let arg_count = GenericArgCountResult {
|
let arg_count = GenericArgCountResult {
|
||||||
explicit_late_bound,
|
explicit_late_bound,
|
||||||
correct: if infer_args_for_err.is_empty() {
|
correct: if infer_args_for_err.is_empty() {
|
||||||
@ -1287,8 +1267,6 @@ fn inferred_kind(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
assert!(!substs.has_escaping_bound_vars());
|
|
||||||
assert!(!ty.has_escaping_bound_vars());
|
|
||||||
|
|
||||||
// First, store the "user substs" for later.
|
// First, store the "user substs" for later.
|
||||||
self.write_user_type_annotation_from_substs(hir_id, def_id, substs, user_self_ty);
|
self.write_user_type_annotation_from_substs(hir_id, def_id, substs, user_self_ty);
|
||||||
@ -1297,7 +1275,10 @@ fn inferred_kind(
|
|||||||
|
|
||||||
// Substitute the values for the type parameters into the type of
|
// Substitute the values for the type parameters into the type of
|
||||||
// the referenced item.
|
// the referenced item.
|
||||||
let ty_substituted = self.instantiate_type_scheme(span, &substs, ty);
|
let ty = tcx.bound_type_of(def_id);
|
||||||
|
assert!(!substs.has_escaping_bound_vars());
|
||||||
|
assert!(!ty.0.has_escaping_bound_vars());
|
||||||
|
let ty_substituted = self.normalize(span, ty.subst(tcx, substs));
|
||||||
|
|
||||||
if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
|
if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
|
||||||
// In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
|
// In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
|
||||||
@ -1305,9 +1286,7 @@ fn inferred_kind(
|
|||||||
// type parameters, which we can infer by unifying the provided `Self`
|
// type parameters, which we can infer by unifying the provided `Self`
|
||||||
// with the substituted impl type.
|
// with the substituted impl type.
|
||||||
// This also occurs for an enum variant on a type alias.
|
// This also occurs for an enum variant on a type alias.
|
||||||
let ty = tcx.type_of(impl_def_id);
|
let impl_ty = self.normalize(span, tcx.bound_type_of(impl_def_id).subst(tcx, substs));
|
||||||
|
|
||||||
let impl_ty = self.instantiate_type_scheme(span, &substs, ty);
|
|
||||||
match self.at(&self.misc(span), self.param_env).eq(impl_ty, self_ty) {
|
match self.at(&self.misc(span), self.param_env).eq(impl_ty, self_ty) {
|
||||||
Ok(ok) => self.register_infer_ok_obligations(ok),
|
Ok(ok) => self.register_infer_ok_obligations(ok),
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
|
@ -456,9 +456,9 @@ fn construct_obligation_for_trait(
|
|||||||
// Instantiate late-bound regions and substitute the trait
|
// Instantiate late-bound regions and substitute the trait
|
||||||
// parameters into the method type to get the actual method type.
|
// parameters into the method type to get the actual method type.
|
||||||
//
|
//
|
||||||
// N.B., instantiate late-bound regions first so that
|
// N.B., instantiate late-bound regions before normalizing the
|
||||||
// `instantiate_type_scheme` can normalize associated types that
|
// function signature so that normalization does not need to deal
|
||||||
// may reference those regions.
|
// with bound regions.
|
||||||
let fn_sig = tcx.bound_fn_sig(def_id);
|
let fn_sig = tcx.bound_fn_sig(def_id);
|
||||||
let fn_sig = fn_sig.subst(self.tcx, substs);
|
let fn_sig = fn_sig.subst(self.tcx, substs);
|
||||||
let fn_sig = self.replace_bound_vars_with_fresh_vars(span, infer::FnCall, fn_sig);
|
let fn_sig = self.replace_bound_vars_with_fresh_vars(span, infer::FnCall, fn_sig);
|
||||||
|
@ -3,11 +3,11 @@
|
|||||||
use crate::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
use crate::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
||||||
use crate::mir;
|
use crate::mir;
|
||||||
use crate::ty::layout::IntegerExt;
|
use crate::ty::layout::IntegerExt;
|
||||||
use crate::ty::{
|
|
||||||
self, DefIdTree, FallibleTypeFolder, Ty, TyCtxt, TypeFoldable, TypeFolder,
|
|
||||||
TypeSuperFoldable, TypeVisitable,
|
|
||||||
};
|
|
||||||
use crate::ty::query::TyCtxtAt;
|
use crate::ty::query::TyCtxtAt;
|
||||||
|
use crate::ty::{
|
||||||
|
self, DefIdTree, FallibleTypeFolder, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperFoldable,
|
||||||
|
TypeVisitable,
|
||||||
|
};
|
||||||
use crate::ty::{GenericArgKind, SubstsRef};
|
use crate::ty::{GenericArgKind, SubstsRef};
|
||||||
use rustc_apfloat::Float as _;
|
use rustc_apfloat::Float as _;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
|
Loading…
Reference in New Issue
Block a user