Now that inlining, mir validation and const eval all use reveal-all, we won't be constraining hidden types here anymore

This commit is contained in:
Oli Scherer 2024-02-28 09:59:50 +00:00
parent c86974d94f
commit 0bb2a6b780

View File

@ -4,7 +4,7 @@
//! other areas of the compiler as well. //! other areas of the compiler as well.
use rustc_infer::infer::TyCtxtInferExt; use rustc_infer::infer::TyCtxtInferExt;
use rustc_middle::traits::{DefiningAnchor, ObligationCause}; use rustc_middle::traits::ObligationCause;
use rustc_middle::ty::{ParamEnv, Ty, TyCtxt, Variance}; use rustc_middle::ty::{ParamEnv, Ty, TyCtxt, Variance};
use rustc_trait_selection::traits::ObligationCtxt; use rustc_trait_selection::traits::ObligationCtxt;
@ -33,9 +33,6 @@ pub fn is_equal_up_to_subtyping<'tcx>(
/// When validating assignments, the variance should be `Covariant`. When checking /// When validating assignments, the variance should be `Covariant`. When checking
/// during `MirPhase` >= `MirPhase::Runtime(RuntimePhase::Initial)` variance should be `Invariant` /// during `MirPhase` >= `MirPhase::Runtime(RuntimePhase::Initial)` variance should be `Invariant`
/// because we want to check for type equality. /// because we want to check for type equality.
///
/// This mostly ignores opaque types as it can be used in constraining contexts
/// while still computing the final underlying type.
pub fn relate_types<'tcx>( pub fn relate_types<'tcx>(
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
param_env: ParamEnv<'tcx>, param_env: ParamEnv<'tcx>,
@ -47,8 +44,7 @@ pub fn relate_types<'tcx>(
return true; return true;
} }
let mut builder = let mut builder = tcx.infer_ctxt().ignoring_regions();
tcx.infer_ctxt().ignoring_regions().with_opaque_type_inference(DefiningAnchor::Bubble);
let infcx = builder.build(); let infcx = builder.build();
let ocx = ObligationCtxt::new(&infcx); let ocx = ObligationCtxt::new(&infcx);
let cause = ObligationCause::dummy(); let cause = ObligationCause::dummy();
@ -58,20 +54,5 @@ pub fn relate_types<'tcx>(
Ok(()) => {} Ok(()) => {}
Err(_) => return false, Err(_) => return false,
}; };
let errors = ocx.select_all_or_error(); ocx.select_all_or_error().is_empty()
// With `Reveal::All`, opaque types get normalized away, with `Reveal::UserFacing`
// we would get unification errors because we're unable to look into opaque types,
// even if they're constrained in our current function.
for (key, ty) in infcx.take_opaque_types() {
let hidden_ty = tcx.type_of(key.def_id).instantiate(tcx, key.args);
if hidden_ty != ty.hidden_type.ty {
span_bug!(
ty.hidden_type.span,
"{}, {}",
tcx.type_of(key.def_id).instantiate(tcx, key.args),
ty.hidden_type.ty
);
}
}
errors.is_empty()
} }