Uplift PredicateEmittingRelation first
This commit is contained in:
parent
28cc0b643d
commit
e5d6a416e8
@ -4168,6 +4168,7 @@ dependencies = [
|
|||||||
"rustc_index",
|
"rustc_index",
|
||||||
"rustc_macros",
|
"rustc_macros",
|
||||||
"rustc_middle",
|
"rustc_middle",
|
||||||
|
"rustc_next_trait_solver",
|
||||||
"rustc_span",
|
"rustc_span",
|
||||||
"rustc_target",
|
"rustc_target",
|
||||||
"rustc_type_ir",
|
"rustc_type_ir",
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_errors::ErrorGuaranteed;
|
use rustc_errors::ErrorGuaranteed;
|
||||||
use rustc_infer::infer::relate::{PredicateEmittingRelation, StructurallyRelateAliases};
|
use rustc_infer::infer::relate::{
|
||||||
use rustc_infer::infer::relate::{Relate, RelateResult, TypeRelation};
|
PredicateEmittingRelation, Relate, RelateResult, StructurallyRelateAliases, TypeRelation,
|
||||||
use rustc_infer::infer::NllRegionVariableOrigin;
|
};
|
||||||
|
use rustc_infer::infer::{InferCtxt, NllRegionVariableOrigin};
|
||||||
use rustc_infer::traits::solve::Goal;
|
use rustc_infer::traits::solve::Goal;
|
||||||
use rustc_infer::traits::Obligation;
|
use rustc_infer::traits::Obligation;
|
||||||
use rustc_middle::mir::ConstraintCategory;
|
use rustc_middle::mir::ConstraintCategory;
|
||||||
@ -522,7 +523,7 @@ fn binders<T>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'bccx, 'tcx> PredicateEmittingRelation<'tcx> for NllTypeRelating<'_, 'bccx, 'tcx> {
|
impl<'bccx, 'tcx> PredicateEmittingRelation<InferCtxt<'tcx>> for NllTypeRelating<'_, 'bccx, 'tcx> {
|
||||||
fn span(&self) -> Span {
|
fn span(&self) -> Span {
|
||||||
self.locations.span(self.type_checker.body)
|
self.locations.span(self.type_checker.body)
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ rustc_hir = { path = "../rustc_hir" }
|
|||||||
rustc_index = { path = "../rustc_index" }
|
rustc_index = { path = "../rustc_index" }
|
||||||
rustc_macros = { path = "../rustc_macros" }
|
rustc_macros = { path = "../rustc_macros" }
|
||||||
rustc_middle = { path = "../rustc_middle" }
|
rustc_middle = { path = "../rustc_middle" }
|
||||||
|
rustc_next_trait_solver = { path = "../rustc_next_trait_solver" }
|
||||||
rustc_span = { path = "../rustc_span" }
|
rustc_span = { path = "../rustc_span" }
|
||||||
rustc_target = { path = "../rustc_target" }
|
rustc_target = { path = "../rustc_target" }
|
||||||
rustc_type_ir = { path = "../rustc_type_ir" }
|
rustc_type_ir = { path = "../rustc_type_ir" }
|
||||||
|
@ -18,11 +18,13 @@
|
|||||||
//! On success, the LUB/GLB operations return the appropriate bound. The
|
//! On success, the LUB/GLB operations return the appropriate bound. The
|
||||||
//! return value of `Equate` or `Sub` shouldn't really be used.
|
//! return value of `Equate` or `Sub` shouldn't really be used.
|
||||||
|
|
||||||
|
pub use rustc_next_trait_solver::relate::combine::*;
|
||||||
|
|
||||||
use super::glb::Glb;
|
use super::glb::Glb;
|
||||||
use super::lub::Lub;
|
use super::lub::Lub;
|
||||||
use super::type_relating::TypeRelating;
|
use super::type_relating::TypeRelating;
|
||||||
|
use super::RelateResult;
|
||||||
use super::StructurallyRelateAliases;
|
use super::StructurallyRelateAliases;
|
||||||
use super::{RelateResult, TypeRelation};
|
|
||||||
use crate::infer::relate;
|
use crate::infer::relate;
|
||||||
use crate::infer::{DefineOpaqueTypes, InferCtxt, TypeTrace};
|
use crate::infer::{DefineOpaqueTypes, InferCtxt, TypeTrace};
|
||||||
use crate::traits::{Obligation, PredicateObligation};
|
use crate::traits::{Obligation, PredicateObligation};
|
||||||
@ -32,7 +34,6 @@
|
|||||||
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
||||||
use rustc_middle::ty::{self, InferConst, Ty, TyCtxt, TypeVisitableExt, Upcast};
|
use rustc_middle::ty::{self, InferConst, Ty, TyCtxt, TypeVisitableExt, Upcast};
|
||||||
use rustc_middle::ty::{IntType, UintType};
|
use rustc_middle::ty::{IntType, UintType};
|
||||||
use rustc_span::Span;
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct CombineFields<'infcx, 'tcx> {
|
pub struct CombineFields<'infcx, 'tcx> {
|
||||||
@ -76,7 +77,7 @@ pub fn super_combine_tys<R>(
|
|||||||
b: Ty<'tcx>,
|
b: Ty<'tcx>,
|
||||||
) -> RelateResult<'tcx, Ty<'tcx>>
|
) -> RelateResult<'tcx, Ty<'tcx>>
|
||||||
where
|
where
|
||||||
R: PredicateEmittingRelation<'tcx>,
|
R: PredicateEmittingRelation<InferCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
debug_assert!(!a.has_escaping_bound_vars());
|
debug_assert!(!a.has_escaping_bound_vars());
|
||||||
debug_assert!(!b.has_escaping_bound_vars());
|
debug_assert!(!b.has_escaping_bound_vars());
|
||||||
@ -171,7 +172,7 @@ pub fn super_combine_consts<R>(
|
|||||||
b: ty::Const<'tcx>,
|
b: ty::Const<'tcx>,
|
||||||
) -> RelateResult<'tcx, ty::Const<'tcx>>
|
) -> RelateResult<'tcx, ty::Const<'tcx>>
|
||||||
where
|
where
|
||||||
R: PredicateEmittingRelation<'tcx>,
|
R: PredicateEmittingRelation<InferCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
debug!("{}.consts({:?}, {:?})", relation.tag(), a, b);
|
debug!("{}.consts({:?}, {:?})", relation.tag(), a, b);
|
||||||
debug_assert!(!a.has_escaping_bound_vars());
|
debug_assert!(!a.has_escaping_bound_vars());
|
||||||
@ -323,30 +324,3 @@ pub fn register_predicates(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait PredicateEmittingRelation<'tcx>: TypeRelation<TyCtxt<'tcx>> {
|
|
||||||
fn span(&self) -> Span;
|
|
||||||
|
|
||||||
fn param_env(&self) -> ty::ParamEnv<'tcx>;
|
|
||||||
|
|
||||||
/// Whether aliases should be related structurally. This is pretty much
|
|
||||||
/// always `No` unless you're equating in some specific locations of the
|
|
||||||
/// new solver. See the comments in these use-cases for more details.
|
|
||||||
fn structurally_relate_aliases(&self) -> StructurallyRelateAliases;
|
|
||||||
|
|
||||||
/// Register obligations that must hold in order for this relation to hold
|
|
||||||
fn register_goals(
|
|
||||||
&mut self,
|
|
||||||
obligations: impl IntoIterator<Item = Goal<'tcx, ty::Predicate<'tcx>>>,
|
|
||||||
);
|
|
||||||
|
|
||||||
/// Register predicates that must hold in order for this relation to hold.
|
|
||||||
/// This uses the default `param_env` of the obligation.
|
|
||||||
fn register_predicates(
|
|
||||||
&mut self,
|
|
||||||
obligations: impl IntoIterator<Item: Upcast<TyCtxt<'tcx>, ty::Predicate<'tcx>>>,
|
|
||||||
);
|
|
||||||
|
|
||||||
/// Register `AliasRelate` obligation(s) that both types must be related to each other.
|
|
||||||
fn register_alias_relate_predicate(&mut self, a: Ty<'tcx>, b: Ty<'tcx>);
|
|
||||||
}
|
|
||||||
|
@ -30,7 +30,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||||||
/// `TypeRelation`. Do not use this, and instead please use `At::eq`, for all
|
/// `TypeRelation`. Do not use this, and instead please use `At::eq`, for all
|
||||||
/// other usecases (i.e. setting the value of a type var).
|
/// other usecases (i.e. setting the value of a type var).
|
||||||
#[instrument(level = "debug", skip(self, relation))]
|
#[instrument(level = "debug", skip(self, relation))]
|
||||||
pub fn instantiate_ty_var<R: PredicateEmittingRelation<'tcx>>(
|
pub fn instantiate_ty_var<R: PredicateEmittingRelation<InferCtxt<'tcx>>>(
|
||||||
&self,
|
&self,
|
||||||
relation: &mut R,
|
relation: &mut R,
|
||||||
target_is_expected: bool,
|
target_is_expected: bool,
|
||||||
@ -178,7 +178,7 @@ pub fn instantiate_ty_var<R: PredicateEmittingRelation<'tcx>>(
|
|||||||
///
|
///
|
||||||
/// See `tests/ui/const-generics/occurs-check/` for more examples where this is relevant.
|
/// See `tests/ui/const-generics/occurs-check/` for more examples where this is relevant.
|
||||||
#[instrument(level = "debug", skip(self, relation))]
|
#[instrument(level = "debug", skip(self, relation))]
|
||||||
pub(super) fn instantiate_const_var<R: PredicateEmittingRelation<'tcx>>(
|
pub(super) fn instantiate_const_var<R: PredicateEmittingRelation<InferCtxt<'tcx>>>(
|
||||||
&self,
|
&self,
|
||||||
relation: &mut R,
|
relation: &mut R,
|
||||||
target_is_expected: bool,
|
target_is_expected: bool,
|
||||||
|
@ -123,7 +123,7 @@ fn define_opaque_types(&self) -> DefineOpaqueTypes {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> PredicateEmittingRelation<'tcx> for Glb<'_, '_, 'tcx> {
|
impl<'tcx> PredicateEmittingRelation<InferCtxt<'tcx>> for Glb<'_, '_, 'tcx> {
|
||||||
fn span(&self) -> Span {
|
fn span(&self) -> Span {
|
||||||
self.fields.trace.span()
|
self.fields.trace.span()
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
///
|
///
|
||||||
/// GLB moves "down" the lattice (to smaller values); LUB moves
|
/// GLB moves "down" the lattice (to smaller values); LUB moves
|
||||||
/// "up" the lattice (to bigger values).
|
/// "up" the lattice (to bigger values).
|
||||||
pub trait LatticeDir<'f, 'tcx>: PredicateEmittingRelation<'tcx> {
|
pub trait LatticeDir<'f, 'tcx>: PredicateEmittingRelation<InferCtxt<'tcx>> {
|
||||||
fn infcx(&self) -> &'f InferCtxt<'tcx>;
|
fn infcx(&self) -> &'f InferCtxt<'tcx>;
|
||||||
|
|
||||||
fn cause(&self) -> &ObligationCause<'tcx>;
|
fn cause(&self) -> &ObligationCause<'tcx>;
|
||||||
|
@ -123,7 +123,7 @@ fn define_opaque_types(&self) -> DefineOpaqueTypes {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> PredicateEmittingRelation<'tcx> for Lub<'_, '_, 'tcx> {
|
impl<'tcx> PredicateEmittingRelation<InferCtxt<'tcx>> for Lub<'_, '_, 'tcx> {
|
||||||
fn span(&self) -> Span {
|
fn span(&self) -> Span {
|
||||||
self.fields.trace.span()
|
self.fields.trace.span()
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,13 @@
|
|||||||
//! (except for some relations used for diagnostics and heuristics in the compiler).
|
//! (except for some relations used for diagnostics and heuristics in the compiler).
|
||||||
//! As well as the implementation of `Relate` for interned things (`Ty`/`Const`/etc).
|
//! As well as the implementation of `Relate` for interned things (`Ty`/`Const`/etc).
|
||||||
|
|
||||||
pub use rustc_middle::ty::relate::*;
|
pub use rustc_middle::ty::relate::RelateResult;
|
||||||
|
pub use rustc_next_trait_solver::relate::*;
|
||||||
|
|
||||||
pub use self::combine::CombineFields;
|
pub use self::combine::CombineFields;
|
||||||
pub use self::combine::PredicateEmittingRelation;
|
pub use self::combine::PredicateEmittingRelation;
|
||||||
|
|
||||||
|
#[allow(hidden_glob_reexports)]
|
||||||
pub(super) mod combine;
|
pub(super) mod combine;
|
||||||
mod generalize;
|
mod generalize;
|
||||||
mod glb;
|
mod glb;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use super::combine::CombineFields;
|
use super::combine::CombineFields;
|
||||||
use crate::infer::relate::{PredicateEmittingRelation, StructurallyRelateAliases};
|
use crate::infer::relate::{PredicateEmittingRelation, StructurallyRelateAliases};
|
||||||
use crate::infer::BoundRegionConversionTime::HigherRankedType;
|
use crate::infer::BoundRegionConversionTime::HigherRankedType;
|
||||||
use crate::infer::{DefineOpaqueTypes, SubregionOrigin};
|
use crate::infer::{DefineOpaqueTypes, InferCtxt, SubregionOrigin};
|
||||||
use rustc_middle::traits::solve::Goal;
|
use rustc_middle::traits::solve::Goal;
|
||||||
use rustc_middle::ty::relate::{
|
use rustc_middle::ty::relate::{
|
||||||
relate_args_invariantly, relate_args_with_variances, Relate, RelateResult, TypeRelation,
|
relate_args_invariantly, relate_args_with_variances, Relate, RelateResult, TypeRelation,
|
||||||
@ -296,7 +296,7 @@ fn binders<T>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> PredicateEmittingRelation<'tcx> for TypeRelating<'_, '_, 'tcx> {
|
impl<'tcx> PredicateEmittingRelation<InferCtxt<'tcx>> for TypeRelating<'_, '_, 'tcx> {
|
||||||
fn span(&self) -> Span {
|
fn span(&self) -> Span {
|
||||||
self.fields.trace.span()
|
self.fields.trace.span()
|
||||||
}
|
}
|
||||||
|
@ -92,6 +92,8 @@
|
|||||||
impl<'tcx> Interner for TyCtxt<'tcx> {
|
impl<'tcx> Interner for TyCtxt<'tcx> {
|
||||||
type DefId = DefId;
|
type DefId = DefId;
|
||||||
type LocalDefId = LocalDefId;
|
type LocalDefId = LocalDefId;
|
||||||
|
type Span = Span;
|
||||||
|
|
||||||
type GenericArgs = ty::GenericArgsRef<'tcx>;
|
type GenericArgs = ty::GenericArgsRef<'tcx>;
|
||||||
|
|
||||||
type GenericArgsSlice = &'tcx [ty::GenericArg<'tcx>];
|
type GenericArgsSlice = &'tcx [ty::GenericArg<'tcx>];
|
||||||
|
@ -10,18 +10,6 @@
|
|||||||
|
|
||||||
pub type RelateResult<'tcx, T> = rustc_type_ir::relate::RelateResult<TyCtxt<'tcx>, T>;
|
pub type RelateResult<'tcx, T> = rustc_type_ir::relate::RelateResult<TyCtxt<'tcx>, T>;
|
||||||
|
|
||||||
/// Whether aliases should be related structurally or not. Used
|
|
||||||
/// to adjust the behavior of generalization and combine.
|
|
||||||
///
|
|
||||||
/// This should always be `No` unless in a few special-cases when
|
|
||||||
/// instantiating canonical responses and in the new solver. Each
|
|
||||||
/// such case should have a comment explaining why it is used.
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
|
||||||
pub enum StructurallyRelateAliases {
|
|
||||||
Yes,
|
|
||||||
No,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> Relate<TyCtxt<'tcx>> for ty::ImplSubject<'tcx> {
|
impl<'tcx> Relate<TyCtxt<'tcx>> for ty::ImplSubject<'tcx> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn relate<R: TypeRelation<TyCtxt<'tcx>>>(
|
fn relate<R: TypeRelation<TyCtxt<'tcx>>>(
|
||||||
|
@ -6,5 +6,6 @@
|
|||||||
|
|
||||||
pub mod canonicalizer;
|
pub mod canonicalizer;
|
||||||
pub mod delegate;
|
pub mod delegate;
|
||||||
|
pub mod relate;
|
||||||
pub mod resolve;
|
pub mod resolve;
|
||||||
pub mod solve;
|
pub mod solve;
|
||||||
|
15
compiler/rustc_next_trait_solver/src/relate.rs
Normal file
15
compiler/rustc_next_trait_solver/src/relate.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
pub use rustc_type_ir::relate::*;
|
||||||
|
|
||||||
|
pub mod combine;
|
||||||
|
|
||||||
|
/// Whether aliases should be related structurally or not. Used
|
||||||
|
/// to adjust the behavior of generalization and combine.
|
||||||
|
///
|
||||||
|
/// This should always be `No` unless in a few special-cases when
|
||||||
|
/// instantiating canonical responses and in the new solver. Each
|
||||||
|
/// such case should have a comment explaining why it is used.
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub enum StructurallyRelateAliases {
|
||||||
|
Yes,
|
||||||
|
No,
|
||||||
|
}
|
34
compiler/rustc_next_trait_solver/src/relate/combine.rs
Normal file
34
compiler/rustc_next_trait_solver/src/relate/combine.rs
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
pub use rustc_type_ir::relate::*;
|
||||||
|
use rustc_type_ir::solve::Goal;
|
||||||
|
use rustc_type_ir::{InferCtxtLike, Interner, Upcast};
|
||||||
|
|
||||||
|
use super::StructurallyRelateAliases;
|
||||||
|
|
||||||
|
pub trait PredicateEmittingRelation<Infcx, I = <Infcx as InferCtxtLike>::Interner>:
|
||||||
|
TypeRelation<I>
|
||||||
|
where
|
||||||
|
Infcx: InferCtxtLike<Interner = I>,
|
||||||
|
I: Interner,
|
||||||
|
{
|
||||||
|
fn span(&self) -> I::Span;
|
||||||
|
|
||||||
|
fn param_env(&self) -> I::ParamEnv;
|
||||||
|
|
||||||
|
/// Whether aliases should be related structurally. This is pretty much
|
||||||
|
/// always `No` unless you're equating in some specific locations of the
|
||||||
|
/// new solver. See the comments in these use-cases for more details.
|
||||||
|
fn structurally_relate_aliases(&self) -> StructurallyRelateAliases;
|
||||||
|
|
||||||
|
/// Register obligations that must hold in order for this relation to hold
|
||||||
|
fn register_goals(&mut self, obligations: impl IntoIterator<Item = Goal<I, I::Predicate>>);
|
||||||
|
|
||||||
|
/// Register predicates that must hold in order for this relation to hold.
|
||||||
|
/// This uses the default `param_env` of the obligation.
|
||||||
|
fn register_predicates(
|
||||||
|
&mut self,
|
||||||
|
obligations: impl IntoIterator<Item: Upcast<I, I::Predicate>>,
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Register `AliasRelate` obligation(s) that both types must be related to each other.
|
||||||
|
fn register_alias_relate_predicate(&mut self, a: I::Ty, b: I::Ty);
|
||||||
|
}
|
@ -32,6 +32,7 @@ pub trait Interner:
|
|||||||
{
|
{
|
||||||
type DefId: DefId<Self>;
|
type DefId: DefId<Self>;
|
||||||
type LocalDefId: Copy + Debug + Hash + Eq + Into<Self::DefId> + TypeFoldable<Self>;
|
type LocalDefId: Copy + Debug + Hash + Eq + Into<Self::DefId> + TypeFoldable<Self>;
|
||||||
|
type Span: Copy + Debug + Hash + Eq;
|
||||||
|
|
||||||
type GenericArgs: GenericArgs<Self>;
|
type GenericArgs: GenericArgs<Self>;
|
||||||
type GenericArgsSlice: Copy + Debug + Hash + Eq + SliceLike<Item = Self::GenericArg>;
|
type GenericArgsSlice: Copy + Debug + Hash + Eq + SliceLike<Item = Self::GenericArg>;
|
||||||
|
Loading…
Reference in New Issue
Block a user