make needs_infer specific to inference variables
Notably, excluding ReSkolemized
This commit is contained in:
parent
2e59e467a0
commit
69400751ab
8 changed files with 23 additions and 11 deletions
|
@ -409,7 +409,7 @@ impl<'a, 'b, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for AssociatedTypeNormalizer<'a,
|
|||
if let ConstVal::Unevaluated(def_id, substs) = constant.val {
|
||||
let tcx = self.selcx.tcx().global_tcx();
|
||||
if let Some(param_env) = self.tcx().lift_to_global(&self.param_env) {
|
||||
if substs.needs_infer() {
|
||||
if substs.needs_infer() || substs.has_skol() {
|
||||
let identity_substs = Substs::identity_for_item(tcx, def_id);
|
||||
let instance = ty::Instance::resolve(tcx, param_env, def_id, identity_substs);
|
||||
if let Some(instance) = instance {
|
||||
|
|
|
@ -196,7 +196,7 @@ impl<'cx, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for QueryNormalizer<'cx, 'gcx, 'tcx
|
|||
if let ConstVal::Unevaluated(def_id, substs) = constant.val {
|
||||
let tcx = self.infcx.tcx.global_tcx();
|
||||
if let Some(param_env) = self.tcx().lift_to_global(&self.param_env) {
|
||||
if substs.needs_infer() {
|
||||
if substs.needs_infer() || substs.has_skol() {
|
||||
let identity_substs = Substs::identity_for_item(tcx, def_id);
|
||||
let instance = ty::Instance::resolve(tcx, param_env, def_id, identity_substs);
|
||||
if let Some(instance) = instance {
|
||||
|
|
|
@ -2119,7 +2119,7 @@ macro_rules! intern_method {
|
|||
$alloc_method:ident,
|
||||
$alloc_to_key:expr,
|
||||
$alloc_to_ret:expr,
|
||||
$needs_infer:expr) -> $ty:ty) => {
|
||||
$keep_in_local_tcx:expr) -> $ty:ty) => {
|
||||
impl<'a, 'gcx, $lt_tcx> TyCtxt<'a, 'gcx, $lt_tcx> {
|
||||
pub fn $method(self, v: $alloc) -> &$lt_tcx $ty {
|
||||
{
|
||||
|
@ -2137,7 +2137,7 @@ macro_rules! intern_method {
|
|||
// HACK(eddyb) Depend on flags being accurate to
|
||||
// determine that all contents are in the global tcx.
|
||||
// See comments on Lift for why we can't use that.
|
||||
if !($needs_infer)(&v) {
|
||||
if !($keep_in_local_tcx)(&v) {
|
||||
if !self.is_global() {
|
||||
let v = unsafe {
|
||||
mem::transmute(v)
|
||||
|
@ -2165,7 +2165,7 @@ macro_rules! intern_method {
|
|||
}
|
||||
|
||||
macro_rules! direct_interners {
|
||||
($lt_tcx:tt, $($name:ident: $method:ident($needs_infer:expr) -> $ty:ty),+) => {
|
||||
($lt_tcx:tt, $($name:ident: $method:ident($keep_in_local_tcx:expr) -> $ty:ty),+) => {
|
||||
$(impl<$lt_tcx> PartialEq for Interned<$lt_tcx, $ty> {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
self.0 == other.0
|
||||
|
@ -2180,7 +2180,10 @@ macro_rules! direct_interners {
|
|||
}
|
||||
}
|
||||
|
||||
intern_method!($lt_tcx, $name: $method($ty, alloc, |x| x, |x| x, $needs_infer) -> $ty);)+
|
||||
intern_method!(
|
||||
$lt_tcx,
|
||||
$name: $method($ty, alloc, |x| x, |x| x, $keep_in_local_tcx) -> $ty
|
||||
);)+
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -91,6 +91,9 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone {
|
|||
fn needs_infer(&self) -> bool {
|
||||
self.has_type_flags(TypeFlags::HAS_TY_INFER | TypeFlags::HAS_RE_INFER)
|
||||
}
|
||||
fn has_skol(&self) -> bool {
|
||||
self.has_type_flags(TypeFlags::HAS_RE_SKOL)
|
||||
}
|
||||
fn needs_subst(&self) -> bool {
|
||||
self.has_type_flags(TypeFlags::NEEDS_SUBST)
|
||||
}
|
||||
|
|
|
@ -1476,7 +1476,11 @@ impl<'tcx> ParamEnv<'tcx> {
|
|||
}
|
||||
|
||||
Reveal::All => {
|
||||
if value.needs_infer() || value.has_param_types() || value.has_self_ty() {
|
||||
if value.has_skol()
|
||||
|| value.needs_infer()
|
||||
|| value.has_param_types()
|
||||
|| value.has_self_ty()
|
||||
{
|
||||
ParamEnvAnd {
|
||||
param_env: self,
|
||||
value,
|
||||
|
|
|
@ -1199,7 +1199,6 @@ impl RegionKind {
|
|||
}
|
||||
ty::ReSkolemized(..) => {
|
||||
flags = flags | TypeFlags::HAS_FREE_REGIONS;
|
||||
flags = flags | TypeFlags::HAS_RE_INFER;
|
||||
flags = flags | TypeFlags::HAS_RE_SKOL;
|
||||
flags = flags | TypeFlags::KEEP_IN_LOCAL_TCX;
|
||||
}
|
||||
|
|
|
@ -1485,7 +1485,10 @@ impl<'tcx> Candidate<'tcx> {
|
|||
// inference variables or other artifacts. This
|
||||
// means they are safe to put into the
|
||||
// `WhereClausePick`.
|
||||
assert!(!trait_ref.skip_binder().substs.needs_infer());
|
||||
assert!(
|
||||
!trait_ref.skip_binder().substs.needs_infer()
|
||||
&& !trait_ref.skip_binder().substs.has_skol()
|
||||
);
|
||||
|
||||
WhereClausePick(trait_ref.clone())
|
||||
}
|
||||
|
|
|
@ -107,7 +107,7 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
|
|||
|
||||
fn write_ty_to_tables(&mut self, hir_id: hir::HirId, ty: Ty<'gcx>) {
|
||||
debug!("write_ty_to_tables({:?}, {:?})", hir_id, ty);
|
||||
assert!(!ty.needs_infer());
|
||||
assert!(!ty.needs_infer() && !ty.has_skol());
|
||||
self.tables.node_types_mut().insert(hir_id, ty);
|
||||
}
|
||||
|
||||
|
@ -431,7 +431,7 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
|
|||
if let Some(substs) = self.fcx.tables.borrow().node_substs_opt(hir_id) {
|
||||
let substs = self.resolve(&substs, &span);
|
||||
debug!("write_substs_to_tcx({:?}, {:?})", hir_id, substs);
|
||||
assert!(!substs.needs_infer());
|
||||
assert!(!substs.needs_infer() && !substs.has_skol());
|
||||
self.tables.node_substs_mut().insert(hir_id, substs);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue