]> git.lizzy.rs Git - rust.git/blob - src/librustc/ty/structural_impls.rs
Remove FixedArraySize error
[rust.git] / src / librustc / ty / structural_impls.rs
1 //! This module contains implements of the `Lift` and `TypeFoldable`
2 //! traits for various types in the Rust compiler. Most are written by
3 //! hand, though we've recently added some macros (e.g.,
4 //! `BraceStructLiftImpl!`) to help with the tedium.
5
6 use crate::hir::def::Namespace;
7 use crate::mir::ProjectionKind;
8 use crate::mir::interpret::ConstValue;
9 use crate::ty::{self, Lift, Ty, TyCtxt, InferConst};
10 use crate::ty::fold::{TypeFoldable, TypeFolder, TypeVisitor};
11 use crate::ty::print::{FmtPrinter, Printer};
12 use rustc_data_structures::indexed_vec::{IndexVec, Idx};
13 use smallvec::SmallVec;
14 use crate::mir::interpret;
15
16 use std::fmt;
17 use std::rc::Rc;
18
19 impl fmt::Debug for ty::GenericParamDef {
20     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21         let type_name = match self.kind {
22             ty::GenericParamDefKind::Lifetime => "Lifetime",
23             ty::GenericParamDefKind::Type {..} => "Type",
24             ty::GenericParamDefKind::Const => "Const",
25         };
26         write!(f, "{}({}, {:?}, {})",
27                type_name,
28                self.name,
29                self.def_id,
30                self.index)
31     }
32 }
33
34 impl fmt::Debug for ty::TraitDef {
35     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36         ty::tls::with(|tcx| {
37             FmtPrinter::new(tcx, f, Namespace::TypeNS)
38                 .print_def_path(self.def_id, &[])?;
39             Ok(())
40         })
41     }
42 }
43
44 impl fmt::Debug for ty::AdtDef {
45     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46         ty::tls::with(|tcx| {
47             FmtPrinter::new(tcx, f, Namespace::TypeNS)
48                 .print_def_path(self.did, &[])?;
49             Ok(())
50         })
51     }
52 }
53
54 impl fmt::Debug for ty::ClosureUpvar<'tcx> {
55     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
56         write!(f, "ClosureUpvar({:?},{:?})",
57                self.res,
58                self.ty)
59     }
60 }
61
62 impl fmt::Debug for ty::UpvarId {
63     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
64         let name = ty::tls::with(|tcx| {
65             tcx.hir().name_by_hir_id(self.var_path.hir_id)
66         });
67         write!(f, "UpvarId({:?};`{}`;{:?})",
68             self.var_path.hir_id,
69             name,
70             self.closure_expr_id)
71     }
72 }
73
74 impl fmt::Debug for ty::UpvarBorrow<'tcx> {
75     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
76         write!(f, "UpvarBorrow({:?}, {:?})",
77                self.kind, self.region)
78     }
79 }
80
81 impl fmt::Debug for ty::ExistentialTraitRef<'tcx> {
82     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
83         fmt::Display::fmt(self, f)
84     }
85 }
86
87 impl fmt::Debug for ty::adjustment::Adjustment<'tcx> {
88     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
89         write!(f, "{:?} -> {}", self.kind, self.target)
90     }
91 }
92
93 impl fmt::Debug for ty::BoundRegion {
94     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
95         match *self {
96             ty::BrAnon(n) => write!(f, "BrAnon({:?})", n),
97             ty::BrFresh(n) => write!(f, "BrFresh({:?})", n),
98             ty::BrNamed(did, name) => {
99                 write!(f, "BrNamed({:?}:{:?}, {})",
100                         did.krate, did.index, name)
101             }
102             ty::BrEnv => write!(f, "BrEnv"),
103         }
104     }
105 }
106
107 impl fmt::Debug for ty::RegionKind {
108     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
109         match *self {
110             ty::ReEarlyBound(ref data) => {
111                 write!(f, "ReEarlyBound({}, {})",
112                         data.index,
113                         data.name)
114             }
115
116             ty::ReClosureBound(ref vid) => {
117                 write!(f, "ReClosureBound({:?})", vid)
118             }
119
120             ty::ReLateBound(binder_id, ref bound_region) => {
121                 write!(f, "ReLateBound({:?}, {:?})", binder_id, bound_region)
122             }
123
124             ty::ReFree(ref fr) => fr.fmt(f),
125
126             ty::ReScope(id) => write!(f, "ReScope({:?})", id),
127
128             ty::ReStatic => write!(f, "ReStatic"),
129
130             ty::ReVar(ref vid) => vid.fmt(f),
131
132             ty::RePlaceholder(placeholder) => {
133                 write!(f, "RePlaceholder({:?})", placeholder)
134             }
135
136             ty::ReEmpty => write!(f, "ReEmpty"),
137
138             ty::ReErased => write!(f, "ReErased"),
139         }
140     }
141 }
142
143 impl fmt::Debug for ty::FreeRegion {
144     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
145         write!(f, "ReFree({:?}, {:?})", self.scope, self.bound_region)
146     }
147 }
148
149 impl fmt::Debug for ty::Variance {
150     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
151         f.write_str(match *self {
152             ty::Covariant => "+",
153             ty::Contravariant => "-",
154             ty::Invariant => "o",
155             ty::Bivariant => "*",
156         })
157     }
158 }
159
160 impl fmt::Debug for ty::FnSig<'tcx> {
161     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
162         write!(f, "({:?}; c_variadic: {})->{:?}",
163                 self.inputs(), self.c_variadic, self.output())
164     }
165 }
166
167 impl fmt::Debug for ty::TyVid {
168     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
169         write!(f, "_#{}t", self.index)
170     }
171 }
172
173 impl<'tcx> fmt::Debug for ty::ConstVid<'tcx> {
174     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
175         write!(f, "_#{}c", self.index)
176     }
177 }
178
179 impl fmt::Debug for ty::IntVid {
180     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
181         write!(f, "_#{}i", self.index)
182     }
183 }
184
185 impl fmt::Debug for ty::FloatVid {
186     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
187         write!(f, "_#{}f", self.index)
188     }
189 }
190
191 impl fmt::Debug for ty::RegionVid {
192     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
193         write!(f, "'_#{}r", self.index())
194     }
195 }
196
197 impl fmt::Debug for ty::InferTy {
198     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
199         match *self {
200             ty::TyVar(ref v) => v.fmt(f),
201             ty::IntVar(ref v) => v.fmt(f),
202             ty::FloatVar(ref v) => v.fmt(f),
203             ty::FreshTy(v) => write!(f, "FreshTy({:?})", v),
204             ty::FreshIntTy(v) => write!(f, "FreshIntTy({:?})", v),
205             ty::FreshFloatTy(v) => write!(f, "FreshFloatTy({:?})", v),
206         }
207     }
208 }
209
210 impl fmt::Debug for ty::IntVarValue {
211     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
212         match *self {
213             ty::IntType(ref v) => v.fmt(f),
214             ty::UintType(ref v) => v.fmt(f),
215         }
216     }
217 }
218
219 impl fmt::Debug for ty::FloatVarValue {
220     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
221         self.0.fmt(f)
222     }
223 }
224
225 impl fmt::Debug for ty::TraitRef<'tcx> {
226     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
227         // FIXME(#59188) this is used across the compiler to print
228         // a `TraitRef` qualified (with the Self type explicit),
229         // instead of having a different way to make that choice.
230         write!(f, "<{} as {}>", self.self_ty(), self)
231     }
232 }
233
234 impl fmt::Debug for Ty<'tcx> {
235     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
236         fmt::Display::fmt(self, f)
237     }
238 }
239
240 impl fmt::Debug for ty::ParamTy {
241     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
242         write!(f, "{}/#{}", self.name, self.index)
243     }
244 }
245
246 impl fmt::Debug for ty::ParamConst {
247     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
248         write!(f, "{}/#{}", self.name, self.index)
249     }
250 }
251
252 impl fmt::Debug for ty::TraitPredicate<'tcx> {
253     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
254         write!(f, "TraitPredicate({:?})", self.trait_ref)
255     }
256 }
257
258 impl fmt::Debug for ty::ProjectionPredicate<'tcx> {
259     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
260         write!(f, "ProjectionPredicate({:?}, {:?})", self.projection_ty, self.ty)
261     }
262 }
263
264 impl fmt::Debug for ty::Predicate<'tcx> {
265     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
266         match *self {
267             ty::Predicate::Trait(ref a) => a.fmt(f),
268             ty::Predicate::Subtype(ref pair) => pair.fmt(f),
269             ty::Predicate::RegionOutlives(ref pair) => pair.fmt(f),
270             ty::Predicate::TypeOutlives(ref pair) => pair.fmt(f),
271             ty::Predicate::Projection(ref pair) => pair.fmt(f),
272             ty::Predicate::WellFormed(ty) => write!(f, "WellFormed({:?})", ty),
273             ty::Predicate::ObjectSafe(trait_def_id) => {
274                 write!(f, "ObjectSafe({:?})", trait_def_id)
275             }
276             ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => {
277                 write!(f, "ClosureKind({:?}, {:?}, {:?})",
278                     closure_def_id, closure_substs, kind)
279             }
280             ty::Predicate::ConstEvaluatable(def_id, substs) => {
281                 write!(f, "ConstEvaluatable({:?}, {:?})", def_id, substs)
282             }
283         }
284     }
285 }
286
287 ///////////////////////////////////////////////////////////////////////////
288 // Atomic structs
289 //
290 // For things that don't carry any arena-allocated data (and are
291 // copy...), just add them to this list.
292
293 CloneTypeFoldableAndLiftImpls! {
294     (),
295     bool,
296     usize,
297     crate::ty::layout::VariantIdx,
298     u64,
299     String,
300     crate::middle::region::Scope,
301     ::syntax::ast::FloatTy,
302     ::syntax::ast::NodeId,
303     ::syntax_pos::symbol::Symbol,
304     crate::hir::def::Res,
305     crate::hir::def_id::DefId,
306     crate::hir::InlineAsm,
307     crate::hir::MatchSource,
308     crate::hir::Mutability,
309     crate::hir::Unsafety,
310     ::rustc_target::spec::abi::Abi,
311     crate::mir::Local,
312     crate::mir::Promoted,
313     crate::traits::Reveal,
314     crate::ty::adjustment::AutoBorrowMutability,
315     crate::ty::AdtKind,
316     // Including `BoundRegion` is a *bit* dubious, but direct
317     // references to bound region appear in `ty::Error`, and aren't
318     // really meant to be folded. In general, we can only fold a fully
319     // general `Region`.
320     crate::ty::BoundRegion,
321     crate::ty::Placeholder<crate::ty::BoundRegion>,
322     crate::ty::ClosureKind,
323     crate::ty::FreeRegion,
324     crate::ty::InferTy,
325     crate::ty::IntVarValue,
326     crate::ty::ParamConst,
327     crate::ty::ParamTy,
328     crate::ty::adjustment::PointerCast,
329     crate::ty::RegionVid,
330     crate::ty::UniverseIndex,
331     crate::ty::Variance,
332     ::syntax_pos::Span,
333 }
334
335 ///////////////////////////////////////////////////////////////////////////
336 // Lift implementations
337
338 // FIXME(eddyb) replace all the uses of `Option::map` with `?`.
339 impl<'tcx, A: Lift<'tcx>, B: Lift<'tcx>> Lift<'tcx> for (A, B) {
340     type Lifted = (A::Lifted, B::Lifted);
341     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
342         tcx.lift(&self.0).and_then(|a| tcx.lift(&self.1).map(|b| (a, b)))
343     }
344 }
345
346 impl<'tcx, A: Lift<'tcx>, B: Lift<'tcx>, C: Lift<'tcx>> Lift<'tcx> for (A, B, C) {
347     type Lifted = (A::Lifted, B::Lifted, C::Lifted);
348     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
349         tcx.lift(&self.0).and_then(|a| {
350             tcx.lift(&self.1).and_then(|b| tcx.lift(&self.2).map(|c| (a, b, c)))
351         })
352     }
353 }
354
355 impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for Option<T> {
356     type Lifted = Option<T::Lifted>;
357     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
358         match *self {
359             Some(ref x) => tcx.lift(x).map(Some),
360             None => Some(None)
361         }
362     }
363 }
364
365 impl<'tcx, T: Lift<'tcx>, E: Lift<'tcx>> Lift<'tcx> for Result<T, E> {
366     type Lifted = Result<T::Lifted, E::Lifted>;
367     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
368         match *self {
369             Ok(ref x) => tcx.lift(x).map(Ok),
370             Err(ref e) => tcx.lift(e).map(Err)
371         }
372     }
373 }
374
375 impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for Box<T> {
376     type Lifted = Box<T::Lifted>;
377     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
378         tcx.lift(&**self).map(Box::new)
379     }
380 }
381
382 impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for [T] {
383     type Lifted = Vec<T::Lifted>;
384     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
385         // type annotation needed to inform `projection_must_outlive`
386         let mut result : Vec<<T as Lift<'tcx>>::Lifted>
387             = Vec::with_capacity(self.len());
388         for x in self {
389             if let Some(value) = tcx.lift(x) {
390                 result.push(value);
391             } else {
392                 return None;
393             }
394         }
395         Some(result)
396     }
397 }
398
399 impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for Vec<T> {
400     type Lifted = Vec<T::Lifted>;
401     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
402         tcx.lift(&self[..])
403     }
404 }
405
406 impl<'tcx, I: Idx, T: Lift<'tcx>> Lift<'tcx> for IndexVec<I, T> {
407     type Lifted = IndexVec<I, T::Lifted>;
408     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
409         self.iter()
410             .map(|e| tcx.lift(e))
411             .collect()
412     }
413 }
414
415 impl<'a, 'tcx> Lift<'tcx> for ty::TraitRef<'a> {
416     type Lifted = ty::TraitRef<'tcx>;
417     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
418         tcx.lift(&self.substs).map(|substs| ty::TraitRef {
419             def_id: self.def_id,
420             substs,
421         })
422     }
423 }
424
425 impl<'a, 'tcx> Lift<'tcx> for ty::ExistentialTraitRef<'a> {
426     type Lifted = ty::ExistentialTraitRef<'tcx>;
427     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
428         tcx.lift(&self.substs).map(|substs| ty::ExistentialTraitRef {
429             def_id: self.def_id,
430             substs,
431         })
432     }
433 }
434
435 impl<'a, 'tcx> Lift<'tcx> for ty::ExistentialPredicate<'a> {
436     type Lifted = ty::ExistentialPredicate<'tcx>;
437     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
438         match self {
439             ty::ExistentialPredicate::Trait(x) => {
440                 tcx.lift(x).map(ty::ExistentialPredicate::Trait)
441             }
442             ty::ExistentialPredicate::Projection(x) => {
443                 tcx.lift(x).map(ty::ExistentialPredicate::Projection)
444             }
445             ty::ExistentialPredicate::AutoTrait(def_id) => {
446                 Some(ty::ExistentialPredicate::AutoTrait(*def_id))
447             }
448         }
449     }
450 }
451
452 impl<'a, 'tcx> Lift<'tcx> for ty::TraitPredicate<'a> {
453     type Lifted = ty::TraitPredicate<'tcx>;
454     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>)
455                              -> Option<ty::TraitPredicate<'tcx>> {
456         tcx.lift(&self.trait_ref).map(|trait_ref| ty::TraitPredicate {
457             trait_ref,
458         })
459     }
460 }
461
462 impl<'a, 'tcx> Lift<'tcx> for ty::SubtypePredicate<'a> {
463     type Lifted = ty::SubtypePredicate<'tcx>;
464     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>)
465                              -> Option<ty::SubtypePredicate<'tcx>> {
466         tcx.lift(&(self.a, self.b)).map(|(a, b)| ty::SubtypePredicate {
467             a_is_expected: self.a_is_expected,
468             a,
469             b,
470         })
471     }
472 }
473
474 impl<'tcx, A: Copy+Lift<'tcx>, B: Copy+Lift<'tcx>> Lift<'tcx> for ty::OutlivesPredicate<A, B> {
475     type Lifted = ty::OutlivesPredicate<A::Lifted, B::Lifted>;
476     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
477         tcx.lift(&(self.0, self.1)).map(|(a, b)| ty::OutlivesPredicate(a, b))
478     }
479 }
480
481 impl<'a, 'tcx> Lift<'tcx> for ty::ProjectionTy<'a> {
482     type Lifted = ty::ProjectionTy<'tcx>;
483     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>)
484                              -> Option<ty::ProjectionTy<'tcx>> {
485         tcx.lift(&self.substs).map(|substs| {
486             ty::ProjectionTy {
487                 item_def_id: self.item_def_id,
488                 substs,
489             }
490         })
491     }
492 }
493
494 impl<'a, 'tcx> Lift<'tcx> for ty::ProjectionPredicate<'a> {
495     type Lifted = ty::ProjectionPredicate<'tcx>;
496     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>)
497                              -> Option<ty::ProjectionPredicate<'tcx>> {
498         tcx.lift(&(self.projection_ty, self.ty)).map(|(projection_ty, ty)| {
499             ty::ProjectionPredicate {
500                 projection_ty,
501                 ty,
502             }
503         })
504     }
505 }
506
507 impl<'a, 'tcx> Lift<'tcx> for ty::ExistentialProjection<'a> {
508     type Lifted = ty::ExistentialProjection<'tcx>;
509     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
510         tcx.lift(&self.substs).map(|substs| {
511             ty::ExistentialProjection {
512                 substs,
513                 ty: tcx.lift(&self.ty).expect("type must lift when substs do"),
514                 item_def_id: self.item_def_id,
515             }
516         })
517     }
518 }
519
520 impl<'a, 'tcx> Lift<'tcx> for ty::Predicate<'a> {
521     type Lifted = ty::Predicate<'tcx>;
522     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
523         match *self {
524             ty::Predicate::Trait(ref binder) => {
525                 tcx.lift(binder).map(ty::Predicate::Trait)
526             }
527             ty::Predicate::Subtype(ref binder) => {
528                 tcx.lift(binder).map(ty::Predicate::Subtype)
529             }
530             ty::Predicate::RegionOutlives(ref binder) => {
531                 tcx.lift(binder).map(ty::Predicate::RegionOutlives)
532             }
533             ty::Predicate::TypeOutlives(ref binder) => {
534                 tcx.lift(binder).map(ty::Predicate::TypeOutlives)
535             }
536             ty::Predicate::Projection(ref binder) => {
537                 tcx.lift(binder).map(ty::Predicate::Projection)
538             }
539             ty::Predicate::WellFormed(ty) => {
540                 tcx.lift(&ty).map(ty::Predicate::WellFormed)
541             }
542             ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => {
543                 tcx.lift(&closure_substs)
544                    .map(|closure_substs| ty::Predicate::ClosureKind(closure_def_id,
545                                                                     closure_substs,
546                                                                     kind))
547             }
548             ty::Predicate::ObjectSafe(trait_def_id) => {
549                 Some(ty::Predicate::ObjectSafe(trait_def_id))
550             }
551             ty::Predicate::ConstEvaluatable(def_id, substs) => {
552                 tcx.lift(&substs).map(|substs| {
553                     ty::Predicate::ConstEvaluatable(def_id, substs)
554                 })
555             }
556         }
557     }
558 }
559
560 impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for ty::Binder<T> {
561     type Lifted = ty::Binder<T::Lifted>;
562     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
563         tcx.lift(self.skip_binder()).map(ty::Binder::bind)
564     }
565 }
566
567 impl<'a, 'tcx> Lift<'tcx> for ty::ParamEnv<'a> {
568     type Lifted = ty::ParamEnv<'tcx>;
569     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
570         tcx.lift(&self.caller_bounds).map(|caller_bounds| {
571             ty::ParamEnv {
572                 reveal: self.reveal,
573                 caller_bounds,
574                 def_id: self.def_id,
575             }
576         })
577     }
578 }
579
580 impl<'a, 'tcx, T: Lift<'tcx>> Lift<'tcx> for ty::ParamEnvAnd<'a, T> {
581     type Lifted = ty::ParamEnvAnd<'tcx, T::Lifted>;
582     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
583         tcx.lift(&self.param_env).and_then(|param_env| {
584             tcx.lift(&self.value).map(|value| {
585                 ty::ParamEnvAnd {
586                     param_env,
587                     value,
588                 }
589             })
590         })
591     }
592 }
593
594 impl<'a, 'tcx> Lift<'tcx> for ty::ClosureSubsts<'a> {
595     type Lifted = ty::ClosureSubsts<'tcx>;
596     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
597         tcx.lift(&self.substs).map(|substs| {
598             ty::ClosureSubsts { substs }
599         })
600     }
601 }
602
603 impl<'a, 'tcx> Lift<'tcx> for ty::GeneratorSubsts<'a> {
604     type Lifted = ty::GeneratorSubsts<'tcx>;
605     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
606         tcx.lift(&self.substs).map(|substs| {
607             ty::GeneratorSubsts { substs }
608         })
609     }
610 }
611
612 impl<'a, 'tcx> Lift<'tcx> for ty::adjustment::Adjustment<'a> {
613     type Lifted = ty::adjustment::Adjustment<'tcx>;
614     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
615         tcx.lift(&self.kind).and_then(|kind| {
616             tcx.lift(&self.target).map(|target| {
617                 ty::adjustment::Adjustment { kind, target }
618             })
619         })
620     }
621 }
622
623 impl<'a, 'tcx> Lift<'tcx> for ty::adjustment::Adjust<'a> {
624     type Lifted = ty::adjustment::Adjust<'tcx>;
625     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
626         match *self {
627             ty::adjustment::Adjust::NeverToAny =>
628                 Some(ty::adjustment::Adjust::NeverToAny),
629             ty::adjustment::Adjust::Pointer(ptr) =>
630                 Some(ty::adjustment::Adjust::Pointer(ptr)),
631             ty::adjustment::Adjust::Deref(ref overloaded) => {
632                 tcx.lift(overloaded).map(ty::adjustment::Adjust::Deref)
633             }
634             ty::adjustment::Adjust::Borrow(ref autoref) => {
635                 tcx.lift(autoref).map(ty::adjustment::Adjust::Borrow)
636             }
637         }
638     }
639 }
640
641 impl<'a, 'tcx> Lift<'tcx> for ty::adjustment::OverloadedDeref<'a> {
642     type Lifted = ty::adjustment::OverloadedDeref<'tcx>;
643     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
644         tcx.lift(&self.region).map(|region| {
645             ty::adjustment::OverloadedDeref {
646                 region,
647                 mutbl: self.mutbl,
648             }
649         })
650     }
651 }
652
653 impl<'a, 'tcx> Lift<'tcx> for ty::adjustment::AutoBorrow<'a> {
654     type Lifted = ty::adjustment::AutoBorrow<'tcx>;
655     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
656         match *self {
657             ty::adjustment::AutoBorrow::Ref(r, m) => {
658                 tcx.lift(&r).map(|r| ty::adjustment::AutoBorrow::Ref(r, m))
659             }
660             ty::adjustment::AutoBorrow::RawPtr(m) => {
661                 Some(ty::adjustment::AutoBorrow::RawPtr(m))
662             }
663         }
664     }
665 }
666
667 impl<'a, 'tcx> Lift<'tcx> for ty::GenSig<'a> {
668     type Lifted = ty::GenSig<'tcx>;
669     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
670         tcx.lift(&(self.yield_ty, self.return_ty))
671            .map(|(yield_ty, return_ty)| {
672                ty::GenSig {
673                    yield_ty,
674                    return_ty,
675                }
676            })
677     }
678 }
679
680 impl<'a, 'tcx> Lift<'tcx> for ty::FnSig<'a> {
681     type Lifted = ty::FnSig<'tcx>;
682     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
683         tcx.lift(&self.inputs_and_output).map(|x| {
684             ty::FnSig {
685                 inputs_and_output: x,
686                 c_variadic: self.c_variadic,
687                 unsafety: self.unsafety,
688                 abi: self.abi,
689             }
690         })
691     }
692 }
693
694 impl<'tcx, T: Lift<'tcx>> Lift<'tcx> for ty::error::ExpectedFound<T> {
695     type Lifted = ty::error::ExpectedFound<T::Lifted>;
696     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted> {
697         tcx.lift(&self.expected).and_then(|expected| {
698             tcx.lift(&self.found).map(|found| {
699                 ty::error::ExpectedFound {
700                     expected,
701                     found,
702                 }
703             })
704         })
705     }
706 }
707
708 impl<'a, 'tcx> Lift<'tcx> for ty::error::TypeError<'a> {
709     type Lifted = ty::error::TypeError<'tcx>;
710     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
711         use crate::ty::error::TypeError::*;
712
713         Some(match *self {
714             Mismatch => Mismatch,
715             UnsafetyMismatch(x) => UnsafetyMismatch(x),
716             AbiMismatch(x) => AbiMismatch(x),
717             Mutability => Mutability,
718             TupleSize(x) => TupleSize(x),
719             ArgCount => ArgCount,
720             RegionsDoesNotOutlive(a, b) => {
721                 return tcx.lift(&(a, b)).map(|(a, b)| RegionsDoesNotOutlive(a, b))
722             }
723             RegionsInsufficientlyPolymorphic(a, b) => {
724                 return tcx.lift(&b).map(|b| RegionsInsufficientlyPolymorphic(a, b))
725             }
726             RegionsOverlyPolymorphic(a, b) => {
727                 return tcx.lift(&b).map(|b| RegionsOverlyPolymorphic(a, b))
728             }
729             RegionsPlaceholderMismatch => RegionsPlaceholderMismatch,
730             IntMismatch(x) => IntMismatch(x),
731             FloatMismatch(x) => FloatMismatch(x),
732             Traits(x) => Traits(x),
733             VariadicMismatch(x) => VariadicMismatch(x),
734             CyclicTy(t) => return tcx.lift(&t).map(|t| CyclicTy(t)),
735             ProjectionMismatched(x) => ProjectionMismatched(x),
736             ProjectionBoundsLength(x) => ProjectionBoundsLength(x),
737             Sorts(ref x) => return tcx.lift(x).map(Sorts),
738             ExistentialMismatch(ref x) => return tcx.lift(x).map(ExistentialMismatch),
739             ConstMismatch(ref x) => return tcx.lift(x).map(ConstMismatch),
740         })
741     }
742 }
743
744 impl<'a, 'tcx> Lift<'tcx> for ty::InstanceDef<'a> {
745     type Lifted = ty::InstanceDef<'tcx>;
746     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
747         match *self {
748             ty::InstanceDef::Item(def_id) =>
749                 Some(ty::InstanceDef::Item(def_id)),
750             ty::InstanceDef::VtableShim(def_id) =>
751                 Some(ty::InstanceDef::VtableShim(def_id)),
752             ty::InstanceDef::Intrinsic(def_id) =>
753                 Some(ty::InstanceDef::Intrinsic(def_id)),
754             ty::InstanceDef::FnPtrShim(def_id, ref ty) =>
755                 Some(ty::InstanceDef::FnPtrShim(def_id, tcx.lift(ty)?)),
756             ty::InstanceDef::Virtual(def_id, n) =>
757                 Some(ty::InstanceDef::Virtual(def_id, n)),
758             ty::InstanceDef::ClosureOnceShim { call_once } =>
759                 Some(ty::InstanceDef::ClosureOnceShim { call_once }),
760             ty::InstanceDef::DropGlue(def_id, ref ty) =>
761                 Some(ty::InstanceDef::DropGlue(def_id, tcx.lift(ty)?)),
762             ty::InstanceDef::CloneShim(def_id, ref ty) =>
763                 Some(ty::InstanceDef::CloneShim(def_id, tcx.lift(ty)?)),
764         }
765     }
766 }
767
768 BraceStructLiftImpl! {
769     impl<'a, 'tcx> Lift<'tcx> for ty::TypeAndMut<'a> {
770         type Lifted = ty::TypeAndMut<'tcx>;
771         ty, mutbl
772     }
773 }
774
775 BraceStructLiftImpl! {
776     impl<'a, 'tcx> Lift<'tcx> for ty::Instance<'a> {
777         type Lifted = ty::Instance<'tcx>;
778         def, substs
779     }
780 }
781
782 BraceStructLiftImpl! {
783     impl<'a, 'tcx> Lift<'tcx> for interpret::GlobalId<'a> {
784         type Lifted = interpret::GlobalId<'tcx>;
785         instance, promoted
786     }
787 }
788
789 ///////////////////////////////////////////////////////////////////////////
790 // TypeFoldable implementations.
791 //
792 // Ideally, each type should invoke `folder.fold_foo(self)` and
793 // nothing else. In some cases, though, we haven't gotten around to
794 // adding methods on the `folder` yet, and thus the folding is
795 // hard-coded here. This is less-flexible, because folders cannot
796 // override the behavior, but there are a lot of random types and one
797 // can easily refactor the folding into the TypeFolder trait as
798 // needed.
799
800 /// AdtDefs are basically the same as a DefId.
801 impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::AdtDef {
802     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, _folder: &mut F) -> Self {
803         *self
804     }
805
806     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, _visitor: &mut V) -> bool {
807         false
808     }
809 }
810
811 impl<'tcx, T:TypeFoldable<'tcx>, U:TypeFoldable<'tcx>> TypeFoldable<'tcx> for (T, U) {
812     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> (T, U) {
813         (self.0.fold_with(folder), self.1.fold_with(folder))
814     }
815
816     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
817         self.0.visit_with(visitor) || self.1.visit_with(visitor)
818     }
819 }
820
821 EnumTypeFoldableImpl! {
822     impl<'tcx, T> TypeFoldable<'tcx> for Option<T> {
823         (Some)(a),
824         (None),
825     } where T: TypeFoldable<'tcx>
826 }
827
828 impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Rc<T> {
829     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
830         Rc::new((**self).fold_with(folder))
831     }
832
833     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
834         (**self).visit_with(visitor)
835     }
836 }
837
838 impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Box<T> {
839     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
840         let content: T = (**self).fold_with(folder);
841         box content
842     }
843
844     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
845         (**self).visit_with(visitor)
846     }
847 }
848
849 impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Vec<T> {
850     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
851         self.iter().map(|t| t.fold_with(folder)).collect()
852     }
853
854     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
855         self.iter().any(|t| t.visit_with(visitor))
856     }
857 }
858
859 impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Box<[T]> {
860     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
861         self.iter().map(|t| t.fold_with(folder)).collect::<Vec<_>>().into_boxed_slice()
862     }
863
864     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
865         self.iter().any(|t| t.visit_with(visitor))
866     }
867 }
868
869 impl<'tcx, T:TypeFoldable<'tcx>> TypeFoldable<'tcx> for ty::Binder<T> {
870     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
871         self.map_bound_ref(|ty| ty.fold_with(folder))
872     }
873
874     fn fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
875         folder.fold_binder(self)
876     }
877
878     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
879         self.skip_binder().visit_with(visitor)
880     }
881
882     fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
883         visitor.visit_binder(self)
884     }
885 }
886
887 BraceStructTypeFoldableImpl! {
888     impl<'tcx> TypeFoldable<'tcx> for ty::ParamEnv<'tcx> { reveal, caller_bounds, def_id }
889 }
890
891 impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ty::ExistentialPredicate<'tcx>> {
892     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
893         let v = self.iter().map(|p| p.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
894         folder.tcx().intern_existential_predicates(&v)
895     }
896
897     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
898         self.iter().any(|p| p.visit_with(visitor))
899     }
900 }
901
902 EnumTypeFoldableImpl! {
903     impl<'tcx> TypeFoldable<'tcx> for ty::ExistentialPredicate<'tcx> {
904         (ty::ExistentialPredicate::Trait)(a),
905         (ty::ExistentialPredicate::Projection)(a),
906         (ty::ExistentialPredicate::AutoTrait)(a),
907     }
908 }
909
910 impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<Ty<'tcx>> {
911     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
912         let v = self.iter().map(|t| t.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
913         folder.tcx().intern_type_list(&v)
914     }
915
916     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
917         self.iter().any(|t| t.visit_with(visitor))
918     }
919 }
920
921 impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ProjectionKind> {
922     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
923         let v = self.iter().map(|t| t.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
924         folder.tcx().intern_projs(&v)
925     }
926
927     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
928         self.iter().any(|t| t.visit_with(visitor))
929     }
930 }
931
932 impl<'tcx> TypeFoldable<'tcx> for ty::instance::Instance<'tcx> {
933     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
934         use crate::ty::InstanceDef::*;
935         Self {
936             substs: self.substs.fold_with(folder),
937             def: match self.def {
938                 Item(did) => Item(did.fold_with(folder)),
939                 VtableShim(did) => VtableShim(did.fold_with(folder)),
940                 Intrinsic(did) => Intrinsic(did.fold_with(folder)),
941                 FnPtrShim(did, ty) => FnPtrShim(
942                     did.fold_with(folder),
943                     ty.fold_with(folder),
944                 ),
945                 Virtual(did, i) => Virtual(
946                     did.fold_with(folder),
947                     i,
948                 ),
949                 ClosureOnceShim { call_once } => ClosureOnceShim {
950                     call_once: call_once.fold_with(folder),
951                 },
952                 DropGlue(did, ty) => DropGlue(
953                     did.fold_with(folder),
954                     ty.fold_with(folder),
955                 ),
956                 CloneShim(did, ty) => CloneShim(
957                     did.fold_with(folder),
958                     ty.fold_with(folder),
959                 ),
960             },
961         }
962     }
963
964     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
965         use crate::ty::InstanceDef::*;
966         self.substs.visit_with(visitor) ||
967         match self.def {
968             Item(did) | VtableShim(did) | Intrinsic(did) | Virtual(did, _) => {
969                 did.visit_with(visitor)
970             },
971             FnPtrShim(did, ty) | CloneShim(did, ty) => {
972                 did.visit_with(visitor) || ty.visit_with(visitor)
973             },
974             DropGlue(did, ty) => {
975                 did.visit_with(visitor) || ty.visit_with(visitor)
976             },
977             ClosureOnceShim { call_once } => call_once.visit_with(visitor),
978         }
979     }
980 }
981
982 impl<'tcx> TypeFoldable<'tcx> for interpret::GlobalId<'tcx> {
983     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
984         Self {
985             instance: self.instance.fold_with(folder),
986             promoted: self.promoted
987         }
988     }
989
990     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
991         self.instance.visit_with(visitor)
992     }
993 }
994
995 impl<'tcx> TypeFoldable<'tcx> for Ty<'tcx> {
996     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
997         let sty = match self.sty {
998             ty::RawPtr(tm) => ty::RawPtr(tm.fold_with(folder)),
999             ty::Array(typ, sz) => ty::Array(typ.fold_with(folder), sz.fold_with(folder)),
1000             ty::Slice(typ) => ty::Slice(typ.fold_with(folder)),
1001             ty::Adt(tid, substs) => ty::Adt(tid, substs.fold_with(folder)),
1002             ty::Dynamic(ref trait_ty, ref region) =>
1003                 ty::Dynamic(trait_ty.fold_with(folder), region.fold_with(folder)),
1004             ty::Tuple(ts) => ty::Tuple(ts.fold_with(folder)),
1005             ty::FnDef(def_id, substs) => {
1006                 ty::FnDef(def_id, substs.fold_with(folder))
1007             }
1008             ty::FnPtr(f) => ty::FnPtr(f.fold_with(folder)),
1009             ty::Ref(ref r, ty, mutbl) => {
1010                 ty::Ref(r.fold_with(folder), ty.fold_with(folder), mutbl)
1011             }
1012             ty::Generator(did, substs, movability) => {
1013                 ty::Generator(
1014                     did,
1015                     substs.fold_with(folder),
1016                     movability)
1017             }
1018             ty::GeneratorWitness(types) => ty::GeneratorWitness(types.fold_with(folder)),
1019             ty::Closure(did, substs) => ty::Closure(did, substs.fold_with(folder)),
1020             ty::Projection(ref data) => ty::Projection(data.fold_with(folder)),
1021             ty::UnnormalizedProjection(ref data) => {
1022                 ty::UnnormalizedProjection(data.fold_with(folder))
1023             }
1024             ty::Opaque(did, substs) => ty::Opaque(did, substs.fold_with(folder)),
1025
1026             ty::Bool |
1027             ty::Char |
1028             ty::Str |
1029             ty::Int(_) |
1030             ty::Uint(_) |
1031             ty::Float(_) |
1032             ty::Error |
1033             ty::Infer(_) |
1034             ty::Param(..) |
1035             ty::Bound(..) |
1036             ty::Placeholder(..) |
1037             ty::Never |
1038             ty::Foreign(..) => return self
1039         };
1040
1041         if self.sty == sty {
1042             self
1043         } else {
1044             folder.tcx().mk_ty(sty)
1045         }
1046     }
1047
1048     fn fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
1049         folder.fold_ty(*self)
1050     }
1051
1052     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
1053         match self.sty {
1054             ty::RawPtr(ref tm) => tm.visit_with(visitor),
1055             ty::Array(typ, sz) => typ.visit_with(visitor) || sz.visit_with(visitor),
1056             ty::Slice(typ) => typ.visit_with(visitor),
1057             ty::Adt(_, substs) => substs.visit_with(visitor),
1058             ty::Dynamic(ref trait_ty, ref reg) =>
1059                 trait_ty.visit_with(visitor) || reg.visit_with(visitor),
1060             ty::Tuple(ts) => ts.visit_with(visitor),
1061             ty::FnDef(_, substs) => substs.visit_with(visitor),
1062             ty::FnPtr(ref f) => f.visit_with(visitor),
1063             ty::Ref(r, ty, _) => r.visit_with(visitor) || ty.visit_with(visitor),
1064             ty::Generator(_did, ref substs, _) => {
1065                 substs.visit_with(visitor)
1066             }
1067             ty::GeneratorWitness(ref types) => types.visit_with(visitor),
1068             ty::Closure(_did, ref substs) => substs.visit_with(visitor),
1069             ty::Projection(ref data) | ty::UnnormalizedProjection(ref data) => {
1070                 data.visit_with(visitor)
1071             }
1072             ty::Opaque(_, ref substs) => substs.visit_with(visitor),
1073
1074             ty::Bool |
1075             ty::Char |
1076             ty::Str |
1077             ty::Int(_) |
1078             ty::Uint(_) |
1079             ty::Float(_) |
1080             ty::Error |
1081             ty::Infer(_) |
1082             ty::Bound(..) |
1083             ty::Placeholder(..) |
1084             ty::Param(..) |
1085             ty::Never |
1086             ty::Foreign(..) => false,
1087         }
1088     }
1089
1090     fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
1091         visitor.visit_ty(self)
1092     }
1093 }
1094
1095 BraceStructTypeFoldableImpl! {
1096     impl<'tcx> TypeFoldable<'tcx> for ty::TypeAndMut<'tcx> {
1097         ty, mutbl
1098     }
1099 }
1100
1101 BraceStructTypeFoldableImpl! {
1102     impl<'tcx> TypeFoldable<'tcx> for ty::GenSig<'tcx> {
1103         yield_ty, return_ty
1104     }
1105 }
1106
1107 BraceStructTypeFoldableImpl! {
1108     impl<'tcx> TypeFoldable<'tcx> for ty::FnSig<'tcx> {
1109         inputs_and_output, c_variadic, unsafety, abi
1110     }
1111 }
1112
1113 BraceStructTypeFoldableImpl! {
1114     impl<'tcx> TypeFoldable<'tcx> for ty::TraitRef<'tcx> { def_id, substs }
1115 }
1116
1117 BraceStructTypeFoldableImpl! {
1118     impl<'tcx> TypeFoldable<'tcx> for ty::ExistentialTraitRef<'tcx> { def_id, substs }
1119 }
1120
1121 BraceStructTypeFoldableImpl! {
1122     impl<'tcx> TypeFoldable<'tcx> for ty::ImplHeader<'tcx> {
1123         impl_def_id,
1124         self_ty,
1125         trait_ref,
1126         predicates,
1127     }
1128 }
1129
1130 impl<'tcx> TypeFoldable<'tcx> for ty::Region<'tcx> {
1131     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, _folder: &mut F) -> Self {
1132         *self
1133     }
1134
1135     fn fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
1136         folder.fold_region(*self)
1137     }
1138
1139     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, _visitor: &mut V) -> bool {
1140         false
1141     }
1142
1143     fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
1144         visitor.visit_region(*self)
1145     }
1146 }
1147
1148 BraceStructTypeFoldableImpl! {
1149     impl<'tcx> TypeFoldable<'tcx> for ty::ClosureSubsts<'tcx> {
1150         substs,
1151     }
1152 }
1153
1154 BraceStructTypeFoldableImpl! {
1155     impl<'tcx> TypeFoldable<'tcx> for ty::GeneratorSubsts<'tcx> {
1156         substs,
1157     }
1158 }
1159
1160 BraceStructTypeFoldableImpl! {
1161     impl<'tcx> TypeFoldable<'tcx> for ty::adjustment::Adjustment<'tcx> {
1162         kind,
1163         target,
1164     }
1165 }
1166
1167 EnumTypeFoldableImpl! {
1168     impl<'tcx> TypeFoldable<'tcx> for ty::adjustment::Adjust<'tcx> {
1169         (ty::adjustment::Adjust::NeverToAny),
1170         (ty::adjustment::Adjust::Pointer)(a),
1171         (ty::adjustment::Adjust::Deref)(a),
1172         (ty::adjustment::Adjust::Borrow)(a),
1173     }
1174 }
1175
1176 BraceStructTypeFoldableImpl! {
1177     impl<'tcx> TypeFoldable<'tcx> for ty::adjustment::OverloadedDeref<'tcx> {
1178         region, mutbl,
1179     }
1180 }
1181
1182 EnumTypeFoldableImpl! {
1183     impl<'tcx> TypeFoldable<'tcx> for ty::adjustment::AutoBorrow<'tcx> {
1184         (ty::adjustment::AutoBorrow::Ref)(a, b),
1185         (ty::adjustment::AutoBorrow::RawPtr)(m),
1186     }
1187 }
1188
1189 BraceStructTypeFoldableImpl! {
1190     impl<'tcx> TypeFoldable<'tcx> for ty::GenericPredicates<'tcx> {
1191         parent, predicates
1192     }
1193 }
1194
1195 impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ty::Predicate<'tcx>> {
1196     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
1197         let v = self.iter().map(|p| p.fold_with(folder)).collect::<SmallVec<[_; 8]>>();
1198         folder.tcx().intern_predicates(&v)
1199     }
1200
1201     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
1202         self.iter().any(|p| p.visit_with(visitor))
1203     }
1204 }
1205
1206 EnumTypeFoldableImpl! {
1207     impl<'tcx> TypeFoldable<'tcx> for ty::Predicate<'tcx> {
1208         (ty::Predicate::Trait)(a),
1209         (ty::Predicate::Subtype)(a),
1210         (ty::Predicate::RegionOutlives)(a),
1211         (ty::Predicate::TypeOutlives)(a),
1212         (ty::Predicate::Projection)(a),
1213         (ty::Predicate::WellFormed)(a),
1214         (ty::Predicate::ClosureKind)(a, b, c),
1215         (ty::Predicate::ObjectSafe)(a),
1216         (ty::Predicate::ConstEvaluatable)(a, b),
1217     }
1218 }
1219
1220 BraceStructTypeFoldableImpl! {
1221     impl<'tcx> TypeFoldable<'tcx> for ty::ProjectionPredicate<'tcx> {
1222         projection_ty, ty
1223     }
1224 }
1225
1226 BraceStructTypeFoldableImpl! {
1227     impl<'tcx> TypeFoldable<'tcx> for ty::ExistentialProjection<'tcx> {
1228         ty, substs, item_def_id
1229     }
1230 }
1231
1232 BraceStructTypeFoldableImpl! {
1233     impl<'tcx> TypeFoldable<'tcx> for ty::ProjectionTy<'tcx> {
1234         substs, item_def_id
1235     }
1236 }
1237
1238 BraceStructTypeFoldableImpl! {
1239     impl<'tcx> TypeFoldable<'tcx> for ty::InstantiatedPredicates<'tcx> {
1240         predicates
1241     }
1242 }
1243
1244 BraceStructTypeFoldableImpl! {
1245     impl<'tcx, T> TypeFoldable<'tcx> for ty::ParamEnvAnd<'tcx, T> {
1246         param_env, value
1247     } where T: TypeFoldable<'tcx>
1248 }
1249
1250 BraceStructTypeFoldableImpl! {
1251     impl<'tcx> TypeFoldable<'tcx> for ty::SubtypePredicate<'tcx> {
1252         a_is_expected, a, b
1253     }
1254 }
1255
1256 BraceStructTypeFoldableImpl! {
1257     impl<'tcx> TypeFoldable<'tcx> for ty::TraitPredicate<'tcx> {
1258         trait_ref
1259     }
1260 }
1261
1262 TupleStructTypeFoldableImpl! {
1263     impl<'tcx,T,U> TypeFoldable<'tcx> for ty::OutlivesPredicate<T,U> {
1264         a, b
1265     } where T : TypeFoldable<'tcx>, U : TypeFoldable<'tcx>,
1266 }
1267
1268 BraceStructTypeFoldableImpl! {
1269     impl<'tcx> TypeFoldable<'tcx> for ty::ClosureUpvar<'tcx> {
1270         res, span, ty
1271     }
1272 }
1273
1274 BraceStructTypeFoldableImpl! {
1275     impl<'tcx, T> TypeFoldable<'tcx> for ty::error::ExpectedFound<T> {
1276         expected, found
1277     } where T: TypeFoldable<'tcx>
1278 }
1279
1280 impl<'tcx, T: TypeFoldable<'tcx>, I: Idx> TypeFoldable<'tcx> for IndexVec<I, T> {
1281     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
1282         self.iter().map(|x| x.fold_with(folder)).collect()
1283     }
1284
1285     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
1286         self.iter().any(|t| t.visit_with(visitor))
1287     }
1288 }
1289
1290 EnumTypeFoldableImpl! {
1291     impl<'tcx> TypeFoldable<'tcx> for ty::error::TypeError<'tcx> {
1292         (ty::error::TypeError::Mismatch),
1293         (ty::error::TypeError::UnsafetyMismatch)(x),
1294         (ty::error::TypeError::AbiMismatch)(x),
1295         (ty::error::TypeError::Mutability),
1296         (ty::error::TypeError::TupleSize)(x),
1297         (ty::error::TypeError::ArgCount),
1298         (ty::error::TypeError::RegionsDoesNotOutlive)(a, b),
1299         (ty::error::TypeError::RegionsInsufficientlyPolymorphic)(a, b),
1300         (ty::error::TypeError::RegionsOverlyPolymorphic)(a, b),
1301         (ty::error::TypeError::RegionsPlaceholderMismatch),
1302         (ty::error::TypeError::IntMismatch)(x),
1303         (ty::error::TypeError::FloatMismatch)(x),
1304         (ty::error::TypeError::Traits)(x),
1305         (ty::error::TypeError::VariadicMismatch)(x),
1306         (ty::error::TypeError::CyclicTy)(t),
1307         (ty::error::TypeError::ProjectionMismatched)(x),
1308         (ty::error::TypeError::ProjectionBoundsLength)(x),
1309         (ty::error::TypeError::Sorts)(x),
1310         (ty::error::TypeError::ExistentialMismatch)(x),
1311         (ty::error::TypeError::ConstMismatch)(x),
1312     }
1313 }
1314
1315 impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::Const<'tcx> {
1316     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
1317         let ty = self.ty.fold_with(folder);
1318         let val = self.val.fold_with(folder);
1319         folder.tcx().mk_const(ty::Const {
1320             ty,
1321             val
1322         })
1323     }
1324
1325     fn fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
1326         folder.fold_const(*self)
1327     }
1328
1329     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
1330         self.ty.visit_with(visitor) || self.val.visit_with(visitor)
1331     }
1332
1333     fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
1334         visitor.visit_const(self)
1335     }
1336 }
1337
1338 impl<'tcx> TypeFoldable<'tcx> for ConstValue<'tcx> {
1339     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
1340         match *self {
1341             ConstValue::ByRef(ptr, alloc) => ConstValue::ByRef(ptr, alloc),
1342             ConstValue::Infer(ic) => ConstValue::Infer(ic.fold_with(folder)),
1343             ConstValue::Param(p) => ConstValue::Param(p.fold_with(folder)),
1344             ConstValue::Placeholder(p) => ConstValue::Placeholder(p),
1345             ConstValue::Scalar(a) => ConstValue::Scalar(a),
1346             ConstValue::Slice { data, start, end } => ConstValue::Slice { data, start, end },
1347             ConstValue::Unevaluated(did, substs)
1348                 => ConstValue::Unevaluated(did, substs.fold_with(folder)),
1349         }
1350     }
1351
1352     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
1353         match *self {
1354             ConstValue::ByRef(..) => false,
1355             ConstValue::Infer(ic) => ic.visit_with(visitor),
1356             ConstValue::Param(p) => p.visit_with(visitor),
1357             ConstValue::Placeholder(_) => false,
1358             ConstValue::Scalar(_) => false,
1359             ConstValue::Slice { .. } => false,
1360             ConstValue::Unevaluated(_, substs) => substs.visit_with(visitor),
1361         }
1362     }
1363 }
1364
1365 impl<'tcx> TypeFoldable<'tcx> for InferConst<'tcx> {
1366     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, _folder: &mut F) -> Self {
1367         *self
1368     }
1369
1370     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, _visitor: &mut V) -> bool {
1371         false
1372     }
1373 }