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:
parent
c86974d94f
commit
0bb2a6b780
@ -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()
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user