always make define_opaque_types
explicit
This commit is contained in:
parent
e84e5ff04a
commit
d2b7604db9
33 changed files with 308 additions and 225 deletions
|
@ -30,16 +30,20 @@ use super::*;
|
|||
use rustc_middle::ty::relate::{Relate, TypeRelation};
|
||||
use rustc_middle::ty::{Const, ImplSubject};
|
||||
|
||||
/// Whether we should define opaque types or just treat them opaquely.
|
||||
///
|
||||
/// Currently only used to prevent predicate matching from matching anything
|
||||
/// against opaque types.
|
||||
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
|
||||
pub enum DefineOpaqueTypes {
|
||||
Yes,
|
||||
No,
|
||||
}
|
||||
|
||||
pub struct At<'a, 'tcx> {
|
||||
pub infcx: &'a InferCtxt<'tcx>,
|
||||
pub cause: &'a ObligationCause<'tcx>,
|
||||
pub param_env: ty::ParamEnv<'tcx>,
|
||||
/// Whether we should define opaque types
|
||||
/// or just treat them opaquely.
|
||||
/// Currently only used to prevent predicate
|
||||
/// matching from matching anything against opaque
|
||||
/// types.
|
||||
pub define_opaque_types: bool,
|
||||
}
|
||||
|
||||
pub struct Trace<'a, 'tcx> {
|
||||
|
@ -55,7 +59,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
cause: &'a ObligationCause<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
) -> At<'a, 'tcx> {
|
||||
At { infcx: self, cause, param_env, define_opaque_types: false }
|
||||
At { infcx: self, cause, param_env }
|
||||
}
|
||||
|
||||
/// Forks the inference context, creating a new inference context with the same inference
|
||||
|
@ -93,33 +97,21 @@ pub trait ToTrace<'tcx>: Relate<'tcx> + Copy {
|
|||
}
|
||||
|
||||
impl<'a, 'tcx> At<'a, 'tcx> {
|
||||
pub fn define_opaque_types(self, define_opaque_types: bool) -> Self {
|
||||
Self { define_opaque_types, ..self }
|
||||
}
|
||||
|
||||
/// Hacky routine for equating two impl headers in coherence.
|
||||
pub fn eq_impl_headers(
|
||||
self,
|
||||
expected: &ty::ImplHeader<'tcx>,
|
||||
actual: &ty::ImplHeader<'tcx>,
|
||||
) -> InferResult<'tcx, ()> {
|
||||
debug!("eq_impl_header({:?} = {:?})", expected, actual);
|
||||
match (expected.trait_ref, actual.trait_ref) {
|
||||
(Some(a_ref), Some(b_ref)) => self.eq(a_ref, b_ref),
|
||||
(None, None) => self.eq(expected.self_ty, actual.self_ty),
|
||||
_ => bug!("mk_eq_impl_headers given mismatched impl kinds"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Makes `a <: b`, where `a` may or may not be expected.
|
||||
///
|
||||
/// See [`At::trace_exp`] and [`Trace::sub`] for a version of
|
||||
/// this method that only requires `T: Relate<'tcx>`
|
||||
pub fn sub_exp<T>(self, a_is_expected: bool, a: T, b: T) -> InferResult<'tcx, ()>
|
||||
pub fn sub_exp<T>(
|
||||
self,
|
||||
define_opaque_types: DefineOpaqueTypes,
|
||||
a_is_expected: bool,
|
||||
a: T,
|
||||
b: T,
|
||||
) -> InferResult<'tcx, ()>
|
||||
where
|
||||
T: ToTrace<'tcx>,
|
||||
{
|
||||
self.trace_exp(a_is_expected, a, b).sub(a, b)
|
||||
self.trace_exp(a_is_expected, a, b).sub(define_opaque_types, a, b)
|
||||
}
|
||||
|
||||
/// Makes `actual <: expected`. For example, if type-checking a
|
||||
|
@ -129,54 +121,81 @@ impl<'a, 'tcx> At<'a, 'tcx> {
|
|||
///
|
||||
/// See [`At::trace`] and [`Trace::sub`] for a version of
|
||||
/// this method that only requires `T: Relate<'tcx>`
|
||||
pub fn sup<T>(self, expected: T, actual: T) -> InferResult<'tcx, ()>
|
||||
pub fn sup<T>(
|
||||
self,
|
||||
define_opaque_types: DefineOpaqueTypes,
|
||||
expected: T,
|
||||
actual: T,
|
||||
) -> InferResult<'tcx, ()>
|
||||
where
|
||||
T: ToTrace<'tcx>,
|
||||
{
|
||||
self.sub_exp(false, actual, expected)
|
||||
self.sub_exp(define_opaque_types, false, actual, expected)
|
||||
}
|
||||
|
||||
/// Makes `expected <: actual`.
|
||||
///
|
||||
/// See [`At::trace`] and [`Trace::sub`] for a version of
|
||||
/// this method that only requires `T: Relate<'tcx>`
|
||||
pub fn sub<T>(self, expected: T, actual: T) -> InferResult<'tcx, ()>
|
||||
pub fn sub<T>(
|
||||
self,
|
||||
define_opaque_types: DefineOpaqueTypes,
|
||||
expected: T,
|
||||
actual: T,
|
||||
) -> InferResult<'tcx, ()>
|
||||
where
|
||||
T: ToTrace<'tcx>,
|
||||
{
|
||||
self.sub_exp(true, expected, actual)
|
||||
self.sub_exp(define_opaque_types, true, expected, actual)
|
||||
}
|
||||
|
||||
/// Makes `expected <: actual`.
|
||||
///
|
||||
/// See [`At::trace_exp`] and [`Trace::eq`] for a version of
|
||||
/// this method that only requires `T: Relate<'tcx>`
|
||||
pub fn eq_exp<T>(self, a_is_expected: bool, a: T, b: T) -> InferResult<'tcx, ()>
|
||||
pub fn eq_exp<T>(
|
||||
self,
|
||||
define_opaque_types: DefineOpaqueTypes,
|
||||
a_is_expected: bool,
|
||||
a: T,
|
||||
b: T,
|
||||
) -> InferResult<'tcx, ()>
|
||||
where
|
||||
T: ToTrace<'tcx>,
|
||||
{
|
||||
self.trace_exp(a_is_expected, a, b).eq(a, b)
|
||||
self.trace_exp(a_is_expected, a, b).eq(define_opaque_types, a, b)
|
||||
}
|
||||
|
||||
/// Makes `expected <: actual`.
|
||||
///
|
||||
/// See [`At::trace`] and [`Trace::eq`] for a version of
|
||||
/// this method that only requires `T: Relate<'tcx>`
|
||||
pub fn eq<T>(self, expected: T, actual: T) -> InferResult<'tcx, ()>
|
||||
pub fn eq<T>(
|
||||
self,
|
||||
define_opaque_types: DefineOpaqueTypes,
|
||||
expected: T,
|
||||
actual: T,
|
||||
) -> InferResult<'tcx, ()>
|
||||
where
|
||||
T: ToTrace<'tcx>,
|
||||
{
|
||||
self.trace(expected, actual).eq(expected, actual)
|
||||
self.trace(expected, actual).eq(define_opaque_types, expected, actual)
|
||||
}
|
||||
|
||||
pub fn relate<T>(self, expected: T, variance: ty::Variance, actual: T) -> InferResult<'tcx, ()>
|
||||
pub fn relate<T>(
|
||||
self,
|
||||
define_opaque_types: DefineOpaqueTypes,
|
||||
expected: T,
|
||||
variance: ty::Variance,
|
||||
actual: T,
|
||||
) -> InferResult<'tcx, ()>
|
||||
where
|
||||
T: ToTrace<'tcx>,
|
||||
{
|
||||
match variance {
|
||||
ty::Variance::Covariant => self.sub(expected, actual),
|
||||
ty::Variance::Invariant => self.eq(expected, actual),
|
||||
ty::Variance::Contravariant => self.sup(expected, actual),
|
||||
ty::Variance::Covariant => self.sub(define_opaque_types, expected, actual),
|
||||
ty::Variance::Invariant => self.eq(define_opaque_types, expected, actual),
|
||||
ty::Variance::Contravariant => self.sup(define_opaque_types, expected, actual),
|
||||
|
||||
// We could make this make sense but it's not readily
|
||||
// exposed and I don't feel like dealing with it. Note
|
||||
|
@ -195,11 +214,16 @@ impl<'a, 'tcx> At<'a, 'tcx> {
|
|||
///
|
||||
/// See [`At::trace`] and [`Trace::lub`] for a version of
|
||||
/// this method that only requires `T: Relate<'tcx>`
|
||||
pub fn lub<T>(self, expected: T, actual: T) -> InferResult<'tcx, T>
|
||||
pub fn lub<T>(
|
||||
self,
|
||||
define_opaque_types: DefineOpaqueTypes,
|
||||
expected: T,
|
||||
actual: T,
|
||||
) -> InferResult<'tcx, T>
|
||||
where
|
||||
T: ToTrace<'tcx>,
|
||||
{
|
||||
self.trace(expected, actual).lub(expected, actual)
|
||||
self.trace(expected, actual).lub(define_opaque_types, expected, actual)
|
||||
}
|
||||
|
||||
/// Computes the greatest-lower-bound, or mutual subtype, of two
|
||||
|
@ -208,11 +232,16 @@ impl<'a, 'tcx> At<'a, 'tcx> {
|
|||
///
|
||||
/// See [`At::trace`] and [`Trace::glb`] for a version of
|
||||
/// this method that only requires `T: Relate<'tcx>`
|
||||
pub fn glb<T>(self, expected: T, actual: T) -> InferResult<'tcx, T>
|
||||
pub fn glb<T>(
|
||||
self,
|
||||
define_opaque_types: DefineOpaqueTypes,
|
||||
expected: T,
|
||||
actual: T,
|
||||
) -> InferResult<'tcx, T>
|
||||
where
|
||||
T: ToTrace<'tcx>,
|
||||
{
|
||||
self.trace(expected, actual).glb(expected, actual)
|
||||
self.trace(expected, actual).glb(define_opaque_types, expected, actual)
|
||||
}
|
||||
|
||||
/// Sets the "trace" values that will be used for
|
||||
|
@ -242,13 +271,13 @@ impl<'a, 'tcx> Trace<'a, 'tcx> {
|
|||
/// Makes `a <: b` where `a` may or may not be expected (if
|
||||
/// `a_is_expected` is true, then `a` is expected).
|
||||
#[instrument(skip(self), level = "debug")]
|
||||
pub fn sub<T>(self, a: T, b: T) -> InferResult<'tcx, ()>
|
||||
pub fn sub<T>(self, define_opaque_types: DefineOpaqueTypes, a: T, b: T) -> InferResult<'tcx, ()>
|
||||
where
|
||||
T: Relate<'tcx>,
|
||||
{
|
||||
let Trace { at, trace, a_is_expected } = self;
|
||||
at.infcx.commit_if_ok(|_| {
|
||||
let mut fields = at.infcx.combine_fields(trace, at.param_env, at.define_opaque_types);
|
||||
let mut fields = at.infcx.combine_fields(trace, at.param_env, define_opaque_types);
|
||||
fields
|
||||
.sub(a_is_expected)
|
||||
.relate(a, b)
|
||||
|
@ -259,13 +288,13 @@ impl<'a, 'tcx> Trace<'a, 'tcx> {
|
|||
/// Makes `a == b`; the expectation is set by the call to
|
||||
/// `trace()`.
|
||||
#[instrument(skip(self), level = "debug")]
|
||||
pub fn eq<T>(self, a: T, b: T) -> InferResult<'tcx, ()>
|
||||
pub fn eq<T>(self, define_opaque_types: DefineOpaqueTypes, a: T, b: T) -> InferResult<'tcx, ()>
|
||||
where
|
||||
T: Relate<'tcx>,
|
||||
{
|
||||
let Trace { at, trace, a_is_expected } = self;
|
||||
at.infcx.commit_if_ok(|_| {
|
||||
let mut fields = at.infcx.combine_fields(trace, at.param_env, at.define_opaque_types);
|
||||
let mut fields = at.infcx.combine_fields(trace, at.param_env, define_opaque_types);
|
||||
fields
|
||||
.equate(a_is_expected)
|
||||
.relate(a, b)
|
||||
|
@ -274,13 +303,13 @@ impl<'a, 'tcx> Trace<'a, 'tcx> {
|
|||
}
|
||||
|
||||
#[instrument(skip(self), level = "debug")]
|
||||
pub fn lub<T>(self, a: T, b: T) -> InferResult<'tcx, T>
|
||||
pub fn lub<T>(self, define_opaque_types: DefineOpaqueTypes, a: T, b: T) -> InferResult<'tcx, T>
|
||||
where
|
||||
T: Relate<'tcx>,
|
||||
{
|
||||
let Trace { at, trace, a_is_expected } = self;
|
||||
at.infcx.commit_if_ok(|_| {
|
||||
let mut fields = at.infcx.combine_fields(trace, at.param_env, at.define_opaque_types);
|
||||
let mut fields = at.infcx.combine_fields(trace, at.param_env, define_opaque_types);
|
||||
fields
|
||||
.lub(a_is_expected)
|
||||
.relate(a, b)
|
||||
|
@ -289,13 +318,13 @@ impl<'a, 'tcx> Trace<'a, 'tcx> {
|
|||
}
|
||||
|
||||
#[instrument(skip(self), level = "debug")]
|
||||
pub fn glb<T>(self, a: T, b: T) -> InferResult<'tcx, T>
|
||||
pub fn glb<T>(self, define_opaque_types: DefineOpaqueTypes, a: T, b: T) -> InferResult<'tcx, T>
|
||||
where
|
||||
T: Relate<'tcx>,
|
||||
{
|
||||
let Trace { at, trace, a_is_expected } = self;
|
||||
at.infcx.commit_if_ok(|_| {
|
||||
let mut fields = at.infcx.combine_fields(trace, at.param_env, at.define_opaque_types);
|
||||
let mut fields = at.infcx.combine_fields(trace, at.param_env, define_opaque_types);
|
||||
fields
|
||||
.glb(a_is_expected)
|
||||
.relate(a, b)
|
||||
|
|
|
@ -14,7 +14,7 @@ use crate::infer::canonical::{
|
|||
};
|
||||
use crate::infer::nll_relate::{TypeRelating, TypeRelatingDelegate};
|
||||
use crate::infer::region_constraints::{Constraint, RegionConstraintData};
|
||||
use crate::infer::{InferCtxt, InferOk, InferResult, NllRegionVariableOrigin};
|
||||
use crate::infer::{DefineOpaqueTypes, InferCtxt, InferOk, InferResult, NllRegionVariableOrigin};
|
||||
use crate::traits::query::{Fallible, NoSolution};
|
||||
use crate::traits::{Obligation, ObligationCause, PredicateObligation};
|
||||
use crate::traits::{PredicateObligations, TraitEngine, TraitEngineExt};
|
||||
|
@ -510,7 +510,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
let b = substitute_value(self.tcx, &result_subst, b);
|
||||
debug!(?a, ?b, "constrain opaque type");
|
||||
obligations
|
||||
.extend(self.at(cause, param_env).define_opaque_types(true).eq(a, b)?.obligations);
|
||||
.extend(self.at(cause, param_env).eq(DefineOpaqueTypes::Yes, a, b)?.obligations);
|
||||
}
|
||||
|
||||
Ok(InferOk { value: result_subst, obligations })
|
||||
|
@ -603,8 +603,11 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
|
||||
match (value1.unpack(), value2.unpack()) {
|
||||
(GenericArgKind::Type(v1), GenericArgKind::Type(v2)) => {
|
||||
obligations
|
||||
.extend(self.at(cause, param_env).eq(v1, v2)?.into_obligations());
|
||||
obligations.extend(
|
||||
self.at(cause, param_env)
|
||||
.eq(DefineOpaqueTypes::Yes, v1, v2)?
|
||||
.into_obligations(),
|
||||
);
|
||||
}
|
||||
(GenericArgKind::Lifetime(re1), GenericArgKind::Lifetime(re2))
|
||||
if re1.is_erased() && re2.is_erased() =>
|
||||
|
@ -612,11 +615,14 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
// no action needed
|
||||
}
|
||||
(GenericArgKind::Lifetime(v1), GenericArgKind::Lifetime(v2)) => {
|
||||
obligations
|
||||
.extend(self.at(cause, param_env).eq(v1, v2)?.into_obligations());
|
||||
obligations.extend(
|
||||
self.at(cause, param_env)
|
||||
.eq(DefineOpaqueTypes::Yes, v1, v2)?
|
||||
.into_obligations(),
|
||||
);
|
||||
}
|
||||
(GenericArgKind::Const(v1), GenericArgKind::Const(v2)) => {
|
||||
let ok = self.at(cause, param_env).eq(v1, v2)?;
|
||||
let ok = self.at(cause, param_env).eq(DefineOpaqueTypes::Yes, v1, v2)?;
|
||||
obligations.extend(ok.into_obligations());
|
||||
}
|
||||
_ => {
|
||||
|
|
|
@ -27,7 +27,7 @@ use super::glb::Glb;
|
|||
use super::lub::Lub;
|
||||
use super::sub::Sub;
|
||||
use super::type_variable::TypeVariableValue;
|
||||
use super::{InferCtxt, MiscVariable, TypeTrace};
|
||||
use super::{DefineOpaqueTypes, InferCtxt, MiscVariable, TypeTrace};
|
||||
use crate::traits::{Obligation, PredicateObligations};
|
||||
use rustc_data_structures::sso::SsoHashMap;
|
||||
use rustc_hir::def_id::DefId;
|
||||
|
@ -52,12 +52,7 @@ pub struct CombineFields<'infcx, 'tcx> {
|
|||
pub cause: Option<ty::relate::Cause>,
|
||||
pub param_env: ty::ParamEnv<'tcx>,
|
||||
pub obligations: PredicateObligations<'tcx>,
|
||||
/// Whether we should define opaque types
|
||||
/// or just treat them opaquely.
|
||||
/// Currently only used to prevent predicate
|
||||
/// matching from matching anything against opaque
|
||||
/// types.
|
||||
pub define_opaque_types: bool,
|
||||
pub define_opaque_types: DefineOpaqueTypes,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
use crate::infer::DefineOpaqueTypes;
|
||||
use crate::traits::PredicateObligations;
|
||||
|
||||
use super::combine::{CombineFields, ObligationEmittingRelation, RelationDir};
|
||||
|
@ -110,7 +111,8 @@ impl<'tcx> TypeRelation<'tcx> for Equate<'_, '_, 'tcx> {
|
|||
}
|
||||
(&ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }), _)
|
||||
| (_, &ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }))
|
||||
if self.fields.define_opaque_types && def_id.is_local() =>
|
||||
if self.fields.define_opaque_types == DefineOpaqueTypes::Yes
|
||||
&& def_id.is_local() =>
|
||||
{
|
||||
self.fields.obligations.extend(
|
||||
infcx
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
use super::combine::{CombineFields, ObligationEmittingRelation};
|
||||
use super::lattice::{self, LatticeDir};
|
||||
use super::InferCtxt;
|
||||
use super::Subtype;
|
||||
use super::{DefineOpaqueTypes, InferCtxt};
|
||||
|
||||
use crate::traits::{ObligationCause, PredicateObligations};
|
||||
use rustc_middle::ty::relate::{Relate, RelateResult, TypeRelation};
|
||||
|
@ -142,7 +142,7 @@ impl<'combine, 'infcx, 'tcx> LatticeDir<'infcx, 'tcx> for Glb<'combine, 'infcx,
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn define_opaque_types(&self) -> bool {
|
||||
fn define_opaque_types(&self) -> DefineOpaqueTypes {
|
||||
self.fields.define_opaque_types
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
use super::combine::ObligationEmittingRelation;
|
||||
use super::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
||||
use super::InferCtxt;
|
||||
use super::{DefineOpaqueTypes, InferCtxt};
|
||||
|
||||
use crate::traits::ObligationCause;
|
||||
use rustc_middle::ty::relate::RelateResult;
|
||||
|
@ -36,7 +36,7 @@ pub trait LatticeDir<'f, 'tcx>: ObligationEmittingRelation<'tcx> {
|
|||
|
||||
fn cause(&self) -> &ObligationCause<'tcx>;
|
||||
|
||||
fn define_opaque_types(&self) -> bool;
|
||||
fn define_opaque_types(&self) -> DefineOpaqueTypes;
|
||||
|
||||
// Relates the type `v` to `a` and `b` such that `v` represents
|
||||
// the LUB/GLB of `a` and `b` as appropriate.
|
||||
|
@ -110,7 +110,7 @@ where
|
|||
) if a_def_id == b_def_id => infcx.super_combine_tys(this, a, b),
|
||||
(&ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }), _)
|
||||
| (_, &ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }))
|
||||
if this.define_opaque_types() && def_id.is_local() =>
|
||||
if this.define_opaque_types() == DefineOpaqueTypes::Yes && def_id.is_local() =>
|
||||
{
|
||||
this.register_obligations(
|
||||
infcx
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
use super::combine::{CombineFields, ObligationEmittingRelation};
|
||||
use super::lattice::{self, LatticeDir};
|
||||
use super::InferCtxt;
|
||||
use super::Subtype;
|
||||
use super::{DefineOpaqueTypes, InferCtxt};
|
||||
|
||||
use crate::traits::{ObligationCause, PredicateObligations};
|
||||
use rustc_middle::ty::relate::{Relate, RelateResult, TypeRelation};
|
||||
|
@ -142,7 +142,7 @@ impl<'combine, 'infcx, 'tcx> LatticeDir<'infcx, 'tcx> for Lub<'combine, 'infcx,
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn define_opaque_types(&self) -> bool {
|
||||
fn define_opaque_types(&self) -> DefineOpaqueTypes {
|
||||
self.fields.define_opaque_types
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
pub use self::at::DefineOpaqueTypes;
|
||||
pub use self::freshen::TypeFreshener;
|
||||
pub use self::lexical_region_resolve::RegionResolutionError;
|
||||
pub use self::LateBoundRegionConversionTime::*;
|
||||
|
@ -729,7 +730,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
&'a self,
|
||||
trace: TypeTrace<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
define_opaque_types: bool,
|
||||
define_opaque_types: DefineOpaqueTypes,
|
||||
) -> CombineFields<'a, 'tcx> {
|
||||
CombineFields {
|
||||
infcx: self,
|
||||
|
@ -860,7 +861,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
T: at::ToTrace<'tcx>,
|
||||
{
|
||||
let origin = &ObligationCause::dummy();
|
||||
self.probe(|_| self.at(origin, param_env).sub(a, b).is_ok())
|
||||
self.probe(|_| self.at(origin, param_env).sub(DefineOpaqueTypes::No, a, b).is_ok())
|
||||
}
|
||||
|
||||
pub fn can_eq<T>(&self, param_env: ty::ParamEnv<'tcx>, a: T, b: T) -> bool
|
||||
|
@ -868,7 +869,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
T: at::ToTrace<'tcx>,
|
||||
{
|
||||
let origin = &ObligationCause::dummy();
|
||||
self.probe(|_| self.at(origin, param_env).eq(a, b).is_ok())
|
||||
self.probe(|_| self.at(origin, param_env).eq(DefineOpaqueTypes::No, a, b).is_ok())
|
||||
}
|
||||
|
||||
#[instrument(skip(self), level = "debug")]
|
||||
|
@ -963,7 +964,8 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
let ty::SubtypePredicate { a_is_expected, a, b } =
|
||||
self.instantiate_binder_with_placeholders(predicate);
|
||||
|
||||
let ok = self.at(cause, param_env).sub_exp(a_is_expected, a, b)?;
|
||||
let ok =
|
||||
self.at(cause, param_env).sub_exp(DefineOpaqueTypes::No, a_is_expected, a, b)?;
|
||||
|
||||
Ok(ok.unit())
|
||||
}))
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use super::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
||||
use super::{DefineOpaqueTypes, InferResult};
|
||||
use crate::errors::OpaqueHiddenTypeDiag;
|
||||
use crate::infer::{DefiningAnchor, InferCtxt, InferOk};
|
||||
use crate::traits;
|
||||
|
@ -16,18 +18,13 @@ use rustc_middle::ty::{
|
|||
TypeVisitable, TypeVisitableExt, TypeVisitor,
|
||||
};
|
||||
use rustc_span::Span;
|
||||
|
||||
use std::ops::ControlFlow;
|
||||
|
||||
pub type OpaqueTypeMap<'tcx> = VecMap<OpaqueTypeKey<'tcx>, OpaqueTypeDecl<'tcx>>;
|
||||
|
||||
mod table;
|
||||
|
||||
pub type OpaqueTypeMap<'tcx> = VecMap<OpaqueTypeKey<'tcx>, OpaqueTypeDecl<'tcx>>;
|
||||
pub use table::{OpaqueTypeStorage, OpaqueTypeTable};
|
||||
|
||||
use super::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
||||
use super::InferResult;
|
||||
|
||||
/// Information about the opaque types whose values we
|
||||
/// are inferring in this function (these are the `impl Trait` that
|
||||
/// appear in the return type).
|
||||
|
@ -547,8 +544,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||
if let Some(prev) = prev {
|
||||
obligations = self
|
||||
.at(&cause, param_env)
|
||||
.define_opaque_types(true)
|
||||
.eq_exp(a_is_expected, prev, hidden_ty)?
|
||||
.eq_exp(DefineOpaqueTypes::Yes, a_is_expected, prev, hidden_ty)?
|
||||
.obligations;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use super::combine::{CombineFields, RelationDir};
|
||||
use super::{ObligationEmittingRelation, SubregionOrigin};
|
||||
use super::{DefineOpaqueTypes, ObligationEmittingRelation, SubregionOrigin};
|
||||
|
||||
use crate::traits::{Obligation, PredicateObligations};
|
||||
use rustc_middle::ty::relate::{Cause, Relate, RelateResult, TypeRelation};
|
||||
|
@ -138,7 +138,8 @@ impl<'tcx> TypeRelation<'tcx> for Sub<'_, '_, 'tcx> {
|
|||
}
|
||||
(&ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }), _)
|
||||
| (_, &ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }))
|
||||
if self.fields.define_opaque_types && def_id.is_local() =>
|
||||
if self.fields.define_opaque_types == DefineOpaqueTypes::Yes
|
||||
&& def_id.is_local() =>
|
||||
{
|
||||
self.fields.obligations.extend(
|
||||
infcx
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue