mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-30 16:43:41 +00:00
Fully fledged Clause type
This commit is contained in:
parent
fca56a8d2c
commit
21226eefb2
@ -945,8 +945,8 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||||||
|
|
||||||
let mut trait_bounds = vec![];
|
let mut trait_bounds = vec![];
|
||||||
let mut projection_bounds = vec![];
|
let mut projection_bounds = vec![];
|
||||||
for (clause, span) in bounds.predicates() {
|
for (clause, span) in bounds.clauses() {
|
||||||
let pred: ty::Predicate<'tcx> = clause.to_predicate(tcx);
|
let pred: ty::Predicate<'tcx> = clause.as_predicate();
|
||||||
let bound_pred = pred.kind();
|
let bound_pred = pred.kind();
|
||||||
match bound_pred.skip_binder() {
|
match bound_pred.skip_binder() {
|
||||||
ty::PredicateKind::Clause(clause) => match clause {
|
ty::PredicateKind::Clause(clause) => match clause {
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
//! `ty` form from the HIR.
|
//! `ty` form from the HIR.
|
||||||
|
|
||||||
use rustc_hir::LangItem;
|
use rustc_hir::LangItem;
|
||||||
use rustc_middle::ty::Binder;
|
|
||||||
use rustc_middle::ty::{self, ToPredicate, Ty, TyCtxt};
|
use rustc_middle::ty::{self, ToPredicate, Ty, TyCtxt};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
@ -24,62 +23,58 @@ use rustc_span::Span;
|
|||||||
/// include the self type (e.g., `trait_bounds`) but in others we do not
|
/// include the self type (e.g., `trait_bounds`) but in others we do not
|
||||||
#[derive(Default, PartialEq, Eq, Clone, Debug)]
|
#[derive(Default, PartialEq, Eq, Clone, Debug)]
|
||||||
pub struct Bounds<'tcx> {
|
pub struct Bounds<'tcx> {
|
||||||
pub predicates: Vec<(Binder<'tcx, ty::ClauseKind<'tcx>>, Span)>,
|
pub clauses: Vec<(ty::Clause<'tcx>, Span)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Bounds<'tcx> {
|
impl<'tcx> Bounds<'tcx> {
|
||||||
pub fn push_region_bound(
|
pub fn push_region_bound(
|
||||||
&mut self,
|
&mut self,
|
||||||
_tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
region: ty::PolyTypeOutlivesPredicate<'tcx>,
|
region: ty::PolyTypeOutlivesPredicate<'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
) {
|
) {
|
||||||
self.predicates.push((region.map_bound(|p| ty::ClauseKind::TypeOutlives(p)), span));
|
self.clauses
|
||||||
|
.push((region.map_bound(|p| ty::ClauseKind::TypeOutlives(p)).to_predicate(tcx), span));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push_trait_bound(
|
pub fn push_trait_bound(
|
||||||
&mut self,
|
&mut self,
|
||||||
_tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
trait_ref: ty::PolyTraitRef<'tcx>,
|
trait_ref: ty::PolyTraitRef<'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
constness: ty::BoundConstness,
|
constness: ty::BoundConstness,
|
||||||
polarity: ty::ImplPolarity,
|
polarity: ty::ImplPolarity,
|
||||||
) {
|
) {
|
||||||
self.predicates.push((
|
self.clauses.push((
|
||||||
trait_ref.map_bound(|trait_ref| {
|
trait_ref
|
||||||
|
.map_bound(|trait_ref| {
|
||||||
ty::ClauseKind::Trait(ty::TraitPredicate { trait_ref, constness, polarity })
|
ty::ClauseKind::Trait(ty::TraitPredicate { trait_ref, constness, polarity })
|
||||||
}),
|
})
|
||||||
|
.to_predicate(tcx),
|
||||||
span,
|
span,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push_projection_bound(
|
pub fn push_projection_bound(
|
||||||
&mut self,
|
&mut self,
|
||||||
_tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
projection: ty::PolyProjectionPredicate<'tcx>,
|
projection: ty::PolyProjectionPredicate<'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
) {
|
) {
|
||||||
self.predicates.push((projection.map_bound(|proj| ty::ClauseKind::Projection(proj)), span));
|
self.clauses.push((
|
||||||
|
projection.map_bound(|proj| ty::ClauseKind::Projection(proj)).to_predicate(tcx),
|
||||||
|
span,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push_sized(&mut self, tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, span: Span) {
|
pub fn push_sized(&mut self, tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, span: Span) {
|
||||||
let sized_def_id = tcx.require_lang_item(LangItem::Sized, Some(span));
|
let sized_def_id = tcx.require_lang_item(LangItem::Sized, Some(span));
|
||||||
let trait_ref = ty::TraitRef::new(tcx, sized_def_id, [ty]);
|
let trait_ref = ty::TraitRef::new(tcx, sized_def_id, [ty]);
|
||||||
// Preferable to put this obligation first, since we report better errors for sized ambiguity.
|
// Preferable to put this obligation first, since we report better errors for sized ambiguity.
|
||||||
self.predicates.insert(
|
self.clauses.insert(0, (trait_ref.to_predicate(tcx), span));
|
||||||
0,
|
|
||||||
(
|
|
||||||
ty::Binder::dummy(ty::ClauseKind::Trait(
|
|
||||||
trait_ref.without_const().to_predicate(tcx),
|
|
||||||
)),
|
|
||||||
span,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn predicates(
|
pub fn clauses(&self) -> impl Iterator<Item = (ty::Clause<'tcx>, Span)> + '_ {
|
||||||
&self,
|
self.clauses.iter().cloned()
|
||||||
) -> impl Iterator<Item = (Binder<'tcx, ty::ClauseKind<'tcx>>, Span)> + '_ {
|
|
||||||
self.predicates.iter().cloned()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ use crate::astconv::{AstConv, OnlySelfBounds};
|
|||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_infer::traits::util;
|
use rustc_infer::traits::util;
|
||||||
use rustc_middle::ty::subst::InternalSubsts;
|
use rustc_middle::ty::subst::InternalSubsts;
|
||||||
use rustc_middle::ty::ToPredicate;
|
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_span::def_id::{DefId, LocalDefId};
|
use rustc_span::def_id::{DefId, LocalDefId};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
@ -49,8 +48,8 @@ fn associated_type_bounds<'tcx>(
|
|||||||
|
|
||||||
let all_bounds = tcx.arena.alloc_from_iter(
|
let all_bounds = tcx.arena.alloc_from_iter(
|
||||||
bounds
|
bounds
|
||||||
.predicates()
|
.clauses()
|
||||||
.map(|(clause, span)| (clause.to_predicate(tcx), span))
|
.map(|(clause, span)| (clause.as_predicate(), span))
|
||||||
.chain(bounds_from_parent),
|
.chain(bounds_from_parent),
|
||||||
);
|
);
|
||||||
debug!(
|
debug!(
|
||||||
@ -80,9 +79,8 @@ fn opaque_type_bounds<'tcx>(
|
|||||||
icx.astconv().add_implicitly_sized(&mut bounds, item_ty, ast_bounds, None, span);
|
icx.astconv().add_implicitly_sized(&mut bounds, item_ty, ast_bounds, None, span);
|
||||||
debug!(?bounds);
|
debug!(?bounds);
|
||||||
|
|
||||||
tcx.arena.alloc_from_iter(
|
tcx.arena
|
||||||
bounds.predicates().map(|(clause, span)| (clause.to_predicate(tcx), span)),
|
.alloc_from_iter(bounds.clauses().map(|(clause, span)| (clause.as_predicate(), span)))
|
||||||
)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,8 +126,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
|
|||||||
predicates.extend(
|
predicates.extend(
|
||||||
icx.astconv()
|
icx.astconv()
|
||||||
.compute_bounds(tcx.types.self_param, self_bounds, OnlySelfBounds(false))
|
.compute_bounds(tcx.types.self_param, self_bounds, OnlySelfBounds(false))
|
||||||
.predicates()
|
.clauses()
|
||||||
.map(|(clause, span)| (clause.to_predicate(tcx), span)),
|
.map(|(clause, span)| (clause.as_predicate(), span)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,9 +176,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
|
|||||||
param.span,
|
param.span,
|
||||||
);
|
);
|
||||||
trace!(?bounds);
|
trace!(?bounds);
|
||||||
predicates.extend(
|
predicates
|
||||||
bounds.predicates().map(|(clause, span)| (clause.to_predicate(tcx), span)),
|
.extend(bounds.clauses().map(|(clause, span)| (clause.as_predicate(), span)));
|
||||||
);
|
|
||||||
trace!(?predicates);
|
trace!(?predicates);
|
||||||
}
|
}
|
||||||
GenericParamKind::Const { .. } => {
|
GenericParamKind::Const { .. } => {
|
||||||
@ -237,9 +236,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
|
|||||||
bound_vars,
|
bound_vars,
|
||||||
OnlySelfBounds(false),
|
OnlySelfBounds(false),
|
||||||
);
|
);
|
||||||
predicates.extend(
|
predicates
|
||||||
bounds.predicates().map(|(clause, span)| (clause.to_predicate(tcx), span)),
|
.extend(bounds.clauses().map(|(clause, span)| (clause.as_predicate(), span)));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hir::WherePredicate::RegionPredicate(region_pred) => {
|
hir::WherePredicate::RegionPredicate(region_pred) => {
|
||||||
@ -669,8 +667,8 @@ pub(super) fn implied_predicates_with_filter(
|
|||||||
// Combine the two lists to form the complete set of superbounds:
|
// Combine the two lists to form the complete set of superbounds:
|
||||||
let implied_bounds = &*tcx.arena.alloc_from_iter(
|
let implied_bounds = &*tcx.arena.alloc_from_iter(
|
||||||
superbounds
|
superbounds
|
||||||
.predicates()
|
.clauses()
|
||||||
.map(|(clause, span)| (clause.to_predicate(tcx), span))
|
.map(|(clause, span)| (clause.as_predicate(), span))
|
||||||
.chain(where_bounds_that_match),
|
.chain(where_bounds_that_match),
|
||||||
);
|
);
|
||||||
debug!(?implied_bounds);
|
debug!(?implied_bounds);
|
||||||
@ -831,7 +829,7 @@ impl<'tcx> ItemCtxt<'tcx> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
bounds.predicates().map(|(clause, span)| (clause.to_predicate(self.tcx), span)).collect()
|
bounds.clauses().map(|(clause, span)| (clause.as_predicate(), span)).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(level = "trace", skip(self))]
|
#[instrument(level = "trace", skip(self))]
|
||||||
|
@ -167,6 +167,26 @@ impl<'tcx> Elaboratable<'tcx> for (ty::Predicate<'tcx>, Span) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Elaboratable<'tcx> for ty::Clause<'tcx> {
|
||||||
|
fn predicate(&self) -> ty::Predicate<'tcx> {
|
||||||
|
self.as_predicate()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn child(&self, predicate: ty::Predicate<'tcx>) -> Self {
|
||||||
|
predicate.as_clause().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn child_with_derived_cause(
|
||||||
|
&self,
|
||||||
|
predicate: ty::Predicate<'tcx>,
|
||||||
|
_span: Span,
|
||||||
|
_parent_trait_pred: ty::PolyTraitPredicate<'tcx>,
|
||||||
|
_index: usize,
|
||||||
|
) -> Self {
|
||||||
|
predicate.as_clause().unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn elaborate<'tcx, O: Elaboratable<'tcx>>(
|
pub fn elaborate<'tcx, O: Elaboratable<'tcx>>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
obligations: impl IntoIterator<Item = O>,
|
obligations: impl IntoIterator<Item = O>,
|
||||||
|
@ -561,6 +561,42 @@ impl rustc_errors::IntoDiagnosticArg for Predicate<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// TODO: doc
|
||||||
|
#[derive(Clone, Copy, PartialEq, Eq, Hash, HashStable)]
|
||||||
|
#[rustc_pass_by_value]
|
||||||
|
pub struct Clause<'tcx>(Interned<'tcx, WithCachedTypeInfo<ty::Binder<'tcx, PredicateKind<'tcx>>>>);
|
||||||
|
|
||||||
|
impl<'tcx> Clause<'tcx> {
|
||||||
|
pub fn as_predicate(self) -> Predicate<'tcx> {
|
||||||
|
Predicate(self.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn kind(self) -> Binder<'tcx, ClauseKind<'tcx>> {
|
||||||
|
self.0.internee.map_bound(|kind| match kind {
|
||||||
|
PredicateKind::Clause(clause) => clause,
|
||||||
|
_ => unreachable!(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_trait_clause(self) -> Option<Binder<'tcx, TraitPredicate<'tcx>>> {
|
||||||
|
let clause = self.kind();
|
||||||
|
if let ty::ClauseKind::Trait(trait_clause) = clause.skip_binder() {
|
||||||
|
Some(clause.rebind(trait_clause))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_projection_clause(self) -> Option<Binder<'tcx, ProjectionPredicate<'tcx>>> {
|
||||||
|
let clause = self.kind();
|
||||||
|
if let ty::ClauseKind::Projection(projection_clause) = clause.skip_binder() {
|
||||||
|
Some(clause.rebind(projection_clause))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
|
#[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
|
||||||
#[derive(HashStable, TypeFoldable, TypeVisitable, Lift)]
|
#[derive(HashStable, TypeFoldable, TypeVisitable, Lift)]
|
||||||
/// A clause is something that can appear in where bounds or be inferred
|
/// A clause is something that can appear in where bounds or be inferred
|
||||||
@ -592,24 +628,6 @@ pub enum ClauseKind<'tcx> {
|
|||||||
ConstEvaluatable(ty::Const<'tcx>),
|
ConstEvaluatable(ty::Const<'tcx>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Binder<'tcx, ClauseKind<'tcx>> {
|
|
||||||
pub fn as_trait_clause(self) -> Option<Binder<'tcx, TraitPredicate<'tcx>>> {
|
|
||||||
if let ty::ClauseKind::Trait(trait_clause) = self.skip_binder() {
|
|
||||||
Some(self.rebind(trait_clause))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn as_projection_clause(self) -> Option<Binder<'tcx, ProjectionPredicate<'tcx>>> {
|
|
||||||
if let ty::ClauseKind::Projection(projection_clause) = self.skip_binder() {
|
|
||||||
Some(self.rebind(projection_clause))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
|
#[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
|
||||||
#[derive(HashStable, TypeFoldable, TypeVisitable, Lift)]
|
#[derive(HashStable, TypeFoldable, TypeVisitable, Lift)]
|
||||||
pub enum PredicateKind<'tcx> {
|
pub enum PredicateKind<'tcx> {
|
||||||
@ -1222,6 +1240,13 @@ impl<'tcx> ToPredicate<'tcx> for Binder<'tcx, ClauseKind<'tcx>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> ToPredicate<'tcx, Clause<'tcx>> for Binder<'tcx, ClauseKind<'tcx>> {
|
||||||
|
#[inline(always)]
|
||||||
|
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Clause<'tcx> {
|
||||||
|
tcx.mk_predicate(self.map_bound(|clause| ty::PredicateKind::Clause(clause))).expect_clause()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> ToPredicate<'tcx> for TraitRef<'tcx> {
|
impl<'tcx> ToPredicate<'tcx> for TraitRef<'tcx> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
|
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
|
||||||
@ -1229,14 +1254,11 @@ impl<'tcx> ToPredicate<'tcx> for TraitRef<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> ToPredicate<'tcx, Binder<'tcx, ClauseKind<'tcx>>> for TraitRef<'tcx> {
|
impl<'tcx> ToPredicate<'tcx, Clause<'tcx>> for TraitRef<'tcx> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> Binder<'tcx, ClauseKind<'tcx>> {
|
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Clause<'tcx> {
|
||||||
Binder::dummy(ClauseKind::Trait(TraitPredicate {
|
let p: Predicate<'tcx> = self.to_predicate(tcx);
|
||||||
trait_ref: self,
|
p.expect_clause()
|
||||||
constness: ty::BoundConstness::NotConst,
|
|
||||||
polarity: ty::ImplPolarity::Positive,
|
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1248,9 +1270,9 @@ impl<'tcx> ToPredicate<'tcx> for Binder<'tcx, TraitRef<'tcx>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> ToPredicate<'tcx, Binder<'tcx, ClauseKind<'tcx>>> for Binder<'tcx, TraitRef<'tcx>> {
|
impl<'tcx> ToPredicate<'tcx, Clause<'tcx>> for Binder<'tcx, TraitRef<'tcx>> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Binder<'tcx, ClauseKind<'tcx>> {
|
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Clause<'tcx> {
|
||||||
let pred: PolyTraitPredicate<'tcx> = self.to_predicate(tcx);
|
let pred: PolyTraitPredicate<'tcx> = self.to_predicate(tcx);
|
||||||
pred.to_predicate(tcx)
|
pred.to_predicate(tcx)
|
||||||
}
|
}
|
||||||
@ -1285,9 +1307,10 @@ impl<'tcx> ToPredicate<'tcx> for PolyTraitPredicate<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> ToPredicate<'tcx, Binder<'tcx, ClauseKind<'tcx>>> for PolyTraitPredicate<'tcx> {
|
impl<'tcx> ToPredicate<'tcx, Clause<'tcx>> for PolyTraitPredicate<'tcx> {
|
||||||
fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> Binder<'tcx, ClauseKind<'tcx>> {
|
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Clause<'tcx> {
|
||||||
self.map_bound(|p| ClauseKind::Trait(p))
|
let p: Predicate<'tcx> = self.to_predicate(tcx);
|
||||||
|
p.expect_clause()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1309,9 +1332,10 @@ impl<'tcx> ToPredicate<'tcx> for PolyProjectionPredicate<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> ToPredicate<'tcx, Binder<'tcx, ClauseKind<'tcx>>> for PolyProjectionPredicate<'tcx> {
|
impl<'tcx> ToPredicate<'tcx, Clause<'tcx>> for PolyProjectionPredicate<'tcx> {
|
||||||
fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> Binder<'tcx, ClauseKind<'tcx>> {
|
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Clause<'tcx> {
|
||||||
self.map_bound(|p| ClauseKind::Projection(p))
|
let p: Predicate<'tcx> = self.to_predicate(tcx);
|
||||||
|
p.expect_clause()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1385,18 +1409,17 @@ impl<'tcx> Predicate<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn as_clause(self) -> Option<Binder<'tcx, ClauseKind<'tcx>>> {
|
pub fn as_clause(self) -> Option<Clause<'tcx>> {
|
||||||
let predicate = self.kind();
|
match self.kind().skip_binder() {
|
||||||
match predicate.skip_binder() {
|
PredicateKind::Clause(..) => Some(self.expect_clause()),
|
||||||
PredicateKind::Clause(clause) => Some(predicate.rebind(clause)),
|
_ => None,
|
||||||
PredicateKind::AliasRelate(..)
|
}
|
||||||
| PredicateKind::Subtype(..)
|
}
|
||||||
| PredicateKind::Coerce(..)
|
|
||||||
| PredicateKind::ObjectSafe(..)
|
pub fn expect_clause(self) -> Clause<'tcx> {
|
||||||
| PredicateKind::ClosureKind(..)
|
match self.kind().skip_binder() {
|
||||||
| PredicateKind::ConstEquate(..)
|
PredicateKind::Clause(..) => Clause(self.0),
|
||||||
| PredicateKind::Ambiguous
|
_ => bug!(),
|
||||||
| PredicateKind::TypeWellFormedFromEnv(..) => None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -171,6 +171,12 @@ impl<'tcx> fmt::Debug for ty::Predicate<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> fmt::Debug for ty::Clause<'tcx> {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
write!(f, "{:?}", self.kind())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> fmt::Debug for ty::ClauseKind<'tcx> {
|
impl<'tcx> fmt::Debug for ty::ClauseKind<'tcx> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
match *self {
|
match *self {
|
||||||
@ -654,12 +660,31 @@ impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for ty::Predicate<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME(clause): This is wonky
|
||||||
|
impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for ty::Clause<'tcx> {
|
||||||
|
fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
|
||||||
|
self,
|
||||||
|
folder: &mut F,
|
||||||
|
) -> Result<Self, F::Error> {
|
||||||
|
Ok(folder
|
||||||
|
.try_fold_predicate(self.as_predicate())?
|
||||||
|
.as_clause()
|
||||||
|
.expect("no sensible folder would do this"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for ty::Predicate<'tcx> {
|
impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for ty::Predicate<'tcx> {
|
||||||
fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
visitor.visit_predicate(*self)
|
visitor.visit_predicate(*self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for ty::Clause<'tcx> {
|
||||||
|
fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
visitor.visit_predicate(self.as_predicate())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeSuperFoldable<TyCtxt<'tcx>> for ty::Predicate<'tcx> {
|
impl<'tcx> TypeSuperFoldable<TyCtxt<'tcx>> for ty::Predicate<'tcx> {
|
||||||
fn try_super_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
|
fn try_super_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
|
||||||
self,
|
self,
|
||||||
|
@ -1271,8 +1271,8 @@ impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> {
|
|||||||
self.tcx.types.never,
|
self.tcx.types.never,
|
||||||
);
|
);
|
||||||
|
|
||||||
for (pred, _) in bounds.predicates() {
|
for (clause, _) in bounds.clauses() {
|
||||||
match pred.skip_binder() {
|
match clause.kind().skip_binder() {
|
||||||
ty::ClauseKind::Trait(trait_predicate) => {
|
ty::ClauseKind::Trait(trait_predicate) => {
|
||||||
if self.visit_trait(trait_predicate.trait_ref).is_break() {
|
if self.visit_trait(trait_predicate.trait_ref).is_break() {
|
||||||
return;
|
return;
|
||||||
|
@ -106,7 +106,7 @@ pub(super) trait GoalKind<'tcx>:
|
|||||||
fn probe_and_match_goal_against_assumption(
|
fn probe_and_match_goal_against_assumption(
|
||||||
ecx: &mut EvalCtxt<'_, 'tcx>,
|
ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||||
goal: Goal<'tcx, Self>,
|
goal: Goal<'tcx, Self>,
|
||||||
assumption: ty::Binder<'tcx, ty::ClauseKind<'tcx>>,
|
assumption: ty::Clause<'tcx>,
|
||||||
then: impl FnOnce(&mut EvalCtxt<'_, 'tcx>) -> QueryResult<'tcx>,
|
then: impl FnOnce(&mut EvalCtxt<'_, 'tcx>) -> QueryResult<'tcx>,
|
||||||
) -> QueryResult<'tcx>;
|
) -> QueryResult<'tcx>;
|
||||||
|
|
||||||
@ -116,7 +116,7 @@ pub(super) trait GoalKind<'tcx>:
|
|||||||
fn consider_implied_clause(
|
fn consider_implied_clause(
|
||||||
ecx: &mut EvalCtxt<'_, 'tcx>,
|
ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||||
goal: Goal<'tcx, Self>,
|
goal: Goal<'tcx, Self>,
|
||||||
assumption: ty::Binder<'tcx, ty::ClauseKind<'tcx>>,
|
assumption: ty::Clause<'tcx>,
|
||||||
requirements: impl IntoIterator<Item = Goal<'tcx, ty::Predicate<'tcx>>>,
|
requirements: impl IntoIterator<Item = Goal<'tcx, ty::Predicate<'tcx>>>,
|
||||||
) -> QueryResult<'tcx> {
|
) -> QueryResult<'tcx> {
|
||||||
Self::probe_and_match_goal_against_assumption(ecx, goal, assumption, |ecx| {
|
Self::probe_and_match_goal_against_assumption(ecx, goal, assumption, |ecx| {
|
||||||
@ -132,7 +132,7 @@ pub(super) trait GoalKind<'tcx>:
|
|||||||
fn consider_alias_bound_candidate(
|
fn consider_alias_bound_candidate(
|
||||||
ecx: &mut EvalCtxt<'_, 'tcx>,
|
ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||||
goal: Goal<'tcx, Self>,
|
goal: Goal<'tcx, Self>,
|
||||||
assumption: ty::Binder<'tcx, ty::ClauseKind<'tcx>>,
|
assumption: ty::Clause<'tcx>,
|
||||||
) -> QueryResult<'tcx> {
|
) -> QueryResult<'tcx> {
|
||||||
Self::probe_and_match_goal_against_assumption(ecx, goal, assumption, |ecx| {
|
Self::probe_and_match_goal_against_assumption(ecx, goal, assumption, |ecx| {
|
||||||
ecx.validate_alias_bound_self_from_param_env(goal)
|
ecx.validate_alias_bound_self_from_param_env(goal)
|
||||||
@ -145,7 +145,7 @@ pub(super) trait GoalKind<'tcx>:
|
|||||||
fn consider_object_bound_candidate(
|
fn consider_object_bound_candidate(
|
||||||
ecx: &mut EvalCtxt<'_, 'tcx>,
|
ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||||
goal: Goal<'tcx, Self>,
|
goal: Goal<'tcx, Self>,
|
||||||
assumption: ty::Binder<'tcx, ty::ClauseKind<'tcx>>,
|
assumption: ty::Clause<'tcx>,
|
||||||
) -> QueryResult<'tcx> {
|
) -> QueryResult<'tcx> {
|
||||||
Self::probe_and_match_goal_against_assumption(ecx, goal, assumption, |ecx| {
|
Self::probe_and_match_goal_against_assumption(ecx, goal, assumption, |ecx| {
|
||||||
let tcx = ecx.tcx();
|
let tcx = ecx.tcx();
|
||||||
|
@ -107,7 +107,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> {
|
|||||||
fn probe_and_match_goal_against_assumption(
|
fn probe_and_match_goal_against_assumption(
|
||||||
ecx: &mut EvalCtxt<'_, 'tcx>,
|
ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||||
goal: Goal<'tcx, Self>,
|
goal: Goal<'tcx, Self>,
|
||||||
assumption: ty::Binder<'tcx, ty::ClauseKind<'tcx>>,
|
assumption: ty::Clause<'tcx>,
|
||||||
then: impl FnOnce(&mut EvalCtxt<'_, 'tcx>) -> QueryResult<'tcx>,
|
then: impl FnOnce(&mut EvalCtxt<'_, 'tcx>) -> QueryResult<'tcx>,
|
||||||
) -> QueryResult<'tcx> {
|
) -> QueryResult<'tcx> {
|
||||||
if let Some(projection_pred) = assumption.as_projection_clause() {
|
if let Some(projection_pred) = assumption.as_projection_clause() {
|
||||||
|
@ -85,7 +85,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
|
|||||||
fn probe_and_match_goal_against_assumption(
|
fn probe_and_match_goal_against_assumption(
|
||||||
ecx: &mut EvalCtxt<'_, 'tcx>,
|
ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||||
goal: Goal<'tcx, Self>,
|
goal: Goal<'tcx, Self>,
|
||||||
assumption: ty::Binder<'tcx, ty::ClauseKind<'tcx>>,
|
assumption: ty::Clause<'tcx>,
|
||||||
then: impl FnOnce(&mut EvalCtxt<'_, 'tcx>) -> QueryResult<'tcx>,
|
then: impl FnOnce(&mut EvalCtxt<'_, 'tcx>) -> QueryResult<'tcx>,
|
||||||
) -> QueryResult<'tcx> {
|
) -> QueryResult<'tcx> {
|
||||||
if let Some(trait_clause) = assumption.as_trait_clause() {
|
if let Some(trait_clause) = assumption.as_trait_clause() {
|
||||||
|
Loading…
Reference in New Issue
Block a user