2 use smallvec::SmallVec;
4 use crate::traits::project::Normalized;
5 use crate::ty::fold::{TypeFoldable, TypeFolder, TypeVisitor};
6 use crate::ty::{self, Lift, Ty, TyCtxt};
7 use syntax::symbol::Symbol;
11 use std::collections::{BTreeSet, BTreeMap};
13 // Structural impls for the structs in `traits`.
15 impl<'tcx, T: fmt::Debug> fmt::Debug for Normalized<'tcx, T> {
16 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17 write!(f, "Normalized({:?}, {:?})", self.value, self.obligations)
21 impl<'tcx, O: fmt::Debug> fmt::Debug for traits::Obligation<'tcx, O> {
22 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23 if ty::tls::with(|tcx| tcx.sess.verbose()) {
26 "Obligation(predicate={:?}, cause={:?}, param_env={:?}, depth={})",
27 self.predicate, self.cause, self.param_env, self.recursion_depth
32 "Obligation(predicate={:?}, depth={})",
33 self.predicate, self.recursion_depth
39 impl<'tcx, N: fmt::Debug> fmt::Debug for traits::Vtable<'tcx, N> {
40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42 super::VtableImpl(ref v) => write!(f, "{:?}", v),
44 super::VtableAutoImpl(ref t) => write!(f, "{:?}", t),
46 super::VtableClosure(ref d) => write!(f, "{:?}", d),
48 super::VtableGenerator(ref d) => write!(f, "{:?}", d),
50 super::VtableFnPointer(ref d) => write!(f, "VtableFnPointer({:?})", d),
52 super::VtableObject(ref d) => write!(f, "{:?}", d),
54 super::VtableParam(ref n) => write!(f, "VtableParam({:?})", n),
56 super::VtableBuiltin(ref d) => write!(f, "{:?}", d),
58 super::VtableTraitAlias(ref d) => write!(f, "{:?}", d),
63 impl<'tcx, N: fmt::Debug> fmt::Debug for traits::VtableImplData<'tcx, N> {
64 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
67 "VtableImplData(impl_def_id={:?}, substs={:?}, nested={:?})",
68 self.impl_def_id, self.substs, self.nested
73 impl<'tcx, N: fmt::Debug> fmt::Debug for traits::VtableGeneratorData<'tcx, N> {
74 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77 "VtableGeneratorData(generator_def_id={:?}, substs={:?}, nested={:?})",
78 self.generator_def_id, self.substs, self.nested
83 impl<'tcx, N: fmt::Debug> fmt::Debug for traits::VtableClosureData<'tcx, N> {
84 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
87 "VtableClosureData(closure_def_id={:?}, substs={:?}, nested={:?})",
88 self.closure_def_id, self.substs, self.nested
93 impl<N: fmt::Debug> fmt::Debug for traits::VtableBuiltinData<N> {
94 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
95 write!(f, "VtableBuiltinData(nested={:?})", self.nested)
99 impl<N: fmt::Debug> fmt::Debug for traits::VtableAutoImplData<N> {
100 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
103 "VtableAutoImplData(trait_def_id={:?}, nested={:?})",
104 self.trait_def_id, self.nested
109 impl<'tcx, N: fmt::Debug> fmt::Debug for traits::VtableObjectData<'tcx, N> {
110 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
113 "VtableObjectData(upcast={:?}, vtable_base={}, nested={:?})",
114 self.upcast_trait_ref, self.vtable_base, self.nested
119 impl<'tcx, N: fmt::Debug> fmt::Debug for traits::VtableFnPointerData<'tcx, N> {
120 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
123 "VtableFnPointerData(fn_ty={:?}, nested={:?})",
124 self.fn_ty, self.nested
129 impl<'tcx, N: fmt::Debug> fmt::Debug for traits::VtableTraitAliasData<'tcx, N> {
130 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
133 "VtableTraitAlias(alias_def_id={:?}, substs={:?}, nested={:?})",
134 self.alias_def_id, self.substs, self.nested
139 impl<'tcx> fmt::Debug for traits::FulfillmentError<'tcx> {
140 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
141 write!(f, "FulfillmentError({:?},{:?})", self.obligation, self.code)
145 impl<'tcx> fmt::Debug for traits::FulfillmentErrorCode<'tcx> {
146 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
148 super::CodeSelectionError(ref e) => write!(f, "{:?}", e),
149 super::CodeProjectionError(ref e) => write!(f, "{:?}", e),
150 super::CodeSubtypeError(ref a, ref b) => {
151 write!(f, "CodeSubtypeError({:?}, {:?})", a, b)
153 super::CodeAmbiguity => write!(f, "Ambiguity"),
158 impl<'tcx> fmt::Debug for traits::MismatchedProjectionTypes<'tcx> {
159 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
160 write!(f, "MismatchedProjectionTypes({:?})", self.err)
164 impl<'tcx> fmt::Display for traits::WhereClause<'tcx> {
165 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
166 use crate::traits::WhereClause::*;
168 // Bypass `ty::print` because it does not print out anonymous regions.
169 // FIXME(eddyb) implement a custom `PrettyPrinter`, or move this to `ty::print`.
170 fn write_region_name<'tcx>(
172 fmt: &mut fmt::Formatter<'_>
175 ty::ReLateBound(index, br) => match br {
176 ty::BoundRegion::BrNamed(_, name) => write!(fmt, "{}", name),
177 ty::BoundRegion::BrAnon(var) => {
178 if *index == ty::INNERMOST {
179 write!(fmt, "'^{}", var)
181 write!(fmt, "'^{}_{}", index.index(), var)
184 _ => write!(fmt, "'_"),
187 _ => write!(fmt, "{}", r),
192 Implemented(trait_ref) => write!(fmt, "Implemented({})", trait_ref),
193 ProjectionEq(projection) => write!(fmt, "ProjectionEq({})", projection),
194 RegionOutlives(predicate) => {
195 write!(fmt, "RegionOutlives({}: ", predicate.0)?;
196 write_region_name(predicate.1, fmt)?;
199 TypeOutlives(predicate) => {
200 write!(fmt, "TypeOutlives({}: ", predicate.0)?;
201 write_region_name(predicate.1, fmt)?;
208 impl<'tcx> fmt::Display for traits::WellFormed<'tcx> {
209 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
210 use crate::traits::WellFormed::*;
213 Trait(trait_ref) => write!(fmt, "WellFormed({})", trait_ref),
214 Ty(ty) => write!(fmt, "WellFormed({})", ty),
219 impl<'tcx> fmt::Display for traits::FromEnv<'tcx> {
220 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
221 use crate::traits::FromEnv::*;
224 Trait(trait_ref) => write!(fmt, "FromEnv({})", trait_ref),
225 Ty(ty) => write!(fmt, "FromEnv({})", ty),
230 impl<'tcx> fmt::Display for traits::DomainGoal<'tcx> {
231 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
232 use crate::traits::DomainGoal::*;
235 Holds(wc) => write!(fmt, "{}", wc),
236 WellFormed(wf) => write!(fmt, "{}", wf),
237 FromEnv(from_env) => write!(fmt, "{}", from_env),
238 Normalize(projection) => write!(
240 "Normalize({} -> {})",
241 projection.projection_ty,
248 impl fmt::Display for traits::QuantifierKind {
249 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
250 use crate::traits::QuantifierKind::*;
253 Universal => write!(fmt, "forall"),
254 Existential => write!(fmt, "exists"),
259 /// Collect names for regions / types bound by a quantified goal / clause.
260 /// This collector does not try to do anything clever like in `ty::print`, it's just used
261 /// for debug output in tests anyway.
262 struct BoundNamesCollector {
263 // Just sort by name because `BoundRegion::BrNamed` does not have a `BoundVar` index anyway.
264 regions: BTreeSet<Symbol>,
266 // Sort by `BoundVar` index, so usually this should be equivalent to the order given
267 // by the list of type parameters.
268 types: BTreeMap<u32, Symbol>,
270 binder_index: ty::DebruijnIndex,
273 impl BoundNamesCollector {
275 BoundNamesCollector {
276 regions: BTreeSet::new(),
277 types: BTreeMap::new(),
278 binder_index: ty::INNERMOST,
282 fn is_empty(&self) -> bool {
283 self.regions.is_empty() && self.types.is_empty()
286 fn write_names(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
287 let mut start = true;
288 for r in &self.regions {
293 write!(fmt, "{}", r)?;
295 for (_, t) in &self.types {
300 write!(fmt, "{}", t)?;
306 impl<'tcx> TypeVisitor<'tcx> for BoundNamesCollector {
307 fn visit_binder<T: TypeFoldable<'tcx>>(&mut self, t: &ty::Binder<T>) -> bool {
308 self.binder_index.shift_in(1);
309 let result = t.super_visit_with(self);
310 self.binder_index.shift_out(1);
314 fn visit_ty(&mut self, t: Ty<'tcx>) -> bool {
316 ty::Bound(debruijn, bound_ty) if debruijn == self.binder_index => {
318 bound_ty.var.as_u32(),
319 match bound_ty.kind {
320 ty::BoundTyKind::Param(name) => name,
321 ty::BoundTyKind::Anon =>
322 Symbol::intern(&format!("^{}", bound_ty.var.as_u32()),
331 t.super_visit_with(self)
334 fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool {
336 ty::ReLateBound(index, br) if *index == self.binder_index => {
338 ty::BoundRegion::BrNamed(_, name) => {
339 self.regions.insert(*name);
342 ty::BoundRegion::BrAnon(var) => {
343 self.regions.insert(Symbol::intern(&format!("'^{}", var)));
353 r.super_visit_with(self)
357 impl<'tcx> fmt::Display for traits::Goal<'tcx> {
358 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
359 use crate::traits::GoalKind::*;
362 Implies(hypotheses, goal) => {
363 write!(fmt, "if (")?;
364 for (index, hyp) in hypotheses.iter().enumerate() {
368 write!(fmt, "{}", hyp)?;
370 write!(fmt, ") {{ {} }}", goal)
372 And(goal1, goal2) => write!(fmt, "({} && {})", goal1, goal2),
373 Not(goal) => write!(fmt, "not {{ {} }}", goal),
374 DomainGoal(goal) => write!(fmt, "{}", goal),
375 Quantified(qkind, goal) => {
376 let mut collector = BoundNamesCollector::new();
377 goal.skip_binder().visit_with(&mut collector);
379 if !collector.is_empty() {
380 write!(fmt, "{}<", qkind)?;
381 collector.write_names(fmt)?;
382 write!(fmt, "> {{ ")?;
385 write!(fmt, "{}", goal.skip_binder())?;
387 if !collector.is_empty() {
393 Subtype(a, b) => write!(fmt, "{} <: {}", a, b),
394 CannotProve => write!(fmt, "CannotProve"),
399 impl<'tcx> fmt::Display for traits::ProgramClause<'tcx> {
400 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
401 let traits::ProgramClause { goal, hypotheses, .. } = self;
402 write!(fmt, "{}", goal)?;
403 if !hypotheses.is_empty() {
404 write!(fmt, " :- ")?;
405 for (index, condition) in hypotheses.iter().enumerate() {
409 write!(fmt, "{}", condition)?;
416 impl<'tcx> fmt::Display for traits::Clause<'tcx> {
417 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
418 use crate::traits::Clause::*;
421 Implies(clause) => write!(fmt, "{}", clause),
423 let mut collector = BoundNamesCollector::new();
424 clause.skip_binder().visit_with(&mut collector);
426 if !collector.is_empty() {
427 write!(fmt, "forall<")?;
428 collector.write_names(fmt)?;
429 write!(fmt, "> {{ ")?;
432 write!(fmt, "{}", clause.skip_binder())?;
434 if !collector.is_empty() {
444 ///////////////////////////////////////////////////////////////////////////
445 // Lift implementations
447 impl<'a, 'tcx> Lift<'tcx> for traits::SelectionError<'a> {
448 type Lifted = traits::SelectionError<'tcx>;
449 fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
451 super::Unimplemented => Some(super::Unimplemented),
452 super::OutputTypeParameterMismatch(a, b, ref err) => {
453 tcx.lift(&(a, b)).and_then(|(a, b)|
455 .map(|err| super::OutputTypeParameterMismatch(a, b, err))
458 super::TraitNotObjectSafe(def_id) => Some(super::TraitNotObjectSafe(def_id)),
459 super::ConstEvalFailure(err) => Some(super::ConstEvalFailure(err)),
460 super::Overflow => Some(super::Overflow),
465 impl<'a, 'tcx> Lift<'tcx> for traits::ObligationCauseCode<'a> {
466 type Lifted = traits::ObligationCauseCode<'tcx>;
467 fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
469 super::ReturnNoExpression => Some(super::ReturnNoExpression),
470 super::MiscObligation => Some(super::MiscObligation),
471 super::SliceOrArrayElem => Some(super::SliceOrArrayElem),
472 super::TupleElem => Some(super::TupleElem),
473 super::ProjectionWf(proj) => tcx.lift(&proj).map(super::ProjectionWf),
474 super::ItemObligation(def_id) => Some(super::ItemObligation(def_id)),
475 super::BindingObligation(def_id, span) => Some(super::BindingObligation(def_id, span)),
476 super::ReferenceOutlivesReferent(ty) => {
477 tcx.lift(&ty).map(super::ReferenceOutlivesReferent)
479 super::ObjectTypeBound(ty, r) => tcx.lift(&ty).and_then(|ty|
481 .and_then(|r| Some(super::ObjectTypeBound(ty, r)))
483 super::ObjectCastObligation(ty) => tcx.lift(&ty).map(super::ObjectCastObligation),
484 super::Coercion { source, target } => Some(super::Coercion {
485 source: tcx.lift(&source)?,
486 target: tcx.lift(&target)?,
488 super::AssignmentLhsSized => Some(super::AssignmentLhsSized),
489 super::TupleInitializerSized => Some(super::TupleInitializerSized),
490 super::StructInitializerSized => Some(super::StructInitializerSized),
491 super::VariableType(id) => Some(super::VariableType(id)),
492 super::ReturnValue(id) => Some(super::ReturnValue(id)),
493 super::ReturnType => Some(super::ReturnType),
494 super::SizedArgumentType => Some(super::SizedArgumentType),
495 super::SizedReturnType => Some(super::SizedReturnType),
496 super::SizedYieldType => Some(super::SizedYieldType),
497 super::RepeatVec(suggest_flag) => Some(super::RepeatVec(suggest_flag)),
498 super::FieldSized { adt_kind, last } => Some(super::FieldSized { adt_kind, last }),
499 super::ConstSized => Some(super::ConstSized),
500 super::ConstPatternStructural => Some(super::ConstPatternStructural),
501 super::SharedStatic => Some(super::SharedStatic),
502 super::BuiltinDerivedObligation(ref cause) => {
503 tcx.lift(cause).map(super::BuiltinDerivedObligation)
505 super::ImplDerivedObligation(ref cause) => {
506 tcx.lift(cause).map(super::ImplDerivedObligation)
508 super::CompareImplMethodObligation {
512 } => Some(super::CompareImplMethodObligation {
517 super::ExprAssignable => Some(super::ExprAssignable),
518 super::MatchExpressionArm(box super::MatchExpressionArmCause {
525 tcx.lift(&last_ty).map(|last_ty| {
526 super::MatchExpressionArm(box super::MatchExpressionArmCause {
529 prior_arms: prior_arms.clone(),
535 super::MatchExpressionArmPattern { span, ty } => {
536 tcx.lift(&ty).map(|ty| super::MatchExpressionArmPattern { span, ty })
538 super::IfExpression(box super::IfExpressionCause { then, outer, semicolon }) => {
539 Some(super::IfExpression(box super::IfExpressionCause {
545 super::IfExpressionWithNoElse => Some(super::IfExpressionWithNoElse),
546 super::MainFunctionType => Some(super::MainFunctionType),
547 super::StartFunctionType => Some(super::StartFunctionType),
548 super::IntrinsicType => Some(super::IntrinsicType),
549 super::MethodReceiver => Some(super::MethodReceiver),
550 super::BlockTailExpression(id) => Some(super::BlockTailExpression(id)),
551 super::TrivialBound => Some(super::TrivialBound),
552 super::AssocTypeBound(ref data) => Some(super::AssocTypeBound(data.clone())),
557 impl<'a, 'tcx> Lift<'tcx> for traits::DerivedObligationCause<'a> {
558 type Lifted = traits::DerivedObligationCause<'tcx>;
559 fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
560 tcx.lift(&self.parent_trait_ref).and_then(|trait_ref|
561 tcx.lift(&*self.parent_code)
562 .map(|code| traits::DerivedObligationCause {
563 parent_trait_ref: trait_ref,
564 parent_code: Rc::new(code),
570 impl<'a, 'tcx> Lift<'tcx> for traits::ObligationCause<'a> {
571 type Lifted = traits::ObligationCause<'tcx>;
572 fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
573 tcx.lift(&self.code).map(|code| traits::ObligationCause {
575 body_id: self.body_id,
582 impl<'a, 'tcx> Lift<'tcx> for traits::Vtable<'a, ()> {
583 type Lifted = traits::Vtable<'tcx, ()>;
584 fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
586 traits::VtableImpl(traits::VtableImplData {
590 }) => tcx.lift(&substs).map(|substs|
591 traits::VtableImpl(traits::VtableImplData {
597 traits::VtableAutoImpl(t) => Some(traits::VtableAutoImpl(t)),
598 traits::VtableGenerator(traits::VtableGeneratorData {
602 }) => tcx.lift(&substs).map(|substs|
603 traits::VtableGenerator(traits::VtableGeneratorData {
604 generator_def_id: generator_def_id,
609 traits::VtableClosure(traits::VtableClosureData {
613 }) => tcx.lift(&substs).map(|substs|
614 traits::VtableClosure(traits::VtableClosureData {
620 traits::VtableFnPointer(traits::VtableFnPointerData { fn_ty, nested }) => {
621 tcx.lift(&fn_ty).map(|fn_ty|
622 traits::VtableFnPointer(traits::VtableFnPointerData { fn_ty, nested })
625 traits::VtableParam(n) => Some(traits::VtableParam(n)),
626 traits::VtableBuiltin(n) => Some(traits::VtableBuiltin(n)),
627 traits::VtableObject(traits::VtableObjectData {
631 }) => tcx.lift(&upcast_trait_ref).map(|trait_ref|
632 traits::VtableObject(traits::VtableObjectData {
633 upcast_trait_ref: trait_ref,
638 traits::VtableTraitAlias(traits::VtableTraitAliasData {
642 }) => tcx.lift(&substs).map(|substs|
643 traits::VtableTraitAlias(traits::VtableTraitAliasData {
654 impl<'a, 'tcx> Lift<'tcx> for traits::WhereClause<'a> {
655 type Lifted = traits::WhereClause<'tcx>;
656 (traits::WhereClause::Implemented)(trait_ref),
657 (traits::WhereClause::ProjectionEq)(projection),
658 (traits::WhereClause::TypeOutlives)(ty_outlives),
659 (traits::WhereClause::RegionOutlives)(region_outlives),
664 impl<'a, 'tcx> Lift<'tcx> for traits::WellFormed<'a> {
665 type Lifted = traits::WellFormed<'tcx>;
666 (traits::WellFormed::Trait)(trait_ref),
667 (traits::WellFormed::Ty)(ty),
672 impl<'a, 'tcx> Lift<'tcx> for traits::FromEnv<'a> {
673 type Lifted = traits::FromEnv<'tcx>;
674 (traits::FromEnv::Trait)(trait_ref),
675 (traits::FromEnv::Ty)(ty),
680 impl<'a, 'tcx> Lift<'tcx> for traits::DomainGoal<'a> {
681 type Lifted = traits::DomainGoal<'tcx>;
682 (traits::DomainGoal::Holds)(wc),
683 (traits::DomainGoal::WellFormed)(wf),
684 (traits::DomainGoal::FromEnv)(from_env),
685 (traits::DomainGoal::Normalize)(projection),
690 impl<'a, 'tcx> Lift<'tcx> for traits::GoalKind<'a> {
691 type Lifted = traits::GoalKind<'tcx>;
692 (traits::GoalKind::Implies)(hypotheses, goal),
693 (traits::GoalKind::And)(goal1, goal2),
694 (traits::GoalKind::Not)(goal),
695 (traits::GoalKind::DomainGoal)(domain_goal),
696 (traits::GoalKind::Quantified)(kind, goal),
697 (traits::GoalKind::Subtype)(a, b),
698 (traits::GoalKind::CannotProve),
702 impl<'a, 'tcx> Lift<'tcx> for traits::Environment<'a> {
703 type Lifted = traits::Environment<'tcx>;
704 fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
705 tcx.lift(&self.clauses).map(|clauses| {
706 traits::Environment {
713 impl<'a, 'tcx, G: Lift<'tcx>> Lift<'tcx> for traits::InEnvironment<'a, G> {
714 type Lifted = traits::InEnvironment<'tcx, G::Lifted>;
715 fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
716 tcx.lift(&self.environment).and_then(|environment| {
717 tcx.lift(&self.goal).map(|goal| {
718 traits::InEnvironment {
727 impl<'tcx, C> Lift<'tcx> for chalk_engine::ExClause<C>
729 C: chalk_engine::context::Context + Clone,
730 C: traits::ChalkContextLift<'tcx>,
732 type Lifted = C::LiftedExClause;
734 fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
735 <C as traits::ChalkContextLift>::lift_ex_clause_to_tcx(self, tcx)
739 impl<'tcx, C> Lift<'tcx> for chalk_engine::DelayedLiteral<C>
741 C: chalk_engine::context::Context + Clone,
742 C: traits::ChalkContextLift<'tcx>,
744 type Lifted = C::LiftedDelayedLiteral;
746 fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
747 <C as traits::ChalkContextLift>::lift_delayed_literal_to_tcx(self, tcx)
751 impl<'tcx, C> Lift<'tcx> for chalk_engine::Literal<C>
753 C: chalk_engine::context::Context + Clone,
754 C: traits::ChalkContextLift<'tcx>,
756 type Lifted = C::LiftedLiteral;
758 fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
759 <C as traits::ChalkContextLift>::lift_literal_to_tcx(self, tcx)
763 ///////////////////////////////////////////////////////////////////////////
764 // TypeFoldable implementations.
766 impl<'tcx, O: TypeFoldable<'tcx>> TypeFoldable<'tcx> for traits::Obligation<'tcx, O> {
767 fn super_fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self {
769 cause: self.cause.clone(),
770 recursion_depth: self.recursion_depth,
771 predicate: self.predicate.fold_with(folder),
772 param_env: self.param_env.fold_with(folder),
776 fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
777 self.predicate.visit_with(visitor)
781 BraceStructTypeFoldableImpl! {
782 impl<'tcx, N> TypeFoldable<'tcx> for traits::VtableImplData<'tcx, N> {
783 impl_def_id, substs, nested
784 } where N: TypeFoldable<'tcx>
787 BraceStructTypeFoldableImpl! {
788 impl<'tcx, N> TypeFoldable<'tcx> for traits::VtableGeneratorData<'tcx, N> {
789 generator_def_id, substs, nested
790 } where N: TypeFoldable<'tcx>
793 BraceStructTypeFoldableImpl! {
794 impl<'tcx, N> TypeFoldable<'tcx> for traits::VtableClosureData<'tcx, N> {
795 closure_def_id, substs, nested
796 } where N: TypeFoldable<'tcx>
799 BraceStructTypeFoldableImpl! {
800 impl<'tcx, N> TypeFoldable<'tcx> for traits::VtableAutoImplData<N> {
802 } where N: TypeFoldable<'tcx>
805 BraceStructTypeFoldableImpl! {
806 impl<'tcx, N> TypeFoldable<'tcx> for traits::VtableBuiltinData<N> {
808 } where N: TypeFoldable<'tcx>
811 BraceStructTypeFoldableImpl! {
812 impl<'tcx, N> TypeFoldable<'tcx> for traits::VtableObjectData<'tcx, N> {
813 upcast_trait_ref, vtable_base, nested
814 } where N: TypeFoldable<'tcx>
817 BraceStructTypeFoldableImpl! {
818 impl<'tcx, N> TypeFoldable<'tcx> for traits::VtableFnPointerData<'tcx, N> {
821 } where N: TypeFoldable<'tcx>
824 BraceStructTypeFoldableImpl! {
825 impl<'tcx, N> TypeFoldable<'tcx> for traits::VtableTraitAliasData<'tcx, N> {
826 alias_def_id, substs, nested
827 } where N: TypeFoldable<'tcx>
830 EnumTypeFoldableImpl! {
831 impl<'tcx, N> TypeFoldable<'tcx> for traits::Vtable<'tcx, N> {
832 (traits::VtableImpl)(a),
833 (traits::VtableAutoImpl)(a),
834 (traits::VtableGenerator)(a),
835 (traits::VtableClosure)(a),
836 (traits::VtableFnPointer)(a),
837 (traits::VtableParam)(a),
838 (traits::VtableBuiltin)(a),
839 (traits::VtableObject)(a),
840 (traits::VtableTraitAlias)(a),
841 } where N: TypeFoldable<'tcx>
844 BraceStructTypeFoldableImpl! {
845 impl<'tcx, T> TypeFoldable<'tcx> for Normalized<'tcx, T> {
848 } where T: TypeFoldable<'tcx>
851 EnumTypeFoldableImpl! {
852 impl<'tcx> TypeFoldable<'tcx> for traits::WhereClause<'tcx> {
853 (traits::WhereClause::Implemented)(trait_ref),
854 (traits::WhereClause::ProjectionEq)(projection),
855 (traits::WhereClause::TypeOutlives)(ty_outlives),
856 (traits::WhereClause::RegionOutlives)(region_outlives),
860 EnumTypeFoldableImpl! {
861 impl<'tcx> TypeFoldable<'tcx> for traits::WellFormed<'tcx> {
862 (traits::WellFormed::Trait)(trait_ref),
863 (traits::WellFormed::Ty)(ty),
867 EnumTypeFoldableImpl! {
868 impl<'tcx> TypeFoldable<'tcx> for traits::FromEnv<'tcx> {
869 (traits::FromEnv::Trait)(trait_ref),
870 (traits::FromEnv::Ty)(ty),
874 EnumTypeFoldableImpl! {
875 impl<'tcx> TypeFoldable<'tcx> for traits::DomainGoal<'tcx> {
876 (traits::DomainGoal::Holds)(wc),
877 (traits::DomainGoal::WellFormed)(wf),
878 (traits::DomainGoal::FromEnv)(from_env),
879 (traits::DomainGoal::Normalize)(projection),
883 CloneTypeFoldableAndLiftImpls! {
884 traits::QuantifierKind,
887 EnumTypeFoldableImpl! {
888 impl<'tcx> TypeFoldable<'tcx> for traits::GoalKind<'tcx> {
889 (traits::GoalKind::Implies)(hypotheses, goal),
890 (traits::GoalKind::And)(goal1, goal2),
891 (traits::GoalKind::Not)(goal),
892 (traits::GoalKind::DomainGoal)(domain_goal),
893 (traits::GoalKind::Quantified)(qkind, goal),
894 (traits::GoalKind::Subtype)(a, b),
895 (traits::GoalKind::CannotProve),
899 impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<traits::Goal<'tcx>> {
900 fn super_fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self {
902 .map(|t| t.fold_with(folder))
903 .collect::<SmallVec<[_; 8]>>();
904 folder.tcx().intern_goals(&v)
907 fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
908 self.iter().any(|t| t.visit_with(visitor))
912 impl<'tcx> TypeFoldable<'tcx> for traits::Goal<'tcx> {
913 fn super_fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self {
914 let v = (**self).fold_with(folder);
915 folder.tcx().mk_goal(v)
918 fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
919 (**self).visit_with(visitor)
923 BraceStructTypeFoldableImpl! {
924 impl<'tcx> TypeFoldable<'tcx> for traits::ProgramClause<'tcx> {
931 CloneTypeFoldableAndLiftImpls! {
932 traits::ProgramClauseCategory,
935 EnumTypeFoldableImpl! {
936 impl<'tcx> TypeFoldable<'tcx> for traits::Clause<'tcx> {
937 (traits::Clause::Implies)(clause),
938 (traits::Clause::ForAll)(clause),
942 BraceStructTypeFoldableImpl! {
943 impl<'tcx> TypeFoldable<'tcx> for traits::Environment<'tcx> { clauses }
946 BraceStructTypeFoldableImpl! {
947 impl<'tcx, G> TypeFoldable<'tcx> for traits::InEnvironment<'tcx, G> {
950 } where G: TypeFoldable<'tcx>
953 impl<'tcx> TypeFoldable<'tcx> for traits::Clauses<'tcx> {
954 fn super_fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self {
956 .map(|t| t.fold_with(folder))
957 .collect::<SmallVec<[_; 8]>>();
958 folder.tcx().intern_clauses(&v)
961 fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
962 self.iter().any(|t| t.visit_with(visitor))
966 impl<'tcx, C> TypeFoldable<'tcx> for chalk_engine::ExClause<C>
968 C: traits::ExClauseFold<'tcx>,
969 C::Substitution: Clone,
970 C::RegionConstraint: Clone,
972 fn super_fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self {
973 <C as traits::ExClauseFold>::fold_ex_clause_with(
979 fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
980 <C as traits::ExClauseFold>::visit_ex_clause_with(
987 EnumTypeFoldableImpl! {
988 impl<'tcx, C> TypeFoldable<'tcx> for chalk_engine::DelayedLiteral<C> {
989 (chalk_engine::DelayedLiteral::CannotProve)(a),
990 (chalk_engine::DelayedLiteral::Negative)(a),
991 (chalk_engine::DelayedLiteral::Positive)(a, b),
993 C: chalk_engine::context::Context<CanonicalConstrainedSubst: TypeFoldable<'tcx>> + Clone,
996 EnumTypeFoldableImpl! {
997 impl<'tcx, C> TypeFoldable<'tcx> for chalk_engine::Literal<C> {
998 (chalk_engine::Literal::Negative)(a),
999 (chalk_engine::Literal::Positive)(a),
1001 C: chalk_engine::context::Context<GoalInEnvironment: Clone + TypeFoldable<'tcx>> + Clone,
1004 CloneTypeFoldableAndLiftImpls! {
1005 chalk_engine::TableIndex,