Auto merge of #116144 - lcnr:subst-less, r=oli-obk
subst -> instantiate continues #110793, there are still quite a few uses of `subst` and `substitute`, but changing them all in the same PR was a bit too much, so I've stopped here for now.
This commit is contained in:
commit
5ae769f06b
@ -1664,7 +1664,7 @@ fn lower_opaque_inner(
|
|||||||
lifetime.ident,
|
lifetime.ident,
|
||||||
));
|
));
|
||||||
|
|
||||||
// Now make an arg that we can use for the substs of the opaque tykind.
|
// Now make an arg that we can use for the generic params of the opaque tykind.
|
||||||
let id = self.next_node_id();
|
let id = self.next_node_id();
|
||||||
let lifetime_arg = self.new_named_lifetime_with_res(id, lifetime.ident, res);
|
let lifetime_arg = self.new_named_lifetime_with_res(id, lifetime.ident, res);
|
||||||
let duplicated_lifetime_def_id = self.local_def_id(duplicated_lifetime_node_id);
|
let duplicated_lifetime_def_id = self.local_def_id(duplicated_lifetime_node_id);
|
||||||
|
@ -27,7 +27,7 @@ pub(crate) struct RegionName {
|
|||||||
/// This helps to print the right kinds of diagnostics.
|
/// This helps to print the right kinds of diagnostics.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub(crate) enum RegionNameSource {
|
pub(crate) enum RegionNameSource {
|
||||||
/// A bound (not free) region that was substituted at the def site (not an HRTB).
|
/// A bound (not free) region that was instantiated at the def site (not an HRTB).
|
||||||
NamedEarlyBoundRegion(Span),
|
NamedEarlyBoundRegion(Span),
|
||||||
/// A free region that the user has a name (`'a`) for.
|
/// A free region that the user has a name (`'a`) for.
|
||||||
NamedFreeRegion(Span),
|
NamedFreeRegion(Span),
|
||||||
@ -619,7 +619,7 @@ fn try_match_adt_and_generic_args<'hir>(
|
|||||||
// programs, so we need to use delay_span_bug here. See #82126.
|
// programs, so we need to use delay_span_bug here. See #82126.
|
||||||
self.infcx.tcx.sess.delay_span_bug(
|
self.infcx.tcx.sess.delay_span_bug(
|
||||||
hir_arg.span(),
|
hir_arg.span(),
|
||||||
format!("unmatched subst and hir arg: found {kind:?} vs {hir_arg:?}"),
|
format!("unmatched arg and hir arg: found {kind:?} vs {hir_arg:?}"),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2250,7 +2250,7 @@ pub(crate) fn best_blame_constraint(
|
|||||||
|
|
||||||
pub(crate) fn universe_info(&self, universe: ty::UniverseIndex) -> UniverseInfo<'tcx> {
|
pub(crate) fn universe_info(&self, universe: ty::UniverseIndex) -> UniverseInfo<'tcx> {
|
||||||
// Query canonicalization can create local superuniverses (for example in
|
// Query canonicalization can create local superuniverses (for example in
|
||||||
// `InferCtx::query_response_substitution_guess`), but they don't have an associated
|
// `InferCtx::query_response_instantiation_guess`), but they don't have an associated
|
||||||
// `UniverseInfo` explaining why they were created.
|
// `UniverseInfo` explaining why they were created.
|
||||||
// This can cause ICEs if these causes are accessed in diagnostics, for example in issue
|
// This can cause ICEs if these causes are accessed in diagnostics, for example in issue
|
||||||
// #114907 where this happens via liveness and dropck outlives results.
|
// #114907 where this happens via liveness and dropck outlives results.
|
||||||
|
@ -1007,7 +1007,7 @@ fn new(
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn register_predefined_opaques_in_new_solver(&mut self) {
|
pub(super) fn register_predefined_opaques_in_new_solver(&mut self) {
|
||||||
// OK to use the identity substitutions for each opaque type key, since
|
// OK to use the identity arguments for each opaque type key, since
|
||||||
// we remap opaques from HIR typeck back to their definition params.
|
// we remap opaques from HIR typeck back to their definition params.
|
||||||
let opaques: Vec<_> = self
|
let opaques: Vec<_> = self
|
||||||
.infcx
|
.infcx
|
||||||
|
@ -639,10 +639,9 @@ fn compute_indices(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let global_mapping = iter::once((tcx.lifetimes.re_static, fr_static));
|
let global_mapping = iter::once((tcx.lifetimes.re_static, fr_static));
|
||||||
let subst_mapping =
|
let arg_mapping = iter::zip(identity_args.regions(), fr_args.regions().map(|r| r.as_var()));
|
||||||
iter::zip(identity_args.regions(), fr_args.regions().map(|r| r.as_var()));
|
|
||||||
|
|
||||||
UniversalRegionIndices { indices: global_mapping.chain(subst_mapping).collect(), fr_static }
|
UniversalRegionIndices { indices: global_mapping.chain(arg_mapping).collect(), fr_static }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compute_inputs_and_output(
|
fn compute_inputs_and_output(
|
||||||
|
@ -100,9 +100,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
stack = &stack[..index + ENCODE_METADATA.len()];
|
stack = &stack[..index + ENCODE_METADATA.len()];
|
||||||
}
|
}
|
||||||
|
|
||||||
const SUBST_AND_NORMALIZE_ERASING_REGIONS: &str = "rustc_middle::ty::normalize_erasing_regions::<impl rustc_middle::ty::context::TyCtxt>::subst_and_normalize_erasing_regions";
|
const INSTANTIATE_AND_NORMALIZE_ERASING_REGIONS: &str = "rustc_middle::ty::normalize_erasing_regions::<impl rustc_middle::ty::context::TyCtxt>::instantiate_and_normalize_erasing_regions";
|
||||||
if let Some(index) = stack.find(SUBST_AND_NORMALIZE_ERASING_REGIONS) {
|
if let Some(index) = stack.find(INSTANTIATE_AND_NORMALIZE_ERASING_REGIONS) {
|
||||||
stack = &stack[..index + SUBST_AND_NORMALIZE_ERASING_REGIONS.len()];
|
stack = &stack[..index + INSTANTIATE_AND_NORMALIZE_ERASING_REGIONS.len()];
|
||||||
}
|
}
|
||||||
|
|
||||||
const NORMALIZE_ERASING_LATE_BOUND_REGIONS: &str = "rustc_middle::ty::normalize_erasing_regions::<impl rustc_middle::ty::context::TyCtxt>::normalize_erasing_late_bound_regions";
|
const NORMALIZE_ERASING_LATE_BOUND_REGIONS: &str = "rustc_middle::ty::normalize_erasing_regions::<impl rustc_middle::ty::context::TyCtxt>::normalize_erasing_late_bound_regions";
|
||||||
|
@ -359,7 +359,7 @@ pub(crate) fn monomorphize<T>(&self, value: T) -> T
|
|||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>> + Copy,
|
T: TypeFoldable<TyCtxt<'tcx>> + Copy,
|
||||||
{
|
{
|
||||||
self.instance.subst_mir_and_normalize_erasing_regions(
|
self.instance.instantiate_mir_and_normalize_erasing_regions(
|
||||||
self.tcx,
|
self.tcx,
|
||||||
ty::ParamEnv::reveal_all(),
|
ty::ParamEnv::reveal_all(),
|
||||||
ty::EarlyBinder::bind(value),
|
ty::EarlyBinder::bind(value),
|
||||||
|
@ -90,7 +90,7 @@ fn make_mir_scope<'ll, 'tcx>(
|
|||||||
Some((callee, _)) => {
|
Some((callee, _)) => {
|
||||||
// FIXME(eddyb) this would be `self.monomorphize(&callee)`
|
// FIXME(eddyb) this would be `self.monomorphize(&callee)`
|
||||||
// if this is moved to `rustc_codegen_ssa::mir::debuginfo`.
|
// if this is moved to `rustc_codegen_ssa::mir::debuginfo`.
|
||||||
let callee = cx.tcx.subst_and_normalize_erasing_regions(
|
let callee = cx.tcx.instantiate_and_normalize_erasing_regions(
|
||||||
instance.args,
|
instance.args,
|
||||||
ty::ParamEnv::reveal_all(),
|
ty::ParamEnv::reveal_all(),
|
||||||
ty::EarlyBinder::bind(callee),
|
ty::EarlyBinder::bind(callee),
|
||||||
|
@ -529,7 +529,7 @@ fn get_containing_scope<'ll, 'tcx>(
|
|||||||
if let Some(impl_def_id) = cx.tcx.impl_of_method(instance.def_id()) {
|
if let Some(impl_def_id) = cx.tcx.impl_of_method(instance.def_id()) {
|
||||||
// If the method does *not* belong to a trait, proceed
|
// If the method does *not* belong to a trait, proceed
|
||||||
if cx.tcx.trait_id_of_impl(impl_def_id).is_none() {
|
if cx.tcx.trait_id_of_impl(impl_def_id).is_none() {
|
||||||
let impl_self_ty = cx.tcx.subst_and_normalize_erasing_regions(
|
let impl_self_ty = cx.tcx.instantiate_and_normalize_erasing_regions(
|
||||||
instance.args,
|
instance.args,
|
||||||
ty::ParamEnv::reveal_all(),
|
ty::ParamEnv::reveal_all(),
|
||||||
cx.tcx.type_of(impl_def_id),
|
cx.tcx.type_of(impl_def_id),
|
||||||
|
@ -118,7 +118,7 @@ pub fn monomorphize<T>(&self, value: T) -> T
|
|||||||
T: Copy + TypeFoldable<TyCtxt<'tcx>>,
|
T: Copy + TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
debug!("monomorphize: self.instance={:?}", self.instance);
|
debug!("monomorphize: self.instance={:?}", self.instance);
|
||||||
self.instance.subst_mir_and_normalize_erasing_regions(
|
self.instance.instantiate_mir_and_normalize_erasing_regions(
|
||||||
self.cx.tcx(),
|
self.cx.tcx(),
|
||||||
ty::ParamEnv::reveal_all(),
|
ty::ParamEnv::reveal_all(),
|
||||||
ty::EarlyBinder::bind(value),
|
ty::EarlyBinder::bind(value),
|
||||||
|
@ -569,7 +569,7 @@ pub(super) fn subst_from_frame_and_normalize_erasing_regions<T: TypeFoldable<TyC
|
|||||||
) -> Result<T, ErrorHandled> {
|
) -> Result<T, ErrorHandled> {
|
||||||
frame
|
frame
|
||||||
.instance
|
.instance
|
||||||
.try_subst_mir_and_normalize_erasing_regions(
|
.try_instantiate_mir_and_normalize_erasing_regions(
|
||||||
*self.tcx,
|
*self.tcx,
|
||||||
self.param_env,
|
self.param_env,
|
||||||
ty::EarlyBinder::bind(value),
|
ty::EarlyBinder::bind(value),
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
};
|
};
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
|
|
||||||
/// Checks whether a type contains generic parameters which require substitution.
|
/// Checks whether a type contains generic parameters which must be instantiated.
|
||||||
///
|
///
|
||||||
/// In case it does, returns a `TooGeneric` const eval error. Note that due to polymorphization
|
/// In case it does, returns a `TooGeneric` const eval error. Note that due to polymorphization
|
||||||
/// types may be "concrete enough" even though they still contain generic parameters in
|
/// types may be "concrete enough" even though they still contain generic parameters in
|
||||||
@ -43,7 +43,8 @@ fn visit_ty(&mut self, ty: Ty<'tcx>) -> ControlFlow<Self::BreakTy> {
|
|||||||
.try_into()
|
.try_into()
|
||||||
.expect("more generic parameters than can fit into a `u32`");
|
.expect("more generic parameters than can fit into a `u32`");
|
||||||
// Only recurse when generic parameters in fns, closures and generators
|
// Only recurse when generic parameters in fns, closures and generators
|
||||||
// are used and require substitution.
|
// are used and have to be instantiated.
|
||||||
|
//
|
||||||
// Just in case there are closures or generators within this subst,
|
// Just in case there are closures or generators within this subst,
|
||||||
// recurse.
|
// recurse.
|
||||||
if unused_params.is_used(index) && subst.has_param() {
|
if unused_params.is_used(index) && subst.has_param() {
|
||||||
|
@ -558,8 +558,8 @@ fn visit_source_scope(&mut self, scope: SourceScope) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A faster version of the validation pass that only checks those things which may break when apply
|
/// A faster version of the validation pass that only checks those things which may break when
|
||||||
/// generic substitutions.
|
/// instantiating any generic parameters.
|
||||||
pub fn validate_types<'tcx>(
|
pub fn validate_types<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
mir_phase: MirPhase,
|
mir_phase: MirPhase,
|
||||||
|
@ -162,14 +162,13 @@ fn foo<T>(x: T) {
|
|||||||
```
|
```
|
||||||
|
|
||||||
The machine code for `foo::<u8>()`, `foo::<bool>()`, `foo::<String>()`, or any
|
The machine code for `foo::<u8>()`, `foo::<bool>()`, `foo::<String>()`, or any
|
||||||
other type substitution is different. Hence the compiler generates the
|
other instantiation is different. Hence the compiler generates the
|
||||||
implementation on-demand. If you call `foo()` with a `bool` parameter, the
|
implementation on-demand. If you call `foo()` with a `bool` parameter, the
|
||||||
compiler will only generate code for `foo::<bool>()`. When we have additional
|
compiler will only generate code for `foo::<bool>()`. When we have additional
|
||||||
type parameters, the number of monomorphized implementations the compiler
|
type parameters, the number of monomorphized implementations the compiler
|
||||||
generates does not grow drastically, since the compiler will only generate an
|
generates does not grow drastically, since the compiler will only generate an
|
||||||
implementation if the function is called with unparameterized substitutions
|
implementation if the function is called with fully concrete arguments
|
||||||
(i.e., substitutions where none of the substituted types are themselves
|
(i.e., arguments which do not contain any generic parameters).
|
||||||
parameterized).
|
|
||||||
|
|
||||||
However, with trait objects we have to make a table containing _every_ object
|
However, with trait objects we have to make a table containing _every_ object
|
||||||
that implements the trait. Now, if it has type parameters, we need to add
|
that implements the trait. Now, if it has type parameters, we need to add
|
||||||
|
@ -427,7 +427,7 @@ pub(super) fn add_predicates_for_ast_type_binding(
|
|||||||
let bound_vars = tcx.late_bound_vars(binding.hir_id);
|
let bound_vars = tcx.late_bound_vars(binding.hir_id);
|
||||||
ty::Binder::bind_with_vars(subst_output, bound_vars)
|
ty::Binder::bind_with_vars(subst_output, bound_vars)
|
||||||
} else {
|
} else {
|
||||||
// Include substitutions for generic parameters of associated types
|
// Append the generic arguments of the associated type to the `trait_ref`.
|
||||||
candidate.map_bound(|trait_ref| {
|
candidate.map_bound(|trait_ref| {
|
||||||
let ident = Ident::new(assoc_item.name, binding.item_name.span);
|
let ident = Ident::new(assoc_item.name, binding.item_name.span);
|
||||||
let item_segment = hir::PathSegment {
|
let item_segment = hir::PathSegment {
|
||||||
|
@ -139,22 +139,22 @@ fn generic_arg_mismatch_err(
|
|||||||
err.emit()
|
err.emit()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates the relevant generic argument substitutions
|
/// Creates the relevant generic arguments
|
||||||
/// corresponding to a set of generic parameters. This is a
|
/// corresponding to a set of generic parameters. This is a
|
||||||
/// rather complex function. Let us try to explain the role
|
/// rather complex function. Let us try to explain the role
|
||||||
/// of each of its parameters:
|
/// of each of its parameters:
|
||||||
///
|
///
|
||||||
/// To start, we are given the `def_id` of the thing we are
|
/// To start, we are given the `def_id` of the thing whose generic
|
||||||
/// creating the substitutions for, and a partial set of
|
/// parameters we are instantiating, and a partial set of
|
||||||
/// substitutions `parent_args`. In general, the substitutions
|
/// arguments `parent_args`. In general, the generic arguments
|
||||||
/// for an item begin with substitutions for all the "parents" of
|
/// for an item begin with arguments for all the "parents" of
|
||||||
/// that item -- e.g., for a method it might include the
|
/// that item -- e.g., for a method it might include the
|
||||||
/// parameters from the impl.
|
/// parameters from the impl.
|
||||||
///
|
///
|
||||||
/// Therefore, the method begins by walking down these parents,
|
/// Therefore, the method begins by walking down these parents,
|
||||||
/// starting with the outermost parent and proceed inwards until
|
/// starting with the outermost parent and proceed inwards until
|
||||||
/// it reaches `def_id`. For each parent `P`, it will check `parent_args`
|
/// it reaches `def_id`. For each parent `P`, it will check `parent_args`
|
||||||
/// first to see if the parent's substitutions are listed in there. If so,
|
/// first to see if the parent's arguments are listed in there. If so,
|
||||||
/// we can append those and move on. Otherwise, it invokes the
|
/// we can append those and move on. Otherwise, it invokes the
|
||||||
/// three callback functions:
|
/// three callback functions:
|
||||||
///
|
///
|
||||||
@ -188,7 +188,7 @@ pub fn create_args_for_parent_generic_args<'tcx, 'a>(
|
|||||||
stack.push((def_id, parent_defs));
|
stack.push((def_id, parent_defs));
|
||||||
}
|
}
|
||||||
|
|
||||||
// We manually build up the substitution, rather than using convenience
|
// We manually build up the generic arguments, rather than using convenience
|
||||||
// methods in `subst.rs`, so that we can iterate over the arguments and
|
// methods in `subst.rs`, so that we can iterate over the arguments and
|
||||||
// parameters in lock-step linearly, instead of trying to match each pair.
|
// parameters in lock-step linearly, instead of trying to match each pair.
|
||||||
let mut args: SmallVec<[ty::GenericArg<'tcx>; 8]> = SmallVec::with_capacity(count);
|
let mut args: SmallVec<[ty::GenericArg<'tcx>; 8]> = SmallVec::with_capacity(count);
|
||||||
@ -196,7 +196,8 @@ pub fn create_args_for_parent_generic_args<'tcx, 'a>(
|
|||||||
while let Some((def_id, defs)) = stack.pop() {
|
while let Some((def_id, defs)) = stack.pop() {
|
||||||
let mut params = defs.params.iter().peekable();
|
let mut params = defs.params.iter().peekable();
|
||||||
|
|
||||||
// If we have already computed substitutions for parents, we can use those directly.
|
// If we have already computed the generic arguments for parents,
|
||||||
|
// we can use those directly.
|
||||||
while let Some(¶m) = params.peek() {
|
while let Some(¶m) = params.peek() {
|
||||||
if let Some(&kind) = parent_args.get(param.index as usize) {
|
if let Some(&kind) = parent_args.get(param.index as usize) {
|
||||||
args.push(kind);
|
args.push(kind);
|
||||||
|
@ -289,7 +289,7 @@ pub fn ast_region_to_region(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Given a path `path` that refers to an item `I` with the declared generics `decl_generics`,
|
/// Given a path `path` that refers to an item `I` with the declared generics `decl_generics`,
|
||||||
/// returns an appropriate set of substitutions for this particular reference to `I`.
|
/// returns an appropriate set of generic arguments for this particular reference to `I`.
|
||||||
pub fn ast_path_args_for_ty(
|
pub fn ast_path_args_for_ty(
|
||||||
&self,
|
&self,
|
||||||
span: Span,
|
span: Span,
|
||||||
@ -315,7 +315,7 @@ pub fn ast_path_args_for_ty(
|
|||||||
|
|
||||||
/// Given the type/lifetime/const arguments provided to some path (along with
|
/// Given the type/lifetime/const arguments provided to some path (along with
|
||||||
/// an implicit `Self`, if this is a trait reference), returns the complete
|
/// an implicit `Self`, if this is a trait reference), returns the complete
|
||||||
/// set of substitutions. This may involve applying defaulted type parameters.
|
/// set of generic arguments. This may involve applying defaulted type parameters.
|
||||||
/// Constraints on associated types are created from `create_assoc_bindings_for_generic_args`.
|
/// Constraints on associated types are created from `create_assoc_bindings_for_generic_args`.
|
||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
|
@ -118,7 +118,7 @@ impl<'tcx> Instance<'tcx> {
|
|||||||
/// lifetimes erased, allowing a `ParamEnv` to be specified for use during normalization.
|
/// lifetimes erased, allowing a `ParamEnv` to be specified for use during normalization.
|
||||||
pub fn ty(&self, tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>) -> Ty<'tcx> {
|
pub fn ty(&self, tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>) -> Ty<'tcx> {
|
||||||
let ty = tcx.type_of(self.def.def_id());
|
let ty = tcx.type_of(self.def.def_id());
|
||||||
tcx.subst_and_normalize_erasing_regions(self.args, param_env, ty)
|
tcx.instantiate_and_normalize_erasing_regions(self.args, param_env, ty)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Finds a crate that contains a monomorphization of this instance that
|
/// Finds a crate that contains a monomorphization of this instance that
|
||||||
@ -580,7 +580,7 @@ fn args_for_mir_body(&self) -> Option<GenericArgsRef<'tcx>> {
|
|||||||
self.def.has_polymorphic_mir_body().then_some(self.args)
|
self.def.has_polymorphic_mir_body().then_some(self.args)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn subst_mir<T>(&self, tcx: TyCtxt<'tcx>, v: EarlyBinder<&T>) -> T
|
pub fn instantiate_mir<T>(&self, tcx: TyCtxt<'tcx>, v: EarlyBinder<&T>) -> T
|
||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>> + Copy,
|
T: TypeFoldable<TyCtxt<'tcx>> + Copy,
|
||||||
{
|
{
|
||||||
@ -593,7 +593,7 @@ pub fn subst_mir<T>(&self, tcx: TyCtxt<'tcx>, v: EarlyBinder<&T>) -> T
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn subst_mir_and_normalize_erasing_regions<T>(
|
pub fn instantiate_mir_and_normalize_erasing_regions<T>(
|
||||||
&self,
|
&self,
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
@ -603,14 +603,14 @@ pub fn subst_mir_and_normalize_erasing_regions<T>(
|
|||||||
T: TypeFoldable<TyCtxt<'tcx>> + Clone,
|
T: TypeFoldable<TyCtxt<'tcx>> + Clone,
|
||||||
{
|
{
|
||||||
if let Some(args) = self.args_for_mir_body() {
|
if let Some(args) = self.args_for_mir_body() {
|
||||||
tcx.subst_and_normalize_erasing_regions(args, param_env, v)
|
tcx.instantiate_and_normalize_erasing_regions(args, param_env, v)
|
||||||
} else {
|
} else {
|
||||||
tcx.normalize_erasing_regions(param_env, v.skip_binder())
|
tcx.normalize_erasing_regions(param_env, v.skip_binder())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn try_subst_mir_and_normalize_erasing_regions<T>(
|
pub fn try_instantiate_mir_and_normalize_erasing_regions<T>(
|
||||||
&self,
|
&self,
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
@ -620,7 +620,7 @@ pub fn try_subst_mir_and_normalize_erasing_regions<T>(
|
|||||||
T: TypeFoldable<TyCtxt<'tcx>> + Clone,
|
T: TypeFoldable<TyCtxt<'tcx>> + Clone,
|
||||||
{
|
{
|
||||||
if let Some(args) = self.args_for_mir_body() {
|
if let Some(args) = self.args_for_mir_body() {
|
||||||
tcx.try_subst_and_normalize_erasing_regions(args, param_env, v)
|
tcx.try_instantiate_and_normalize_erasing_regions(args, param_env, v)
|
||||||
} else {
|
} else {
|
||||||
tcx.try_normalize_erasing_regions(param_env, v.skip_binder())
|
tcx.try_normalize_erasing_regions(param_env, v.skip_binder())
|
||||||
}
|
}
|
||||||
|
@ -134,8 +134,9 @@ pub fn try_normalize_erasing_late_bound_regions<T>(
|
|||||||
/// in-scope substitutions and then normalizing any associated
|
/// in-scope substitutions and then normalizing any associated
|
||||||
/// types.
|
/// types.
|
||||||
/// Panics if normalization fails. In case normalization might fail
|
/// Panics if normalization fails. In case normalization might fail
|
||||||
/// use `try_subst_and_normalize_erasing_regions` instead.
|
/// use `try_instantiate_and_normalize_erasing_regions` instead.
|
||||||
pub fn subst_and_normalize_erasing_regions<T>(
|
#[instrument(level = "debug", skip(self))]
|
||||||
|
pub fn instantiate_and_normalize_erasing_regions<T>(
|
||||||
self,
|
self,
|
||||||
param_args: GenericArgsRef<'tcx>,
|
param_args: GenericArgsRef<'tcx>,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
@ -144,22 +145,16 @@ pub fn subst_and_normalize_erasing_regions<T>(
|
|||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
debug!(
|
|
||||||
"subst_and_normalize_erasing_regions(\
|
|
||||||
param_args={:?}, \
|
|
||||||
value={:?}, \
|
|
||||||
param_env={:?})",
|
|
||||||
param_args, value, param_env,
|
|
||||||
);
|
|
||||||
let substituted = value.instantiate(self, param_args);
|
let substituted = value.instantiate(self, param_args);
|
||||||
self.normalize_erasing_regions(param_env, substituted)
|
self.normalize_erasing_regions(param_env, substituted)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Monomorphizes a type from the AST by first applying the
|
/// Monomorphizes a type from the AST by first applying the
|
||||||
/// in-scope substitutions and then trying to normalize any associated
|
/// in-scope substitutions and then trying to normalize any associated
|
||||||
/// types. Contrary to `subst_and_normalize_erasing_regions` this does
|
/// types. Contrary to `instantiate_and_normalize_erasing_regions` this does
|
||||||
/// not assume that normalization succeeds.
|
/// not assume that normalization succeeds.
|
||||||
pub fn try_subst_and_normalize_erasing_regions<T>(
|
#[instrument(level = "debug", skip(self))]
|
||||||
|
pub fn try_instantiate_and_normalize_erasing_regions<T>(
|
||||||
self,
|
self,
|
||||||
param_args: GenericArgsRef<'tcx>,
|
param_args: GenericArgsRef<'tcx>,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
@ -168,13 +163,6 @@ pub fn try_subst_and_normalize_erasing_regions<T>(
|
|||||||
where
|
where
|
||||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
debug!(
|
|
||||||
"subst_and_normalize_erasing_regions(\
|
|
||||||
param_args={:?}, \
|
|
||||||
value={:?}, \
|
|
||||||
param_env={:?})",
|
|
||||||
param_args, value, param_env,
|
|
||||||
);
|
|
||||||
let substituted = value.instantiate(self, param_args);
|
let substituted = value.instantiate(self, param_args);
|
||||||
self.try_normalize_erasing_regions(param_env, substituted)
|
self.try_normalize_erasing_regions(param_env, substituted)
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ fn try_inlining(
|
|||||||
return Err("optimization fuel exhausted");
|
return Err("optimization fuel exhausted");
|
||||||
}
|
}
|
||||||
|
|
||||||
let Ok(callee_body) = callsite.callee.try_subst_mir_and_normalize_erasing_regions(
|
let Ok(callee_body) = callsite.callee.try_instantiate_mir_and_normalize_erasing_regions(
|
||||||
self.tcx,
|
self.tcx,
|
||||||
self.param_env,
|
self.param_env,
|
||||||
ty::EarlyBinder::bind(callee_body.clone()),
|
ty::EarlyBinder::bind(callee_body.clone()),
|
||||||
@ -481,9 +481,10 @@ fn check_mir_body(
|
|||||||
work_list.push(target);
|
work_list.push(target);
|
||||||
|
|
||||||
// If the place doesn't actually need dropping, treat it like a regular goto.
|
// If the place doesn't actually need dropping, treat it like a regular goto.
|
||||||
let ty = callsite
|
let ty = callsite.callee.instantiate_mir(
|
||||||
.callee
|
self.tcx,
|
||||||
.subst_mir(self.tcx, ty::EarlyBinder::bind(&place.ty(callee_body, tcx).ty));
|
ty::EarlyBinder::bind(&place.ty(callee_body, tcx).ty),
|
||||||
|
);
|
||||||
if ty.needs_drop(tcx, self.param_env) && let UnwindAction::Cleanup(unwind) = unwind {
|
if ty.needs_drop(tcx, self.param_env) && let UnwindAction::Cleanup(unwind) = unwind {
|
||||||
work_list.push(unwind);
|
work_list.push(unwind);
|
||||||
}
|
}
|
||||||
@ -650,7 +651,7 @@ fn dest_needs_borrow(place: Place<'_>) -> bool {
|
|||||||
// Copy only unevaluated constants from the callee_body into the caller_body.
|
// Copy only unevaluated constants from the callee_body into the caller_body.
|
||||||
// Although we are only pushing `ConstKind::Unevaluated` consts to
|
// Although we are only pushing `ConstKind::Unevaluated` consts to
|
||||||
// `required_consts`, here we may not only have `ConstKind::Unevaluated`
|
// `required_consts`, here we may not only have `ConstKind::Unevaluated`
|
||||||
// because we are calling `subst_and_normalize_erasing_regions`.
|
// because we are calling `instantiate_and_normalize_erasing_regions`.
|
||||||
caller_body.required_consts.extend(
|
caller_body.required_consts.extend(
|
||||||
callee_body.required_consts.iter().copied().filter(|&ct| match ct.const_ {
|
callee_body.required_consts.iter().copied().filter(|&ct| match ct.const_ {
|
||||||
Const::Ty(_) => {
|
Const::Ty(_) => {
|
||||||
@ -811,9 +812,10 @@ fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, _: Location) {
|
|||||||
match terminator.kind {
|
match terminator.kind {
|
||||||
TerminatorKind::Drop { ref place, unwind, .. } => {
|
TerminatorKind::Drop { ref place, unwind, .. } => {
|
||||||
// If the place doesn't actually need dropping, treat it like a regular goto.
|
// If the place doesn't actually need dropping, treat it like a regular goto.
|
||||||
let ty = self
|
let ty = self.instance.instantiate_mir(
|
||||||
.instance
|
tcx,
|
||||||
.subst_mir(tcx, ty::EarlyBinder::bind(&place.ty(self.callee_body, tcx).ty));
|
ty::EarlyBinder::bind(&place.ty(self.callee_body, tcx).ty),
|
||||||
|
);
|
||||||
if ty.needs_drop(tcx, self.param_env) {
|
if ty.needs_drop(tcx, self.param_env) {
|
||||||
self.cost += CALL_PENALTY;
|
self.cost += CALL_PENALTY;
|
||||||
if let UnwindAction::Cleanup(_) = unwind {
|
if let UnwindAction::Cleanup(_) = unwind {
|
||||||
@ -824,7 +826,8 @@ fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, _: Location) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
TerminatorKind::Call { func: Operand::Constant(ref f), unwind, .. } => {
|
TerminatorKind::Call { func: Operand::Constant(ref f), unwind, .. } => {
|
||||||
let fn_ty = self.instance.subst_mir(tcx, ty::EarlyBinder::bind(&f.const_.ty()));
|
let fn_ty =
|
||||||
|
self.instance.instantiate_mir(tcx, ty::EarlyBinder::bind(&f.const_.ty()));
|
||||||
self.cost += if let ty::FnDef(def_id, _) = *fn_ty.kind() && tcx.is_intrinsic(def_id) {
|
self.cost += if let ty::FnDef(def_id, _) = *fn_ty.kind() && tcx.is_intrinsic(def_id) {
|
||||||
// Don't give intrinsics the extra penalty for calls
|
// Don't give intrinsics the extra penalty for calls
|
||||||
INSTR_COST
|
INSTR_COST
|
||||||
|
@ -44,7 +44,7 @@ fn process<'tcx>(
|
|||||||
) -> bool {
|
) -> bool {
|
||||||
trace!(%caller);
|
trace!(%caller);
|
||||||
for &(callee, args) in tcx.mir_inliner_callees(caller.def) {
|
for &(callee, args) in tcx.mir_inliner_callees(caller.def) {
|
||||||
let Ok(args) = caller.try_subst_mir_and_normalize_erasing_regions(
|
let Ok(args) = caller.try_instantiate_mir_and_normalize_erasing_regions(
|
||||||
tcx,
|
tcx,
|
||||||
param_env,
|
param_env,
|
||||||
ty::EarlyBinder::bind(args),
|
ty::EarlyBinder::bind(args),
|
||||||
|
@ -606,7 +606,7 @@ pub fn monomorphize<T>(&self, value: T) -> T
|
|||||||
T: TypeFoldable<TyCtxt<'tcx>>,
|
T: TypeFoldable<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
debug!("monomorphize: self.instance={:?}", self.instance);
|
debug!("monomorphize: self.instance={:?}", self.instance);
|
||||||
self.instance.subst_mir_and_normalize_erasing_regions(
|
self.instance.instantiate_mir_and_normalize_erasing_regions(
|
||||||
self.tcx,
|
self.tcx,
|
||||||
ty::ParamEnv::reveal_all(),
|
ty::ParamEnv::reveal_all(),
|
||||||
ty::EarlyBinder::bind(value),
|
ty::EarlyBinder::bind(value),
|
||||||
|
@ -647,7 +647,7 @@ fn characteristic_def_id_of_mono_item<'tcx>(
|
|||||||
// parameters, but the self-type of their impl block do will fail to normalize.
|
// parameters, but the self-type of their impl block do will fail to normalize.
|
||||||
if !tcx.sess.opts.unstable_opts.polymorphize || !instance.has_param() {
|
if !tcx.sess.opts.unstable_opts.polymorphize || !instance.has_param() {
|
||||||
// This is a method within an impl, find out what the self-type is:
|
// This is a method within an impl, find out what the self-type is:
|
||||||
let impl_self_ty = tcx.subst_and_normalize_erasing_regions(
|
let impl_self_ty = tcx.instantiate_and_normalize_erasing_regions(
|
||||||
instance.args,
|
instance.args,
|
||||||
ty::ParamEnv::reveal_all(),
|
ty::ParamEnv::reveal_all(),
|
||||||
tcx.type_of(impl_def_id),
|
tcx.type_of(impl_def_id),
|
||||||
|
@ -26,12 +26,12 @@ pub(crate) fn dump_closure_profile<'tcx>(tcx: TyCtxt<'tcx>, closure_instance: In
|
|||||||
let ClosureSizeProfileData { before_feature_tys, after_feature_tys } =
|
let ClosureSizeProfileData { before_feature_tys, after_feature_tys } =
|
||||||
typeck_results.closure_size_eval[&closure_def_id];
|
typeck_results.closure_size_eval[&closure_def_id];
|
||||||
|
|
||||||
let before_feature_tys = tcx.subst_and_normalize_erasing_regions(
|
let before_feature_tys = tcx.instantiate_and_normalize_erasing_regions(
|
||||||
closure_instance.args,
|
closure_instance.args,
|
||||||
param_env,
|
param_env,
|
||||||
ty::EarlyBinder::bind(before_feature_tys),
|
ty::EarlyBinder::bind(before_feature_tys),
|
||||||
);
|
);
|
||||||
let after_feature_tys = tcx.subst_and_normalize_erasing_regions(
|
let after_feature_tys = tcx.instantiate_and_normalize_erasing_regions(
|
||||||
closure_instance.args,
|
closure_instance.args,
|
||||||
param_env,
|
param_env,
|
||||||
ty::EarlyBinder::bind(after_feature_tys),
|
ty::EarlyBinder::bind(after_feature_tys),
|
||||||
|
@ -401,7 +401,7 @@ fn can_change_type<'a>(cx: &LateContext<'a>, mut expr: &'a Expr<'a>, mut ty: Ty<
|
|||||||
= get_callee_generic_args_and_args(cx, parent_expr)
|
= get_callee_generic_args_and_args(cx, parent_expr)
|
||||||
{
|
{
|
||||||
// FIXME: the `instantiate_identity()` below seems incorrect, since we eventually
|
// FIXME: the `instantiate_identity()` below seems incorrect, since we eventually
|
||||||
// call `tcx.try_subst_and_normalize_erasing_regions` further down
|
// call `tcx.try_instantiate_and_normalize_erasing_regions` further down
|
||||||
// (i.e., we are explicitly not in the identity context).
|
// (i.e., we are explicitly not in the identity context).
|
||||||
let fn_sig = cx.tcx.fn_sig(callee_def_id).instantiate_identity().skip_binder();
|
let fn_sig = cx.tcx.fn_sig(callee_def_id).instantiate_identity().skip_binder();
|
||||||
if let Some(arg_index) = recv.into_iter().chain(call_args).position(|arg| arg.hir_id == expr.hir_id)
|
if let Some(arg_index) = recv.into_iter().chain(call_args).position(|arg| arg.hir_id == expr.hir_id)
|
||||||
@ -452,7 +452,7 @@ fn can_change_type<'a>(cx: &LateContext<'a>, mut expr: &'a Expr<'a>, mut ty: Ty<
|
|||||||
|
|
||||||
let output_ty = fn_sig.output();
|
let output_ty = fn_sig.output();
|
||||||
if output_ty.contains(*param_ty) {
|
if output_ty.contains(*param_ty) {
|
||||||
if let Ok(new_ty) = cx.tcx.try_subst_and_normalize_erasing_regions(
|
if let Ok(new_ty) = cx.tcx.try_instantiate_and_normalize_erasing_regions(
|
||||||
new_subst, cx.param_env, EarlyBinder::bind(output_ty)) {
|
new_subst, cx.param_env, EarlyBinder::bind(output_ty)) {
|
||||||
expr = parent_expr;
|
expr = parent_expr;
|
||||||
ty = new_ty;
|
ty = new_ty;
|
||||||
|
Loading…
Reference in New Issue
Block a user