fix all errors

This commit is contained in:
Adwin White
2026-04-15 12:17:20 +08:00
parent 3e1e35b5d1
commit 6279106e72
334 changed files with 2352 additions and 1390 deletions
@@ -14,7 +14,7 @@
};
use rustc_middle::ty::error::TypeError;
use rustc_middle::ty::{
self, RePlaceholder, Region, RegionVid, Ty, TyCtxt, TypeFoldable, UniverseIndex,
self, RePlaceholder, Region, RegionVid, Ty, TyCtxt, TypeFoldable, UniverseIndex, Unnormalized,
};
use rustc_span::Span;
use rustc_trait_selection::error_reporting::InferCtxtErrorExt;
@@ -275,7 +275,7 @@ fn nice_error<'infcx>(
// the former fails to normalize the `nll/relate_tys/impl-fn-ignore-binder-via-bottom.rs`
// test. Check after #85499 lands to see if its fixes have erased this difference.
let ty::ParamEnvAnd { param_env, value } = key;
let _ = ocx.normalize(&cause, param_env, value.value);
let _ = ocx.normalize(&cause, param_env, Unnormalized::new_wip(value.value));
let diag = try_extract_error_from_fulfill_cx(
&ocx,
@@ -322,7 +322,7 @@ fn nice_error<'infcx>(
let ocx = ObligationCtxt::new(&infcx);
let ty::ParamEnvAnd { param_env, value } = key;
let _ = ocx.deeply_normalize(&cause, param_env, value.value);
let _ = ocx.deeply_normalize(&cause, param_env, Unnormalized::new_wip(value.value));
let diag = try_extract_error_from_fulfill_cx(
&ocx,
@@ -754,19 +754,19 @@ fn suggest_borrow_generic_arg(
}
// Test the callee's predicates, substituting in `ref_ty` for the moved argument type.
clauses.instantiate(tcx, new_args).predicates.iter().all(|&(mut clause)| {
clauses.instantiate(tcx, new_args).predicates.iter().all(|clause| {
// Normalize before testing to see through type aliases and projections.
if let Ok(normalized) = tcx.try_normalize_erasing_regions(
let normalized = tcx
.try_normalize_erasing_regions(
self.infcx.typing_env(self.infcx.param_env),
clause,
) {
clause = normalized;
}
*clause,
)
.unwrap_or_else(|_| clause.skip_norm_wip());
self.infcx.predicate_must_hold_modulo_regions(&Obligation::new(
tcx,
ObligationCause::dummy(),
self.infcx.param_env,
clause,
normalized,
))
})
}) {
@@ -4222,11 +4222,20 @@ fn annotate_argument_and_return_for_borrow(
if is_closure {
None
} else {
let ty = self.infcx.tcx.type_of(self.mir_def_id()).instantiate_identity();
let ty = self
.infcx
.tcx
.type_of(self.mir_def_id())
.instantiate_identity()
.skip_norm_wip();
match ty.kind() {
ty::FnDef(_, _) | ty::FnPtr(..) => self.annotate_fn_sig(
self.mir_def_id(),
self.infcx.tcx.fn_sig(self.mir_def_id()).instantiate_identity(),
self.infcx
.tcx
.fn_sig(self.mir_def_id())
.instantiate_identity()
.skip_norm_wip(),
),
_ => None,
}
@@ -1366,9 +1366,12 @@ fn explain_captures(
let parent_self_ty =
matches!(tcx.def_kind(parent_did), rustc_hir::def::DefKind::Impl { .. })
.then_some(parent_did)
.and_then(|did| match tcx.type_of(did).instantiate_identity().kind() {
.and_then(|did| {
match tcx.type_of(did).instantiate_identity().skip_norm_wip().kind()
{
ty::Adt(def, ..) => Some(def.did()),
_ => None,
}
});
let is_option_or_result = parent_self_ty.is_some_and(|def_id| {
matches!(tcx.get_diagnostic_name(def_id), Some(sym::Option | sym::Result))
@@ -1445,7 +1448,10 @@ fn explain_captures(
&& let self_ty = self.infcx.instantiate_binder_with_fresh_vars(
fn_call_span,
BoundRegionConversionTime::FnCall,
tcx.fn_sig(method_did).instantiate(tcx, method_args).input(0),
tcx.fn_sig(method_did)
.instantiate(tcx, method_args)
.skip_norm_wip()
.input(0),
)
&& self.infcx.can_eq(self.infcx.param_env, ty, self_ty)
{
@@ -640,8 +640,9 @@ fn get_closure_bound_clause_span(
// Check whether one of the where-bounds requires the closure to impl `Fn[Mut]`
// or `AsyncFn[Mut]`.
for (pred, span) in predicates.predicates.iter().zip(predicates.spans.iter()) {
let pred = pred.skip_norm_wip();
let dominated_by_fn_trait = self
.closure_clause_kind(*pred, def_id, asyncness)
.closure_clause_kind(pred, def_id, asyncness)
.is_some_and(|kind| matches!(kind, ty::ClosureKind::Fn | ty::ClosureKind::FnMut));
if dominated_by_fn_trait {
// Found `<TyOfCapturingClosure as FnMut>` or
@@ -9,6 +9,7 @@
use rustc_middle::mir::{self, ConstraintCategory, Location};
use rustc_middle::ty::{
self, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor,
Unnormalized,
};
use rustc_span::Span;
use rustc_trait_selection::error_reporting::infer::region::unexpected_hidden_region_diagnostic;
@@ -282,6 +283,7 @@ fn visit_ty(&mut self, ty: Ty<'tcx>) -> Self::Result {
.tcx
.explicit_item_bounds(def_id)
.iter_instantiated_copied(self.tcx, args)
.map(Unnormalized::skip_norm_wip)
{
bound.visit_with(self)?;
}
@@ -596,7 +596,7 @@ fn report_fnmut_error(
let mut output_ty = self.regioncx.universal_regions().unnormalized_output_ty;
if let ty::Alias(ty::AliasTy { kind: ty::Opaque { def_id }, .. }) = *output_ty.kind() {
output_ty = self.infcx.tcx.type_of(def_id).instantiate_identity()
output_ty = self.infcx.tcx.type_of(def_id).instantiate_identity().skip_norm_wip()
};
debug!("report_fnmut_error: output_ty={:?}", output_ty);
@@ -933,7 +933,7 @@ fn maybe_suggest_constrain_dyn_trait_impl(
debug!(?fn_did, ?args);
// Only suggest this on function calls, not closures
let ty = tcx.type_of(fn_did).instantiate_identity();
let ty = tcx.type_of(fn_did).instantiate_identity().skip_norm_wip();
debug!("ty: {:?}, ty.kind: {:?}", ty, ty.kind());
if let ty::Closure(_, _) = ty.kind() {
return;
@@ -1053,7 +1053,8 @@ fn suggest_deref_closure_return(&self, diag: &mut Diag<'_>) {
else {
return;
};
let ty::Closure(_, args) = *tcx.type_of(closure_def_id).instantiate_identity().kind()
let ty::Closure(_, args) =
*tcx.type_of(closure_def_id).instantiate_identity().skip_norm_wip().kind()
else {
return;
};
@@ -1151,7 +1152,13 @@ fn suggest_deref_closure_return(&self, diag: &mut Diag<'_>) {
let ocx = ObligationCtxt::new(&self.infcx);
ocx.register_obligations(preds.iter().map(|(pred, span)| {
trace!(?pred);
Obligation::misc(tcx, span, self.mir_def_id(), self.infcx.param_env, pred)
Obligation::misc(
tcx,
span,
self.mir_def_id(),
self.infcx.param_env,
pred.skip_norm_wip(),
)
}));
if ocx.evaluate_obligations_error_on_ambiguity().is_empty() && count > 0 {
@@ -6,7 +6,7 @@
use rustc_hir as hir;
use rustc_hir::def::{DefKind, Res};
use rustc_middle::ty::print::RegionHighlightMode;
use rustc_middle::ty::{self, GenericArgKind, GenericArgsRef, RegionVid, Ty};
use rustc_middle::ty::{self, GenericArgKind, GenericArgsRef, RegionVid, Ty, Unnormalized};
use rustc_middle::{bug, span_bug};
use rustc_span::{DUMMY_SP, Span, Symbol, kw, sym};
use rustc_trait_selection::error_reporting::InferCtxtErrorExt;
@@ -418,7 +418,7 @@ fn give_name_if_we_can_match_upvar_args(
// Get the parent fn's signature with liberated late-bound regions,
// so we have `ReLateParam` instead of `ReBound`.
let parent_fn_sig = tcx.fn_sig(parent_def_id).instantiate_identity();
let parent_fn_sig = tcx.fn_sig(parent_def_id).instantiate_identity().skip_norm_wip();
let liberated_sig = tcx.liberate_late_bound_regions(parent_def_id, parent_fn_sig);
let parent_param_ty = *liberated_sig.inputs().get(param_index)?;
@@ -1023,10 +1023,10 @@ fn give_name_if_anonymous_region_appears_in_impl_signature(
return None;
};
let found = tcx
.any_free_region_meets(&tcx.type_of(region_parent).instantiate_identity(), |r| {
r.kind() == ty::ReEarlyParam(region)
});
let found = tcx.any_free_region_meets(
&tcx.type_of(region_parent).instantiate_identity().skip_norm_wip(),
|r| r.kind() == ty::ReEarlyParam(region),
);
Some(RegionName {
name: self.synthesize_region_name(),
@@ -1051,12 +1051,15 @@ fn give_name_if_anonymous_region_appears_in_arg_position_impl_trait(
return None;
};
let predicates = self
let predicates: Vec<_> = self
.infcx
.tcx
.predicates_of(self.body.source.def_id())
.instantiate_identity(self.infcx.tcx)
.predicates;
.predicates
.into_iter()
.map(Unnormalized::skip_norm_wip)
.collect();
if let Some(upvar_index) = self
.regioncx
@@ -12,7 +12,7 @@
use rustc_middle::ty::{
self, DefiningScopeKind, DefinitionSiteHiddenType, FallibleTypeFolder, GenericArg,
GenericArgsRef, OpaqueTypeKey, ProvisionalHiddenType, Region, RegionVid, Ty, TyCtxt,
TypeFoldable, TypeSuperFoldable, TypeVisitableExt, fold_regions,
TypeFoldable, TypeSuperFoldable, TypeVisitableExt, Unnormalized, fold_regions,
};
use rustc_mir_dataflow::points::DenseLocationMap;
use rustc_span::Span;
@@ -569,16 +569,17 @@ pub(crate) fn apply_definition_site_hidden_types<'tcx>(
};
// We erase all non-member region of the opaque and need to treat these as existentials.
let expected_ty =
ty::fold_regions(tcx, expected.ty.instantiate(tcx, key.args), |re, _dbi| {
match re.kind() {
let expected_ty = ty::fold_regions(
tcx,
expected.ty.instantiate(tcx, key.args).skip_norm_wip(),
|re, _dbi| match re.kind() {
ty::ReErased => infcx.next_nll_region_var(
NllRegionVariableOrigin::Existential { name: None },
|| crate::RegionCtxt::Existential(None),
),
_ => re,
}
});
},
);
// We now simply equate the expected with the actual hidden type.
let locations = Locations::All(hidden_type.span);
@@ -598,8 +599,13 @@ pub(crate) fn apply_definition_site_hidden_types<'tcx>(
body.source.def_id().expect_local(),
);
// We need to normalize both types in the old solver before equatingt them.
let actual_ty = ocx.normalize(&cause, infcx.param_env, hidden_type.ty);
let expected_ty = ocx.normalize(&cause, infcx.param_env, expected_ty);
let actual_ty = ocx.normalize(
&cause,
infcx.param_env,
Unnormalized::new_wip(hidden_type.ty),
);
let expected_ty =
ocx.normalize(&cause, infcx.param_env, Unnormalized::new_wip(expected_ty));
ocx.eq(&cause, infcx.param_env, actual_ty, expected_ty).map_err(|_| NoSolution)
},
"equating opaque types",
@@ -5,7 +5,7 @@
use rustc_infer::infer::outlives::env::RegionBoundPairs;
use rustc_middle::bug;
use rustc_middle::mir::{Body, ConstraintCategory};
use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable, Upcast};
use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable, Unnormalized, Upcast};
use rustc_span::Span;
use rustc_span::def_id::DefId;
use rustc_trait_selection::solve::NoSolution;
@@ -189,7 +189,11 @@ pub(super) fn normalize<T>(&mut self, value: T, location: impl NormalizeLocation
where
T: type_op::normalize::Normalizable<'tcx> + fmt::Display + Copy + 'tcx,
{
self.normalize_with_category(value, location, ConstraintCategory::Boring)
self.normalize_with_category(
Unnormalized::new_wip(value),
location,
ConstraintCategory::Boring,
)
}
pub(super) fn deeply_normalize<T>(&mut self, value: T, location: impl NormalizeLocation) -> T
@@ -214,6 +218,7 @@ pub(super) fn normalize_with_category<T>(
where
T: type_op::normalize::Normalizable<'tcx> + fmt::Display + Copy + 'tcx,
{
let value = value.skip_normalization();
let param_env = self.infcx.param_env;
let result: Result<_, ErrorGuaranteed> = self.fully_perform_op(
location.to_locations(),
@@ -246,11 +251,7 @@ pub(super) fn struct_tail(
CustomTypeOp::new(
|ocx| {
let structurally_normalize = |ty| {
ocx.structurally_normalize_ty(
&cause,
param_env,
ty,
)
ocx.structurally_normalize_ty(&cause, param_env, Unnormalized::new_wip(ty))
.unwrap_or_else(|_| bug!("struct tail should have been computable, since we computed it in HIR"))
};
@@ -295,7 +296,7 @@ pub(super) fn structurally_resolve(
body.source.def_id().expect_local(),
),
param_env,
ty,
Unnormalized::new_wip(ty),
)
.map_err(|_| NoSolution)
},
@@ -364,7 +365,7 @@ pub(super) fn ascribe_user_type_skip_wf(
// obligation for the unnormalized user_ty here. This is
// where the "incorrectly skips the WF checks we normally do"
// happens
let user_ty = ocx.normalize(&cause, param_env, user_ty);
let user_ty = ocx.normalize(&cause, param_env, Unnormalized::new_wip(user_ty));
ocx.eq(&cause, param_env, user_ty, mir_ty)?;
Ok(())
},
@@ -1759,7 +1759,8 @@ fn visit_const_operand(&mut self, constant: &ConstOperand<'tcx>, location: Locat
);
}
} else if let Some(static_def_id) = constant.check_static_ptr(tcx) {
let unnormalized_ty = tcx.type_of(static_def_id).instantiate_identity();
let unnormalized_ty =
tcx.type_of(static_def_id).instantiate_identity().skip_norm_wip();
let normalized_ty = self.normalize(unnormalized_ty, locations);
let literal_ty = constant.const_.ty().builtin_deref(true).unwrap();
@@ -585,7 +585,7 @@ fn defining_ty(&self) -> DefiningTy<'tcx> {
match tcx.hir_body_owner_kind(self.mir_def) {
BodyOwnerKind::Closure | BodyOwnerKind::Fn => {
let defining_ty = tcx.type_of(self.mir_def).instantiate_identity();
let defining_ty = tcx.type_of(self.mir_def).instantiate_identity().skip_norm_wip();
debug!("defining_ty (pre-replacement): {:?}", defining_ty);
@@ -780,7 +780,7 @@ fn compute_inputs_and_output(
}
DefiningTy::FnDef(def_id, _) => {
let sig = tcx.fn_sig(def_id).instantiate_identity();
let sig = tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip();
let sig = indices.fold_to_region_vids(tcx, sig);
let inputs_and_output = sig.inputs_and_output();
@@ -804,7 +804,8 @@ fn compute_inputs_and_output(
.infcx
.tcx
.type_of(va_list_did)
.instantiate(self.infcx.tcx, &[region.into()]);
.instantiate(self.infcx.tcx, &[region.into()])
.skip_norm_wip();
// The signature needs to follow the order [input_tys, va_list_ty, output_ty]
return inputs_and_output.map_bound(|tys| {
@@ -822,7 +823,7 @@ fn compute_inputs_and_output(
// For a constant body, there are no inputs, and one
// "output" (the type of the constant).
assert_eq!(self.mir_def.to_def_id(), def_id);
let ty = tcx.type_of(self.mir_def).instantiate_identity();
let ty = tcx.type_of(self.mir_def).instantiate_identity().skip_norm_wip();
let ty = indices.fold_to_region_vids(tcx, ty);
ty::Binder::dummy(tcx.mk_type_list(&[ty]))
@@ -834,9 +835,9 @@ fn compute_inputs_and_output(
ty::Binder::dummy(tcx.mk_type_list(&[ty]))
}
DefiningTy::GlobalAsm(def_id) => {
ty::Binder::dummy(tcx.mk_type_list(&[tcx.type_of(def_id).instantiate_identity()]))
}
DefiningTy::GlobalAsm(def_id) => ty::Binder::dummy(
tcx.mk_type_list(&[tcx.type_of(def_id).instantiate_identity().skip_norm_wip()]),
),
};
// FIXME(#129952): We probably want a more principled approach here.
@@ -974,7 +975,7 @@ fn for_each_late_bound_region_in_item<'tcx>(
// only deduced that a param in the closure signature is late-bound from a constraint
// that we discover during typeck.
DefKind::Closure => {
let ty = tcx.type_of(mir_def_id).instantiate_identity();
let ty = tcx.type_of(mir_def_id).instantiate_identity().skip_norm_wip();
match *ty.kind() {
ty::Closure(_, args) => args.as_closure().sig().bound_vars(),
ty::CoroutineClosure(_, args) => {
@@ -19,6 +19,7 @@
use rustc_codegen_ssa::debuginfo::type_names;
use rustc_hir::def::DefKind;
use rustc_hir::def_id::DefIdMap;
use rustc_middle::ty::Unnormalized;
use rustc_session::Session;
use rustc_session::config::DebugInfo;
use rustc_span::{RemapPathScopeComponents, SourceFileHash, StableSourceFileId};
@@ -244,7 +245,10 @@ pub(crate) fn define_function<'tcx>(
type_names::push_generic_args(
tcx,
tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), args),
tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(args),
),
&mut name,
);
@@ -1,6 +1,6 @@
use cranelift_frontend::{FunctionBuilder, FunctionBuilderContext};
use rustc_hir::LangItem;
use rustc_middle::ty::{AssocTag, GenericArg};
use rustc_middle::ty::{AssocTag, GenericArg, Unnormalized};
use rustc_session::config::EntryFnType;
use rustc_span::{DUMMY_SP, Ident};
@@ -50,7 +50,7 @@ fn create_entry_fn(
// listing.
let main_ret_ty = tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
main_ret_ty.no_bound_vars().unwrap(),
Unnormalized::new_wip(main_ret_ty.no_bound_vars().unwrap()),
);
let cmain_sig = Signature {
@@ -16,7 +16,7 @@
use rustc_hir as hir;
use rustc_middle::mir::BinOp;
use rustc_middle::ty::layout::HasTyCtxt;
use rustc_middle::ty::{self, Ty};
use rustc_middle::ty::{self, Ty, Unnormalized};
use rustc_span::{Span, Symbol, sym};
use crate::builder::Builder;
@@ -539,7 +539,10 @@ macro_rules! require_simd2 {
match *in_elem.kind() {
ty::RawPtr(p_ty, _) => {
let metadata = p_ty.ptr_metadata_ty(bx.tcx, |ty| {
bx.tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), ty)
bx.tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(ty),
)
});
require!(
metadata.is_unit(),
@@ -553,7 +556,10 @@ macro_rules! require_simd2 {
match *out_elem.kind() {
ty::RawPtr(p_ty, _) => {
let metadata = p_ty.ptr_metadata_ty(bx.tcx, |ty| {
bx.tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), ty)
bx.tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(ty),
)
});
require!(
metadata.is_unit(),
@@ -16,7 +16,8 @@
HasTypingEnv, LayoutOf, TyAndLayout, WIDE_PTR_ADDR, WIDE_PTR_EXTRA,
};
use rustc_middle::ty::{
self, AdtDef, AdtKind, CoroutineArgsExt, ExistentialTraitRef, Instance, Ty, TyCtxt, Visibility,
self, AdtDef, AdtKind, CoroutineArgsExt, ExistentialTraitRef, Instance, Ty, TyCtxt,
Unnormalized, Visibility,
};
use rustc_session::config::{self, DebugInfo, Lto};
use rustc_span::{DUMMY_SP, FileName, RemapPathScopeComponents, SourceFile, Span, Symbol, hygiene};
@@ -1234,7 +1235,12 @@ fn build_upvar_field_di_nodes<'ll, 'tcx>(
}
};
assert!(up_var_tys.iter().all(|t| t == cx.tcx.normalize_erasing_regions(cx.typing_env(), t)));
assert!(
up_var_tys
.iter()
.all(|t| t
== cx.tcx.normalize_erasing_regions(cx.typing_env(), Unnormalized::new_wip(t)))
);
let capture_names = cx.tcx.closure_saved_names_of_captured_variables(def_id);
let layout = cx.layout_of(closure_or_coroutine_ty);
@@ -1418,7 +1424,9 @@ fn build_generic_type_param_di_nodes<'ll, 'tcx>(
let template_params: SmallVec<_> = iter::zip(args, names)
.filter_map(|(kind, name)| {
kind.as_type().map(|ty| {
let actual_type = cx.tcx.normalize_erasing_regions(cx.typing_env(), ty);
let actual_type = cx
.tcx
.normalize_erasing_regions(cx.typing_env(), Unnormalized::new_wip(ty));
let actual_type_di_node = type_di_node(cx, actual_type);
Some(cx.create_template_type_parameter(name.as_str(), actual_type_di_node))
})
@@ -7,7 +7,7 @@
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_macros::HashStable;
use rustc_middle::bug;
use rustc_middle::ty::{self, ExistentialTraitRef, Ty, TyCtxt};
use rustc_middle::ty::{self, ExistentialTraitRef, Ty, TyCtxt, Unnormalized};
use super::{DefinitionLocation, SmallVec, UNKNOWN_LINE_NUMBER, unknown_file_metadata};
use crate::common::CodegenCx;
@@ -50,14 +50,23 @@ pub(super) enum UniqueTypeId<'tcx> {
impl<'tcx> UniqueTypeId<'tcx> {
pub(crate) fn for_ty(tcx: TyCtxt<'tcx>, t: Ty<'tcx>) -> Self {
assert_eq!(t, tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), t));
assert_eq!(
t,
tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(t)
)
);
UniqueTypeId::Ty(t, private::HiddenZst)
}
pub(crate) fn for_enum_variant_part(tcx: TyCtxt<'tcx>, enum_ty: Ty<'tcx>) -> Self {
assert_eq!(
enum_ty,
tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), enum_ty)
tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(enum_ty)
)
);
UniqueTypeId::VariantPart(enum_ty, private::HiddenZst)
}
@@ -69,7 +78,10 @@ pub(crate) fn for_enum_variant_struct_type(
) -> Self {
assert_eq!(
enum_ty,
tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), enum_ty)
tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(enum_ty)
)
);
UniqueTypeId::VariantStructType(enum_ty, variant_idx, private::HiddenZst)
}
@@ -81,7 +93,10 @@ pub(crate) fn for_enum_variant_struct_type_wrapper(
) -> Self {
assert_eq!(
enum_ty,
tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), enum_ty)
tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(enum_ty)
)
);
UniqueTypeId::VariantStructTypeCppLikeWrapper(enum_ty, variant_idx, private::HiddenZst)
}
@@ -93,11 +108,17 @@ pub(crate) fn for_vtable_ty(
) -> Self {
assert_eq!(
self_type,
tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), self_type)
tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(self_type)
)
);
assert_eq!(
implemented_trait,
tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), implemented_trait)
tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(implemented_trait)
)
);
UniqueTypeId::VTableTy(self_type, implemented_trait, private::HiddenZst)
}
@@ -17,7 +17,7 @@
use rustc_index::IndexVec;
use rustc_middle::mir;
use rustc_middle::ty::layout::{HasTypingEnv, LayoutOf};
use rustc_middle::ty::{self, GenericArgsRef, Instance, Ty, TypeVisitableExt};
use rustc_middle::ty::{self, GenericArgsRef, Instance, Ty, TypeVisitableExt, Unnormalized};
use rustc_session::Session;
use rustc_session::config::{self, DebugInfo};
use rustc_span::{
@@ -458,7 +458,7 @@ fn dbg_scope_fn(
type_names::push_generic_args(
tcx,
tcx.normalize_erasing_regions(self.typing_env(), args),
tcx.normalize_erasing_regions(self.typing_env(), Unnormalized::new_wip(args)),
&mut name,
);
@@ -595,7 +595,10 @@ fn get_template_parameters<'ll, 'tcx>(
iter::zip(args, names)
.filter_map(|(kind, name)| {
kind.as_type().map(|ty| {
let actual_type = cx.tcx.normalize_erasing_regions(cx.typing_env(), ty);
let actual_type = cx.tcx.normalize_erasing_regions(
cx.typing_env(),
Unnormalized::new_wip(ty),
);
let actual_type_metadata = type_di_node(cx, actual_type);
Some(cx.create_template_type_parameter(
name.as_str(),
+8 -6
View File
@@ -17,7 +17,9 @@
use rustc_middle::mir::BinOp;
use rustc_middle::ty::layout::{FnAbiOf, HasTyCtxt, HasTypingEnv, LayoutOf};
use rustc_middle::ty::offload_meta::OffloadMetadata;
use rustc_middle::ty::{self, GenericArgsRef, Instance, SimdAlign, Ty, TyCtxt, TypingEnv};
use rustc_middle::ty::{
self, GenericArgsRef, Instance, SimdAlign, Ty, TyCtxt, TypingEnv, Unnormalized,
};
use rustc_middle::{bug, span_bug};
use rustc_session::config::CrateType;
use rustc_session::lint::builtin::DEPRECATED_LLVM_INTRINSIC;
@@ -814,9 +816,9 @@ fn codegen_llvm_intrinsic_call(
let fn_ty = instance.ty(tcx, self.typing_env());
let fn_sig = match *fn_ty.kind() {
ty::FnDef(def_id, args) => {
tcx.instantiate_bound_regions_with_erased(tcx.fn_sig(def_id).instantiate(tcx, args))
}
ty::FnDef(def_id, args) => tcx.instantiate_bound_regions_with_erased(
tcx.fn_sig(def_id).instantiate(tcx, args).skip_norm_wip(),
),
_ => unreachable!(),
};
assert!(!fn_sig.c_variadic());
@@ -2933,7 +2935,7 @@ macro_rules! bitwise_red {
match in_elem.kind() {
ty::RawPtr(p_ty, _) => {
let metadata = p_ty.ptr_metadata_ty(bx.tcx, |ty| {
bx.tcx.normalize_erasing_regions(bx.typing_env(), ty)
bx.tcx.normalize_erasing_regions(bx.typing_env(), Unnormalized::new_wip(ty))
});
require!(
metadata.is_unit(),
@@ -2947,7 +2949,7 @@ macro_rules! bitwise_red {
match out_elem.kind() {
ty::RawPtr(p_ty, _) => {
let metadata = p_ty.ptr_metadata_ty(bx.tcx, |ty| {
bx.tcx.normalize_erasing_regions(bx.typing_env(), ty)
bx.tcx.normalize_erasing_regions(bx.typing_env(), Unnormalized::new_wip(ty))
});
require!(
metadata.is_unit(),
+5 -4
View File
@@ -27,7 +27,7 @@
use rustc_middle::mono::{CodegenUnit, CodegenUnitNameBuilder, MonoItem, MonoItemPartitions};
use rustc_middle::query::Providers;
use rustc_middle::ty::layout::{HasTyCtxt, HasTypingEnv, LayoutOf, TyAndLayout};
use rustc_middle::ty::{self, Instance, PatternKind, Ty, TyCtxt};
use rustc_middle::ty::{self, Instance, PatternKind, Ty, TyCtxt, Unnormalized};
use rustc_middle::{bug, span_bug};
use rustc_session::Session;
use rustc_session::config::{self, CrateType, EntryFnType};
@@ -519,9 +519,10 @@ fn create_entry_fn<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
// late-bound regions, since late-bound
// regions must appear in the argument
// listing.
let main_ret_ty = cx
.tcx()
.normalize_erasing_regions(cx.typing_env(), main_ret_ty.no_bound_vars().unwrap());
let main_ret_ty = cx.tcx().normalize_erasing_regions(
cx.typing_env(),
Unnormalized::new_wip(main_ret_ty.no_bound_vars().unwrap()),
);
let Some(llfn) = cx.declare_c_main(llfty) else {
// FIXME: We should be smart and show a better diagnostic here.
@@ -22,7 +22,9 @@
use rustc_hir::{CoroutineDesugaring, CoroutineKind, CoroutineSource, Mutability};
use rustc_middle::bug;
use rustc_middle::ty::layout::{IntegerExt, TyAndLayout};
use rustc_middle::ty::{self, ExistentialProjection, GenericArgKind, GenericArgsRef, Ty, TyCtxt};
use rustc_middle::ty::{
self, ExistentialProjection, GenericArgKind, GenericArgsRef, Ty, TyCtxt, Unnormalized,
};
use smallvec::SmallVec;
use crate::debuginfo::wants_c_like_enum_debuginfo;
@@ -540,8 +542,10 @@ pub fn compute_debuginfo_vtable_name<'tcx>(
}
if let Some(trait_ref) = trait_ref {
let trait_ref =
tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), trait_ref);
let trait_ref = tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(trait_ref),
);
push_item_name(tcx, trait_ref.def_id, true, &mut vtable_name);
visited.clear();
push_generic_args_internal(tcx, trait_ref.args, &mut vtable_name, &mut visited);
@@ -654,7 +658,13 @@ fn push_generic_args_internal<'tcx>(
output: &mut String,
visited: &mut FxHashSet<Ty<'tcx>>,
) -> bool {
assert_eq!(args, tcx.normalize_erasing_regions(ty::TypingEnv::fully_monomorphized(), args));
assert_eq!(
args,
tcx.normalize_erasing_regions(
ty::TypingEnv::fully_monomorphized(),
Unnormalized::new_wip(args)
)
);
let mut args = args.non_erasable_generics().peekable();
if args.peek().is_none() {
return false;
@@ -399,8 +399,9 @@ fn revalidate_conditional_constness(
ty::BoundConstness::Const
}
};
let const_conditions =
ocx.normalize(&ObligationCause::misc(call_span, body_id), param_env, const_conditions);
let const_conditions = const_conditions.into_iter().map(|(c, s)| {
(ocx.normalize(&ObligationCause::misc(call_span, body_id), param_env, c), s)
});
ocx.register_obligations(const_conditions.into_iter().map(|(trait_ref, span)| {
Obligation::new(
tcx,
@@ -66,11 +66,11 @@ fn is_async(&self) -> bool {
pub fn fn_sig(&self) -> PolyFnSig<'tcx> {
let did = self.def_id().to_def_id();
if self.tcx.is_closure_like(did) {
let ty = self.tcx.type_of(did).instantiate_identity();
let ty = self.tcx.type_of(did).instantiate_identity().skip_norm_wip();
let ty::Closure(_, args) = ty.kind() else { bug!("type_of closure not ty::Closure") };
args.as_closure().sig()
} else {
self.tcx.fn_sig(did).instantiate_identity()
self.tcx.fn_sig(did).instantiate_identity().skip_norm_wip()
}
}
}
@@ -70,7 +70,8 @@ fn eval_body_using_ecx<'tcx, R: InterpretationResult<'tcx>>(
body: &'tcx mir::Body<'tcx>,
) -> InterpResult<'tcx, R> {
let tcx = *ecx.tcx;
let layout = ecx.layout_of(body.bound_return_ty().instantiate(tcx, cid.instance.args))?;
let layout =
ecx.layout_of(body.bound_return_ty().instantiate(tcx, cid.instance.args).skip_norm_wip())?;
let (intern_kind, ret) = setup_for_eval(ecx, cid, layout)?;
trace!(
@@ -9,7 +9,7 @@
use rustc_hir::def_id::DefId;
use rustc_hir::find_attr;
use rustc_middle::ty::layout::{IntegerExt, TyAndLayout};
use rustc_middle::ty::{self, AdtDef, Instance, Ty, VariantDef};
use rustc_middle::ty::{self, AdtDef, Instance, Ty, Unnormalized, VariantDef};
use rustc_middle::{bug, mir, span_bug};
use rustc_target::callconv::{ArgAbi, FnAbi};
use tracing::field::Empty;
@@ -219,7 +219,9 @@ fn layout_compat(
// Even if `ty` is normalized, the search for the unsized tail will project
// to fields, which can yield non-normalized types. So we need to provide a
// normalization function.
let normalize = |ty| self.tcx.normalize_erasing_regions(self.typing_env, ty);
let normalize = |ty| {
self.tcx.normalize_erasing_regions(self.typing_env, Unnormalized::new_wip(ty))
};
ty.ptr_metadata_ty(*self.tcx, normalize)
};
return interp_ok(meta_ty(caller) == meta_ty(callee));
@@ -37,7 +37,8 @@ fn alloc_caller_location<'tcx>(
let loc_ty = ecx
.tcx
.type_of(ecx.tcx.require_lang_item(LangItem::PanicLocation, ecx.tcx.span))
.instantiate(*ecx.tcx, ecx.tcx.mk_args(&[ecx.tcx.lifetimes.re_erased.into()]));
.instantiate(*ecx.tcx, ecx.tcx.mk_args(&[ecx.tcx.lifetimes.re_erased.into()]))
.skip_norm_wip();
let loc_layout = ecx.layout_of(loc_ty).unwrap();
let location = ecx.allocate(loc_layout, MemoryKind::CallerLocation).unwrap();
@@ -5,7 +5,7 @@
use rustc_infer::infer::TyCtxtInferExt;
use rustc_middle::traits::ObligationCause;
use rustc_middle::ty::{Ty, TyCtxt, TypingEnv, Variance};
use rustc_middle::ty::{Ty, TyCtxt, TypingEnv, Unnormalized, Variance};
use rustc_trait_selection::traits::ObligationCtxt;
/// Returns whether `src` is a subtype of `dest`, i.e. `src <: dest`.
@@ -37,8 +37,8 @@ pub fn relate_types<'tcx>(
let (infcx, param_env) = tcx.infer_ctxt().ignoring_regions().build_with_typing_env(typing_env);
let ocx = ObligationCtxt::new(&infcx);
let cause = ObligationCause::dummy();
let src = ocx.normalize(&cause, param_env, src);
let dest = ocx.normalize(&cause, param_env, dest);
let src = ocx.normalize(&cause, param_env, Unnormalized::new_wip(src));
let dest = ocx.normalize(&cause, param_env, Unnormalized::new_wip(dest));
match ocx.relate(&cause, param_env, variance, src, dest) {
Ok(()) => {}
Err(_) => return false,
@@ -149,7 +149,9 @@ fn print_coroutine_with_kind(
) -> Result<(), PrintError> {
self.print_def_path(def_id, parent_args)?;
let ty::Coroutine(_, args) = self.tcx.type_of(def_id).instantiate_identity().kind() else {
let ty::Coroutine(_, args) =
self.tcx.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
else {
// Could be `ty::Error`.
return Ok(());
};
+5 -3
View File
@@ -93,7 +93,8 @@ fn next(&mut self) -> Option<Self::Item> {
if self.infcx.next_trait_solver()
&& let ty::Alias(..) = ty.kind()
{
let (normalized_ty, obligations) = self.structurally_normalize_ty(ty)?;
let (normalized_ty, obligations) =
self.structurally_normalize_ty(Unnormalized::new_wip(ty))?;
self.state.obligations.extend(obligations);
(AutoderefKind::Builtin, normalized_ty)
} else {
@@ -176,8 +177,9 @@ fn overloaded_deref_ty(&mut self, ty: Ty<'tcx>) -> Option<Ty<'tcx>> {
return None;
}
let (normalized_ty, obligations) =
self.structurally_normalize_ty(Ty::new_projection(tcx, trait_target_def_id, [ty]))?;
let (normalized_ty, obligations) = self.structurally_normalize_ty(Unnormalized::new(
Ty::new_projection(tcx, trait_target_def_id, [ty]),
))?;
debug!("overloaded_deref_ty({:?}) = ({:?}, {:?})", ty, normalized_ty, obligations);
self.state.obligations.extend(obligations);
@@ -54,7 +54,7 @@ pub(crate) fn check_drop_impl(
tcx.ensure_result().orphan_check_impl(drop_impl_did)?;
let self_ty = tcx.type_of(drop_impl_did).instantiate_identity();
let self_ty = tcx.type_of(drop_impl_did).instantiate_identity().skip_norm_wip();
match self_ty.kind() {
ty::Adt(adt_def, adt_to_impl_args) => {
@@ -206,11 +206,13 @@ fn ensure_impl_predicates_are_implied_by_item_defn<'tcx>(
// reference the params from the ADT instead of from the impl which is bad UX. To resolve
// this we "rename" the ADT's params to be the impl's params which should not affect behaviour.
let impl_adt_ty = Ty::new_adt(tcx, tcx.adt_def(adt_def_id), adt_to_impl_args);
let adt_env =
ty::EarlyBinder::bind(tcx.param_env(adt_def_id)).instantiate(tcx, adt_to_impl_args);
let adt_env = ty::EarlyBinder::bind(tcx.param_env(adt_def_id))
.instantiate(tcx, adt_to_impl_args)
.skip_norm_wip();
let fresh_impl_args = infcx.fresh_args_for_item(impl_span, impl_def_id.to_def_id());
let fresh_adt_ty = tcx.impl_trait_ref(impl_def_id).instantiate(tcx, fresh_impl_args).self_ty();
let fresh_adt_ty =
tcx.impl_trait_ref(impl_def_id).instantiate(tcx, fresh_impl_args).skip_norm_wip().self_ty();
ocx.eq(&ObligationCause::dummy_with_span(impl_span), adt_env, fresh_adt_ty, impl_adt_ty)
.expect("equating fully generic trait ref should never fail");
+27 -23
View File
@@ -21,7 +21,7 @@
use rustc_middle::ty::util::Discr;
use rustc_middle::ty::{
AdtDef, BottomUpFolder, FnSig, GenericArgKind, RegionKind, TypeFoldable, TypeSuperVisitable,
TypeVisitable, TypeVisitableExt, fold_regions,
TypeVisitable, TypeVisitableExt, Unnormalized, fold_regions,
};
use rustc_session::lint::builtin::UNINHABITED_STATIC;
use rustc_target::spec::{AbiMap, AbiMapping};
@@ -145,7 +145,7 @@ fn allowed_union_or_unsafe_field<'tcx>(
.lang_items()
.get(LangItem::BikeshedGuaranteedNoDrop)
.unwrap_or_else(|| tcx.require_lang_item(LangItem::Copy, span));
let Ok(ty) = tcx.try_normalize_erasing_regions(typing_env, ty) else {
let Ok(ty) = tcx.try_normalize_erasing_regions(typing_env, Unnormalized::new_wip(ty)) else {
tcx.dcx().span_delayed_bug(span, "could not normalize field type");
return true;
};
@@ -200,7 +200,7 @@ fn check_static_inhabited(tcx: TyCtxt<'_>, def_id: LocalDefId) {
// would be enough to check this for `extern` statics, as statics with an initializer will
// have UB during initialization if they are uninhabited, but there also seems to be no good
// reason to allow any statics to be uninhabited.
let ty = tcx.type_of(def_id).instantiate_identity();
let ty = tcx.type_of(def_id).instantiate_identity().skip_norm_wip();
let span = tcx.def_span(def_id);
let layout = match tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty)) {
Ok(l) => l,
@@ -247,7 +247,7 @@ fn check_opaque(tcx: TyCtxt<'_>, def_id: LocalDefId) {
return;
}
if tcx.type_of(def_id).instantiate_identity().references_error() {
if tcx.type_of(def_id).instantiate_identity().skip_norm_wip().references_error() {
return;
}
if check_opaque_for_cycles(tcx, def_id).is_err() {
@@ -336,7 +336,7 @@ fn check_opaque_meets_bounds<'tcx>(
//
// FIXME: Consider wrapping the hidden type in an existential `Binder` and instantiating it
// here rather than using ReErased.
let hidden_ty = tcx.type_of(def_id.to_def_id()).instantiate(tcx, args);
let hidden_ty = tcx.type_of(def_id.to_def_id()).instantiate(tcx, args).skip_norm_wip();
let hidden_ty = fold_regions(tcx, hidden_ty, |re, _dbi| match re.kind() {
ty::ReErased => infcx.next_region_var(RegionVariableOrigin::Misc(span)),
_ => re,
@@ -345,8 +345,10 @@ fn check_opaque_meets_bounds<'tcx>(
// HACK: We eagerly instantiate some bounds to report better errors for them...
// This isn't necessary for correctness, since we register these bounds when
// equating the opaque below, but we should clean this up in the new solver.
for (predicate, pred_span) in
tcx.explicit_item_bounds(def_id).iter_instantiated_copied(tcx, args)
for (predicate, pred_span) in tcx
.explicit_item_bounds(def_id)
.iter_instantiated_copied(tcx, args)
.map(Unnormalized::skip_norm_wip)
{
let predicate = predicate.fold_with(&mut BottomUpFolder {
tcx,
@@ -540,7 +542,7 @@ fn sanity_check_found_hidden_type<'tcx>(
// These correspond to lifetime variables that never got resolved, so we patch this up here.
ty.ty = erase_re_vars(ty.ty);
// Get the hidden type.
let hidden_ty = tcx.type_of(key.def_id).instantiate(tcx, key.args);
let hidden_ty = tcx.type_of(key.def_id).instantiate(tcx, key.args).skip_norm_wip();
let hidden_ty = erase_re_vars(hidden_ty);
// If the hidden types differ, emit a type mismatch diagnostic.
@@ -740,7 +742,7 @@ fn is_enum_of_nonnullable_ptr<'tcx>(
fn check_static_linkage(tcx: TyCtxt<'_>, def_id: LocalDefId) {
if tcx.codegen_fn_attrs(def_id).import_linkage.is_some() {
if match tcx.type_of(def_id).instantiate_identity().kind() {
if match tcx.type_of(def_id).instantiate_identity().skip_norm_wip().kind() {
ty::RawPtr(_, _) => false,
ty::Adt(adt_def, args) => !is_enum_of_nonnullable_ptr(tcx, *adt_def, *args),
_ => true,
@@ -783,7 +785,7 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
check_static_inhabited(tcx, def_id);
check_static_linkage(tcx, def_id);
let ty = tcx.type_of(def_id).instantiate_identity();
let ty = tcx.type_of(def_id).instantiate_identity().skip_norm_wip();
res = res.and(wfcheck::check_static_item(
tcx, def_id, ty, /* should_check_for_sync */ true,
));
@@ -823,10 +825,9 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
tcx.ensure_ok().associated_items(def_id);
if of_trait {
let impl_trait_header = tcx.impl_trait_header(def_id);
res = res.and(
tcx.ensure_result()
.coherent_trait(impl_trait_header.trait_ref.instantiate_identity().def_id),
);
res = res.and(tcx.ensure_result().coherent_trait(
impl_trait_header.trait_ref.instantiate_identity().skip_norm_wip().def_id,
));
if res.is_ok() {
// Checking this only makes sense if the all trait impls satisfy basic
@@ -978,7 +979,7 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(),
//
// Changing this to normalized obligations is a breaking change:
// `type Bar = [(); panic!()];` would become an error
if let Some(unnormalized_obligations) = wfcx.unnormalized_obligations(span, ty)
if let Some(unnormalized_obligations) = wfcx.unnormalized_obligations(span, ty.skip_norm_wip())
{
let filtered_obligations =
unnormalized_obligations.into_iter().filter(|o| {
@@ -1240,7 +1241,7 @@ fn check_impl_items_against_trait<'tcx>(
impl_id: LocalDefId,
impl_trait_header: ty::ImplTraitHeader<'tcx>,
) {
let trait_ref = impl_trait_header.trait_ref.instantiate_identity();
let trait_ref = impl_trait_header.trait_ref.instantiate_identity().skip_norm_wip();
// If the trait reference itself is erroneous (so the compilation is going
// to fail), skip checking the items here -- the `impl_item` table in `tcx`
// isn't populated for such impls.
@@ -1287,7 +1288,9 @@ fn check_impl_items_against_trait<'tcx>(
tcx,
ty_impl_item,
ty_trait_item,
tcx.impl_trait_ref(ty_impl_item.container_id(tcx)).instantiate_identity(),
tcx.impl_trait_ref(ty_impl_item.container_id(tcx))
.instantiate_identity()
.skip_norm_wip(),
);
}
ty::AssocKind::Const { .. } => {}
@@ -1416,7 +1419,7 @@ fn check_impl_items_against_trait<'tcx>(
}
fn check_simd(tcx: TyCtxt<'_>, sp: Span, def_id: LocalDefId) {
let t = tcx.type_of(def_id).instantiate_identity();
let t = tcx.type_of(def_id).instantiate_identity().skip_norm_wip();
if let ty::Adt(def, args) = t.kind()
&& def.is_struct()
{
@@ -1491,7 +1494,7 @@ fn check_simd(tcx: TyCtxt<'_>, sp: Span, def_id: LocalDefId) {
#[tracing::instrument(skip(tcx), level = "debug")]
fn check_scalable_vector(tcx: TyCtxt<'_>, span: Span, def_id: LocalDefId, scalable: ScalableElt) {
let ty = tcx.type_of(def_id).instantiate_identity();
let ty = tcx.type_of(def_id).instantiate_identity().skip_norm_wip();
let ty::Adt(def, args) = ty.kind() else { return };
if !def.is_struct() {
tcx.dcx().delayed_bug("`rustc_scalable_vector` applied to non-struct");
@@ -1641,7 +1644,7 @@ pub(super) fn check_packed(tcx: TyCtxt<'_>, sp: Span, def: ty::AdtDef<'_>) {
if first {
format!(
"`{}` contains a field of type `{}`",
tcx.type_of(def.did()).instantiate_identity(),
tcx.type_of(def.did()).instantiate_identity().skip_norm_wip(),
ident
)
} else {
@@ -1662,7 +1665,7 @@ pub(super) fn check_packed_inner(
def_id: DefId,
stack: &mut Vec<DefId>,
) -> Option<Vec<(DefId, Span)>> {
if let ty::Adt(def, args) = tcx.type_of(def_id).instantiate_identity().kind() {
if let ty::Adt(def, args) = tcx.type_of(def_id).instantiate_identity().skip_norm_wip().kind() {
if def.is_struct() || def.is_union() {
if def.repr().align.is_some() {
return Some(vec![(def.did(), DUMMY_SP)]);
@@ -1790,7 +1793,8 @@ fn check_unsuited<'tcx>(
ty: Ty<'tcx>,
) -> ControlFlow<UnsuitedInfo<'tcx>> {
// We can encounter projections during traversal, so ensure the type is normalized.
let ty = tcx.try_normalize_erasing_regions(typing_env, ty).unwrap_or(ty);
let ty =
tcx.try_normalize_erasing_regions(typing_env, Unnormalized::new_wip(ty)).unwrap_or(ty);
match ty.kind() {
ty::Tuple(list) => list.iter().try_for_each(|t| check_unsuited(tcx, typing_env, t)),
ty::Array(ty, _) => check_unsuited(tcx, typing_env, *ty),
@@ -2024,7 +2028,7 @@ fn check_type_alias_type_params_are_used<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalD
return;
}
let ty = tcx.type_of(def_id).instantiate_identity();
let ty = tcx.type_of(def_id).instantiate_identity().skip_norm_wip();
if ty.references_error() {
// If there is already another error, do not emit an error for not using a type parameter.
return;
@@ -15,7 +15,7 @@
use rustc_infer::infer::{self, InferCtxt, TyCtxtInferExt};
use rustc_infer::traits::{ObligationCause, ObligationCauseCode};
use rustc_middle::ty::error::{ExpectedFound, TypeError};
use rustc_middle::ty::{self, ParamEnv, Ty, TyCtxt, TypeVisitableExt, TypingMode};
use rustc_middle::ty::{self, ParamEnv, Ty, TyCtxt, TypeVisitableExt, TypingMode, Unnormalized};
use rustc_span::{ErrorGuaranteed, Ident, Span, Symbol};
use rustc_trait_selection::error_reporting::InferCtxtErrorExt;
use rustc_trait_selection::regions::InferCtxtRegionExt;
@@ -68,26 +68,33 @@ pub(crate) fn compare_eii_function_types<'tcx>(
let mut wf_tys = FxIndexSet::default();
let norm_cause = ObligationCause::misc(external_impl_span, external_impl);
let declaration_sig = tcx.fn_sig(foreign_item).instantiate_identity();
let declaration_sig = tcx.fn_sig(foreign_item).instantiate_identity().skip_norm_wip();
let declaration_sig = tcx.liberate_late_bound_regions(external_impl.into(), declaration_sig);
debug!(?declaration_sig);
let unnormalized_external_impl_sig = infcx.instantiate_binder_with_fresh_vars(
external_impl_span,
infer::BoundRegionConversionTime::HigherRankedType,
tcx.fn_sig(external_impl).instantiate(
tcx.fn_sig(external_impl)
.instantiate(
tcx,
infcx.fresh_args_for_item(external_impl_span, external_impl.to_def_id()),
),
)
.skip_norm_wip(),
);
let external_impl_sig = ocx.normalize(
&norm_cause,
param_env,
Unnormalized::new_wip(unnormalized_external_impl_sig),
);
let external_impl_sig = ocx.normalize(&norm_cause, param_env, unnormalized_external_impl_sig);
debug!(?external_impl_sig);
// Next, add all inputs and output as well-formed tys. Importantly,
// we have to do this before normalization, since the normalized ty may
// not contain the input parameters. See issue #87748.
wf_tys.extend(declaration_sig.inputs_and_output.iter());
let declaration_sig = ocx.normalize(&norm_cause, param_env, declaration_sig);
let declaration_sig =
ocx.normalize(&norm_cause, param_env, Unnormalized::new_wip(declaration_sig));
// We also have to add the normalized declaration
// as we don't normalize during implied bounds computation.
wf_tys.extend(external_impl_sig.inputs_and_output.iter());
@@ -170,7 +177,7 @@ pub(crate) fn compare_eii_statics<'tcx>(
let infcx = &tcx.infer_ctxt().build(TypingMode::non_body_analysis());
let ocx = ObligationCtxt::new_with_diagnostics(infcx);
let declaration_ty = tcx.type_of(foreign_item).instantiate_identity();
let declaration_ty = tcx.type_of(foreign_item).instantiate_identity().skip_norm_wip();
debug!(?declaration_ty);
// FIXME: Copied over from compare impl items, same issue:
@@ -16,7 +16,7 @@
use rustc_middle::ty::{
self, BottomUpFolder, GenericArgs, GenericParamDefKind, Generics, Ty, TyCtxt, TypeFoldable,
TypeFolder, TypeSuperFoldable, TypeVisitable, TypeVisitableExt, TypeVisitor, TypingMode,
Upcast,
Unnormalized, Upcast,
};
use rustc_middle::{bug, span_bug};
use rustc_span::{BytePos, DUMMY_SP, Span};
@@ -40,7 +40,8 @@ pub(super) fn compare_impl_item(
) -> Result<(), ErrorGuaranteed> {
let impl_item = tcx.associated_item(impl_item_def_id);
let trait_item = tcx.associated_item(impl_item.expect_trait_impl()?);
let impl_trait_ref = tcx.impl_trait_ref(impl_item.container_id(tcx)).instantiate_identity();
let impl_trait_ref =
tcx.impl_trait_ref(impl_item.container_id(tcx)).instantiate_identity().skip_norm_wip();
debug!(?impl_trait_ref);
match impl_item.kind {
@@ -235,8 +236,9 @@ fn compare_method_predicate_entailment<'tcx>(
);
}
let hybrid_preds = hybrid_preds.into_iter().map(Unnormalized::skip_norm_wip);
let normalize_cause = traits::ObligationCause::misc(impl_m_span, impl_m_def_id);
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds));
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds));
// FIXME(-Zhigher-ranked-assumptions): The `hybrid_preds`
// should be well-formed. However, using them may result in
// region errors as we currently don't track placeholder
@@ -327,21 +329,22 @@ fn compare_method_predicate_entailment<'tcx>(
let unnormalized_impl_sig = infcx.instantiate_binder_with_fresh_vars(
impl_m_span,
BoundRegionConversionTime::HigherRankedType,
tcx.fn_sig(impl_m.def_id).instantiate_identity(),
tcx.fn_sig(impl_m.def_id).instantiate_identity().skip_norm_wip(),
);
let norm_cause = ObligationCause::misc(impl_m_span, impl_m_def_id);
let impl_sig = ocx.normalize(&norm_cause, param_env, unnormalized_impl_sig);
let impl_sig =
ocx.normalize(&norm_cause, param_env, Unnormalized::new_wip(unnormalized_impl_sig));
debug!(?impl_sig);
let trait_sig = tcx.fn_sig(trait_m.def_id).instantiate(tcx, trait_to_impl_args);
let trait_sig = tcx.fn_sig(trait_m.def_id).instantiate(tcx, trait_to_impl_args).skip_norm_wip();
let trait_sig = tcx.liberate_late_bound_regions(impl_m.def_id, trait_sig);
// Next, add all inputs and output as well-formed tys. Importantly,
// we have to do this before normalization, since the normalized ty may
// not contain the input parameters. See issue #87748.
wf_tys.extend(trait_sig.inputs_and_output.iter());
let trait_sig = ocx.normalize(&norm_cause, param_env, trait_sig);
let trait_sig = ocx.normalize(&norm_cause, param_env, Unnormalized::new_wip(trait_sig));
// We also have to add the normalized trait signature
// as we don't normalize during implied bounds computation.
wf_tys.extend(trait_sig.inputs_and_output.iter());
@@ -463,8 +466,10 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
) -> Result<&'tcx DefIdMap<ty::EarlyBinder<'tcx, Ty<'tcx>>>, ErrorGuaranteed> {
let impl_m = tcx.associated_item(impl_m_def_id.to_def_id());
let trait_m = tcx.associated_item(impl_m.expect_trait_impl()?);
let impl_trait_ref =
tcx.impl_trait_ref(tcx.parent(impl_m_def_id.to_def_id())).instantiate_identity();
let impl_trait_ref = tcx
.impl_trait_ref(tcx.parent(impl_m_def_id.to_def_id()))
.instantiate_identity()
.skip_norm_wip();
// First, check a few of the same things as `compare_impl_method`,
// just so we don't ICE during instantiation later.
check_method_is_structurally_compatible(tcx, impl_m, trait_m, impl_trait_ref, true)?;
@@ -493,7 +498,7 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
.instantiate_identity(tcx)
.into_iter()
.chain(tcx.predicates_of(trait_m.def_id).instantiate_own(tcx, trait_to_impl_args))
.map(|(clause, _)| clause);
.map(|(clause, _)| clause.skip_norm_wip());
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds));
let param_env = traits::normalize_param_env_or_error(
tcx,
@@ -532,11 +537,11 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
let impl_sig = ocx.normalize(
&misc_cause,
param_env,
infcx.instantiate_binder_with_fresh_vars(
Unnormalized::new_wip(infcx.instantiate_binder_with_fresh_vars(
return_span,
BoundRegionConversionTime::HigherRankedType,
tcx.fn_sig(impl_m.def_id).instantiate_identity(),
),
tcx.fn_sig(impl_m.def_id).instantiate_identity().skip_norm_wip(),
)),
);
impl_sig.error_reported()?;
let impl_return_ty = impl_sig.output();
@@ -549,11 +554,12 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
let unnormalized_trait_sig = tcx
.liberate_late_bound_regions(
impl_m.def_id,
tcx.fn_sig(trait_m.def_id).instantiate(tcx, trait_to_impl_args),
tcx.fn_sig(trait_m.def_id).instantiate(tcx, trait_to_impl_args).skip_norm_wip(),
)
.fold_with(&mut collector);
let trait_sig = ocx.normalize(&misc_cause, param_env, unnormalized_trait_sig);
let trait_sig =
ocx.normalize(&misc_cause, param_env, Unnormalized::new_wip(unnormalized_trait_sig));
trait_sig.error_reported()?;
let trait_return_ty = trait_sig.output();
@@ -839,12 +845,13 @@ fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
.cx()
.explicit_item_bounds(def_id)
.iter_instantiated_copied(self.cx(), proj_args)
.map(Unnormalized::skip_norm_wip)
{
let pred = pred.fold_with(self);
let pred = self.ocx.normalize(
&ObligationCause::misc(self.span, self.body_id),
self.param_env,
pred,
Unnormalized::new_wip(pred),
);
self.ocx.register_obligation(traits::Obligation::new(
@@ -1252,11 +1259,11 @@ fn check_region_late_boundedness<'tcx>(
.build_with_typing_env(ty::TypingEnv::non_body_analysis(tcx, impl_m.def_id));
let impl_m_args = infcx.fresh_args_for_item(DUMMY_SP, impl_m.def_id);
let impl_m_sig = tcx.fn_sig(impl_m.def_id).instantiate(tcx, impl_m_args);
let impl_m_sig = tcx.fn_sig(impl_m.def_id).instantiate(tcx, impl_m_args).skip_norm_wip();
let impl_m_sig = tcx.liberate_late_bound_regions(impl_m.def_id, impl_m_sig);
let trait_m_args = infcx.fresh_args_for_item(DUMMY_SP, trait_m.def_id);
let trait_m_sig = tcx.fn_sig(trait_m.def_id).instantiate(tcx, trait_m_args);
let trait_m_sig = tcx.fn_sig(trait_m.def_id).instantiate(tcx, trait_m_args).skip_norm_wip();
let trait_m_sig = tcx.liberate_late_bound_regions(impl_m.def_id, trait_m_sig);
let ocx = ObligationCtxt::new(&infcx);
@@ -1443,7 +1450,7 @@ fn find_region_in_predicates<'tcx>(
early_bound_region: ty::Region<'tcx>,
) -> Option<Span> {
for (pred, span) in tcx.explicit_predicates_of(def_id).instantiate_identity(tcx) {
if pred.visit_with(&mut FindRegion(early_bound_region)).is_break() {
if pred.skip_norm_wip().visit_with(&mut FindRegion(early_bound_region)).is_break() {
return Some(span);
}
}
@@ -1508,7 +1515,7 @@ fn compare_self_type<'tcx>(
}
ty::AssocContainer::Trait => tcx.types.self_param,
};
let self_arg_ty = tcx.fn_sig(method.def_id).instantiate_identity().input(0);
let self_arg_ty = tcx.fn_sig(method.def_id).instantiate_identity().skip_norm_wip().input(0);
let (infcx, param_env) = tcx
.infer_ctxt()
.build_with_typing_env(ty::TypingEnv::non_body_analysis(tcx, method.def_id));
@@ -2111,7 +2118,7 @@ fn compare_generic_param_kinds<'tcx>(
format!(
"{} const parameter of type `{}`",
prefix,
tcx.type_of(param.def_id).instantiate_identity()
tcx.type_of(param.def_id).instantiate_identity().skip_norm_wip()
)
}
Type { .. } => format!("{prefix} type parameter"),
@@ -2227,8 +2234,9 @@ fn compare_const_predicate_entailment<'tcx>(
.instantiate_own(tcx, trait_to_impl_args)
.map(|(predicate, _)| predicate),
);
let hybrid_preds = hybrid_preds.into_iter().map(Unnormalized::skip_norm_wip);
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds));
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds));
let param_env = traits::normalize_param_env_or_error(
tcx,
param_env,
@@ -2379,7 +2387,8 @@ fn compare_type_predicate_entailment<'tcx>(
);
}
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds));
let hybrid_preds = hybrid_preds.into_iter().map(Unnormalized::skip_norm_wip);
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds));
let param_env = traits::normalize_param_env_or_error(tcx, param_env, normalize_cause);
debug!(caller_bounds=?param_env.caller_bounds());
@@ -2511,12 +2520,13 @@ pub(super) fn check_type_bounds<'tcx>(
let mut obligations: Vec<_> = util::elaborate(
tcx,
tcx.explicit_item_bounds(trait_ty.def_id).iter_instantiated_copied(tcx, rebased_args).map(
|(concrete_ty_bound, span)| {
tcx.explicit_item_bounds(trait_ty.def_id)
.iter_instantiated_copied(tcx, rebased_args)
.map(Unnormalized::skip_norm_wip)
.map(|(concrete_ty_bound, span)| {
debug!(?concrete_ty_bound);
traits::Obligation::new(tcx, mk_cause(span), param_env, concrete_ty_bound)
},
),
}),
)
.collect();
@@ -2526,6 +2536,7 @@ pub(super) fn check_type_bounds<'tcx>(
tcx,
tcx.explicit_implied_const_bounds(trait_ty.def_id)
.iter_instantiated_copied(tcx, rebased_args)
.map(Unnormalized::skip_norm_wip)
.map(|(c, span)| {
traits::Obligation::new(
tcx,
@@ -2544,7 +2555,11 @@ pub(super) fn check_type_bounds<'tcx>(
// See <https://github.com/rust-lang/rust/pull/117542#issue-1976337685>.
let normalize_param_env = param_env_with_gat_bounds(tcx, impl_ty, impl_trait_ref);
for obligation in &mut obligations {
match ocx.deeply_normalize(&normalize_cause, normalize_param_env, obligation.predicate) {
match ocx.deeply_normalize(
&normalize_cause,
normalize_param_env,
Unnormalized::new_wip(obligation.predicate),
) {
Ok(pred) => obligation.predicate = pred,
Err(e) => {
return Err(infcx.err_ctxt().report_fulfillment_errors(e));
@@ -2702,7 +2717,7 @@ fn param_env_with_gat_bounds<'tcx>(
// checking the default value specifically here. Add this equality to the
// ParamEnv for normalization specifically.
let normalize_impl_ty =
tcx.type_of(impl_ty.def_id).instantiate(tcx, normalize_impl_ty_args);
tcx.type_of(impl_ty.def_id).instantiate(tcx, normalize_impl_ty_args).skip_norm_wip();
let rebased_args =
normalize_impl_ty_args.rebase_onto(tcx, container_id, impl_trait_ref.args);
let bound_vars = tcx.mk_bound_variable_kinds(&bound_vars);
@@ -9,7 +9,7 @@
use rustc_middle::ty::print::{with_no_trimmed_paths, with_types_for_signature};
use rustc_middle::ty::{
self, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperVisitable, TypeVisitable,
TypeVisitableExt, TypeVisitor, TypingMode,
TypeVisitableExt, TypeVisitor, TypingMode, Unnormalized,
};
use rustc_span::Span;
use rustc_trait_selection::regions::InferCtxtRegionExt;
@@ -44,19 +44,22 @@ pub(crate) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
let impl_def_id = impl_m.container_id(tcx);
let impl_m_args = ty::GenericArgs::identity_for_item(tcx, impl_m.def_id);
let trait_m_to_impl_m_args = impl_m_args.rebase_onto(tcx, impl_def_id, impl_trait_ref.args);
let bound_trait_m_sig = tcx.fn_sig(trait_m.def_id).instantiate(tcx, trait_m_to_impl_m_args);
let bound_trait_m_sig =
tcx.fn_sig(trait_m.def_id).instantiate(tcx, trait_m_to_impl_m_args).skip_norm_wip();
let trait_m_sig = tcx.liberate_late_bound_regions(impl_m.def_id, bound_trait_m_sig);
// replace the self type of the trait ref with `Self` so that diagnostics render better.
let trait_m_sig_with_self_for_diag = tcx.liberate_late_bound_regions(
impl_m.def_id,
tcx.fn_sig(trait_m.def_id).instantiate(
tcx.fn_sig(trait_m.def_id)
.instantiate(
tcx,
tcx.mk_args_from_iter(
[tcx.types.self_param.into()]
.into_iter()
.chain(trait_m_to_impl_m_args.iter().skip(1)),
),
),
)
.skip_norm_wip(),
);
let Ok(hidden_tys) = tcx.collect_return_position_impl_trait_in_trait_tys(impl_m.def_id) else {
@@ -80,8 +83,9 @@ pub(crate) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
for trait_projection in collector.types.into_iter().rev() {
let impl_opaque_args = trait_projection.args.rebase_onto(tcx, trait_m.def_id, impl_m_args);
let hidden_ty =
hidden_tys[&trait_projection.kind.def_id()].instantiate(tcx, impl_opaque_args);
let hidden_ty = hidden_tys[&trait_projection.kind.def_id()]
.instantiate(tcx, impl_opaque_args)
.skip_norm_wip();
// If the hidden type is not an opaque, then we have "refined" the trait signature.
let ty::Alias(
@@ -121,12 +125,14 @@ pub(crate) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
trait_bounds.extend(
tcx.item_bounds(trait_projection.kind.def_id())
.iter_instantiated(tcx, trait_projection.args),
.iter_instantiated(tcx, trait_projection.args)
.map(Unnormalized::skip_norm_wip),
);
impl_bounds.extend(elaborate(
tcx,
tcx.explicit_item_bounds(impl_opaque_def_id)
.iter_instantiated_copied(tcx, impl_opaque.args),
.iter_instantiated_copied(tcx, impl_opaque.args)
.map(Unnormalized::skip_norm_wip),
));
pairs.push((trait_projection, impl_opaque));
@@ -137,7 +143,7 @@ pub(crate) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
.instantiate_identity(tcx)
.into_iter()
.chain(tcx.predicates_of(trait_m.def_id).instantiate_own(tcx, trait_m_to_impl_m_args))
.map(|(clause, _)| clause);
.map(|(clause, _)| clause.skip_norm_wip());
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds));
let param_env = normalize_param_env_or_error(tcx, param_env, ObligationCause::dummy());
@@ -152,9 +158,11 @@ pub(crate) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
// 2. Deeply normalize any other projections that show up in the bound. That makes sure
// that we don't consider `tests/ui/async-await/in-trait/async-associated-types.rs`
// or `tests/ui/impl-trait/in-trait/refine-normalize.rs` to be refining.
let Ok((trait_bounds, impl_bounds)) =
ocx.deeply_normalize(&ObligationCause::dummy(), param_env, (trait_bounds, impl_bounds))
else {
let Ok((trait_bounds, impl_bounds)) = ocx.deeply_normalize(
&ObligationCause::dummy(),
param_env,
Unnormalized::new_wip((trait_bounds, impl_bounds)),
) else {
tcx.dcx().delayed_bug("encountered errors when checking RPITIT refinement (selection)");
return;
};
@@ -168,7 +176,7 @@ pub(crate) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
implied_wf_types.extend(ocx.normalize(
&ObligationCause::dummy(),
param_env,
trait_m_sig.inputs_and_output,
Unnormalized::new_wip(trait_m_sig.inputs_and_output),
));
if !ocx.evaluate_obligations_error_on_ambiguity().is_empty() {
tcx.dcx().delayed_bug("encountered errors when checking RPITIT refinement (selection)");
@@ -267,6 +275,7 @@ fn visit_ty(&mut self, ty: Ty<'tcx>) {
.tcx
.explicit_item_bounds(def_id)
.iter_instantiated_copied(self.tcx, proj.args)
.map(Unnormalized::skip_norm_wip)
{
pred.visit_with(self);
}
@@ -320,6 +329,7 @@ fn report_mismatched_rpitit_signature<'tcx>(
let Some(future_output_ty) = tcx
.explicit_item_bounds(future_ty_def_id)
.iter_instantiated_copied(tcx, args)
.map(Unnormalized::skip_norm_wip)
.find_map(|(clause, _)| match clause.kind().no_bound_vars()? {
ty::ClauseKind::Projection(proj) => proj.term.as_type(),
_ => None,
@@ -4,7 +4,7 @@
use rustc_hir::{Node, find_attr};
use rustc_infer::infer::TyCtxtInferExt;
use rustc_middle::span_bug;
use rustc_middle::ty::{self, TyCtxt, TypingMode};
use rustc_middle::ty::{self, TyCtxt, TypingMode, Unnormalized};
use rustc_session::config::EntryFnType;
use rustc_span::def_id::{CRATE_DEF_ID, DefId, LocalDefId};
use rustc_span::{ErrorGuaranteed, Span};
@@ -23,12 +23,12 @@ pub(crate) fn check_for_entry_fn(tcx: TyCtxt<'_>) -> Result<(), ErrorGuaranteed>
}
fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) -> Result<(), ErrorGuaranteed> {
let main_fnsig = tcx.fn_sig(main_def_id).instantiate_identity();
let main_fnsig = tcx.fn_sig(main_def_id).instantiate_identity().skip_norm_wip();
let main_span = tcx.def_span(main_def_id);
fn main_fn_diagnostics_def_id(tcx: TyCtxt<'_>, def_id: DefId, sp: Span) -> LocalDefId {
if let Some(local_def_id) = def_id.as_local() {
let hir_type = tcx.type_of(local_def_id).instantiate_identity();
let hir_type = tcx.type_of(local_def_id).instantiate_identity().skip_norm_wip();
if !matches!(hir_type.kind(), ty::FnDef(..)) {
span_bug!(sp, "main has a non-function type: found `{}`", hir_type);
}
@@ -129,7 +129,7 @@ fn main_fn_return_type_span(tcx: TyCtxt<'_>, def_id: DefId) -> Option<Span> {
ObligationCauseCode::MainFunctionType,
);
let ocx = traits::ObligationCtxt::new_with_diagnostics(&infcx);
let norm_return_ty = ocx.normalize(&cause, param_env, return_ty);
let norm_return_ty = ocx.normalize(&cause, param_env, Unnormalized::new_wip(return_ty));
ocx.register_bound(cause, param_env, norm_return_ty, term_did);
let errors = ocx.evaluate_obligations_error_on_ambiguity();
if !errors.is_empty() {
@@ -277,7 +277,7 @@ pub(crate) fn check_intrinsic_type(
kind: ty::BoundRegionKind::ClosureEnv,
},
);
let va_list_ty = tcx.type_of(did).instantiate(tcx, &[region.into()]);
let va_list_ty = tcx.type_of(did).instantiate(tcx, &[region.into()]).skip_norm_wip();
(Ty::new_ref(tcx, env_region, va_list_ty, mutbl), va_list_ty)
};
+11 -5
View File
@@ -89,6 +89,7 @@
use rustc_middle::ty::print::with_types_for_signature;
use rustc_middle::ty::{
self, GenericArgs, GenericArgsRef, OutlivesPredicate, Region, Ty, TyCtxt, TypingMode,
Unnormalized,
};
use rustc_middle::{bug, span_bug};
use rustc_session::parse::feature_err;
@@ -238,7 +239,7 @@ fn missing_items_err(
let snippet = with_types_for_signature!(suggestion_signature(
tcx,
trait_item,
tcx.impl_trait_ref(impl_def_id).instantiate_identity(),
tcx.impl_trait_ref(impl_def_id).instantiate_identity().skip_norm_wip(),
));
let code = format!("{padding}{snippet}\n{padding}");
if let Some(span) = tcx.hir_span_if_local(trait_item.def_id) {
@@ -489,6 +490,7 @@ fn fn_sig_suggestion<'tcx>(
&& let Some(output) = tcx
.explicit_item_self_bounds(alias_ty.kind.def_id())
.iter_instantiated_copied(tcx, alias_ty.args)
.map(Unnormalized::skip_norm_wip)
.find_map(|(bound, _)| {
bound.as_projection_clause()?.no_bound_vars()?.term.as_type()
}) {
@@ -536,22 +538,26 @@ fn suggestion_signature<'tcx>(
tcx,
tcx.liberate_late_bound_regions(
assoc.def_id,
tcx.fn_sig(assoc.def_id).instantiate(tcx, args),
tcx.fn_sig(assoc.def_id).instantiate(tcx, args).skip_norm_wip(),
),
assoc.ident(tcx),
tcx.predicates_of(assoc.def_id).instantiate_own(tcx, args),
tcx.predicates_of(assoc.def_id)
.instantiate_own(tcx, args)
.map(|(c, s)| (c.skip_norm_wip(), s)),
assoc,
),
ty::AssocKind::Type { .. } => {
let (generics, where_clauses) = bounds_from_generic_predicates(
tcx,
tcx.predicates_of(assoc.def_id).instantiate_own(tcx, args),
tcx.predicates_of(assoc.def_id)
.instantiate_own(tcx, args)
.map(|(c, s)| (c.skip_norm_wip(), s)),
assoc,
);
format!("type {}{generics} = /* Type */{where_clauses};", assoc.name())
}
ty::AssocKind::Const { name, .. } => {
let ty = tcx.type_of(assoc.def_id).instantiate_identity();
let ty = tcx.type_of(assoc.def_id).instantiate_identity().skip_norm_wip();
let val = tcx
.infer_ctxt()
.build(TypingMode::non_body_analysis())
@@ -24,7 +24,7 @@
use rustc_middle::ty::{
self, AdtKind, GenericArgKind, GenericArgs, GenericParamDefKind, Ty, TyCtxt, TypeFlags,
TypeFoldable, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor, TypingMode,
Upcast,
Unnormalized, Upcast,
};
use rustc_middle::{bug, span_bug};
use rustc_session::parse::feature_err;
@@ -109,7 +109,7 @@ pub(super) fn deeply_normalize<T>(
Ok(value) => value,
Err(errors) => {
self.infcx.err_ctxt().report_fulfillment_errors(errors);
value
value.skip_norm_wip()
}
}
} else {
@@ -426,7 +426,7 @@ fn check_gat_where_clauses(tcx: TyCtxt<'_>, trait_def_id: LocalDefId) {
// `Self::Iter<'a>` is a GAT we want to gather any potential missing bounds from.
let sig: ty::FnSig<'_> = tcx.liberate_late_bound_regions(
item_def_id.to_def_id(),
tcx.fn_sig(item_def_id).instantiate_identity(),
tcx.fn_sig(item_def_id).instantiate_identity().skip_norm_wip(),
);
gather_gat_bounds(
tcx,
@@ -456,6 +456,7 @@ fn check_gat_where_clauses(tcx: TyCtxt<'_>, trait_def_id: LocalDefId) {
item_def_id,
tcx.explicit_item_bounds(item_def_id)
.iter_identity_copied()
.map(Unnormalized::skip_norm_wip)
.collect::<Vec<_>>(),
&FxIndexSet::default(),
gat_def_id,
@@ -850,7 +851,7 @@ fn check_param_wf(tcx: TyCtxt<'_>, param: &ty::GenericParamDef) -> Result<(), Er
// Const parameters are well formed if their type is structural match.
ty::GenericParamDefKind::Const { .. } => {
let ty = tcx.type_of(param.def_id).instantiate_identity();
let ty = tcx.type_of(param.def_id).instantiate_identity().skip_norm_wip();
let span = tcx.def_span(param.def_id);
let def_id = param.def_id.expect_local();
@@ -975,7 +976,7 @@ pub(crate) fn check_associated_item(
let self_ty = match item.container {
ty::AssocContainer::Trait => tcx.types.self_param,
ty::AssocContainer::InherentImpl | ty::AssocContainer::TraitImpl(_) => {
tcx.type_of(item.container_id(tcx)).instantiate_identity()
tcx.type_of(item.container_id(tcx)).instantiate_identity().skip_norm_wip()
}
};
@@ -1005,7 +1006,7 @@ pub(crate) fn check_associated_item(
Ok(())
}
ty::AssocKind::Fn { .. } => {
let sig = tcx.fn_sig(def_id).instantiate_identity();
let sig = tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip();
let hir_sig =
tcx.hir_node_by_def_id(def_id).fn_sig().expect("bad signature for method");
check_fn_or_method(wfcx, sig, hir_sig.decl, def_id);
@@ -1094,7 +1095,7 @@ fn check_type_defn<'tcx>(
// intermediate types must be sized.
let needs_drop_copy = || {
packed && {
let ty = tcx.type_of(variant.tail().did).instantiate_identity();
let ty = tcx.type_of(variant.tail().did).instantiate_identity().skip_norm_wip();
let ty = tcx.erase_and_anonymize_regions(ty);
assert!(!ty.has_infer());
ty.needs_drop(tcx, wfcx.infcx.typing_env(wfcx.param_env))
@@ -1201,7 +1202,8 @@ fn check_associated_type_bounds(wfcx: &WfCheckingCtxt<'_, '_>, item: ty::AssocIt
let bounds = wfcx.tcx().explicit_item_bounds(item.def_id);
debug!("check_associated_type_bounds: bounds={:?}", bounds);
let wf_obligations = bounds.iter_identity_copied().flat_map(|(bound, bound_span)| {
let wf_obligations = bounds.iter_identity_copied().map(Unnormalized::skip_norm_wip).flat_map(
|(bound, bound_span)| {
traits::wf::clause_obligations(
wfcx.infcx,
wfcx.param_env,
@@ -1209,7 +1211,8 @@ fn check_associated_type_bounds(wfcx: &WfCheckingCtxt<'_, '_>, item: ty::AssocIt
bound,
bound_span,
)
});
},
);
wfcx.register_obligations(wf_obligations);
}
@@ -1222,7 +1225,7 @@ fn check_item_fn(
enter_wf_checking_ctxt(tcx, def_id, |wfcx| {
check_eiis_fn(tcx, def_id);
let sig = tcx.fn_sig(def_id).instantiate_identity();
let sig = tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip();
check_fn_or_method(wfcx, sig, decl, def_id);
Ok(())
})
@@ -1296,14 +1299,14 @@ pub(crate) fn check_static_item<'tcx>(
let span = tcx.ty_span(item_id);
let loc = Some(WellFormedLoc::Ty(item_id));
let item_ty = wfcx.deeply_normalize(span, loc, ty);
let item_ty = wfcx.deeply_normalize(span, loc, Unnormalized::new_wip(ty));
let is_foreign_item = tcx.is_foreign_item(item_id);
let is_structurally_foreign_item = || {
let tail = tcx.struct_tail_raw(
item_ty,
&ObligationCause::dummy(),
|ty| wfcx.deeply_normalize(span, loc, ty),
|ty| wfcx.deeply_normalize(span, loc, Unnormalized::new_wip(ty)),
|| {},
);
@@ -1395,7 +1398,7 @@ fn check_impl<'tcx>(
let trait_ref = tcx.impl_trait_ref(item.owner_id).instantiate_identity();
// Avoid bogus "type annotations needed `Foo: Bar`" errors on `impl Bar for Foo` in
// case other `Foo` impls are incoherent.
tcx.ensure_result().coherent_trait(trait_ref.def_id)?;
tcx.ensure_result().coherent_trait(trait_ref.skip_normalization().def_id)?;
let trait_span = of_trait.trait_ref.path.span;
let trait_ref = wfcx.deeply_normalize(
trait_span,
@@ -1456,11 +1459,11 @@ fn check_impl<'tcx>(
wfcx.register_obligations(obligations);
}
None => {
let self_ty = tcx.type_of(item.owner_id).instantiate_identity();
let self_ty = tcx.type_of(item.owner_id).instantiate_identity().skip_norm_wip();
let self_ty = wfcx.deeply_normalize(
item.span,
Some(WellFormedLoc::Ty(item.hir_id().expect_owner().def_id)),
self_ty,
Unnormalized::new_wip(self_ty),
);
wfcx.register_wf_obligation(
impl_.self_ty.span,
@@ -1491,7 +1494,11 @@ pub(super) fn check_where_clauses<'tcx>(wfcx: &WfCheckingCtxt<'_, 'tcx>, def_id:
//
// Here, the default `Vec<[u32]>` is not WF because `[u32]: Sized` does not hold.
for param in &generics.own_params {
if let Some(default) = param.default_value(tcx).map(ty::EarlyBinder::instantiate_identity) {
if let Some(default) = param
.default_value(tcx)
.map(ty::EarlyBinder::instantiate_identity)
.map(Unnormalized::skip_norm_wip)
{
// Ignore dependent defaults -- that is, where the default of one type
// parameter includes another (e.g., `<T, U = T>`). In those cases, we can't
// be sure if it will error or not as user might always specify the other.
@@ -1519,14 +1526,14 @@ pub(super) fn check_where_clauses<'tcx>(wfcx: &WfCheckingCtxt<'_, 'tcx>, def_id:
ty::ConstKind::Error(_) | ty::ConstKind::Expr(_) => continue,
ty::ConstKind::Value(cv) => cv.ty,
ty::ConstKind::Unevaluated(uv) => {
infcx.tcx.type_of(uv.def).instantiate(infcx.tcx, uv.args)
infcx.tcx.type_of(uv.def).instantiate(infcx.tcx, uv.args).skip_norm_wip()
}
ty::ConstKind::Param(param_ct) => {
param_ct.find_const_ty_from_env(wfcx.param_env)
}
};
let param_ty = tcx.type_of(param.def_id).instantiate_identity();
let param_ty = tcx.type_of(param.def_id).instantiate_identity().skip_norm_wip();
if !ct_ty.has_param() && !param_ty.has_param() {
let cause = traits::ObligationCause::new(
tcx.def_span(param.def_id),
@@ -1555,7 +1562,7 @@ pub(super) fn check_where_clauses<'tcx>(wfcx: &WfCheckingCtxt<'_, 'tcx>, def_id:
let args = GenericArgs::for_item(tcx, def_id.to_def_id(), |param, _| {
if param.index >= generics.parent_count as u32
// If the param has a default, ...
&& let Some(default) = param.default_value(tcx).map(ty::EarlyBinder::instantiate_identity)
&& let Some(default) = param.default_value(tcx).map(ty::EarlyBinder::instantiate_identity).map(Unnormalized::skip_norm_wip)
// ... and it's not a dependent default, ...
&& !default.has_param()
{
@@ -1599,12 +1606,16 @@ fn visit_const(&mut self, c: ty::Const<'tcx>) -> Self::Result {
let instantiated_pred = ty::EarlyBinder::bind(pred).instantiate(tcx, args);
// Don't check non-defaulted params, dependent defaults (including lifetimes)
// or preds with multiple params.
if instantiated_pred.has_non_region_param()
if instantiated_pred.skip_normalization().has_non_region_param()
|| param_count.params.len() > 1
|| has_region
{
None
} else if predicates.predicates.iter().any(|&(p, _)| p == instantiated_pred) {
} else if predicates
.predicates
.iter()
.any(|&(p, _)| Unnormalized::new_wip(p) == instantiated_pred)
{
// Avoid duplication of predicates that contain no parameters, for example.
None
} else {
@@ -1638,13 +1649,15 @@ fn visit_const(&mut self, c: ty::Const<'tcx>) -> Self::Result {
.copied()
.zip(predicates.spans.iter().copied())
.filter_map(|(clause, sp)| {
let clause = clause.skip_norm_wip();
let proj = clause.as_projection_clause()?;
let pred_binder = proj
.map_bound(|pred| {
pred.term.as_const().map(|ct| {
let assoc_const_ty = tcx
.type_of(pred.projection_term.def_id)
.instantiate(tcx, pred.projection_term.args);
.instantiate(tcx, pred.projection_term.args)
.skip_norm_wip();
ty::ClauseKind::ConstArgHasType(ct, assoc_const_ty)
})
})
@@ -1662,7 +1675,13 @@ fn visit_const(&mut self, c: ty::Const<'tcx>) -> Self::Result {
assert_eq!(predicates.predicates.len(), predicates.spans.len());
let wf_obligations = predicates.into_iter().flat_map(|(p, sp)| {
traits::wf::clause_obligations(infcx, wfcx.param_env, wfcx.body_def_id, p, sp)
traits::wf::clause_obligations(
infcx,
wfcx.param_env,
wfcx.body_def_id,
p.skip_norm_wip(),
sp,
)
});
let obligations: Vec<_> =
wf_obligations.chain(default_obligations).chain(assoc_const_obligations).collect();
@@ -1697,7 +1716,7 @@ fn check_fn_or_method<'tcx>(
// one greater than the index of the last input type.
param_idx: idx,
}),
ty,
Unnormalized::new_wip(ty),
)
}));
@@ -1783,16 +1802,16 @@ fn check_method_receiver<'tcx>(
let span = fn_sig.decl.inputs[0].span;
let loc = Some(WellFormedLoc::Param { function: method.def_id.expect_local(), param_idx: 0 });
let sig = tcx.fn_sig(method.def_id).instantiate_identity();
let sig = tcx.fn_sig(method.def_id).instantiate_identity().skip_norm_wip();
let sig = tcx.liberate_late_bound_regions(method.def_id, sig);
let sig = wfcx.normalize(DUMMY_SP, loc, sig);
let sig = wfcx.normalize(DUMMY_SP, loc, Unnormalized::new_wip(sig));
debug!("check_method_receiver: sig={:?}", sig);
let self_ty = wfcx.normalize(DUMMY_SP, loc, self_ty);
let self_ty = wfcx.normalize(DUMMY_SP, loc, Unnormalized::new_wip(self_ty));
let receiver_ty = sig.inputs()[0];
let receiver_ty = wfcx.normalize(DUMMY_SP, loc, receiver_ty);
let receiver_ty = wfcx.normalize(DUMMY_SP, loc, Unnormalized::new_wip(receiver_ty));
// If the receiver already has errors reported, consider it valid to avoid
// unnecessary errors (#58712).
@@ -2126,6 +2145,7 @@ pub(super) fn check_variances_for_type_defn<'tcx>(tcx: TyCtxt<'tcx>, def_id: Loc
if let ControlFlow::Break(ErrorGuaranteed { .. }) = tcx
.type_of(def_id)
.instantiate_identity()
.skip_norm_wip()
.visit_with(&mut HasErrorDeep { tcx, seen: Default::default() })
{
continue;
@@ -2157,7 +2177,11 @@ fn visit_ty(&mut self, ty: Ty<'tcx>) -> Self::Result {
ty::Adt(def, _) => {
if self.seen.insert(def.did()) {
for field in def.all_fields() {
self.tcx.type_of(field.did).instantiate_identity().visit_with(self)?;
self.tcx
.type_of(field.did)
.instantiate_identity()
.skip_norm_wip()
.visit_with(self)?;
}
}
}
@@ -2278,11 +2302,15 @@ fn visit_def(&mut self, def_id: DefId) -> ControlFlow<(), ()> {
match self.tcx.def_kind(def_id) {
DefKind::Struct | DefKind::Enum | DefKind::Union => {
self.tcx.adt_def(def_id).all_fields().try_for_each(|field| {
self.tcx.type_of(field.did).instantiate_identity().visit_with(self)
self.tcx
.type_of(field.did)
.instantiate_identity()
.skip_norm_wip()
.visit_with(self)
})
}
DefKind::TyAlias if self.tcx.type_alias_is_lazy(def_id) => {
self.tcx.type_of(def_id).instantiate_identity().visit_with(self)
self.tcx.type_of(def_id).instantiate_identity().skip_norm_wip().visit_with(self)
}
_ => ControlFlow::Continue(()),
}
@@ -2368,7 +2396,7 @@ fn check_false_global_bounds(&mut self) {
// Match the existing behavior.
if pred.is_global() && !pred.has_type_flags(TypeFlags::HAS_BINDER_VARS) {
let pred = self.normalize(span, None, pred);
let pred = self.normalize(span, None, Unnormalized::new_wip(pred));
// only use the span of the predicate clause (#90869)
let hir_node = tcx.hir_node_by_def_id(self.body_def_id);
@@ -2483,8 +2511,13 @@ fn lint_redundant_lifetimes<'tcx>(
);
// If we are in a function, add its late-bound lifetimes too.
if matches!(def_kind, DefKind::Fn | DefKind::AssocFn) {
for (idx, var) in
tcx.fn_sig(owner_id).instantiate_identity().bound_vars().iter().enumerate()
for (idx, var) in tcx
.fn_sig(owner_id)
.instantiate_identity()
.skip_norm_wip()
.bound_vars()
.iter()
.enumerate()
{
let ty::BoundVariableKind::Region(kind) = var else { continue };
let kind = ty::LateParamRegionKind::from_bound(ty::BoundVar::from_usize(idx), kind);
@@ -73,7 +73,7 @@ fn visit_implementation_of_drop(checker: &Checker<'_>) -> Result<(), ErrorGuaran
let tcx = checker.tcx;
let impl_did = checker.impl_def_id;
// Destructors only work on local ADT types.
match checker.impl_header.trait_ref.instantiate_identity().self_ty().kind() {
match checker.impl_header.trait_ref.instantiate_identity().skip_norm_wip().self_ty().kind() {
ty::Adt(def, _) if def.did().is_local() => return Ok(()),
ty::Error(_) => return Ok(()),
_ => {}
@@ -93,7 +93,7 @@ fn visit_implementation_of_copy(checker: &Checker<'_>) -> Result<(), ErrorGuaran
let impl_did = checker.impl_def_id;
debug!("visit_implementation_of_copy: impl_did={:?}", impl_did);
let self_type = impl_header.trait_ref.instantiate_identity().self_ty();
let self_type = impl_header.trait_ref.instantiate_identity().skip_norm_wip().self_ty();
debug!("visit_implementation_of_copy: self_type={:?} (bound)", self_type);
let param_env = tcx.param_env(impl_did);
@@ -142,7 +142,7 @@ fn visit_implementation_of_unpin(checker: &Checker<'_>) -> Result<(), ErrorGuara
let impl_did = checker.impl_def_id;
debug!("visit_implementation_of_unpin: impl_did={:?}", impl_did);
let self_type = impl_header.trait_ref.instantiate_identity().self_ty();
let self_type = impl_header.trait_ref.instantiate_identity().skip_norm_wip().self_ty();
debug!("visit_implementation_of_unpin: self_type={:?}", self_type);
let span = tcx.def_span(impl_did);
@@ -175,7 +175,7 @@ fn visit_implementation_of_const_param_ty(checker: &Checker<'_>) -> Result<(), E
let tcx = checker.tcx;
let header = checker.impl_header;
let impl_did = checker.impl_def_id;
let self_type = header.trait_ref.instantiate_identity().self_ty();
let self_type = header.trait_ref.instantiate_identity().skip_norm_wip().self_ty();
assert!(!self_type.has_escaping_bound_vars());
let param_env = tcx.param_env(impl_did);
@@ -259,7 +259,7 @@ fn is_from_coerce_pointee_derive(tcx: TyCtxt<'_>, span: Span) -> bool {
fn visit_implementation_of_dispatch_from_dyn(checker: &Checker<'_>) -> Result<(), ErrorGuaranteed> {
let tcx = checker.tcx;
let impl_did = checker.impl_def_id;
let trait_ref = checker.impl_header.trait_ref.instantiate_identity();
let trait_ref = checker.impl_header.trait_ref.instantiate_identity().skip_norm_wip();
debug!("visit_implementation_of_dispatch_from_dyn: impl_did={:?}", impl_did);
let span = tcx.def_span(impl_did);
@@ -350,7 +350,7 @@ fn visit_implementation_of_dispatch_from_dyn(checker: &Checker<'_>) -> Result<()
ty::TypingEnv::non_body_analysis(tcx, def_a.did()),
unnormalized_ty,
)
.unwrap_or(unnormalized_ty)
.unwrap_or(unnormalized_ty.skip_norm_wip())
.is_phantom_data()
{
return None;
@@ -445,8 +445,8 @@ pub(crate) fn coerce_unsized_info<'tcx>(
let coerce_unsized_trait = tcx.require_lang_item(LangItem::CoerceUnsized, span);
let unsize_trait = tcx.require_lang_item(LangItem::Unsize, span);
let source = tcx.type_of(impl_did).instantiate_identity();
let trait_ref = tcx.impl_trait_ref(impl_did).instantiate_identity();
let source = tcx.type_of(impl_did).instantiate_identity().skip_norm_wip();
let trait_ref = tcx.impl_trait_ref(impl_did).instantiate_identity().skip_norm_wip();
assert_eq!(trait_ref.def_id, coerce_unsized_trait);
let target = trait_ref.args.type_at(1);
@@ -570,7 +570,7 @@ pub(crate) fn coerce_unsized_info<'tcx>(
ty::TypingEnv::non_body_analysis(tcx, def_a.did()),
unnormalized_ty,
)
.unwrap_or(unnormalized_ty)
.unwrap_or(unnormalized_ty.skip_norm_wip())
.is_phantom_data()
{
return None;
@@ -788,7 +788,8 @@ fn visit_implementation_of_coerce_pointee_validity(
checker: &Checker<'_>,
) -> Result<(), ErrorGuaranteed> {
let tcx = checker.tcx;
let self_ty = tcx.impl_trait_ref(checker.impl_def_id).instantiate_identity().self_ty();
let self_ty =
tcx.impl_trait_ref(checker.impl_def_id).instantiate_identity().skip_norm_wip().self_ty();
let span = tcx.def_span(checker.impl_def_id);
if !tcx.is_builtin_derived(checker.impl_def_id.into()) {
return Err(tcx.dcx().emit_err(errors::CoercePointeeNoUserValidityAssertion { span }));
@@ -164,7 +164,7 @@ fn check_item(&mut self, id: hir::ItemId) -> Result<(), ErrorGuaranteed> {
let id = id.owner_id.def_id;
let item_span = self.tcx.def_span(id);
let self_ty = self.tcx.type_of(id).instantiate_identity();
let self_ty = self.tcx.type_of(id).instantiate_identity().skip_norm_wip();
let mut self_ty = self.tcx.peel_off_free_alias_tys(self_ty);
// We allow impls on pattern types exactly when we allow impls on the base type.
// FIXME(pattern_types): Figure out the exact coherence rules we want here.
@@ -172,7 +172,7 @@ fn coherent_trait(tcx: TyCtxt<'_>, def_id: DefId) -> Result<(), ErrorGuaranteed>
for &impl_def_id in impls {
let impl_header = tcx.impl_trait_header(impl_def_id);
let trait_ref = impl_header.trait_ref.instantiate_identity();
let trait_ref = impl_header.trait_ref.instantiate_identity().skip_norm_wip();
let trait_def = tcx.trait_def(trait_ref.def_id);
res = res
@@ -7,6 +7,7 @@
use rustc_lint_defs::builtin::UNCOVERED_PARAM_IN_PROJECTION;
use rustc_middle::ty::{
self, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor, TypingMode,
Unnormalized,
};
use rustc_middle::{bug, span_bug};
use rustc_span::def_id::{DefId, LocalDefId};
@@ -22,7 +23,7 @@ pub(crate) fn orphan_check_impl(
tcx: TyCtxt<'_>,
impl_def_id: LocalDefId,
) -> Result<(), ErrorGuaranteed> {
let trait_ref = tcx.impl_trait_ref(impl_def_id).instantiate_identity();
let trait_ref = tcx.impl_trait_ref(impl_def_id).instantiate_identity().skip_norm_wip();
trait_ref.error_reported()?;
match orphan_check(tcx, impl_def_id, OrphanCheckMode::Proper) {
@@ -301,13 +302,13 @@ fn orphan_check<'tcx>(
let infcx = tcx.infer_ctxt().build(TypingMode::Coherence);
let cause = traits::ObligationCause::dummy();
let args = infcx.fresh_args_for_item(cause.span, impl_def_id.to_def_id());
let trait_ref = trait_ref.instantiate(tcx, args);
let trait_ref = trait_ref.instantiate(tcx, args).skip_norm_wip();
let lazily_normalize_ty = |user_ty: Ty<'tcx>| {
let ty::Alias(..) = user_ty.kind() else { return Ok(user_ty) };
let ocx = traits::ObligationCtxt::new(&infcx);
let ty = ocx.normalize(&cause, ty::ParamEnv::empty(), user_ty);
let ty = ocx.normalize(&cause, ty::ParamEnv::empty(), Unnormalized::new_wip(user_ty));
let ty = infcx.resolve_vars_if_possible(ty);
let errors = ocx.try_evaluate_obligations();
if !errors.is_empty() {
@@ -318,7 +319,7 @@ fn orphan_check<'tcx>(
ocx.structurally_normalize_ty(
&cause,
ty::ParamEnv::empty(),
infcx.resolve_vars_if_possible(ty),
Unnormalized::new_wip(infcx.resolve_vars_if_possible(ty)),
)
.unwrap_or(ty)
} else {
@@ -18,7 +18,7 @@ pub(super) fn check_item(
) -> Result<(), ErrorGuaranteed> {
let unsafe_attr =
tcx.generics_of(def_id).own_params.iter().find(|p| p.pure_wrt_drop).map(|_| "may_dangle");
let trait_ref = trait_header.trait_ref.instantiate_identity();
let trait_ref = trait_header.trait_ref.instantiate_identity().skip_norm_wip();
let is_copy = tcx.is_lang_item(trait_def.def_id, LangItem::Copy);
let trait_def_safety = if is_copy {
+18 -12
View File
@@ -34,7 +34,8 @@
use rustc_middle::query::Providers;
use rustc_middle::ty::util::{Discr, IntTypeExt};
use rustc_middle::ty::{
self, AdtKind, Const, IsSuggestable, Ty, TyCtxt, TypeVisitableExt, TypingMode, fold_regions,
self, AdtKind, Const, IsSuggestable, Ty, TyCtxt, TypeVisitableExt, TypingMode, Unnormalized,
fold_regions,
};
use rustc_middle::{bug, span_bug};
use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw, sym};
@@ -388,7 +389,7 @@ fn select_inherent_assoc_candidates(
let candidates = candidates
.into_iter()
.filter(|&InherentAssocCandidate { impl_, .. }| {
let impl_ty = self.tcx().type_of(impl_).instantiate_identity();
let impl_ty = self.tcx().type_of(impl_).instantiate_identity().skip_norm_wip();
// See comment on doing this operation for `self_ty`
let impl_ty = self.tcx.expand_free_alias_tys(impl_ty);
@@ -1033,8 +1034,11 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<'_, ty::PolyFn
Ctor(data) => {
assert_matches!(data.ctor(), Some(_));
let adt_def_id = tcx.hir_get_parent_item(hir_id).def_id.to_def_id();
let ty = tcx.type_of(adt_def_id).instantiate_identity();
let inputs = data.fields().iter().map(|f| tcx.type_of(f.def_id).instantiate_identity());
let ty = tcx.type_of(adt_def_id).instantiate_identity().skip_norm_wip();
let inputs = data
.fields()
.iter()
.map(|f| tcx.type_of(f.def_id).instantiate_identity().skip_norm_wip());
// constructors for structs with `layout_scalar_valid_range` are unsafe to call
let safety = match tcx.layout_scalar_valid_range(adt_def_id) {
(Bound::Unbounded, Bound::Unbounded) => hir::Safety::Safe,
@@ -1339,7 +1343,7 @@ pub fn suggest_impl_trait<'tcx>(
let item_ty = ocx.normalize(
&ObligationCause::dummy(),
param_env,
Ty::new_projection_from_args(infcx.tcx, assoc_item_def_id, args),
Unnormalized::new(Ty::new_projection_from_args(infcx.tcx, assoc_item_def_id, args)),
);
// FIXME(compiler-errors): We may benefit from resolving regions here.
if ocx.try_evaluate_obligations().is_empty()
@@ -1373,7 +1377,7 @@ fn impl_trait_header(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::ImplTraitHeader
let of_trait = impl_
.of_trait
.unwrap_or_else(|| panic!("expected impl trait, found inherent impl on {def_id:?}"));
let selfty = tcx.type_of(def_id).instantiate_identity();
let selfty = tcx.type_of(def_id).instantiate_identity().skip_norm_wip();
let is_rustc_reservation = find_attr!(tcx, def_id, RustcReservationImpl(..));
check_impl_constness(tcx, impl_.constness, &of_trait.trait_ref);
@@ -1597,9 +1601,10 @@ fn const_param_default<'tcx>(
let def_id = local_def_id.to_def_id();
let identity_args = ty::GenericArgs::identity_for_item(tcx, tcx.parent(def_id));
let ct = icx
.lowerer()
.lower_const_arg(default_ct, tcx.type_of(def_id).instantiate(tcx, identity_args));
let ct = icx.lowerer().lower_const_arg(
default_ct,
tcx.type_of(def_id).instantiate(tcx, identity_args).skip_norm_wip(),
);
ty::EarlyBinder::bind(ct)
}
@@ -1713,9 +1718,10 @@ fn const_of_item<'tcx>(
};
let icx = ItemCtxt::new(tcx, def_id);
let identity_args = ty::GenericArgs::identity_for_item(tcx, def_id);
let ct = icx
.lowerer()
.lower_const_arg(ct_arg, tcx.type_of(def_id.to_def_id()).instantiate(tcx, identity_args));
let ct = icx.lowerer().lower_const_arg(
ct_arg,
tcx.type_of(def_id.to_def_id()).instantiate(tcx, identity_args).skip_norm_wip(),
);
if let Err(e) = icx.check_tainted_by_errors()
&& !ct.references_error()
{
@@ -3,7 +3,7 @@
use rustc_hir::def_id::LocalDefId;
use rustc_hir::{find_attr, intravisit};
use rustc_middle::hir::nested_filter;
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt};
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt, Unnormalized};
use rustc_span::sym;
pub(crate) fn opaque_hidden_types(tcx: TyCtxt<'_>) {
@@ -20,7 +20,7 @@ pub(crate) fn opaque_hidden_types(tcx: TyCtxt<'_>) {
continue;
}
let ty = tcx.type_of(id).instantiate_identity();
let ty = tcx.type_of(id).instantiate_identity().skip_norm_wip();
let span = tcx.def_span(id);
tcx.dcx().emit_err(crate::errors::TypeOf { span, ty });
}
@@ -32,7 +32,12 @@ pub(crate) fn predicates_and_item_bounds(tcx: TyCtxt<'_>) {
let attrs = tcx.get_all_attrs(id);
if find_attr!(attrs, RustcDumpPredicates) {
let preds = tcx.predicates_of(id).instantiate_identity(tcx).predicates;
let preds = tcx
.predicates_of(id)
.instantiate_identity(tcx)
.predicates
.into_iter()
.map(Unnormalized::skip_norm_wip);
let span = tcx.def_span(id);
let mut diag = tcx.dcx().struct_span_err(span, sym::rustc_dump_predicates.as_str());
@@ -47,7 +52,7 @@ pub(crate) fn predicates_and_item_bounds(tcx: TyCtxt<'_>) {
match tcx.def_kind(id) {
DefKind::AssocTy => {
let bounds = tcx.item_bounds(id).instantiate_identity();
let bounds = tcx.item_bounds(id).instantiate_identity().skip_norm_wip();
let span = tcx.def_span(id);
let mut diag = tcx.dcx().struct_span_err(span, name);
@@ -123,14 +128,14 @@ pub(crate) fn vtables<'tcx>(tcx: TyCtxt<'tcx>) {
let vtable_entries = match tcx.hir_item(id).kind {
hir::ItemKind::Impl(hir::Impl { of_trait: Some(_), .. }) => {
let trait_ref = tcx.impl_trait_ref(def_id).instantiate_identity();
if trait_ref.has_non_region_param() {
if trait_ref.skip_normalization().has_non_region_param() {
tcx.dcx().span_err(
attr_span,
"`rustc_dump_vtable` must be applied to non-generic impl",
);
continue;
}
if !tcx.is_dyn_compatible(trait_ref.def_id) {
if !tcx.is_dyn_compatible(trait_ref.skip_normalization().def_id) {
tcx.dcx().span_err(
attr_span,
"`rustc_dump_vtable` must be applied to dyn-compatible trait",
@@ -150,7 +155,7 @@ pub(crate) fn vtables<'tcx>(tcx: TyCtxt<'tcx>) {
}
hir::ItemKind::TyAlias(..) => {
let ty = tcx.type_of(def_id).instantiate_identity();
if ty.has_non_region_param() {
if ty.skip_normalization().has_non_region_param() {
tcx.dcx().span_err(
attr_span,
"`rustc_dump_vtable` must be applied to non-generic type",
@@ -558,7 +558,7 @@ fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
self.tcx.opt_rpitit_info(projection_ty_def_id)
&& fn_def_id == self.fn_def_id
{
self.tcx.type_of(projection_ty_def_id).instantiate(self.tcx, args)
self.tcx.type_of(projection_ty_def_id).instantiate(self.tcx, args).skip_norm_wip()
} else {
ty.super_fold_with(self)
}
@@ -92,8 +92,11 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
// parent predicates would hold, and also so that the param-env
// inherits these predicates as assumptions.
let identity_args = ty::GenericArgs::identity_for_item(tcx, def_id);
predicates
.extend(tcx.explicit_predicates_of(fn_def_id).instantiate_own(tcx, identity_args));
predicates.extend(
tcx.explicit_predicates_of(fn_def_id)
.instantiate_own(tcx, identity_args)
.map(|(c, s)| (c.skip_norm_wip(), s)),
);
// We also install bidirectional outlives predicates for the RPITIT
// to keep the duplicates lifetimes from opaque lowering in sync.
@@ -118,12 +121,15 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
let impl_assoc_identity_args = ty::GenericArgs::identity_for_item(tcx, def_id);
let impl_def_id = tcx.parent(fn_def_id);
let impl_trait_ref_args = tcx.impl_trait_ref(impl_def_id).instantiate_identity().args;
let impl_trait_ref_args =
tcx.impl_trait_ref(impl_def_id).instantiate_identity().skip_norm_wip().args;
let impl_assoc_args =
impl_assoc_identity_args.rebase_onto(tcx, impl_def_id, impl_trait_ref_args);
let impl_predicates = trait_assoc_predicates.instantiate_own(tcx, impl_assoc_args);
let impl_predicates = trait_assoc_predicates
.instantiate_own(tcx, impl_assoc_args)
.map(|(c, s)| (c.skip_norm_wip(), s));
return ty::GenericPredicates {
parent: Some(impl_def_id),
@@ -161,8 +167,9 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
if let Some(of_trait) = impl_.of_trait
&& of_trait.defaultness.is_default()
{
is_default_impl_trait =
Some(ty::Binder::dummy(tcx.impl_trait_ref(def_id).instantiate_identity()));
is_default_impl_trait = Some(ty::Binder::dummy(
tcx.impl_trait_ref(def_id).instantiate_identity().skip_norm_wip(),
));
}
}
ItemKind::Trait(_, _, _, _, _, _, self_bounds, ..)
@@ -248,7 +255,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
}
hir::GenericParamKind::Const { .. } => {
let param_def_id = param.def_id.to_def_id();
let ct_ty = tcx.type_of(param_def_id).instantiate_identity();
let ct_ty = tcx.type_of(param_def_id).instantiate_identity().skip_norm_wip();
let ct = icx.lowerer().lower_const_param(param_def_id, param.hir_id);
predicates
.insert((ty::ClauseKind::ConstArgHasType(ct, ct_ty).upcast(tcx), param.span));
@@ -345,9 +352,11 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
// in trait checking. See `setup_constraining_predicates`
// for details.
if let Node::Item(&Item { kind: ItemKind::Impl(impl_), .. }) = node {
let self_ty = tcx.type_of(def_id).instantiate_identity();
let trait_ref =
impl_.of_trait.is_some().then(|| tcx.impl_trait_ref(def_id).instantiate_identity());
let self_ty = tcx.type_of(def_id).instantiate_identity().skip_norm_wip();
let trait_ref = impl_
.of_trait
.is_some()
.then(|| tcx.impl_trait_ref(def_id).instantiate_identity().skip_norm_wip());
cgp::setup_constraining_predicates(
tcx,
&mut predicates,
@@ -465,18 +474,18 @@ fn visit_const(&mut self, c: ty::Const<'tcx>) {
if impl_.of_trait.is_some() {
debug!("visit impl trait_ref");
let trait_ref = tcx.impl_trait_ref(def_id);
trait_ref.instantiate_identity().visit_with(&mut collector);
trait_ref.instantiate_identity().skip_norm_wip().visit_with(&mut collector);
}
debug!("visit self_ty");
let self_ty = tcx.type_of(def_id);
self_ty.instantiate_identity().visit_with(&mut collector);
self_ty.instantiate_identity().skip_norm_wip().visit_with(&mut collector);
}
if let Some(_) = tcx.hir_fn_sig_by_hir_id(hir_id) {
debug!("visit fn sig");
let fn_sig = tcx.fn_sig(def_id);
let fn_sig = fn_sig.instantiate_identity();
let fn_sig = fn_sig.instantiate_identity().skip_norm_wip();
debug!(?fn_sig);
fn_sig.visit_with(&mut collector);
}
@@ -23,7 +23,7 @@
use rustc_middle::hir::nested_filter;
use rustc_middle::middle::resolve_bound_vars::*;
use rustc_middle::query::Providers;
use rustc_middle::ty::{self, TyCtxt, TypeSuperVisitable, TypeVisitor};
use rustc_middle::ty::{self, TyCtxt, TypeSuperVisitable, TypeVisitor, Unnormalized};
use rustc_middle::{bug, span_bug};
use rustc_span::def_id::{DefId, LocalDefId};
use rustc_span::{Ident, Span, sym};
@@ -1883,7 +1883,11 @@ fn visit_segment_args(
.map(|param| generic_param_def_as_bound_arg(param)),
);
bound_vars.extend(
self.tcx.fn_sig(assoc_fn.def_id).instantiate_identity().bound_vars(),
self.tcx
.fn_sig(assoc_fn.def_id)
.instantiate_identity()
.skip_norm_wip()
.bound_vars(),
);
bound_vars
} else {
@@ -1967,7 +1971,10 @@ fn supertrait_hrtb_vars(
break Some((bound_vars.into_iter().collect(), assoc_item));
}
let predicates = tcx.explicit_supertraits_containing_assoc_item((def_id, assoc_ident));
let obligations = predicates.iter_identity_copied().filter_map(|(pred, _)| {
let obligations = predicates
.iter_identity_copied()
.map(Unnormalized::skip_norm_wip)
.filter_map(|(pred, _)| {
let bound_predicate = pred.kind();
match bound_predicate.skip_binder() {
ty::ClauseKind::Trait(data) => {
@@ -2197,7 +2204,9 @@ fn try_append_return_type_notation_params(
.iter()
.map(|param| generic_param_def_as_bound_arg(param)),
);
bound_vars.extend(self.tcx.fn_sig(item_def_id).instantiate_identity().bound_vars());
bound_vars.extend(
self.tcx.fn_sig(item_def_id).instantiate_identity().skip_norm_wip().bound_vars(),
);
// SUBTLE: Stash the old bound vars onto the *item segment* before appending
// the new bound vars. We do this because we need to know how many bound vars
@@ -2453,7 +2462,9 @@ fn visit_ty(&mut self, ty: &'v hir::Ty<'v, AmbigArg>) {
arg_is_constrained: vec![false; generics.own_params.len()]
.into_boxed_slice(),
};
walker.visit_ty(self.tcx.type_of(*alias_def).instantiate_identity());
walker.visit_ty(
self.tcx.type_of(*alias_def).instantiate_identity().skip_norm_wip(),
);
match segments.last() {
Some(hir::PathSegment { args: Some(args), .. }) => {
@@ -182,7 +182,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<'_
}
},
Node::OpaqueTy(..) => tcx.type_of_opaque(def_id).instantiate_identity(),
Node::OpaqueTy(..) => tcx.type_of_opaque(def_id).instantiate_identity().skip_norm_wip(),
Node::ForeignItem(foreign_item) => match foreign_item.kind {
ForeignItemKind::Fn(..) => {
@@ -205,7 +205,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<'_
Node::Ctor(def) | Node::Variant(Variant { data: def, .. }) => match def {
VariantData::Unit(..) | VariantData::Struct { .. } => {
tcx.type_of(tcx.hir_get_parent_item(hir_id)).instantiate_identity()
tcx.type_of(tcx.hir_get_parent_item(hir_id)).instantiate_identity().skip_norm_wip()
}
VariantData::Tuple(_, _, ctor) => {
let args = ty::GenericArgs::identity_for_item(tcx, def_id);
@@ -356,7 +356,7 @@ fn anon_const_type_of<'tcx>(icx: &ItemCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx
Node::Field(&hir::FieldDef { default: Some(c), def_id: field_def_id, .. })
if c.hir_id == hir_id =>
{
tcx.type_of(field_def_id).instantiate_identity()
tcx.type_of(field_def_id).instantiate_identity().skip_norm_wip()
}
_ => Ty::new_error_with_message(
@@ -418,7 +418,7 @@ fn infer_placeholder_type<'tcx>(
// which `type const`s don't.
let ty = if tcx.is_type_const(def_id.to_def_id()) {
if let Some(trait_item_def_id) = tcx.trait_item_of(def_id.to_def_id()) {
tcx.type_of(trait_item_def_id).instantiate_identity()
tcx.type_of(trait_item_def_id).instantiate_identity().skip_norm_wip()
} else {
Ty::new_error_with_message(
tcx,
+11 -6
View File
@@ -281,9 +281,9 @@ fn get_delegation_self_ty<'tcx>(tcx: TyCtxt<'tcx>, delegation_id: LocalDefId) ->
}
(FnKind::AssocTraitImpl, FnKind::AssocTrait)
| (FnKind::AssocInherentImpl, FnKind::AssocTrait) => {
Some(tcx.type_of(tcx.local_parent(delegation_id)).instantiate_identity())
}
| (FnKind::AssocInherentImpl, FnKind::AssocTrait) => Some(
tcx.type_of(tcx.local_parent(delegation_id)).instantiate_identity().skip_norm_wip(),
),
// For trait impl's `sig_id` is always equal to the corresponding trait method.
// For inherent methods delegation is not yet supported.
@@ -339,7 +339,8 @@ fn create_generic_args<'tcx>(
// them as parent args. We always generate a function whose generics match
// child generics in trait.
let parent = tcx.local_parent(delegation_id);
parent_args = tcx.impl_trait_header(parent).trait_ref.instantiate_identity().args;
parent_args =
tcx.impl_trait_header(parent).trait_ref.instantiate_identity().skip_norm_wip().args;
assert!(child_args.is_empty(), "Child args can not be used in trait impl case");
@@ -347,7 +348,8 @@ fn create_generic_args<'tcx>(
}
(FnKind::AssocInherentImpl, FnKind::AssocTrait) => {
let self_ty = tcx.type_of(tcx.local_parent(delegation_id)).instantiate_identity();
let self_ty =
tcx.type_of(tcx.local_parent(delegation_id)).instantiate_identity().skip_norm_wip();
tcx.mk_args_from_iter(
std::iter::once(ty::GenericArg::from(self_ty))
@@ -457,7 +459,10 @@ fn with_own_preds(
for pred in preds.predicates {
let new_pred = pred.0.fold_with(&mut self.folder);
self.preds.push((EarlyBinder::bind(new_pred).instantiate(self.tcx, args), pred.1));
self.preds.push((
EarlyBinder::bind(new_pred).instantiate(self.tcx, args).skip_norm_wip(),
pred.1,
));
}
self
@@ -543,7 +543,7 @@ pub(super) fn lower_assoc_item_constraint(
hir::Term::Ty(ty) => self.lower_ty(ty).into(),
hir::Term::Const(ct) => {
let ty = projection_term.map_bound(|alias| {
tcx.type_of(alias.def_id).instantiate(tcx, alias.args)
tcx.type_of(alias.def_id).instantiate(tcx, alias.args).skip_norm_wip()
});
let ty = check_assoc_const_binding_type(
self,
@@ -851,7 +851,7 @@ fn lower_return_type_notation_ty(
// `rustc_middle::ty::predicate::Clause::instantiate_supertrait`
// and it's no coincidence why.
let shifted_output = tcx.shift_bound_var_indices(num_bound_vars, output);
Ok(ty::EarlyBinder::bind(shifted_output).instantiate(tcx, args))
Ok(ty::EarlyBinder::bind(shifted_output).instantiate(tcx, args).skip_norm_wip())
}
}
@@ -436,7 +436,7 @@ pub(crate) fn report_missing_self_ty_for_resolved_path(
tcx.visibility(trait_def_id).is_accessible_from(self.item_def_id(), tcx)
&& header.polarity != ty::ImplPolarity::Negative
})
.map(|header| header.trait_ref.instantiate_identity().self_ty())
.map(|header| header.trait_ref.instantiate_identity().skip_norm_wip().self_ty())
// We don't care about blanket impls.
.filter(|self_ty| !self_ty.has_non_region_param())
.map(|self_ty| tcx.erase_and_anonymize_regions(self_ty).to_string())
@@ -511,7 +511,7 @@ pub(super) fn report_unresolved_type_relative_path(
}
Some((hir::def::CtorKind::Fn, def_id)) => {
// tuple
let fn_sig = tcx.fn_sig(def_id).instantiate_identity();
let fn_sig = tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip();
let inputs = fn_sig.inputs().skip_binder();
suggestion = vec![(
ident.span.with_hi(expr.span.hi()),
@@ -728,7 +728,7 @@ fn note_ambiguous_inherent_assoc_item(
"the candidate".into()
};
let impl_ty = tcx.at(span).type_of(impl_).instantiate_identity();
let impl_ty = tcx.at(span).type_of(impl_).instantiate_identity().skip_norm_wip();
let note = format!("{title} is defined in an impl for the type `{impl_ty}`");
if let Some(span) = note_span {
@@ -782,7 +782,10 @@ pub(crate) fn report_unresolved_inherent_assoc_item(
.iter()
.take(limit)
.map(|cand| {
format!("- `{}`", tcx.at(span).type_of(cand.impl_).instantiate_identity())
format!(
"- `{}`",
tcx.at(span).type_of(cand.impl_).instantiate_identity().skip_norm_wip()
)
})
.collect::<Vec<_>>()
.join("\n");
@@ -1786,7 +1789,7 @@ fn generics_args_err_extend<'a>(
);
}
GenericsArgsErrExtend::SelfTyAlias { def_id, span } => {
let ty = tcx.at(span).type_of(def_id).instantiate_identity();
let ty = tcx.at(span).type_of(def_id).instantiate_identity().skip_norm_wip();
let span_of_impl = tcx.span_of_impl(def_id);
let ty::Adt(self_def, _) = *ty.kind() else { return };
let def_id = self_def.did();
@@ -75,7 +75,8 @@ fn generic_arg_mismatch_err(
Res::Def(DefKind::TyParam, src_def_id) => {
if let Some(param_local_id) = param.def_id.as_local() {
let param_name = tcx.hir_ty_param_name(param_local_id);
let param_type = tcx.type_of(param.def_id).instantiate_identity();
let param_type =
tcx.type_of(param.def_id).instantiate_identity().skip_norm_wip();
if param_type.is_suggestable(tcx, false) {
err.span_suggestion_verbose(
tcx.def_span(src_def_id),
@@ -39,8 +39,8 @@
use rustc_middle::ty::print::PrintPolyTraitRefExt as _;
use rustc_middle::ty::{
self, Const, FnSigKind, GenericArgKind, GenericArgsRef, GenericParamDefKind, LitToConstInput,
Ty, TyCtxt, TypeSuperFoldable, TypeVisitableExt, TypingMode, Upcast, const_lit_matches_ty,
fold_regions,
Ty, TyCtxt, TypeSuperFoldable, TypeVisitableExt, TypingMode, Unnormalized, Upcast,
const_lit_matches_ty, fold_regions,
};
use rustc_middle::{bug, span_bug};
use rustc_session::lint::builtin::AMBIGUOUS_ASSOCIATED_ITEMS;
@@ -783,7 +783,9 @@ fn provided_kind(
// Ambig portions of `ConstArg` are handled in the match arm below
.lower_const_arg(
ct.as_unambig_ct(),
tcx.type_of(param.def_id).instantiate(tcx, preceding_args),
tcx.type_of(param.def_id)
.instantiate(tcx, preceding_args)
.skip_norm_wip(),
)
.into(),
(&GenericParamDefKind::Const { .. }, GenericArg::Infer(inf)) => {
@@ -828,6 +830,7 @@ fn inferred_kind(
tcx.at(self.span)
.type_of(param.def_id)
.instantiate(tcx, preceding_args)
.skip_norm_wip()
.into()
} else if synthetic {
Ty::new_param(tcx, param.index, param.name).into()
@@ -842,13 +845,15 @@ fn inferred_kind(
let ty = tcx
.at(self.span)
.type_of(param.def_id)
.instantiate(tcx, preceding_args);
.instantiate(tcx, preceding_args)
.skip_norm_wip();
if let Err(guar) = ty.error_reported() {
return ty::Const::new_error(tcx, guar).into();
}
if !infer_args && has_default {
tcx.const_param_default(param.def_id)
.instantiate(tcx, preceding_args)
.skip_norm_wip()
.into()
} else if infer_args {
self.lowerer.ct_infer(Some(param), self.span).into()
@@ -1217,7 +1222,7 @@ fn lower_path_segment(
let alias_ty = ty::AliasTy::new_from_args(tcx, ty::Free { def_id }, args);
Ty::new_alias(tcx, alias_ty)
} else {
tcx.at(span).type_of(def_id).instantiate(tcx, args)
tcx.at(span).type_of(def_id).instantiate(tcx, args).skip_norm_wip()
}
}
@@ -1247,6 +1252,7 @@ fn probe_single_ty_param_bound_for_assoc_item(
|| {
let trait_refs = predicates
.iter_identity_copied()
.map(Unnormalized::skip_norm_wip)
.filter_map(|(p, _)| Some(p.as_trait_clause()?.map_bound(|t| t.trait_ref)));
traits::transitive_bounds_that_define_assoc_item(tcx, trait_refs, assoc_ident)
},
@@ -1368,7 +1374,9 @@ fn probe_single_bound_for_assoc_item<I>(
// FIXME(mgca): code duplication with other places we lower
// the rhs' of associated const bindings
let ty = projection_term.map_bound(|alias| {
tcx.type_of(alias.def_id).instantiate(tcx, alias.args)
tcx.type_of(alias.def_id)
.instantiate(tcx, alias.args)
.skip_norm_wip()
});
let ty = bounds::check_assoc_const_binding_type(
self,
@@ -1712,7 +1720,8 @@ fn resolve_type_relative_path(
self.probe_single_bound_for_assoc_item(
|| {
let trait_ref = ty::Binder::dummy(trait_ref.instantiate_identity());
let trait_ref =
ty::Binder::dummy(trait_ref.instantiate_identity().skip_norm_wip());
traits::supertraits(tcx, trait_ref)
},
AssocItemQSelf::SelfTyAlias,
@@ -1945,10 +1954,7 @@ fn probe_traits_that_match_assoc_ty(
&& tcx.all_impls(*trait_def_id)
.any(|impl_def_id| {
let header = tcx.impl_trait_header(impl_def_id);
let trait_ref = header.trait_ref.instantiate(
tcx,
infcx.fresh_args_for_item(DUMMY_SP, impl_def_id),
);
let trait_ref = header.trait_ref.instantiate(tcx, infcx.fresh_args_for_item(DUMMY_SP, impl_def_id)).skip_norm_wip();
let value = fold_regions(tcx, qself_ty, |_, _| tcx.lifetimes.re_erased);
// FIXME: Don't bother dealing with non-lifetime binders here...
@@ -2307,7 +2313,7 @@ pub fn lower_resolved_ty_path(
// `Self` in impl (we know the concrete type).
assert_eq!(opt_self_ty, None);
// Try to evaluate any array length constants.
let ty = tcx.at(span).type_of(def_id).instantiate_identity();
let ty = tcx.at(span).type_of(def_id).instantiate_identity().skip_norm_wip();
let _ = self.prohibit_generic_args(
path.segments.iter(),
GenericsArgsErrExtend::SelfTyAlias { def_id, span },
@@ -2616,7 +2622,10 @@ fn lower_const_arg_tuple_call(
.iter()
.zip(args)
.map(|(field_def, arg)| {
self.lower_const_arg(arg, tcx.type_of(field_def.did).instantiate(tcx, adt_args))
self.lower_const_arg(
arg,
tcx.type_of(field_def.did).instantiate(tcx, adt_args).skip_norm_wip(),
)
})
.collect::<Vec<_>>();
@@ -2737,7 +2746,7 @@ fn lower_const_arg_struct(
self.lower_const_arg(
expr.expr,
tcx.type_of(field_def.did).instantiate(tcx, adt_args),
tcx.type_of(field_def.did).instantiate(tcx, adt_args).skip_norm_wip(),
)
}
None => {
@@ -2946,7 +2955,7 @@ fn lower_const_arg_anon(&self, anon: &AnonConst) -> Const<'tcx> {
// FIXME(generic_const_parameter_types): We should use the proper generic args
// here. It's only used as a hint for literals so doesn't matter too much to use the right
// generic arguments, just weaker type inference.
let ty = tcx.type_of(anon.def_id).instantiate_identity();
let ty = tcx.type_of(anon.def_id).instantiate_identity().skip_norm_wip();
match self.try_lower_anon_const_lit(ty, expr) {
Some(v) => v,
@@ -3057,7 +3066,7 @@ fn require_type_const_attribute(
fn lower_delegation_ty(&self, infer: hir::InferDelegation<'tcx>) -> Ty<'tcx> {
match infer {
hir::InferDelegation::DefId(def_id) => {
self.tcx().type_of(def_id).instantiate_identity()
self.tcx().type_of(def_id).instantiate_identity().skip_norm_wip()
}
rustc_hir::InferDelegation::Sig(_, idx) => {
let delegation_sig = self.tcx().inherit_sig_for_delegation_item(self.item_def_id());
@@ -3648,10 +3657,15 @@ pub(super) fn suggest_trait_fn_ty_for_impl_fn_infer(
trait_ref.def_id,
)?;
let fn_sig = tcx.fn_sig(assoc.def_id).instantiate(
let fn_sig = tcx
.fn_sig(assoc.def_id)
.instantiate(
tcx,
trait_ref.args.extend_to(tcx, assoc.def_id, |param, _| tcx.mk_param_from_def(param)),
);
trait_ref
.args
.extend_to(tcx, assoc.def_id, |param, _| tcx.mk_param_from_def(param)),
)
.skip_norm_wip();
let fn_sig = tcx.liberate_late_bound_regions(fn_hir_id.expect_owner().to_def_id(), fn_sig);
Some(if let Some(arg_idx) = arg_idx {
@@ -16,7 +16,7 @@
use rustc_errors::codes::*;
use rustc_hir::def::DefKind;
use rustc_hir::def_id::LocalDefId;
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt};
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt, Unnormalized};
use rustc_span::{ErrorGuaranteed, kw};
use crate::constrained_generic_params as cgp;
@@ -78,7 +78,7 @@ pub(crate) fn enforce_impl_lifetime_params_are_constrained(
impl_def_id: LocalDefId,
of_trait: bool,
) -> Result<(), ErrorGuaranteed> {
let impl_self_ty = tcx.type_of(impl_def_id).instantiate_identity();
let impl_self_ty = tcx.type_of(impl_def_id).instantiate_identity().skip_norm_wip();
// Don't complain about unconstrained type params when self ty isn't known due to errors.
// (#36836)
@@ -86,7 +86,8 @@ pub(crate) fn enforce_impl_lifetime_params_are_constrained(
let impl_generics = tcx.generics_of(impl_def_id);
let impl_predicates = tcx.predicates_of(impl_def_id);
let impl_trait_ref = of_trait.then(|| tcx.impl_trait_ref(impl_def_id).instantiate_identity());
let impl_trait_ref =
of_trait.then(|| tcx.impl_trait_ref(impl_def_id).instantiate_identity().skip_norm_wip());
impl_trait_ref.error_reported()?;
@@ -107,7 +108,11 @@ pub(crate) fn enforce_impl_lifetime_params_are_constrained(
match item.kind {
ty::AssocKind::Type { .. } => {
if item.defaultness(tcx).has_value() {
cgp::parameters_for(tcx, tcx.type_of(def_id).instantiate_identity(), true)
cgp::parameters_for(
tcx,
tcx.type_of(def_id).instantiate_identity().skip_norm_wip(),
true,
)
} else {
vec![]
}
@@ -187,7 +192,7 @@ pub(crate) fn enforce_impl_non_lifetime_params_are_constrained(
tcx: TyCtxt<'_>,
impl_def_id: LocalDefId,
) -> Result<(), ErrorGuaranteed> {
let impl_self_ty = tcx.type_of(impl_def_id).instantiate_identity();
let impl_self_ty = tcx.type_of(impl_def_id).instantiate_identity().skip_norm_wip();
// Don't complain about unconstrained type params when self ty isn't known due to errors.
// (#36836)
@@ -195,8 +200,10 @@ pub(crate) fn enforce_impl_non_lifetime_params_are_constrained(
let impl_generics = tcx.generics_of(impl_def_id);
let impl_predicates = tcx.predicates_of(impl_def_id);
let impl_trait_ref =
tcx.impl_opt_trait_ref(impl_def_id).map(ty::EarlyBinder::instantiate_identity);
let impl_trait_ref = tcx
.impl_opt_trait_ref(impl_def_id)
.map(ty::EarlyBinder::instantiate_identity)
.map(Unnormalized::skip_norm_wip);
impl_trait_ref.error_reported()?;
@@ -215,7 +215,7 @@ fn unconstrained_parent_impl_args<'tcx>(
let impl_generic_predicates = tcx.predicates_of(impl_def_id);
let mut unconstrained_parameters = FxHashSet::default();
let mut constrained_params = FxHashSet::default();
let impl_trait_ref = tcx.impl_trait_ref(impl_def_id).instantiate_identity();
let impl_trait_ref = tcx.impl_trait_ref(impl_def_id).instantiate_identity().skip_norm_wip();
// Unfortunately the functions in `constrained_generic_parameters` don't do
// what we want here. We want only a list of constrained parameters while
@@ -326,7 +326,10 @@ fn check_predicates<'tcx>(
) -> Result<(), ErrorGuaranteed> {
let impl1_predicates: Vec<_> = traits::elaborate(
tcx,
tcx.predicates_of(impl1_def_id).instantiate(tcx, impl1_args).into_iter(),
tcx.predicates_of(impl1_def_id)
.instantiate(tcx, impl1_args)
.into_iter()
.map(|(c, s)| (c.skip_norm_wip(), s)),
)
.collect();
@@ -340,7 +343,7 @@ fn check_predicates<'tcx>(
tcx.predicates_of(impl2_node.def_id())
.instantiate(tcx, impl2_args)
.into_iter()
.map(|(c, _s)| c.as_predicate()),
.map(|(c, _s)| c.skip_norm_wip().as_predicate()),
)
.collect()
};
@@ -373,7 +376,7 @@ fn check_predicates<'tcx>(
.map(|(c, _span)| c.as_predicate());
// Include the well-formed predicates of the type parameters of the impl.
for arg in tcx.impl_trait_ref(impl1_def_id).instantiate_identity().args {
for arg in tcx.impl_trait_ref(impl1_def_id).instantiate_identity().skip_norm_wip().args {
let Some(term) = arg.as_term() else {
continue;
};
@@ -46,7 +46,8 @@ pub(super) fn infer_predicates(
// For field of type &'a T (reference) or Adt
// (struct/enum/union) there will be outlive
// requirements for adt_def.
let field_ty = tcx.type_of(field_def.did).instantiate_identity();
let field_ty =
tcx.type_of(field_def.did).instantiate_identity().skip_norm_wip();
let field_span = tcx.def_span(field_def.did);
insert_required_predicates_to_be_wf(
tcx,
@@ -62,7 +63,7 @@ pub(super) fn infer_predicates(
DefKind::TyAlias if tcx.type_alias_is_lazy(item_did) => {
insert_required_predicates_to_be_wf(
tcx,
tcx.type_of(item_did).instantiate_identity(),
tcx.type_of(item_did).instantiate_identity().skip_norm_wip(),
tcx.def_span(item_did),
&global_inferred_outlives,
&mut item_required_predicates,
@@ -306,7 +307,8 @@ fn check_explicit_predicates<'tcx>(
continue;
}
let predicate = explicit_predicates.rebind(*outlives_predicate).instantiate(tcx, args);
let predicate =
explicit_predicates.rebind(*outlives_predicate).instantiate(tcx, args).skip_norm_wip();
debug!("predicate = {predicate:?}");
insert_outlives_predicate(tcx, predicate.0, predicate.1, span, required_predicates);
}
@@ -349,7 +351,7 @@ fn check_inferred_predicates<'tcx>(
// `predicate` is `U: 'b` in the example above.
// So apply the instantiation to get `T: 'a`.
let ty::OutlivesPredicate(arg, region) =
predicates.rebind(predicate).instantiate(tcx, args);
predicates.rebind(predicate).instantiate(tcx, args).skip_norm_wip();
insert_outlives_predicate(tcx, arg, region, span, required_predicates);
}
}
@@ -105,7 +105,7 @@ fn build_constraints_for_item(&mut self, def_id: LocalDefId) {
let inferred_start = self.terms_cx.inferred_starts[&def_id];
let current_item = &CurrentItem { inferred_start };
let ty = tcx.type_of(def_id).instantiate_identity();
let ty = tcx.type_of(def_id).instantiate_identity().skip_norm_wip();
// The type as returned by `type_of` is the underlying type and generally not a free alias.
// Therefore we need to check the `DefKind` first.
@@ -127,7 +127,7 @@ fn build_constraints_for_item(&mut self, def_id: LocalDefId) {
for field in def.all_fields() {
self.add_constraints_from_ty(
current_item,
tcx.type_of(field.did).instantiate_identity(),
tcx.type_of(field.did).instantiate_identity().skip_norm_wip(),
self.covariant,
);
}
@@ -136,7 +136,7 @@ fn build_constraints_for_item(&mut self, def_id: LocalDefId) {
ty::FnDef(..) => {
self.add_constraints_from_sig(
current_item,
tcx.fn_sig(def_id).instantiate_identity(),
tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip(),
self.covariant,
);
}
@@ -11,6 +11,7 @@
use rustc_middle::span_bug;
use rustc_middle::ty::{
self, CrateVariancesMap, GenericArgsRef, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable,
Unnormalized,
};
use tracing::{debug, instrument};
@@ -185,7 +186,11 @@ fn visit_ty(&mut self, t: Ty<'tcx>) {
let mut collector =
OpaqueTypeLifetimeCollector { tcx, root_def_id: item_def_id.to_def_id(), variances };
let id_args = ty::GenericArgs::identity_for_item(tcx, item_def_id);
for (pred, _) in tcx.explicit_item_bounds(item_def_id).iter_instantiated_copied(tcx, id_args) {
for (pred, _) in tcx
.explicit_item_bounds(item_def_id)
.iter_instantiated_copied(tcx, id_args)
.map(Unnormalized::skip_norm_wip)
{
debug!(?pred);
// We only ignore opaque type args if the opaque type is the outermost type.
@@ -122,7 +122,9 @@ fn create_map(&self) -> DefIdMap<&'tcx [ty::Variance]> {
self.enforce_const_invariance(generics, variances);
// Functions are permitted to have unused generic parameters: make those invariant.
if let ty::FnDef(..) = tcx.type_of(def_id).instantiate_identity().kind() {
if let ty::FnDef(..) =
tcx.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
{
for variance in variances.iter_mut() {
if *variance == ty::Bivariant {
*variance = ty::Invariant;
+5 -4
View File
@@ -12,7 +12,7 @@
use rustc_middle::ty::adjustment::{
Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability,
};
use rustc_middle::ty::{self, GenericArgsRef, Ty, TyCtxt, TypeVisitableExt};
use rustc_middle::ty::{self, GenericArgsRef, Ty, TyCtxt, TypeVisitableExt, Unnormalized};
use rustc_middle::{bug, span_bug};
use rustc_span::def_id::LocalDefId;
use rustc_span::{Span, sym};
@@ -540,7 +540,7 @@ fn confirm_builtin_call(
let (fn_sig, def_id) = match *callee_ty.kind() {
ty::FnDef(def_id, args) => {
self.enforce_context_effects(Some(call_expr.hir_id), call_expr.span, def_id, args);
let fn_sig = self.tcx.fn_sig(def_id).instantiate(self.tcx, args);
let fn_sig = self.tcx.fn_sig(def_id).instantiate(self.tcx, args).skip_norm_wip();
// Unit testing: function items annotated with
// `#[rustc_evaluate_where_clauses]` trigger special output
@@ -549,6 +549,7 @@ fn confirm_builtin_call(
let predicates = self.tcx.predicates_of(def_id);
let predicates = predicates.instantiate(self.tcx, args);
for (predicate, predicate_span) in predicates {
let predicate = predicate.skip_norm_wip();
let obligation = Obligation::new(
self.tcx,
ObligationCause::dummy_with_span(callee_expr.span),
@@ -584,7 +585,7 @@ fn confirm_builtin_call(
BoundRegionConversionTime::FnCall,
fn_sig,
);
let fn_sig = self.normalize(call_expr.span, fn_sig);
let fn_sig = self.normalize(call_expr.span, Unnormalized::new_wip(fn_sig));
self.check_argument_types(
call_expr.span,
@@ -959,7 +960,7 @@ pub(super) fn enforce_context_effects(
self.tcx,
cause,
self.param_env,
cond.to_host_effect_clause(self.tcx, host),
cond.to_host_effect_clause(self.tcx, host).skip_norm_wip(),
));
}
} else {
+7 -2
View File
@@ -40,7 +40,9 @@
use rustc_middle::ty::adjustment::AllowTwoPhase;
use rustc_middle::ty::cast::{CastKind, CastTy};
use rustc_middle::ty::error::TypeError;
use rustc_middle::ty::{self, Ty, TyCtxt, TypeAndMut, TypeVisitableExt, VariantDef, elaborate};
use rustc_middle::ty::{
self, Ty, TyCtxt, TypeAndMut, TypeVisitableExt, Unnormalized, VariantDef, elaborate,
};
use rustc_middle::{bug, span_bug};
use rustc_session::lint;
use rustc_span::{DUMMY_SP, Span, sym};
@@ -753,7 +755,10 @@ fn do_check(&self, fcx: &FnCtxt<'a, 'tcx>) -> Result<CastKind, CastError<'tcx>>
match *self.expr_ty.kind() {
ty::FnDef(..) => {
// Attempt a coercion to a fn pointer type.
let f = fcx.normalize(self.expr_span, self.expr_ty.fn_sig(fcx.tcx));
let f = fcx.normalize(
self.expr_span,
Unnormalized::new_wip(self.expr_ty.fn_sig(fcx.tcx)),
);
let res = fcx.coerce(
self.expr,
self.expr_ty,
+6 -3
View File
@@ -59,7 +59,7 @@ pub(super) fn check_fn<'a, 'tcx>(
let va_list_did = tcx.require_lang_item(LangItem::VaList, span);
let region = fcx.next_region_var(RegionVariableOrigin::Misc(span));
tcx.type_of(va_list_did).instantiate(tcx, &[region.into()])
tcx.type_of(va_list_did).instantiate(tcx, &[region.into()]).skip_norm_wip()
});
// Add formal parameters.
@@ -180,14 +180,17 @@ fn check_panic_info_fn(tcx: TyCtxt<'_>, fn_id: LocalDefId, fn_sig: ty::FnSig<'_>
let panic_info_did = tcx.require_lang_item(hir::LangItem::PanicInfo, span);
// build type `for<'a, 'b> fn(&'a PanicInfo<'b>) -> !`
let panic_info_ty = tcx.type_of(panic_info_did).instantiate(
let panic_info_ty = tcx
.type_of(panic_info_did)
.instantiate(
tcx,
&[ty::GenericArg::from(ty::Region::new_bound(
tcx,
ty::INNERMOST,
ty::BoundRegion { var: ty::BoundVar::from_u32(1), kind: ty::BoundRegionKind::Anon },
))],
);
)
.skip_norm_wip();
let panic_info_ref_ty = Ty::new_imm_ref(
tcx,
ty::Region::new_bound(
+9 -6
View File
@@ -14,7 +14,7 @@
use rustc_middle::span_bug;
use rustc_middle::ty::{
self, ClosureKind, FnSigKind, GenericArgs, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable,
TypeVisitableExt, TypeVisitor,
TypeVisitableExt, TypeVisitor, Unnormalized,
};
use rustc_span::def_id::LocalDefId;
use rustc_span::{DUMMY_SP, Span};
@@ -302,6 +302,7 @@ fn deduce_closure_signature(
self.tcx
.explicit_item_self_bounds(def_id)
.iter_instantiated_copied(self.tcx, args)
.map(Unnormalized::skip_norm_wip)
.map(|(c, s)| (c.as_predicate(), s)),
),
ty::Dynamic(object_type, ..) => {
@@ -364,11 +365,11 @@ fn deduce_closure_signature_from_predicates(
{
let inferred_sig = self.normalize(
span,
self.deduce_sig_from_projection(
Unnormalized::new_wip(self.deduce_sig_from_projection(
Some(span),
closure_kind,
bound_predicate.rebind(proj_predicate),
),
)),
);
// Make sure that we didn't infer a signature that mentions itself.
@@ -945,7 +946,7 @@ fn supplied_sig_of_closure(
self.typeck_results.borrow_mut().user_provided_sigs.insert(expr_def_id, c_result);
// Normalize only after registering in `user_provided_sigs`.
self.normalize(self.tcx.def_span(expr_def_id), result)
self.normalize(self.tcx.def_span(expr_def_id), Unnormalized::new_wip(result))
}
/// Invoked when we are translating the coroutine that results
@@ -1001,6 +1002,7 @@ fn deduce_future_output_from_obligations(&self, body_def_id: LocalDefId) -> Opti
.tcx
.explicit_item_self_bounds(def_id)
.iter_instantiated_copied(self.tcx, args)
.map(Unnormalized::skip_norm_wip)
.find_map(|(p, s)| get_future_output(p.as_predicate(), s))?,
ty::Error(_) => return Some(ret_ty),
_ => {
@@ -1008,7 +1010,7 @@ fn deduce_future_output_from_obligations(&self, body_def_id: LocalDefId) -> Opti
}
};
let output_ty = self.normalize(closure_span, output_ty);
let output_ty = self.normalize(closure_span, Unnormalized::new_wip(output_ty));
// async fn that have opaque types in their return type need to redo the conversion to inference variables
// as they fetch the still opaque version from the signature.
@@ -1113,7 +1115,8 @@ fn closure_sigs(
) -> ClosureSignatures<'tcx> {
let liberated_sig =
self.tcx().liberate_late_bound_regions(expr_def_id.to_def_id(), bound_sig);
let liberated_sig = self.normalize(self.tcx.def_span(expr_def_id), liberated_sig);
let liberated_sig =
self.normalize(self.tcx.def_span(expr_def_id), Unnormalized::new_wip(liberated_sig));
ClosureSignatures { bound_sig, liberated_sig }
}
}
+13 -7
View File
@@ -54,7 +54,7 @@
PointerCoercion,
};
use rustc_middle::ty::error::TypeError;
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitableExt};
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitableExt, Unnormalized};
use rustc_span::{BytePos, DUMMY_SP, Span};
use rustc_trait_selection::infer::InferCtxtExt as _;
use rustc_trait_selection::solve::inspect::{self, InferCtxtProofTreeExt, ProofTreeVisitor};
@@ -963,7 +963,7 @@ fn coerce_from_fn_item(&self, a: Ty<'tcx>, b: Ty<'tcx>) -> CoerceResult<'tcx> {
let a_sig = self.sig_for_fn_def_coercion(a, Some(b_hdr.safety()))?;
let InferOk { value: a_sig, mut obligations } =
self.at(&self.cause, self.param_env).normalize(a_sig);
self.at(&self.cause, self.param_env).normalize(Unnormalized::new_wip(a_sig));
let a = Ty::new_fn_ptr(self.tcx, a_sig);
let adjust = Adjust::Pointer(PointerCoercion::ReifyFnPointer(b_hdr.safety()));
@@ -1104,7 +1104,7 @@ pub(crate) fn may_coerce(&self, expr_ty: Ty<'tcx>, target_ty: Ty<'tcx>) -> bool
if self.next_trait_solver()
&& let ty::Alias(..) = ty.kind()
{
ocx.structurally_normalize_ty(&cause, self.param_env, ty)
ocx.structurally_normalize_ty(&cause, self.param_env, Unnormalized::new_wip(ty))
} else {
Ok(ty)
}
@@ -1336,7 +1336,7 @@ fn try_find_coercion_lub(
};
// The signature must match.
let (a_sig, b_sig) = self.normalize(new.span, (a_sig, b_sig));
let (a_sig, b_sig) = self.normalize(new.span, Unnormalized::new_wip((a_sig, b_sig)));
let sig = self
.at(cause, self.param_env)
.lub(a_sig, b_sig)
@@ -1852,13 +1852,19 @@ fn suggest_boxing_tail_for_return_position_impl_trait(
fcx.probe(|_| {
let ocx = ObligationCtxt::new(fcx);
ocx.register_obligations(
fcx.tcx.item_self_bounds(rpit_def_id).iter_identity().filter_map(|clause| {
fcx.tcx
.item_self_bounds(rpit_def_id)
.iter_identity()
.map(Unnormalized::skip_norm_wip)
.filter_map(|clause| {
let predicate = clause
.kind()
.map_bound(|clause| match clause {
ty::ClauseKind::Trait(trait_pred) => Some(ty::ClauseKind::Trait(
ty::ClauseKind::Trait(trait_pred) => {
Some(ty::ClauseKind::Trait(
trait_pred.with_replaced_self_ty(fcx.tcx, ty),
)),
))
}
ty::ClauseKind::Projection(proj_pred) => {
Some(ty::ClauseKind::Projection(
proj_pred.with_replaced_self_ty(fcx.tcx, ty),
+27 -13
View File
@@ -28,7 +28,7 @@
use rustc_infer::traits::query::NoSolution;
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AllowTwoPhase};
use rustc_middle::ty::error::{ExpectedFound, TypeError};
use rustc_middle::ty::{self, AdtKind, GenericArgsRef, Ty, TypeVisitableExt};
use rustc_middle::ty::{self, AdtKind, GenericArgsRef, Ty, TypeVisitableExt, Unnormalized};
use rustc_middle::{bug, span_bug};
use rustc_session::errors::ExprParenthesesNeeded;
use rustc_session::parse::feature_err;
@@ -594,7 +594,7 @@ pub(crate) fn check_expr_path(
self.add_required_obligations_with_code(expr.span, def_id, args, |_, _| {
code.clone()
});
return tcx.type_of(def_id).instantiate(tcx, args);
return tcx.type_of(def_id).instantiate(tcx, args).skip_norm_wip();
}
}
@@ -1743,7 +1743,10 @@ fn check_expr_repeat(
let count_span = count.span;
let count = self.try_structurally_resolve_const(
count_span,
self.normalize(count_span, self.lower_const_arg(count, tcx.types.usize)),
self.normalize(
count_span,
Unnormalized::new_wip(self.lower_const_arg(count, tcx.types.usize)),
),
);
if let Some(count) = count.try_to_target_usize(tcx) {
@@ -2064,12 +2067,12 @@ fn check_expr_struct_fields(
ty::Adt(adt, args) if adt.is_struct() => variant
.fields
.iter()
.map(|f| self.normalize(span, f.ty(self.tcx, args)))
.map(|f| self.normalize(span, Unnormalized::new_wip(f.ty(self.tcx, args))))
.collect(),
ty::Adt(adt, args) if adt.is_enum() => variant
.fields
.iter()
.map(|f| self.normalize(span, f.ty(self.tcx, args)))
.map(|f| self.normalize(span, Unnormalized::new_wip(f.ty(self.tcx, args))))
.collect(),
_ => {
self.dcx().emit_err(FunctionalRecordUpdateOnNonStruct { span });
@@ -2095,7 +2098,11 @@ fn check_expr_struct_fields(
.map(|f| {
let fru_ty = self.normalize(
expr.span,
self.field_ty(base_expr.span, f, fresh_args),
Unnormalized::new_wip(self.field_ty(
base_expr.span,
f,
fresh_args,
)),
);
let ident =
self.tcx.adjust_ident(f.ident(self.tcx), variant.def_id);
@@ -2180,7 +2187,12 @@ fn check_expr_struct_fields(
ty::Adt(adt, args) if adt.is_struct() => variant
.fields
.iter()
.map(|f| self.normalize(expr.span, f.ty(self.tcx, args)))
.map(|f| {
self.normalize(
expr.span,
Unnormalized::new_wip(f.ty(self.tcx, args)),
)
})
.collect(),
_ => {
self.dcx().emit_err(FunctionalRecordUpdateOnNonStruct {
@@ -2480,7 +2492,8 @@ fn report_private_fields(
let fn_sig = self
.tcx
.fn_sig(item.def_id)
.instantiate(self.tcx, self.fresh_args_for_item(span, item.def_id));
.instantiate(self.tcx, self.fresh_args_for_item(span, item.def_id))
.skip_norm_wip();
let ret_ty = self.tcx.instantiate_bound_regions_with_erased(fn_sig.output());
if !self.can_eq(self.param_env, ret_ty, adt_ty) {
return None;
@@ -2592,7 +2605,7 @@ fn report_unknown_field(
),
);
err.span_label(field.ident.span, "field does not exist");
let fn_sig = self.tcx.fn_sig(def_id).instantiate_identity();
let fn_sig = self.tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip();
let inputs = fn_sig.inputs().skip_binder();
let fields = format!(
"({})",
@@ -2620,7 +2633,7 @@ fn report_unknown_field(
_ => {
err.span_label(variant_ident_span, format!("`{ty}` defined here"));
err.span_label(field.ident.span, "field does not exist");
let fn_sig = self.tcx.fn_sig(def_id).instantiate_identity();
let fn_sig = self.tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip();
let inputs = fn_sig.inputs().skip_binder();
let fields = format!(
"({})",
@@ -3215,7 +3228,8 @@ fn no_such_field_err(
{
err.span_label(field.span, "this is an associated function, not a method");
err.note("found the following associated function; to be used as method, it must have a `self` parameter");
let impl_ty = self.tcx.type_of(impl_def_id).instantiate_identity();
let impl_ty =
self.tcx.type_of(impl_def_id).instantiate_identity().skip_norm_wip();
err.span_note(
self.tcx.def_span(item.def_id),
format!("the candidate is defined in an impl for the type `{impl_ty}`"),
@@ -3586,11 +3600,11 @@ fn find_and_report_unsatisfied_index_impl(
let element_ty = ocx.normalize(
&cause,
self.param_env,
Ty::new_projection_from_args(
Unnormalized::new(Ty::new_projection_from_args(
self.tcx,
index_trait_output_def_id,
impl_trait_ref.args,
),
)),
);
let true_errors = ocx.try_evaluate_obligations();
+2 -1
View File
@@ -632,7 +632,8 @@ fn visit_expr(&mut self, ex: &'_ hir::Expr<'_>) {
match ex.kind {
hir::ExprKind::MethodCall(..) => {
if let Some(def_id) = typeck_results.type_dependent_def_id(ex.hir_id)
&& let method_ty = self.fcx.tcx.type_of(def_id).instantiate_identity()
&& let method_ty =
self.fcx.tcx.type_of(def_id).instantiate_identity().skip_norm_wip()
&& let sig = method_ty.fn_sig(self.fcx.tcx)
&& sig.safety().is_unsafe()
{
+18 -15
View File
@@ -71,7 +71,7 @@ pub(crate) fn transform_args_for_inherent_type_const(
let impl_def_id = assoc_item.container_id(tcx);
let generics = tcx.generics_of(def_id);
let impl_args = &args[..generics.parent_count];
let self_ty = tcx.type_of(impl_def_id).instantiate(tcx, impl_args);
let self_ty = tcx.type_of(impl_def_id).instantiate(tcx, impl_args).skip_norm_wip();
// Build new args: [Self, own_args...]
let own_args = &args[generics.parent_count..];
tcx.mk_args_from_iter(
@@ -474,7 +474,7 @@ pub(crate) fn require_type_has_static_alignment(&self, ty: Ty<'tcx>, span: Span)
if self.next_trait_solver() {
self.try_structurally_resolve_type(span, ty)
} else {
self.normalize(span, ty)
self.normalize(span, Unnormalized::new_wip(ty))
}
},
|| {},
@@ -647,7 +647,7 @@ pub(crate) fn field_ty(
field: &'tcx ty::FieldDef,
args: GenericArgsRef<'tcx>,
) -> Ty<'tcx> {
self.normalize(span, field.ty(self.tcx, args))
self.normalize(span, Unnormalized::new_wip(field.ty(self.tcx, args)))
}
/// Drain all obligations that are stalled on coroutines defined in this body.
@@ -1064,7 +1064,7 @@ pub(crate) fn instantiate_value_path(
if let Res::Local(hid) = res {
let ty = self.local_ty(span, hid);
let ty = self.normalize(span, ty);
let ty = self.normalize(span, Unnormalized::new_wip(ty));
return (ty, res);
}
@@ -1131,7 +1131,7 @@ pub(crate) fn instantiate_value_path(
let ty = LoweredTy::from_raw(
self,
span,
tcx.at(span).type_of(impl_def_id).instantiate_identity(),
tcx.at(span).type_of(impl_def_id).instantiate_identity().skip_norm_wip(),
);
// Firstly, check that this SelfCtor even comes from the item we're currently
@@ -1289,7 +1289,8 @@ fn provided_kind(
self.fcx
.tcx
.type_of(param.def_id)
.instantiate(self.fcx.tcx, preceding_args),
.instantiate(self.fcx.tcx, preceding_args)
.skip_norm_wip(),
)
.into(),
(&GenericParamDefKind::Const { .. }, GenericArg::Infer(inf)) => {
@@ -1309,7 +1310,7 @@ fn inferred_kind(
if !infer_args && let Some(default) = param.default_value(tcx) {
// If we have a default, then it doesn't matter that we're not inferring
// the type/const arguments: We provide the default where any is missing.
return default.instantiate(tcx, preceding_args);
return default.instantiate(tcx, preceding_args).skip_norm_wip();
}
// If no type/const arguments were provided, we have to infer them.
// This case also occurs as a result of some malformed input, e.g.,
@@ -1347,7 +1348,7 @@ fn inferred_kind(
self.write_user_type_annotation_from_args(hir_id, def_id, args_for_user_type, user_self_ty);
// Normalize only after registering type annotations.
let args = self.normalize(span, args_raw);
let args = self.normalize(span, Unnormalized::new_wip(args_raw));
self.add_required_obligations_for_hir(span, def_id, args, hir_id);
@@ -1365,7 +1366,7 @@ fn inferred_kind(
// with the instantiated impl type.
// This also occurs for an enum variant on a type alias.
let impl_ty = self.normalize(span, tcx.type_of(impl_def_id).instantiate(tcx, args));
let self_ty = self.normalize(span, self_ty);
let self_ty = self.normalize(span, Unnormalized::new_wip(self_ty));
match self.at(&self.misc(span), self.param_env).eq(
DefineOpaqueTypes::Yes,
impl_ty,
@@ -1444,9 +1445,10 @@ pub(crate) fn try_structurally_resolve_type(&self, sp: Span, ty: Ty<'tcx>) -> Ty
// We need to use a separate variable here as otherwise the temporary for
// `self.fulfillment_cx.borrow_mut()` is alive in the `Err` branch, resulting
// in a reentrant borrow, causing an ICE.
let result = self
.at(&self.misc(sp), self.param_env)
.structurally_normalize_ty(ty, &mut **self.fulfillment_cx.borrow_mut());
let result = self.at(&self.misc(sp), self.param_env).structurally_normalize_ty(
Unnormalized::new_wip(ty),
&mut **self.fulfillment_cx.borrow_mut(),
);
match result {
Ok(normalized_ty) => normalized_ty,
Err(errors) => {
@@ -1473,9 +1475,10 @@ pub(crate) fn try_structurally_resolve_const(
// We need to use a separate variable here as otherwise the temporary for
// `self.fulfillment_cx.borrow_mut()` is alive in the `Err` branch, resulting
// in a reentrant borrow, causing an ICE.
let result = self
.at(&self.misc(sp), self.param_env)
.structurally_normalize_const(ct, &mut **self.fulfillment_cx.borrow_mut());
let result = self.at(&self.misc(sp), self.param_env).structurally_normalize_const(
Unnormalized::new_wip(ct),
&mut **self.fulfillment_cx.borrow_mut(),
);
match result {
Ok(normalized_ct) => normalized_ct,
Err(errors) => {
@@ -524,7 +524,7 @@ fn point_at_field_if_possible(
{
return Some((
expr_field.expr,
self.tcx.type_of(field.did).instantiate_identity(),
self.tcx.type_of(field.did).instantiate_identity().skip_norm_wip(),
));
}
}
@@ -552,7 +552,7 @@ fn blame_specific_arg_if_possible(
receiver: Option<&'tcx hir::Expr<'tcx>>,
args: &'tcx [hir::Expr<'tcx>],
) -> bool {
let ty = self.tcx.type_of(def_id).instantiate_identity();
let ty = self.tcx.type_of(def_id).instantiate_identity().skip_norm_wip();
if !ty.is_fn() {
return false;
}
@@ -18,7 +18,7 @@
use rustc_infer::infer::{BoundRegionConversionTime, DefineOpaqueTypes, InferOk, TypeTrace};
use rustc_middle::ty::adjustment::AllowTwoPhase;
use rustc_middle::ty::error::TypeError;
use rustc_middle::ty::{self, IsSuggestable, Ty, TyCtxt, TypeVisitableExt};
use rustc_middle::ty::{self, IsSuggestable, Ty, TyCtxt, TypeVisitableExt, Unnormalized};
use rustc_middle::{bug, span_bug};
use rustc_session::Session;
use rustc_span::{DUMMY_SP, Ident, Span, kw, sym};
@@ -95,8 +95,10 @@ pub(in super::super) fn check_repeat_exprs(&self) {
// as otherwise we can wind up conservatively proving `Copy` which may
// infer the repeat expr count to something that never required `Copy` in
// the first place.
let count = self
.structurally_resolve_const(element.span, self.normalize(element.span, count));
let count = self.structurally_resolve_const(
element.span,
self.normalize(element.span, Unnormalized::new_wip(count)),
);
// Avoid run on "`NotCopy: Copy` is not implemented" errors when the
// repeat expr count is erroneous/unknown. The user might wind up
@@ -1406,7 +1408,8 @@ fn label_fn_like(
// fn-like predicates with different args, but callable types really never
// do that, so it's OK.
for (predicate, span) in instantiated {
if let ty::ClauseKind::Trait(pred) = predicate.kind().skip_binder()
if let ty::ClauseKind::Trait(pred) =
predicate.skip_norm_wip().kind().skip_binder()
&& pred.self_ty().peel_refs() == callee_ty
&& self.tcx.is_fn_trait(pred.def_id())
{
@@ -3030,7 +3033,8 @@ fn similar_assoc(&self, call_name: Ident) -> Option<(ty::AssocItem, ty::FnSig<'t
.fn_ctxt
.tcx
.fn_sig(assoc.def_id)
.instantiate(self.call_ctxt.fn_ctxt.tcx, args);
.instantiate(self.call_ctxt.fn_ctxt.tcx, args)
.skip_norm_wip();
self.call_ctxt.fn_ctxt.instantiate_binder_with_fresh_vars(
call_name.span,
+13 -9
View File
@@ -17,7 +17,7 @@
};
use rustc_infer::infer::{self, RegionVariableOrigin};
use rustc_infer::traits::{DynCompatibilityViolation, Obligation};
use rustc_middle::ty::{self, Const, Ty, TyCtxt, TypeVisitableExt};
use rustc_middle::ty::{self, Const, Ty, TyCtxt, TypeVisitableExt, Unnormalized};
use rustc_session::Session;
use rustc_span::{self, DUMMY_SP, ErrorGuaranteed, Ident, Span};
use rustc_trait_selection::error_reporting::TypeErrCtxt;
@@ -192,8 +192,8 @@ pub(crate) fn err_ctxt(&'a self) -> TypeErrCtxt<'a, 'tcx> {
typeck_results: Some(self.typeck_results.borrow()),
diverging_fallback_has_occurred: self.diverging_fallback_has_occurred.get(),
normalize_fn_sig: Box::new(|fn_sig| {
if fn_sig.has_escaping_bound_vars() {
return fn_sig;
if fn_sig.skip_normalization().has_escaping_bound_vars() {
return fn_sig.skip_normalization();
}
self.probe(|_| {
let ocx = ObligationCtxt::new(self);
@@ -205,7 +205,7 @@ pub(crate) fn err_ctxt(&'a self) -> TypeErrCtxt<'a, 'tcx> {
return normalized_fn_sig;
}
}
fn_sig
fn_sig.skip_normalization()
})
}),
autoderef_steps: Box::new(|ty| {
@@ -279,7 +279,7 @@ fn register_trait_ascription_bounds(
self.trait_ascriptions.borrow_mut().entry(hir_id.local_id).or_default().push(clause);
let clause = self.normalize(span, clause);
let clause = self.normalize(span, Unnormalized::new_wip(clause));
self.register_predicate(Obligation::new(
self.tcx,
self.misc(span),
@@ -326,7 +326,11 @@ fn select_inherent_assoc_candidates(
let mut filter_iat_candidate = |self_ty, impl_| {
let ocx = ObligationCtxt::new_with_diagnostics(self);
let self_ty = ocx.normalize(&ObligationCause::dummy(), self.param_env, self_ty);
let self_ty = ocx.normalize(
&ObligationCause::dummy(),
self.param_env,
Unnormalized::new_wip(self_ty),
);
let impl_args = infcx.fresh_args_for_item(span, impl_);
let impl_ty = tcx.type_of(impl_).instantiate(tcx, impl_args);
@@ -410,7 +414,7 @@ fn probe_adt(&self, span: Span, ty: Ty<'tcx>) -> Option<ty::AdtDef<'tcx>> {
if self.next_trait_solver() {
self.try_structurally_resolve_type(span, ty).ty_adt_def()
} else {
self.normalize(span, ty).ty_adt_def()
self.normalize(span, Unnormalized::new_wip(ty)).ty_adt_def()
}
}
_ => None,
@@ -433,7 +437,7 @@ fn record_ty(&self, hir_id: hir::HirId, ty: Ty<'tcx>, span: Span) {
self.add_required_obligations_for_hir(span, *def_id, args, hir_id);
}
self.normalize(span, ty)
self.normalize(span, Unnormalized::new_wip(ty))
} else {
ty
};
@@ -488,7 +492,7 @@ fn from_raw(fcx: &FnCtxt<'_, 'tcx>, span: Span, raw: Ty<'tcx>) -> LoweredTy<'tcx
let normalized = if fcx.next_trait_solver() {
fcx.try_structurally_resolve_type(span, raw)
} else {
fcx.normalize(span, raw)
fcx.normalize(span, Unnormalized::new_wip(raw))
};
LoweredTy { raw, normalized }
}
@@ -19,7 +19,7 @@
use rustc_middle::span_bug;
use rustc_middle::ty::print::with_no_trimmed_paths;
use rustc_middle::ty::{
self, Article, Binder, IsSuggestable, Ty, TyCtxt, TypeVisitableExt, Upcast,
self, Article, Binder, IsSuggestable, Ty, TyCtxt, TypeVisitableExt, Unnormalized, Upcast,
suggest_constraining_type_params,
};
use rustc_session::errors::ExprParenthesesNeeded;
@@ -965,7 +965,7 @@ pub(in super::super) fn suggest_missing_return_type(
let bound_vars =
self.tcx.late_bound_vars(self.tcx.local_def_id_to_hir_id(fn_id));
let ty = Binder::bind_with_vars(ty, bound_vars);
let ty = self.normalize(hir_ty.span, ty);
let ty = self.normalize(hir_ty.span, Unnormalized::new_wip(ty));
let ty = self.tcx.instantiate_bound_regions_with_erased(ty);
if self.may_coerce(expected, ty) {
err.subdiagnostic(errors::ExpectedReturnTypeLabel::Other {
@@ -1231,7 +1231,7 @@ pub(in super::super) fn suggest_missing_break_or_return_expr(
}
ty::Asyncness::No => ty,
};
let ty = self.normalize(expr.span, ty);
let ty = self.normalize(expr.span, Unnormalized::new_wip(ty));
self.may_coerce(found, ty)
}
hir::FnRetTy::DefaultReturn(_) if in_closure => {
@@ -1839,7 +1839,7 @@ pub(crate) fn suggest_associated_const(
// Same item
return false;
}
let item_ty = self.tcx.type_of(item.def_id).instantiate_identity();
let item_ty = self.tcx.type_of(item.def_id).instantiate_identity().skip_norm_wip();
// FIXME(compiler-errors): This check is *so* rudimentary
if item_ty.has_param() {
return false;
+4 -2
View File
@@ -5,7 +5,9 @@
use rustc_hir::def_id::DefId;
use rustc_hir::{self as hir, LangItem};
use rustc_middle::bug;
use rustc_middle::ty::{self, Article, FloatTy, IntTy, Ty, TyCtxt, TypeVisitableExt, UintTy};
use rustc_middle::ty::{
self, Article, FloatTy, IntTy, Ty, TyCtxt, TypeVisitableExt, UintTy, Unnormalized,
};
use rustc_session::lint;
use rustc_span::def_id::LocalDefId;
use rustc_span::{ErrorGuaranteed, Span, Symbol, sym};
@@ -119,7 +121,7 @@ fn get_asm_ty(
} else {
self.fcx.tcx.normalize_erasing_regions(
self.fcx.typing_env(self.fcx.param_env),
len,
Unnormalized::new_wip(len),
)
};
let Some(len) = len.try_to_target_usize(self.tcx()) else {
+2 -2
View File
@@ -7,7 +7,7 @@
use rustc_index::Idx;
use rustc_middle::bug;
use rustc_middle::ty::layout::{LayoutError, SizeSkeleton};
use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_middle::ty::{self, Ty, TyCtxt, Unnormalized};
use rustc_span::def_id::LocalDefId;
use tracing::trace;
@@ -75,7 +75,7 @@ fn check_transmute<'tcx>(
) {
let span = || tcx.hir_span(hir_id);
let normalize = |ty| {
if let Ok(ty) = tcx.try_normalize_erasing_regions(typing_env, ty) {
if let Ok(ty) = tcx.try_normalize_erasing_regions(typing_env, Unnormalized::new_wip(ty)) {
ty
} else {
Ty::new_error_with_message(
+9 -8
View File
@@ -50,7 +50,7 @@
use rustc_infer::traits::{ObligationCauseCode, ObligationInspector, WellFormedLoc};
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
use rustc_middle::query::Providers;
use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_middle::ty::{self, Ty, TyCtxt, Unnormalized};
use rustc_middle::{bug, span_bug};
use rustc_session::config;
use rustc_span::Span;
@@ -144,7 +144,7 @@ fn typeck_with_inspect<'tcx>(
// a suggestion later on.
fcx.lowerer().lower_fn_ty(id, header.safety(), header.abi, decl, None, None)
} else {
tcx.fn_sig(def_id).instantiate_identity()
tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip()
};
check_abi(tcx, id, span, fn_sig.abi());
@@ -168,7 +168,7 @@ fn typeck_with_inspect<'tcx>(
.inputs_and_output
.iter()
.enumerate()
.map(|(idx, ty)| fcx.normalize(arg_span(idx), ty)),
.map(|(idx, ty)| fcx.normalize(arg_span(idx), Unnormalized::new_wip(ty))),
);
if tcx.codegen_fn_attrs(def_id).flags.contains(CodegenFnAttrFlags::NAKED) {
@@ -188,12 +188,12 @@ fn typeck_with_inspect<'tcx>(
// a suggestion later on.
fcx.lowerer().lower_ty(ty)
} else {
tcx.type_of(def_id).instantiate_identity()
tcx.type_of(def_id).instantiate_identity().skip_norm_wip()
};
loops::check(tcx, def_id, body);
let expected_type = fcx.normalize(body.value.span, expected_type);
let expected_type = fcx.normalize(body.value.span, Unnormalized::new_wip(expected_type));
let wf_code = ObligationCauseCode::WellFormed(Some(WellFormedLoc::Ty(def_id)));
fcx.register_wf_obligation(expected_type.into(), body.value.span, wf_code);
@@ -244,7 +244,7 @@ fn typeck_with_inspect<'tcx>(
assert!(fcx.deferred_call_resolutions.borrow().is_empty());
for (ty, span, code) in fcx.deferred_sized_obligations.borrow_mut().drain(..) {
let ty = fcx.normalize(span, ty);
let ty = fcx.normalize(span, Unnormalized::new_wip(ty));
fcx.require_type_is_sized(ty, span, code);
}
@@ -408,14 +408,15 @@ fn infer_type_if_missing<'tcx>(fcx: &FnCtxt<'_, 'tcx>, node: Node<'tcx>) -> Opti
&& let ty::AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container
{
let impl_def_id = item.container_id(tcx);
let impl_trait_ref = tcx.impl_trait_ref(impl_def_id).instantiate_identity();
let impl_trait_ref =
tcx.impl_trait_ref(impl_def_id).instantiate_identity().skip_norm_wip();
let args = ty::GenericArgs::identity_for_item(tcx, def_id).rebase_onto(
tcx,
impl_def_id,
impl_trait_ref.args,
);
tcx.check_args_compatible(trait_item_def_id, args)
.then(|| tcx.type_of(trait_item_def_id).instantiate(tcx, args))
.then(|| tcx.type_of(trait_item_def_id).instantiate(tcx, args).skip_norm_wip())
} else {
Some(fcx.next_ty_var(span))
}
@@ -23,7 +23,7 @@
};
use rustc_middle::ty::{
self, AssocContainer, GenericArgs, GenericArgsRef, GenericParamDefKind, Ty, TyCtxt,
TypeFoldable, TypeVisitableExt, UserArgs,
TypeFoldable, TypeVisitableExt, Unnormalized, UserArgs,
};
use rustc_middle::{bug, span_bug};
use rustc_span::{DUMMY_SP, Span};
@@ -137,14 +137,15 @@ fn confirm(
// traits, no trait system method can be called before this point because they
// could alter our Self-type, except for normalizing the receiver from the
// signature (which is also done during probing).
let method_sig_rcvr = self.normalize(self.span, method_sig.inputs()[0]);
let method_sig_rcvr =
self.normalize(self.span, Unnormalized::new_wip(method_sig.inputs()[0]));
debug!(
"confirm: self_ty={:?} method_sig_rcvr={:?} method_sig={:?} method_predicates={:?}",
self_ty, method_sig_rcvr, method_sig, method_predicates
);
self.unify_receivers(self_ty, method_sig_rcvr, pick);
let method_sig = self.normalize(self.span, method_sig);
let method_sig = self.normalize(self.span, Unnormalized::new_wip(method_sig));
// Make sure nobody calls `drop()` explicitly.
self.check_for_illegal_method_calls(pick);
@@ -460,7 +461,8 @@ fn provided_kind(
self.cfcx
.tcx
.type_of(param.def_id)
.instantiate(self.cfcx.tcx, preceding_args),
.instantiate(self.cfcx.tcx, preceding_args)
.skip_norm_wip(),
)
.into(),
(GenericParamDefKind::Const { .. }, GenericArg::Infer(inf)) => {
@@ -532,7 +534,7 @@ fn inferred_kind(
}
}
self.normalize(self.span, args)
self.normalize(self.span, Unnormalized::new_wip(args))
}
fn unify_receivers(
@@ -591,7 +593,7 @@ fn instantiate_method_sig(
debug!("method_predicates after instantiation = {:?}", method_predicates);
let sig = self.tcx.fn_sig(def_id).instantiate(self.tcx, all_args);
let sig = self.tcx.fn_sig(def_id).instantiate(self.tcx, all_args).skip_norm_wip();
debug!("type scheme instantiated, sig={:?}", sig);
let sig = self.instantiate_binder_with_fresh_vars(sig);
@@ -657,13 +659,16 @@ fn predicates_require_illegal_sized_bound(
) -> Option<Span> {
let sized_def_id = self.tcx.lang_items().sized_trait()?;
traits::elaborate(self.tcx, predicates.predicates.iter().copied())
traits::elaborate(
self.tcx,
predicates.predicates.iter().copied().map(Unnormalized::skip_norm_wip),
)
// We don't care about regions here.
.filter_map(|pred| match pred.kind().skip_binder() {
ty::ClauseKind::Trait(trait_pred) if trait_pred.def_id() == sized_def_id => {
let span = predicates
.iter()
.find_map(|(p, span)| if p == pred { Some(span) } else { None })
.find_map(|(p, span)| if p.skip_norm_wip() == pred { Some(span) } else { None })
.unwrap_or(DUMMY_SP);
Some((trait_pred, span))
}
+3 -3
View File
@@ -15,7 +15,7 @@
use rustc_infer::traits::PredicateObligations;
use rustc_middle::traits::ObligationCause;
use rustc_middle::ty::{
self, GenericArgs, GenericArgsRef, GenericParamDefKind, Ty, TypeVisitableExt,
self, GenericArgs, GenericArgsRef, GenericParamDefKind, Ty, TypeVisitableExt, Unnormalized,
};
use rustc_middle::{bug, span_bug};
use rustc_span::{ErrorGuaranteed, Ident, Span, Symbol};
@@ -421,7 +421,7 @@ pub(super) fn lookup_method_for_operator(
// N.B., instantiate late-bound regions before normalizing the
// function signature so that normalization does not need to deal
// with bound regions.
let fn_sig = tcx.fn_sig(def_id).instantiate(self.tcx, args);
let fn_sig = tcx.fn_sig(def_id).instantiate(self.tcx, args).skip_norm_wip();
let fn_sig = self.instantiate_binder_with_fresh_vars(
obligation.cause.span,
BoundRegionConversionTime::FnCall,
@@ -429,7 +429,7 @@ pub(super) fn lookup_method_for_operator(
);
let InferOk { value: fn_sig, obligations: o } =
self.at(&obligation.cause, self.param_env).normalize(fn_sig);
self.at(&obligation.cause, self.param_env).normalize(Unnormalized::new_wip(fn_sig));
obligations.extend(o);
// Register obligations for the parameters. This will include the
+23 -12
View File
@@ -18,7 +18,7 @@
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams, simplify_type};
use rustc_middle::ty::{
self, AssocContainer, AssocItem, GenericArgs, GenericArgsRef, GenericParamDefKind, ParamEnvAnd,
Ty, TyCtxt, TypeVisitableExt, Upcast,
Ty, TyCtxt, TypeVisitableExt, Unnormalized, Upcast,
};
use rustc_middle::{bug, span_bug};
use rustc_session::lint;
@@ -1073,7 +1073,8 @@ fn matches_return_type(&self, method: ty::AssocItem, expected: Ty<'tcx>) -> bool
match method.kind {
ty::AssocKind::Fn { .. } => self.probe(|_| {
let args = self.fresh_args_for_item(self.span, method.def_id);
let fty = self.tcx.fn_sig(method.def_id).instantiate(self.tcx, args);
let fty =
self.tcx.fn_sig(method.def_id).instantiate(self.tcx, args).skip_norm_wip();
let fty = self.instantiate_binder_with_fresh_vars(
self.span,
BoundRegionConversionTime::FnCall,
@@ -1971,10 +1972,15 @@ fn consider_probe(
match probe.kind {
InherentImplCandidate { impl_def_id, .. } => {
let impl_args = self.fresh_args_for_item(self.span, impl_def_id);
let impl_ty = self.tcx.type_of(impl_def_id).instantiate(self.tcx, impl_args);
let impl_ty = self
.tcx
.type_of(impl_def_id)
.instantiate(self.tcx, impl_args)
.skip_norm_wip();
(xform_self_ty, xform_ret_ty) =
self.xform_self_ty(probe.item, impl_ty, impl_args);
xform_self_ty = ocx.normalize(cause, self.param_env, xform_self_ty);
xform_self_ty =
ocx.normalize(cause, self.param_env, Unnormalized::new_wip(xform_self_ty));
match ocx.relate(cause, self.param_env, self.variance(), self_ty, xform_self_ty)
{
Ok(()) => {}
@@ -1984,7 +1990,8 @@ fn consider_probe(
}
}
// FIXME: Weirdly, we normalize the ret ty in this candidate, but no other candidates.
xform_ret_ty = ocx.normalize(cause, self.param_env, xform_ret_ty);
xform_ret_ty =
ocx.normalize(cause, self.param_env, Unnormalized::new_wip(xform_ret_ty));
// Check whether the impl imposes obligations we have to worry about.
let impl_def_id = probe.item.container_id(self.tcx);
let impl_bounds =
@@ -2033,10 +2040,12 @@ fn consider_probe(
BoundRegionConversionTime::FnCall,
poly_trait_ref,
);
let trait_ref = ocx.normalize(cause, self.param_env, trait_ref);
let trait_ref =
ocx.normalize(cause, self.param_env, Unnormalized::new_wip(trait_ref));
(xform_self_ty, xform_ret_ty) =
self.xform_self_ty(probe.item, trait_ref.self_ty(), trait_ref.args);
xform_self_ty = ocx.normalize(cause, self.param_env, xform_self_ty);
xform_self_ty =
ocx.normalize(cause, self.param_env, Unnormalized::new_wip(xform_self_ty));
match self_ty.kind() {
// HACK: opaque types will match anything for which their bounds hold.
// Thus we need to prevent them from trying to match the `&_` autoref
@@ -2106,7 +2115,7 @@ fn consider_probe(
match ocx.structurally_normalize_ty(
cause,
self.param_env,
trait_ref.self_ty(),
Unnormalized::new_wip(trait_ref.self_ty()),
) {
Ok(ty) => {
if !matches!(ty.kind(), ty::Param(_)) {
@@ -2121,7 +2130,8 @@ fn consider_probe(
}
}
xform_self_ty = ocx.normalize(cause, self.param_env, xform_self_ty);
xform_self_ty =
ocx.normalize(cause, self.param_env, Unnormalized::new_wip(xform_self_ty));
match ocx.relate(cause, self.param_env, self.variance(), self_ty, xform_self_ty)
{
Ok(()) => {}
@@ -2184,7 +2194,8 @@ fn consider_probe(
// but `self.return_type` is only set on the diagnostic-path, so we
// should be okay doing it here.
if !matches!(probe.kind, InherentImplCandidate { .. }) {
xform_ret_ty = ocx.normalize(&cause, self.param_env, xform_ret_ty);
xform_ret_ty =
ocx.normalize(&cause, self.param_env, Unnormalized::new_wip(xform_ret_ty));
}
debug!("comparing return_ty {:?} with xform ret ty {:?}", return_ty, xform_ret_ty);
@@ -2558,7 +2569,7 @@ fn xform_method_sig(&self, method: DefId, args: GenericArgsRef<'tcx>) -> ty::FnS
assert_eq!(args.len(), generics.parent_count);
let xform_fn_sig = if generics.is_own_empty() {
fn_sig.instantiate(self.tcx, args)
fn_sig.instantiate(self.tcx, args).skip_norm_wip()
} else {
let args = GenericArgs::for_item(self.tcx, method, |param, _| {
let i = param.index as usize;
@@ -2576,7 +2587,7 @@ fn xform_method_sig(&self, method: DefId, args: GenericArgsRef<'tcx>) -> ty::FnS
}
}
});
fn_sig.instantiate(self.tcx, args)
fn_sig.instantiate(self.tcx, args).skip_norm_wip()
};
self.tcx.instantiate_bound_regions_with_erased(xform_fn_sig)
+45 -19
View File
@@ -478,7 +478,8 @@ fn create_no_assoc_err(
});
let has_deref = autoderef.step_count() > 0;
if !candidate_found && !has_deref && unsatisfied_predicates.is_empty() {
ty = self.tcx.at(span).type_of(def.did()).instantiate_identity();
ty =
self.tcx.at(span).type_of(def.did()).instantiate_identity().skip_norm_wip();
}
}
}
@@ -1406,7 +1407,11 @@ fn set_not_found_span_label(
// different from the received one
// So we avoid suggestion method with Box<Self>
// for instance
self.tcx.at(span).type_of(*def_id).instantiate_identity()
self.tcx
.at(span)
.type_of(*def_id)
.instantiate_identity()
.skip_norm_wip()
!= rcvr_ty
}
(Mode::Path, false, _) => true,
@@ -1425,7 +1430,12 @@ fn set_not_found_span_label(
vec![
StringPart::normal(format!("the {item_kind} was found for `")),
StringPart::highlighted(
self.tcx.at(span).type_of(*only).instantiate_identity().to_string(),
self.tcx
.at(span)
.type_of(*only)
.instantiate_identity()
.skip_norm_wip()
.to_string(),
),
StringPart::normal(format!("`")),
]
@@ -1439,7 +1449,11 @@ fn set_not_found_span_label(
.map(|impl_item| {
format!(
"- `{}`",
self.tcx.at(span).type_of(*impl_item).instantiate_identity()
self.tcx
.at(span)
.type_of(*impl_item)
.instantiate_identity()
.skip_norm_wip()
)
})
.collect::<Vec<_>>()
@@ -1534,7 +1548,7 @@ fn suggest_enum_variant_for_method_call(
suggestion = vec![(replacement_span, var_name.to_string())];
}
(Some((hir::def::CtorKind::Fn, def_id)), hir::ExprKind::Call(rcvr, args)) => {
let fn_sig = tcx.fn_sig(def_id).instantiate_identity();
let fn_sig = tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip();
let inputs = fn_sig.inputs().skip_binder();
// FIXME: reuse the logic for "change args" suggestion to account for types
// involved and detect things like substitution.
@@ -1580,7 +1594,7 @@ fn suggest_enum_variant_for_method_call(
}
}
(Some((hir::def::CtorKind::Fn, def_id)), _) => {
let fn_sig = tcx.fn_sig(def_id).instantiate_identity();
let fn_sig = tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip();
let inputs = fn_sig.inputs().skip_binder();
suggestion = vec![(
replacement_span,
@@ -2204,7 +2218,8 @@ fn find_likely_intended_associated_item(
// not methods because they dont have an instance of the struct to work with.
if def_kind == DefKind::AssocFn {
let ty_args = self.infcx.fresh_args_for_item(span, similar_candidate.def_id);
let fn_sig = tcx.fn_sig(similar_candidate.def_id).instantiate(tcx, ty_args);
let fn_sig =
tcx.fn_sig(similar_candidate.def_id).instantiate(tcx, ty_args).skip_norm_wip();
let fn_sig = self.instantiate_binder_with_fresh_vars(
span,
BoundRegionConversionTime::FnCall,
@@ -2287,8 +2302,11 @@ pub(crate) fn confusable_method_name(
inherent_method.container_id(self.tcx),
adt_args,
);
let fn_sig =
self.tcx.fn_sig(inherent_method.def_id).instantiate(self.tcx, args);
let fn_sig = self
.tcx
.fn_sig(inherent_method.def_id)
.instantiate(self.tcx, args)
.skip_norm_wip();
let fn_sig = self.instantiate_binder_with_fresh_vars(
item_name.span,
BoundRegionConversionTime::FnCall,
@@ -2363,7 +2381,8 @@ fn note_candidates_on_method_error(
None
};
let impl_ty = self.tcx.at(span).type_of(impl_did).instantiate_identity();
let impl_ty =
self.tcx.at(span).type_of(impl_did).instantiate_identity().skip_norm_wip();
let insertion = match self.tcx.impl_opt_trait_ref(impl_did) {
None => String::new(),
@@ -2411,6 +2430,7 @@ fn note_candidates_on_method_error(
self.tcx,
self.fresh_args_for_item(sugg_span, impl_did),
)
.skip_norm_wip()
.with_replaced_self_ty(self.tcx, rcvr_ty),
idx,
sugg_span,
@@ -2510,6 +2530,7 @@ fn find_builder_fn(&self, err: &mut Diag<'_>, rcvr_ty: Ty<'tcx>, expr_id: hir::H
.tcx
.fn_sig(item.def_id)
.instantiate(self.tcx, self.fresh_args_for_item(DUMMY_SP, item.def_id))
.skip_norm_wip()
.output();
let ret_ty = self.tcx.instantiate_bound_regions_with_erased(ret_ty);
let ty::Adt(def, args) = ret_ty.kind() else {
@@ -2591,7 +2612,7 @@ fn suggest_associated_call_syntax(
// When the "method" is resolved through dereferencing, we really want the
// original type that has the associated function for accurate suggestions.
// (#61411)
let impl_ty = self.tcx.type_of(*impl_did).instantiate_identity();
let impl_ty = self.tcx.type_of(*impl_did).instantiate_identity().skip_norm_wip();
let target_ty = self
.autoderef(sugg_span, rcvr_ty)
.silence_errors()
@@ -2628,9 +2649,10 @@ fn suggest_associated_call_syntax(
if let SelfSource::MethodCall(_) = source {
let first_arg = static_candidates.get(0).and_then(|candidate_source| {
let (assoc_did, self_ty) = match candidate_source {
CandidateSource::Impl(impl_did) => {
(*impl_did, self.tcx.type_of(*impl_did).instantiate_identity())
}
CandidateSource::Impl(impl_did) => (
*impl_did,
self.tcx.type_of(*impl_did).instantiate_identity().skip_norm_wip(),
),
CandidateSource::Trait(trait_did) => (*trait_did, rcvr_ty),
};
@@ -2641,7 +2663,7 @@ fn suggest_associated_call_syntax(
// for CandidateSource::Impl, `Self` will be instantiated to a concrete type
// but for CandidateSource::Trait, `Self` is still `Self`
let sig = self.tcx.fn_sig(assoc.def_id).instantiate_identity();
let sig = self.tcx.fn_sig(assoc.def_id).instantiate_identity().skip_norm_wip();
sig.inputs().skip_binder().get(0).and_then(|first| {
// if the type of first arg is the same as the current impl type, we should take the first arg into assoc function
let first_ty = first.peel_refs();
@@ -2826,8 +2848,11 @@ fn report_failed_method_call_on_range_end(
else {
continue;
};
let range_ty =
self.tcx.type_of(range_def_id).instantiate(self.tcx, &[actual.into()]);
let range_ty = self
.tcx
.type_of(range_def_id)
.instantiate(self.tcx, &[actual.into()])
.skip_norm_wip();
let pick = self.lookup_probe_for_diagnostic(
item_name,
@@ -3492,6 +3517,7 @@ fn consider_suggesting_derives_for_ty(
self.tcx
.type_of(impl_def_id)
.instantiate_identity()
.skip_norm_wip()
.ty_adt_def()
.is_some_and(|def| def.did() == adt.did())
}) {
@@ -3623,7 +3649,7 @@ fn note_derefed_ty_has_method(
// just changing the path.
&& pick.item.is_method()
&& let Some(self_ty) =
self.tcx.fn_sig(pick.item.def_id).instantiate_identity().inputs().skip_binder().get(0)
self.tcx.fn_sig(pick.item.def_id).instantiate_identity().skip_norm_wip().inputs().skip_binder().get(0)
&& self_ty.is_ref()
{
let suggested_path = match deref_ty.kind() {
@@ -4585,7 +4611,7 @@ enum Introducer {
.map(|imp_did| self.tcx.impl_trait_header(imp_did))
.filter(|header| header.polarity != ty::ImplPolarity::Positive)
.any(|header| {
let imp = header.trait_ref.instantiate_identity();
let imp = header.trait_ref.instantiate_identity().skip_norm_wip();
let imp_simp =
simplify_type(self.tcx, imp.self_ty(), TreatParams::AsRigid);
imp_simp.is_some_and(|s| s == simp_rcvr_ty)
@@ -3,7 +3,7 @@
use rustc_middle::bug;
use rustc_middle::ty::{
self, DefiningScopeKind, DefinitionSiteHiddenType, OpaqueTypeKey, ProvisionalHiddenType,
TypeVisitableExt,
TypeVisitableExt, Unnormalized,
};
use rustc_trait_selection::error_reporting::infer::need_type_info::TypeAnnotationNeeded;
use rustc_trait_selection::opaque_types::{
@@ -139,7 +139,7 @@ fn compute_definition_site_hidden_types(
continue;
}
let expected = ty.ty.instantiate(tcx, opaque_type_key.args);
let expected = ty.ty.instantiate(tcx, opaque_type_key.args).skip_norm_wip();
self.demand_eqtype(hidden_type.span, expected, hidden_type.ty);
}
@@ -236,7 +236,7 @@ fn consider_opaque_type_use(
let cause = ObligationCause::misc(hidden_type.span, self.body_id);
let at = self.at(&cause, self.param_env);
let hidden_type = match solve::deeply_normalize(at, hidden_type) {
let hidden_type = match solve::deeply_normalize(at, Unnormalized::new_wip(hidden_type)) {
Ok(hidden_type) => hidden_type,
Err(errors) => {
let guar = self.err_ctxt().report_fulfillment_errors(errors);
+2 -2
View File
@@ -19,7 +19,7 @@
use rustc_hir_analysis::autoderef::report_autoderef_recursion_limit_error;
use rustc_infer::infer::RegionVariableOrigin;
use rustc_middle::traits::PatternOriginExpr;
use rustc_middle::ty::{self, Pinnedness, Ty, TypeVisitableExt};
use rustc_middle::ty::{self, Pinnedness, Ty, TypeVisitableExt, Unnormalized};
use rustc_middle::{bug, span_bug};
use rustc_session::lint::builtin::NON_EXHAUSTIVE_OMITTED_PATTERNS;
use rustc_session::parse::feature_err;
@@ -2704,7 +2704,7 @@ fn deref_pat_target(&self, span: Span, source_ty: Ty<'tcx>) -> Ty<'tcx> {
tcx.require_lang_item(hir::LangItem::DerefTarget, span),
[source_ty],
);
let target_ty = self.normalize(span, target_ty);
let target_ty = self.normalize(span, Unnormalized::new_wip(target_ty));
self.try_structurally_resolve_type(span, target_ty)
}
+3 -3
View File
@@ -44,7 +44,7 @@
use rustc_middle::traits::ObligationCauseCode;
use rustc_middle::ty::{
self, BorrowKind, ClosureSizeProfileData, Ty, TyCtxt, TypeVisitableExt as _, TypeckResults,
UpvarArgs, UpvarCapture,
Unnormalized, UpvarArgs, UpvarCapture,
};
use rustc_middle::{bug, span_bug};
use rustc_session::lint;
@@ -1182,7 +1182,7 @@ fn normalize_capture_place(&self, span: Span, place: Place<'tcx>) -> Place<'tcx>
let at = self.at(&cause, self.param_env);
match solve::deeply_normalize_with_skipped_universes_and_ambiguous_coroutine_goals(
at,
place.clone(),
Unnormalized::new_wip(place.clone()),
vec![],
) {
Ok((normalized, goals)) => {
@@ -1208,7 +1208,7 @@ fn normalize_capture_place(&self, span: Span, place: Place<'tcx>) -> Place<'tcx>
}
} else {
// For the old solver we can rely on `normalize` to eagerly normalize aliases.
self.normalize(span, place)
self.normalize(span, Unnormalized::new_wip(place))
}
}
+9 -4
View File
@@ -23,7 +23,7 @@
use rustc_middle::ty::{
self, DefiningScopeKind, DefinitionSiteHiddenType, Ty, TyCtxt, TypeFoldable, TypeFolder,
TypeSuperFoldable, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor,
fold_regions,
Unnormalized, fold_regions,
};
use rustc_span::Span;
use rustc_trait_selection::error_reporting::infer::need_type_info::TypeAnnotationNeeded;
@@ -623,6 +623,7 @@ fn visit_opaque_types(&mut self) {
hidden_ty
.ty
.instantiate_identity()
.skip_norm_wip()
.visit_with(&mut HasRecursiveOpaque {
def_id,
seen: Default::default(),
@@ -947,7 +948,9 @@ fn handle_term<T>(
let at = self.fcx.at(&cause, self.fcx.param_env);
let universes = vec![None; outer_exclusive_binder(value).as_usize()];
match solve::deeply_normalize_with_skipped_universes_and_ambiguous_coroutine_goals(
at, value, universes,
at,
Unnormalized::new_wip(value),
universes,
) {
Ok((value, goals)) => {
self.nested_goals.extend(goals);
@@ -1035,7 +1038,9 @@ fn cx(&self) -> TyCtxt<'tcx> {
}
fn fold_const(&mut self, ct: ty::Const<'tcx>) -> ty::Const<'tcx> {
self.tcx.try_normalize_erasing_regions(self.typing_env, ct).unwrap_or(ct)
self.tcx
.try_normalize_erasing_regions(self.typing_env, Unnormalized::new_wip(ct))
.unwrap_or(ct)
}
}
@@ -1060,7 +1065,7 @@ fn visit_ty(&mut self, t: Ty<'tcx>) -> Self::Result {
if self.seen.insert(def_id)
&& let Some(hidden_ty) = self.opaques.get(&def_id)
{
hidden_ty.ty.instantiate(self.tcx, args).visit_with(self)?;
hidden_ty.ty.instantiate(self.tcx, args).skip_norm_wip().visit_with(self)?;
}
}
@@ -6,7 +6,7 @@
use rustc_middle::ty::error::{ExpectedFound, TypeError};
use rustc_middle::ty::{
self, BottomUpFolder, OpaqueTypeKey, ProvisionalHiddenType, Ty, TyCtxt, TypeFoldable,
TypeVisitableExt,
TypeVisitableExt, Unnormalized,
};
use rustc_span::Span;
use tracing::{debug, instrument};
@@ -264,7 +264,8 @@ pub fn insert_hidden_type(
let actual = prev.unwrap_or_else(|| {
let actual = tcx
.type_of_opaque_hir_typeck(opaque_type_key.def_id)
.instantiate(self.tcx, opaque_type_key.args);
.instantiate(self.tcx, opaque_type_key.args)
.skip_norm_wip();
let actual = ty::fold_regions(tcx, actual, |re, _dbi| match re.kind() {
ty::ReErased => self.next_region_var(RegionVariableOrigin::Misc(span)),
_ => re,
@@ -352,7 +353,9 @@ pub fn add_item_bounds_for_hidden_type(
};
let item_bounds = tcx.explicit_item_bounds(def_id);
for (predicate, _) in item_bounds.iter_instantiated_copied(tcx, args) {
for (predicate, _) in
item_bounds.iter_instantiated_copied(tcx, args).map(Unnormalized::skip_norm_wip)
{
let predicate = replace_opaques_in(predicate, goals);
// Require that the predicate holds for the concrete type.
@@ -363,7 +366,9 @@ pub fn add_item_bounds_for_hidden_type(
// If this opaque is being defined and it's conditionally const,
if self.tcx.is_conditionally_const(def_id) {
let item_bounds = tcx.explicit_implied_const_bounds(def_id);
for (predicate, _) in item_bounds.iter_instantiated_copied(tcx, args) {
for (predicate, _) in
item_bounds.iter_instantiated_copied(tcx, args).map(Unnormalized::skip_norm_wip)
{
let predicate = replace_opaques_in(
predicate.to_host_effect_clause(self.tcx, ty::BoundConstness::Maybe),
goals,
@@ -1,5 +1,6 @@
use rustc_middle::ty::{
self, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor,
Unnormalized,
};
use crate::infer::outlives::test_type_match;
@@ -61,6 +62,7 @@ fn visit_ty(&mut self, ty: Ty<'tcx>) {
let outlives_bounds: Vec<_> = tcx
.item_bounds(kind.def_id())
.iter_instantiated(tcx, args)
.map(Unnormalized::skip_norm_wip)
.chain(param_env.caller_bounds())
.filter_map(|clause| {
let outlives = clause.as_type_outlives_clause()?;
@@ -1,7 +1,7 @@
use std::assert_matches;
use rustc_middle::ty::outlives::{Component, compute_alias_components_recursive};
use rustc_middle::ty::{self, OutlivesPredicate, Ty, TyCtxt};
use rustc_middle::ty::{self, OutlivesPredicate, Ty, TyCtxt, Unnormalized};
use smallvec::smallvec;
use tracing::{debug, instrument, trace};
@@ -285,6 +285,7 @@ pub(crate) fn declared_bounds_from_definition(
trace!("{:#?}", bounds.skip_binder());
bounds
.iter_instantiated(tcx, alias_ty.args)
.map(Unnormalized::skip_norm_wip)
.filter_map(|p| p.as_type_outlives_clause())
.filter_map(|p| p.no_bound_vars())
.map(|OutlivesPredicate(_, r)| r)
+2 -1
View File
@@ -1,6 +1,6 @@
use rustc_data_structures::fx::FxHashSet;
pub use rustc_middle::ty::elaborate::*;
use rustc_middle::ty::{self, TyCtxt};
use rustc_middle::ty::{self, TyCtxt, Unnormalized};
use rustc_span::{Ident, Span};
use crate::traits::{self, Obligation, ObligationCauseCode, PredicateObligation};
@@ -123,6 +123,7 @@ pub fn transitive_bounds_that_define_assoc_item<'tcx>(
stack.extend(
tcx.explicit_supertraits_containing_assoc_item((trait_ref.def_id(), assoc_name))
.iter_identity_copied()
.map(Unnormalized::skip_norm_wip)
.map(|(clause, _)| clause.instantiate_supertrait(tcx, trait_ref))
.filter_map(|clause| clause.as_trait_clause())
.filter(|clause| clause.polarity() == ty::PredicatePolarity::Positive)
+1 -1
View File
@@ -1171,7 +1171,7 @@ fn run_required_analyses(tcx: TyCtxt<'_>) {
// Eagerly check the unsubstituted layout for cycles.
tcx.ensure_ok().layout_of(
ty::TypingEnv::post_analysis(tcx, def_id.to_def_id())
.as_query_input(tcx.type_of(def_id).instantiate_identity()),
.as_query_input(tcx.type_of(def_id).instantiate_identity().skip_norm_wip()),
);
}
});
+14 -6
View File
@@ -33,7 +33,9 @@
use rustc_middle::lint::LevelAndSource;
use rustc_middle::ty::layout::LayoutOf;
use rustc_middle::ty::print::with_no_trimmed_paths;
use rustc_middle::ty::{self, AssocContainer, Ty, TyCtxt, TypeVisitableExt, Upcast, VariantDef};
use rustc_middle::ty::{
self, AssocContainer, Ty, TyCtxt, TypeVisitableExt, Unnormalized, Upcast, VariantDef,
};
// hardwired lints from rustc_lint_defs
pub use rustc_session::lint::builtin::*;
use rustc_session::lint::fcw;
@@ -464,7 +466,7 @@ fn check_impl_item(&mut self, cx: &LateContext<'_>, impl_item: &hir::ImplItem<'_
// If the method is an impl for an item with docs_hidden, don't doc.
AssocContainer::InherentImpl => {
let parent = cx.tcx.hir_get_parent_item(impl_item.hir_id());
let impl_ty = cx.tcx.type_of(parent).instantiate_identity();
let impl_ty = cx.tcx.type_of(parent).instantiate_identity().skip_norm_wip();
let outerdef = match impl_ty.kind() {
ty::Adt(def, _) => Some(def.did()),
ty::Foreign(def_id) => Some(*def_id),
@@ -573,7 +575,7 @@ fn check_item(&mut self, cx: &LateContext<'_>, item: &hir::Item<'_>) {
// and recommending Copy might be a bad idea.
for field in def.all_fields() {
let did = field.did;
if cx.tcx.type_of(did).instantiate_identity().is_raw_ptr() {
if cx.tcx.type_of(did).instantiate_identity().skip_norm_wip().is_raw_ptr() {
return;
}
}
@@ -703,7 +705,10 @@ fn check_item(&mut self, cx: &LateContext<'_>, item: &hir::Item<'_>) {
let has_impl = cx
.tcx
.non_blanket_impls_for_ty(debug, cx.tcx.type_of(item.owner_id).instantiate_identity())
.non_blanket_impls_for_ty(
debug,
cx.tcx.type_of(item.owner_id).instantiate_identity().skip_norm_wip(),
)
.next()
.is_some();
if !has_impl {
@@ -1376,7 +1381,7 @@ fn check_item(&mut self, cx: &LateContext<'_>, item: &hir::Item<'_>) {
// FIXME(generic_const_exprs): Revisit this before stabilization.
// See also `tests/ui/const-generics/generic_const_exprs/type-alias-bounds.rs`.
let ty = cx.tcx.type_of(item.owner_id).instantiate_identity();
let ty = cx.tcx.type_of(item.owner_id).instantiate_identity().skip_norm_wip();
if ty.has_type_flags(ty::TypeFlags::HAS_CT_PROJECTION)
&& cx.tcx.features().generic_const_exprs()
{
@@ -2523,7 +2528,10 @@ fn ty_find_init_error<'tcx>(
ty: Ty<'tcx>,
init: InitKind,
) -> Option<InitError> {
let ty = cx.tcx.try_normalize_erasing_regions(cx.typing_env(), ty).unwrap_or(ty);
let ty = cx
.tcx
.try_normalize_erasing_regions(cx.typing_env(), Unnormalized::new_wip(ty))
.unwrap_or(ty);
match ty.kind() {
// Primitive types that don't like 0 as a value.
+5 -2
View File
@@ -24,7 +24,9 @@
use rustc_middle::middle::privacy::EffectiveVisibilities;
use rustc_middle::ty::layout::{LayoutError, LayoutOfHelpers, TyAndLayout};
use rustc_middle::ty::print::{PrintError, PrintTraitRefExt as _, Printer, with_no_trimmed_paths};
use rustc_middle::ty::{self, GenericArg, RegisteredTools, Ty, TyCtxt, TypingEnv, TypingMode};
use rustc_middle::ty::{
self, GenericArg, RegisteredTools, Ty, TyCtxt, TypingEnv, TypingMode, Unnormalized,
};
use rustc_session::lint::{FutureIncompatibleInfo, Lint, LintExpectationId, LintId};
use rustc_session::{DynLintStore, Session};
use rustc_span::edit_distance::find_best_match_for_names;
@@ -833,7 +835,8 @@ pub fn get_associated_type(
.find_by_ident_and_kind(tcx, Ident::with_dummy_span(name), ty::AssocTag::Type, trait_id)
.and_then(|assoc| {
let proj = Ty::new_projection(tcx, assoc.def_id, [self_ty]);
tcx.try_normalize_erasing_regions(self.typing_env(), proj).ok()
tcx.try_normalize_erasing_regions(self.typing_env(), Unnormalized::new_wip(proj))
.ok()
})
}
+2 -2
View File
@@ -102,8 +102,8 @@ fn check_fn(
&& let TyKind::Ptr(_) = ret_ty.kind
{
// get the return type of the function or closure
let ty = match cx.tcx.type_of(def_id).instantiate_identity().kind() {
ty::FnDef(..) => cx.tcx.fn_sig(def_id).instantiate_identity(),
let ty = match cx.tcx.type_of(def_id).instantiate_identity().skip_norm_wip().kind() {
ty::FnDef(..) => cx.tcx.fn_sig(def_id).instantiate_identity().skip_norm_wip(),
ty::Closure(_, args) => args.as_closure().sig(),
_ => return,
};
@@ -67,7 +67,7 @@ fn check_impl_item(&mut self, cx: &LateContext<'_>, impl_item: &hir::ImplItem<'_
// We don't care about what `#[derive(Default)]` produces in this lint.
return;
}
let ty = cx.tcx.type_of(impl_id).instantiate_identity();
let ty = cx.tcx.type_of(impl_id).instantiate_identity().skip_norm_wip();
let ty::Adt(def, _) = ty.kind() else { return };
// We now know we have a manually written definition of a `<Type as Default>::default()`.
@@ -65,7 +65,7 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'tcx>) {
&& let Some(did) = of_trait.trait_ref.trait_def_id()
&& tcx.is_lang_item(did, LangItem::Deref)
// the self type is `dyn t_principal`
&& let self_ty = tcx.type_of(item.owner_id).instantiate_identity()
&& let self_ty = tcx.type_of(item.owner_id).instantiate_identity().skip_norm_wip()
&& let ty::Dynamic(data, _) = self_ty.kind()
&& let Some(self_principal) = data.principal()
// `<T as Deref>::Target` is `dyn target_principal`
@@ -48,7 +48,9 @@ fn path_for_rustc_pass_by_value(cx: &LateContext<'_>, ty: &hir::Ty<'_>) -> Optio
return Some(format!("{}{}", name, gen_args(cx, path_segment)));
}
Res::SelfTyAlias { alias_to: did, is_trait_impl: false, .. } => {
if let ty::Adt(adt, args) = cx.tcx.type_of(did).instantiate_identity().kind() {
if let ty::Adt(adt, args) =
cx.tcx.type_of(did).instantiate_identity().skip_norm_wip().kind()
{
if find_attr!(cx.tcx, adt.did(), RustcPassByValue(_)) {
return Some(cx.tcx.def_path_str_with_args(adt.did(), args));
}
+3 -3
View File
@@ -123,7 +123,7 @@ fn check_foreign_item<'tcx>(&mut self, tcx: TyCtxt<'tcx>, this_fi: hir::ForeignI
let Some(existing_did) = self.insert(tcx, this_fi) else { return };
let existing_decl_ty = tcx.type_of(existing_did).skip_binder();
let this_decl_ty = tcx.type_of(this_fi.owner_id).instantiate_identity();
let this_decl_ty = tcx.type_of(this_fi.owner_id).instantiate_identity().skip_norm_wip();
debug!(
"ClashingExternDeclarations: Comparing existing {:?}: {:?} to this {:?}: {:?}",
existing_did, existing_decl_ty, this_fi.owner_id, this_decl_ty
@@ -297,8 +297,8 @@ fn structurally_same_type_impl<'tcx>(
seen_types,
tcx,
typing_env,
tcx.type_of(a_did).instantiate(tcx, a_gen_args),
tcx.type_of(b_did).instantiate(tcx, b_gen_args),
tcx.type_of(a_did).instantiate(tcx, a_gen_args).skip_norm_wip(),
tcx.type_of(b_did).instantiate(tcx, b_gen_args).skip_norm_wip(),
)
},
)
+1 -1
View File
@@ -166,7 +166,7 @@ fn check_fn(
return;
}
let sig = cx.tcx.fn_sig(id).instantiate_identity();
let sig = cx.tcx.fn_sig(id).instantiate_identity().skip_norm_wip();
let sig = cx.tcx.instantiate_bound_regions_with_erased(sig);
for (input_ty, input_hir) in iter::zip(sig.inputs(), decl.inputs) {
@@ -17,6 +17,7 @@
};
use rustc_middle::ty::{
self, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor,
Unnormalized,
};
use rustc_middle::{bug, span_bug};
use rustc_session::lint::fcw;
@@ -141,7 +142,7 @@ enum ParamKind {
}
fn check_fn(tcx: TyCtxt<'_>, parent_def_id: LocalDefId) {
let sig = tcx.fn_sig(parent_def_id).instantiate_identity();
let sig = tcx.fn_sig(parent_def_id).instantiate_identity().skip_norm_wip();
let mut in_scope_parameters = FxIndexMap::default();
// Populate the in_scope_parameters list first with all of the generics in scope
@@ -246,7 +247,7 @@ fn visit_ty(&mut self, t: Ty<'tcx>) {
&& self.tcx.is_impl_trait_in_trait(def_id)
{
// visit the opaque of the RPITIT
self.tcx.type_of(def_id).instantiate(self.tcx, args).visit_with(self)
self.tcx.type_of(def_id).instantiate(self.tcx, args).skip_norm_wip().visit_with(self)
} else if let ty::Alias(ty::AliasTy { kind: ty::Opaque { def_id }, args: opaque_ty_args, .. }) = *t.kind()
&& let Some(opaque_def_id) = def_id.as_local()
// Don't recurse infinitely on an opaque
@@ -412,7 +413,12 @@ fn visit_ty(&mut self, t: Ty<'tcx>) {
// in this lint as well. Interestingly, one place that I expect this lint to fire
// is for `impl for<'a> Bound<Out = impl Other>`, since `impl Other` will begin
// to capture `'a` in e2024 (even though late-bound vars in opaques are not allowed).
for clause in self.tcx.item_bounds(def_id).iter_instantiated(self.tcx, opaque_ty_args) {
for clause in self
.tcx
.item_bounds(def_id)
.iter_instantiated(self.tcx, opaque_ty_args)
.map(Unnormalized::skip_norm_wip)
{
clause.visit_with(self)
}
}
+3 -2
View File
@@ -141,7 +141,7 @@ fn has_unstable_into_iter_predicate<'tcx>(
}
// `IntoIterator::into_iter` has no additional method args.
let into_iter_fn_args =
cx.tcx.instantiate_bound_regions_with_erased(trait_pred).trait_ref.args;
cx.tcx.instantiate_bound_regions_with_erased(trait_pred.skip_norm_wip()).trait_ref.args;
let Ok(Some(instance)) = ty::Instance::try_resolve(
cx.tcx,
cx.typing_env(),
@@ -292,7 +292,8 @@ fn is_ty_or_ty_ctxt(cx: &LateContext<'_>, path: &hir::Path<'_>) -> Option<String
}
// Only lint on `&Ty` and `&TyCtxt` if it is used outside of a trait.
Res::SelfTyAlias { alias_to: did, is_trait_impl: false, .. } => {
if let ty::Adt(adt, args) = cx.tcx.type_of(did).instantiate_identity().kind()
if let ty::Adt(adt, args) =
cx.tcx.type_of(did).instantiate_identity().skip_norm_wip().kind()
&& let Some(name @ (sym::Ty | sym::TyCtxt)) = cx.tcx.get_diagnostic_name(adt.did())
{
return Some(format!("{}<{}>", name, args[0]));
@@ -1,4 +1,5 @@
use rustc_hir as hir;
use rustc_middle::ty::Unnormalized;
use rustc_session::{declare_lint, declare_lint_pass};
use crate::{LateContext, LateLintPass, LintContext};
@@ -46,6 +47,7 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'tcx>) {
.tcx
.explicit_super_predicates_of(def_id)
.iter_identity_copied()
.map(Unnormalized::skip_norm_wip)
.filter_map(|(pred, _)| pred.as_trait_clause())
.filter(|pred| !cx.tcx.is_lang_item(pred.def_id(), hir::LangItem::MetaSized))
.filter(|pred| !cx.tcx.is_default_trait(pred.def_id()));
+5 -3
View File
@@ -1,6 +1,7 @@
use rustc_hir::def::DefKind;
use rustc_hir::{Expr, ExprKind};
use rustc_middle::ty;
use rustc_middle::ty::Unnormalized;
use rustc_middle::ty::adjustment::{Adjust, DerefAdjustKind};
use rustc_session::{declare_lint, declare_lint_pass};
use rustc_span::sym;
@@ -92,9 +93,10 @@ fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
return;
};
let args = cx
.tcx
.normalize_erasing_regions(cx.typing_env(), cx.typeck_results().node_args(expr.hir_id));
let args = cx.tcx.normalize_erasing_regions(
cx.typing_env(),
Unnormalized::new_wip(cx.typeck_results().node_args(expr.hir_id)),
);
// Resolve the trait method instance.
let Ok(Some(i)) = ty::Instance::try_resolve(cx.tcx, cx.typing_env(), did, args) else {
return;
@@ -2,7 +2,7 @@
use rustc_infer::infer::TyCtxtInferExt;
use rustc_macros::{Diagnostic, Subdiagnostic};
use rustc_middle::ty::print::{PrintTraitPredicateExt as _, TraitPredPrintModifiersAndPath};
use rustc_middle::ty::{self, BottomUpFolder, Ty, TypeFoldable};
use rustc_middle::ty::{self, BottomUpFolder, Ty, TypeFoldable, Unnormalized};
use rustc_session::{declare_lint, declare_lint_pass};
use rustc_span::{Span, kw};
use rustc_trait_selection::traits::{self, ObligationCtxt};
@@ -88,7 +88,12 @@ fn check_ty(&mut self, cx: &LateContext<'tcx>, ty: &'tcx hir::Ty<'tcx, AmbigArg>
// For every projection predicate in the opaque type's explicit bounds,
// check that the type that we're assigning actually satisfies the bounds
// of the associated type.
for (pred, pred_span) in cx.tcx.explicit_item_bounds(def_id).iter_identity_copied() {
for (pred, pred_span) in cx
.tcx
.explicit_item_bounds(def_id)
.iter_identity_copied()
.map(Unnormalized::skip_norm_wip)
{
infcx.enter_forall(pred.kind(), |predicate| {
let ty::ClauseKind::Projection(proj) = predicate else {
return;
@@ -146,12 +151,16 @@ fn check_ty(&mut self, cx: &LateContext<'tcx>, ty: &'tcx hir::Ty<'tcx, AmbigArg>
.tcx
.explicit_item_bounds(proj.projection_term.def_id)
.iter_instantiated_copied(cx.tcx, proj.projection_term.args)
.map(Unnormalized::skip_norm_wip)
{
let assoc_pred = assoc_pred.fold_with(proj_replacer);
let ocx = ObligationCtxt::new(infcx);
let assoc_pred =
ocx.normalize(&traits::ObligationCause::dummy(), cx.param_env, assoc_pred);
let assoc_pred = ocx.normalize(
&traits::ObligationCause::dummy(),
cx.param_env,
Unnormalized::new_wip(assoc_pred),
);
if !ocx.evaluate_obligations_error_on_ambiguity().is_empty() {
// Can't normalize for some reason...?
continue;

Some files were not shown because too many files have changed in this diff Show More