mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-31 21:47:15 +03:00
make needs_infer specific to inference variables
Notably, excluding ReSkolemized
This commit is contained in:
@@ -409,7 +409,7 @@ fn fold_const(&mut self, constant: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tc
|
||||
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 @@ fn fold_const(&mut self, constant: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tc
|
||||
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 @@ pub fn $method(self, v: $alloc) -> &$lt_tcx $ty {
|
||||
// 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 @@ pub fn $method(self, v: $alloc) -> &$lt_tcx $ty {
|
||||
}
|
||||
|
||||
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 @@ fn hash<H: Hasher>(&self, s: &mut H) {
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ fn has_infer_types(&self) -> bool {
|
||||
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 @@ pub fn and<T: TypeFoldable<'tcx>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
|
||||
}
|
||||
|
||||
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 @@ pub fn type_flags(&self) -> TypeFlags {
|
||||
}
|
||||
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 @@ fn to_unadjusted_pick(&self) -> Pick<'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 @@ fn tcx(&self) -> TyCtxt<'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 @@ fn visit_node_id(&mut self, span: Span, hir_id: hir::HirId) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user