]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_middle/src/ty/mod.rs
Add polarity to TraitPredicate
[rust.git] / compiler / rustc_middle / src / ty / mod.rs
1 //! Defines how the compiler represents types internally.
2 //!
3 //! Two important entities in this module are:
4 //!
5 //! - [`rustc_middle::ty::Ty`], used to represent the semantics of a type.
6 //! - [`rustc_middle::ty::TyCtxt`], the central data structure in the compiler.
7 //!
8 //! For more information, see ["The `ty` module: representing types"] in the ructc-dev-guide.
9 //!
10 //! ["The `ty` module: representing types"]: https://rustc-dev-guide.rust-lang.org/ty.html
11
12 pub use self::fold::{TypeFoldable, TypeFolder, TypeVisitor};
13 pub use self::AssocItemContainer::*;
14 pub use self::BorrowKind::*;
15 pub use self::IntVarValue::*;
16 pub use self::Variance::*;
17 pub use adt::*;
18 pub use assoc::*;
19 pub use generics::*;
20 pub use vtable::*;
21
22 use crate::hir::exports::ExportMap;
23 use crate::mir::{Body, GeneratorLayout};
24 use crate::traits::{self, Reveal};
25 use crate::ty;
26 use crate::ty::subst::{GenericArg, InternalSubsts, Subst, SubstsRef};
27 use crate::ty::util::Discr;
28 use rustc_ast as ast;
29 use rustc_attr as attr;
30 use rustc_data_structures::fx::{FxHashMap, FxHashSet};
31 use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
32 use rustc_data_structures::tagged_ptr::CopyTaggedPtr;
33 use rustc_hir as hir;
34 use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
35 use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LocalDefIdMap, CRATE_DEF_INDEX};
36 use rustc_hir::Node;
37 use rustc_macros::HashStable;
38 use rustc_query_system::ich::StableHashingContext;
39 use rustc_session::cstore::CrateStoreDyn;
40 use rustc_span::symbol::{kw, Ident, Symbol};
41 use rustc_span::{sym, Span};
42 use rustc_target::abi::Align;
43
44 use std::cmp::Ordering;
45 use std::collections::BTreeMap;
46 use std::hash::{Hash, Hasher};
47 use std::ops::ControlFlow;
48 use std::{fmt, ptr, str};
49
50 pub use crate::ty::diagnostics::*;
51 pub use rustc_type_ir::InferTy::*;
52 pub use rustc_type_ir::*;
53
54 pub use self::binding::BindingMode;
55 pub use self::binding::BindingMode::*;
56 pub use self::closure::{
57     is_ancestor_or_same_capture, place_to_string_for_capture, BorrowKind, CaptureInfo,
58     CapturedPlace, ClosureKind, MinCaptureInformationMap, MinCaptureList,
59     RootVariableMinCaptureList, UpvarBorrow, UpvarCapture, UpvarCaptureMap, UpvarId, UpvarListMap,
60     UpvarPath, CAPTURE_STRUCT_LOCAL,
61 };
62 pub use self::consts::{Const, ConstInt, ConstKind, InferConst, ScalarInt, Unevaluated, ValTree};
63 pub use self::context::{
64     tls, CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations,
65     CtxtInterners, DelaySpanBugEmitted, FreeRegionInfo, GeneratorInteriorTypeCause, GlobalCtxt,
66     Lift, OnDiskCache, TyCtxt, TypeckResults, UserType, UserTypeAnnotationIndex,
67 };
68 pub use self::instance::{Instance, InstanceDef};
69 pub use self::list::List;
70 pub use self::sty::BoundRegionKind::*;
71 pub use self::sty::RegionKind::*;
72 pub use self::sty::TyKind::*;
73 pub use self::sty::{
74     Binder, BoundRegion, BoundRegionKind, BoundTy, BoundTyKind, BoundVar, BoundVariableKind,
75     CanonicalPolyFnSig, ClosureSubsts, ClosureSubstsParts, ConstVid, EarlyBoundRegion,
76     ExistentialPredicate, ExistentialProjection, ExistentialTraitRef, FnSig, FreeRegion, GenSig,
77     GeneratorSubsts, GeneratorSubstsParts, ParamConst, ParamTy, PolyExistentialProjection,
78     PolyExistentialTraitRef, PolyFnSig, PolyGenSig, PolyTraitRef, ProjectionTy, Region, RegionKind,
79     RegionVid, TraitRef, TyKind, TypeAndMut, UpvarSubsts, VarianceDiagInfo, VarianceDiagMutKind,
80 };
81 pub use self::trait_def::TraitDef;
82
83 pub mod _match;
84 pub mod adjustment;
85 pub mod binding;
86 pub mod cast;
87 pub mod codec;
88 pub mod error;
89 pub mod fast_reject;
90 pub mod flags;
91 pub mod fold;
92 pub mod inhabitedness;
93 pub mod layout;
94 pub mod normalize_erasing_regions;
95 pub mod outlives;
96 pub mod print;
97 pub mod query;
98 pub mod relate;
99 pub mod subst;
100 pub mod trait_def;
101 pub mod util;
102 pub mod vtable;
103 pub mod walk;
104
105 mod adt;
106 mod assoc;
107 mod closure;
108 mod consts;
109 mod context;
110 mod diagnostics;
111 mod erase_regions;
112 mod generics;
113 mod impls_ty;
114 mod instance;
115 mod list;
116 mod structural_impls;
117 mod sty;
118
119 // Data types
120
121 #[derive(Debug)]
122 pub struct ResolverOutputs {
123     pub definitions: rustc_hir::definitions::Definitions,
124     pub cstore: Box<CrateStoreDyn>,
125     pub visibilities: FxHashMap<LocalDefId, Visibility>,
126     pub extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
127     pub maybe_unused_trait_imports: FxHashSet<LocalDefId>,
128     pub maybe_unused_extern_crates: Vec<(LocalDefId, Span)>,
129     pub export_map: ExportMap,
130     pub glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>,
131     /// Extern prelude entries. The value is `true` if the entry was introduced
132     /// via `extern crate` item and not `--extern` option or compiler built-in.
133     pub extern_prelude: FxHashMap<Symbol, bool>,
134     pub main_def: Option<MainDefinition>,
135     pub trait_impls: BTreeMap<DefId, Vec<LocalDefId>>,
136     /// A list of proc macro LocalDefIds, written out in the order in which
137     /// they are declared in the static array generated by proc_macro_harness.
138     pub proc_macros: Vec<LocalDefId>,
139     /// Mapping from ident span to path span for paths that don't exist as written, but that
140     /// exist under `std`. For example, wrote `str::from_utf8` instead of `std::str::from_utf8`.
141     pub confused_type_with_std_module: FxHashMap<Span, Span>,
142 }
143
144 #[derive(Clone, Copy, Debug)]
145 pub struct MainDefinition {
146     pub res: Res<ast::NodeId>,
147     pub is_import: bool,
148     pub span: Span,
149 }
150
151 impl MainDefinition {
152     pub fn opt_fn_def_id(self) -> Option<DefId> {
153         if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
154     }
155 }
156
157 /// The "header" of an impl is everything outside the body: a Self type, a trait
158 /// ref (in the case of a trait impl), and a set of predicates (from the
159 /// bounds / where-clauses).
160 #[derive(Clone, Debug, TypeFoldable)]
161 pub struct ImplHeader<'tcx> {
162     pub impl_def_id: DefId,
163     pub self_ty: Ty<'tcx>,
164     pub trait_ref: Option<TraitRef<'tcx>>,
165     pub predicates: Vec<Predicate<'tcx>>,
166 }
167
168 #[derive(
169     Copy,
170     Clone,
171     PartialEq,
172     Eq,
173     Hash,
174     TyEncodable,
175     TyDecodable,
176     HashStable,
177     Debug,
178     TypeFoldable
179 )]
180 pub enum ImplPolarity {
181     /// `impl Trait for Type`
182     Positive,
183     /// `impl !Trait for Type`
184     Negative,
185     /// `#[rustc_reservation_impl] impl Trait for Type`
186     ///
187     /// This is a "stability hack", not a real Rust feature.
188     /// See #64631 for details.
189     Reservation,
190 }
191
192 impl ImplPolarity {
193     pub fn flip(&self) -> Option<ImplPolarity> {
194         match self {
195             ImplPolarity::Positive => Some(ImplPolarity::Negative),
196             ImplPolarity::Negative => Some(ImplPolarity::Positive),
197             ImplPolarity::Reservation => None,
198         }
199     }
200 }
201
202 impl fmt::Display for ImplPolarity {
203     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
204         match self {
205             Self::Positive => f.write_str("positive"),
206             Self::Negative => f.write_str("negative"),
207             Self::Reservation => f.write_str("reservation"),
208         }
209     }
210 }
211
212 #[derive(Clone, Debug, PartialEq, Eq, Copy, Hash, TyEncodable, TyDecodable, HashStable)]
213 pub enum Visibility {
214     /// Visible everywhere (including in other crates).
215     Public,
216     /// Visible only in the given crate-local module.
217     Restricted(DefId),
218     /// Not visible anywhere in the local crate. This is the visibility of private external items.
219     Invisible,
220 }
221
222 #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, HashStable, TyEncodable, TyDecodable)]
223 pub enum BoundConstness {
224     /// `T: Trait`
225     NotConst,
226     /// `T: ~const Trait`
227     ///
228     /// Requires resolving to const only when we are in a const context.
229     ConstIfConst,
230 }
231
232 impl fmt::Display for BoundConstness {
233     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
234         match self {
235             Self::NotConst => f.write_str("normal"),
236             Self::ConstIfConst => f.write_str("`~const`"),
237         }
238     }
239 }
240
241 #[derive(
242     Clone,
243     Debug,
244     PartialEq,
245     Eq,
246     Copy,
247     Hash,
248     TyEncodable,
249     TyDecodable,
250     HashStable,
251     TypeFoldable
252 )]
253 pub struct ClosureSizeProfileData<'tcx> {
254     /// Tuple containing the types of closure captures before the feature `capture_disjoint_fields`
255     pub before_feature_tys: Ty<'tcx>,
256     /// Tuple containing the types of closure captures after the feature `capture_disjoint_fields`
257     pub after_feature_tys: Ty<'tcx>,
258 }
259
260 pub trait DefIdTree: Copy {
261     fn parent(self, id: DefId) -> Option<DefId>;
262
263     fn is_descendant_of(self, mut descendant: DefId, ancestor: DefId) -> bool {
264         if descendant.krate != ancestor.krate {
265             return false;
266         }
267
268         while descendant != ancestor {
269             match self.parent(descendant) {
270                 Some(parent) => descendant = parent,
271                 None => return false,
272             }
273         }
274         true
275     }
276 }
277
278 impl<'tcx> DefIdTree for TyCtxt<'tcx> {
279     fn parent(self, id: DefId) -> Option<DefId> {
280         self.def_key(id).parent.map(|index| DefId { index, ..id })
281     }
282 }
283
284 impl Visibility {
285     pub fn from_hir(visibility: &hir::Visibility<'_>, id: hir::HirId, tcx: TyCtxt<'_>) -> Self {
286         match visibility.node {
287             hir::VisibilityKind::Public => Visibility::Public,
288             hir::VisibilityKind::Crate(_) => Visibility::Restricted(DefId::local(CRATE_DEF_INDEX)),
289             hir::VisibilityKind::Restricted { ref path, .. } => match path.res {
290                 // If there is no resolution, `resolve` will have already reported an error, so
291                 // assume that the visibility is public to avoid reporting more privacy errors.
292                 Res::Err => Visibility::Public,
293                 def => Visibility::Restricted(def.def_id()),
294             },
295             hir::VisibilityKind::Inherited => {
296                 Visibility::Restricted(tcx.parent_module(id).to_def_id())
297             }
298         }
299     }
300
301     /// Returns `true` if an item with this visibility is accessible from the given block.
302     pub fn is_accessible_from<T: DefIdTree>(self, module: DefId, tree: T) -> bool {
303         let restriction = match self {
304             // Public items are visible everywhere.
305             Visibility::Public => return true,
306             // Private items from other crates are visible nowhere.
307             Visibility::Invisible => return false,
308             // Restricted items are visible in an arbitrary local module.
309             Visibility::Restricted(other) if other.krate != module.krate => return false,
310             Visibility::Restricted(module) => module,
311         };
312
313         tree.is_descendant_of(module, restriction)
314     }
315
316     /// Returns `true` if this visibility is at least as accessible as the given visibility
317     pub fn is_at_least<T: DefIdTree>(self, vis: Visibility, tree: T) -> bool {
318         let vis_restriction = match vis {
319             Visibility::Public => return self == Visibility::Public,
320             Visibility::Invisible => return true,
321             Visibility::Restricted(module) => module,
322         };
323
324         self.is_accessible_from(vis_restriction, tree)
325     }
326
327     // Returns `true` if this item is visible anywhere in the local crate.
328     pub fn is_visible_locally(self) -> bool {
329         match self {
330             Visibility::Public => true,
331             Visibility::Restricted(def_id) => def_id.is_local(),
332             Visibility::Invisible => false,
333         }
334     }
335 }
336
337 /// The crate variances map is computed during typeck and contains the
338 /// variance of every item in the local crate. You should not use it
339 /// directly, because to do so will make your pass dependent on the
340 /// HIR of every item in the local crate. Instead, use
341 /// `tcx.variances_of()` to get the variance for a *particular*
342 /// item.
343 #[derive(HashStable, Debug)]
344 pub struct CrateVariancesMap<'tcx> {
345     /// For each item with generics, maps to a vector of the variance
346     /// of its generics. If an item has no generics, it will have no
347     /// entry.
348     pub variances: FxHashMap<DefId, &'tcx [ty::Variance]>,
349 }
350
351 // Contains information needed to resolve types and (in the future) look up
352 // the types of AST nodes.
353 #[derive(Copy, Clone, PartialEq, Eq, Hash)]
354 pub struct CReaderCacheKey {
355     pub cnum: Option<CrateNum>,
356     pub pos: usize,
357 }
358
359 #[allow(rustc::usage_of_ty_tykind)]
360 pub struct TyS<'tcx> {
361     /// This field shouldn't be used directly and may be removed in the future.
362     /// Use `TyS::kind()` instead.
363     kind: TyKind<'tcx>,
364     /// This field shouldn't be used directly and may be removed in the future.
365     /// Use `TyS::flags()` instead.
366     flags: TypeFlags,
367
368     /// This is a kind of confusing thing: it stores the smallest
369     /// binder such that
370     ///
371     /// (a) the binder itself captures nothing but
372     /// (b) all the late-bound things within the type are captured
373     ///     by some sub-binder.
374     ///
375     /// So, for a type without any late-bound things, like `u32`, this
376     /// will be *innermost*, because that is the innermost binder that
377     /// captures nothing. But for a type `&'D u32`, where `'D` is a
378     /// late-bound region with De Bruijn index `D`, this would be `D + 1`
379     /// -- the binder itself does not capture `D`, but `D` is captured
380     /// by an inner binder.
381     ///
382     /// We call this concept an "exclusive" binder `D` because all
383     /// De Bruijn indices within the type are contained within `0..D`
384     /// (exclusive).
385     outer_exclusive_binder: ty::DebruijnIndex,
386 }
387
388 impl<'tcx> TyS<'tcx> {
389     /// A constructor used only for internal testing.
390     #[allow(rustc::usage_of_ty_tykind)]
391     pub fn make_for_test(
392         kind: TyKind<'tcx>,
393         flags: TypeFlags,
394         outer_exclusive_binder: ty::DebruijnIndex,
395     ) -> TyS<'tcx> {
396         TyS { kind, flags, outer_exclusive_binder }
397     }
398 }
399
400 // `TyS` is used a lot. Make sure it doesn't unintentionally get bigger.
401 #[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
402 static_assert_size!(TyS<'_>, 40);
403
404 impl<'tcx> Ord for TyS<'tcx> {
405     fn cmp(&self, other: &TyS<'tcx>) -> Ordering {
406         self.kind().cmp(other.kind())
407     }
408 }
409
410 impl<'tcx> PartialOrd for TyS<'tcx> {
411     fn partial_cmp(&self, other: &TyS<'tcx>) -> Option<Ordering> {
412         Some(self.kind().cmp(other.kind()))
413     }
414 }
415
416 impl<'tcx> PartialEq for TyS<'tcx> {
417     #[inline]
418     fn eq(&self, other: &TyS<'tcx>) -> bool {
419         ptr::eq(self, other)
420     }
421 }
422 impl<'tcx> Eq for TyS<'tcx> {}
423
424 impl<'tcx> Hash for TyS<'tcx> {
425     fn hash<H: Hasher>(&self, s: &mut H) {
426         (self as *const TyS<'_>).hash(s)
427     }
428 }
429
430 impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for TyS<'tcx> {
431     fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
432         let ty::TyS {
433             ref kind,
434
435             // The other fields just provide fast access to information that is
436             // also contained in `kind`, so no need to hash them.
437             flags: _,
438
439             outer_exclusive_binder: _,
440         } = *self;
441
442         kind.hash_stable(hcx, hasher);
443     }
444 }
445
446 #[rustc_diagnostic_item = "Ty"]
447 pub type Ty<'tcx> = &'tcx TyS<'tcx>;
448
449 impl ty::EarlyBoundRegion {
450     /// Does this early bound region have a name? Early bound regions normally
451     /// always have names except when using anonymous lifetimes (`'_`).
452     pub fn has_name(&self) -> bool {
453         self.name != kw::UnderscoreLifetime
454     }
455 }
456
457 #[derive(Debug)]
458 crate struct PredicateInner<'tcx> {
459     kind: Binder<'tcx, PredicateKind<'tcx>>,
460     flags: TypeFlags,
461     /// See the comment for the corresponding field of [TyS].
462     outer_exclusive_binder: ty::DebruijnIndex,
463 }
464
465 #[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
466 static_assert_size!(PredicateInner<'_>, 48);
467
468 #[derive(Clone, Copy, Lift)]
469 pub struct Predicate<'tcx> {
470     inner: &'tcx PredicateInner<'tcx>,
471 }
472
473 impl<'tcx> PartialEq for Predicate<'tcx> {
474     fn eq(&self, other: &Self) -> bool {
475         // `self.kind` is always interned.
476         ptr::eq(self.inner, other.inner)
477     }
478 }
479
480 impl Hash for Predicate<'_> {
481     fn hash<H: Hasher>(&self, s: &mut H) {
482         (self.inner as *const PredicateInner<'_>).hash(s)
483     }
484 }
485
486 impl<'tcx> Eq for Predicate<'tcx> {}
487
488 impl<'tcx> Predicate<'tcx> {
489     /// Gets the inner `Binder<'tcx, PredicateKind<'tcx>>`.
490     #[inline]
491     pub fn kind(self) -> Binder<'tcx, PredicateKind<'tcx>> {
492         self.inner.kind
493     }
494
495     pub fn flip_polarity(&self, tcx: TyCtxt<'tcx>) -> Option<Predicate<'tcx>> {
496         let kind = self
497             .inner
498             .kind
499             .map_bound(|kind| match kind {
500                 PredicateKind::Trait(TraitPredicate { trait_ref, constness, polarity }) => {
501                     Some(PredicateKind::Trait(TraitPredicate {
502                         trait_ref,
503                         constness,
504                         polarity: polarity.flip()?,
505                     }))
506                 }
507
508                 _ => None,
509             })
510             .transpose()?;
511
512         Some(tcx.mk_predicate(kind))
513     }
514 }
515
516 impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for Predicate<'tcx> {
517     fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
518         let PredicateInner {
519             ref kind,
520
521             // The other fields just provide fast access to information that is
522             // also contained in `kind`, so no need to hash them.
523             flags: _,
524             outer_exclusive_binder: _,
525         } = self.inner;
526
527         kind.hash_stable(hcx, hasher);
528     }
529 }
530
531 #[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
532 #[derive(HashStable, TypeFoldable)]
533 pub enum PredicateKind<'tcx> {
534     /// Corresponds to `where Foo: Bar<A, B, C>`. `Foo` here would be
535     /// the `Self` type of the trait reference and `A`, `B`, and `C`
536     /// would be the type parameters.
537     Trait(TraitPredicate<'tcx>),
538
539     /// `where 'a: 'b`
540     RegionOutlives(RegionOutlivesPredicate<'tcx>),
541
542     /// `where T: 'a`
543     TypeOutlives(TypeOutlivesPredicate<'tcx>),
544
545     /// `where <T as TraitRef>::Name == X`, approximately.
546     /// See the `ProjectionPredicate` struct for details.
547     Projection(ProjectionPredicate<'tcx>),
548
549     /// No syntax: `T` well-formed.
550     WellFormed(GenericArg<'tcx>),
551
552     /// Trait must be object-safe.
553     ObjectSafe(DefId),
554
555     /// No direct syntax. May be thought of as `where T: FnFoo<...>`
556     /// for some substitutions `...` and `T` being a closure type.
557     /// Satisfied (or refuted) once we know the closure's kind.
558     ClosureKind(DefId, SubstsRef<'tcx>, ClosureKind),
559
560     /// `T1 <: T2`
561     ///
562     /// This obligation is created most often when we have two
563     /// unresolved type variables and hence don't have enough
564     /// information to process the subtyping obligation yet.
565     Subtype(SubtypePredicate<'tcx>),
566
567     /// `T1` coerced to `T2`
568     ///
569     /// Like a subtyping obligation, this is created most often
570     /// when we have two unresolved type variables and hence
571     /// don't have enough information to process the coercion
572     /// obligation yet. At the moment, we actually process coercions
573     /// very much like subtyping and don't handle the full coercion
574     /// logic.
575     Coerce(CoercePredicate<'tcx>),
576
577     /// Constant initializer must evaluate successfully.
578     ConstEvaluatable(ty::Unevaluated<'tcx, ()>),
579
580     /// Constants must be equal. The first component is the const that is expected.
581     ConstEquate(&'tcx Const<'tcx>, &'tcx Const<'tcx>),
582
583     /// Represents a type found in the environment that we can use for implied bounds.
584     ///
585     /// Only used for Chalk.
586     TypeWellFormedFromEnv(Ty<'tcx>),
587 }
588
589 /// The crate outlives map is computed during typeck and contains the
590 /// outlives of every item in the local crate. You should not use it
591 /// directly, because to do so will make your pass dependent on the
592 /// HIR of every item in the local crate. Instead, use
593 /// `tcx.inferred_outlives_of()` to get the outlives for a *particular*
594 /// item.
595 #[derive(HashStable, Debug)]
596 pub struct CratePredicatesMap<'tcx> {
597     /// For each struct with outlive bounds, maps to a vector of the
598     /// predicate of its outlive bounds. If an item has no outlives
599     /// bounds, it will have no entry.
600     pub predicates: FxHashMap<DefId, &'tcx [(Predicate<'tcx>, Span)]>,
601 }
602
603 impl<'tcx> Predicate<'tcx> {
604     /// Performs a substitution suitable for going from a
605     /// poly-trait-ref to supertraits that must hold if that
606     /// poly-trait-ref holds. This is slightly different from a normal
607     /// substitution in terms of what happens with bound regions. See
608     /// lengthy comment below for details.
609     pub fn subst_supertrait(
610         self,
611         tcx: TyCtxt<'tcx>,
612         trait_ref: &ty::PolyTraitRef<'tcx>,
613     ) -> Predicate<'tcx> {
614         // The interaction between HRTB and supertraits is not entirely
615         // obvious. Let me walk you (and myself) through an example.
616         //
617         // Let's start with an easy case. Consider two traits:
618         //
619         //     trait Foo<'a>: Bar<'a,'a> { }
620         //     trait Bar<'b,'c> { }
621         //
622         // Now, if we have a trait reference `for<'x> T: Foo<'x>`, then
623         // we can deduce that `for<'x> T: Bar<'x,'x>`. Basically, if we
624         // knew that `Foo<'x>` (for any 'x) then we also know that
625         // `Bar<'x,'x>` (for any 'x). This more-or-less falls out from
626         // normal substitution.
627         //
628         // In terms of why this is sound, the idea is that whenever there
629         // is an impl of `T:Foo<'a>`, it must show that `T:Bar<'a,'a>`
630         // holds.  So if there is an impl of `T:Foo<'a>` that applies to
631         // all `'a`, then we must know that `T:Bar<'a,'a>` holds for all
632         // `'a`.
633         //
634         // Another example to be careful of is this:
635         //
636         //     trait Foo1<'a>: for<'b> Bar1<'a,'b> { }
637         //     trait Bar1<'b,'c> { }
638         //
639         // Here, if we have `for<'x> T: Foo1<'x>`, then what do we know?
640         // The answer is that we know `for<'x,'b> T: Bar1<'x,'b>`. The
641         // reason is similar to the previous example: any impl of
642         // `T:Foo1<'x>` must show that `for<'b> T: Bar1<'x, 'b>`.  So
643         // basically we would want to collapse the bound lifetimes from
644         // the input (`trait_ref`) and the supertraits.
645         //
646         // To achieve this in practice is fairly straightforward. Let's
647         // consider the more complicated scenario:
648         //
649         // - We start out with `for<'x> T: Foo1<'x>`. In this case, `'x`
650         //   has a De Bruijn index of 1. We want to produce `for<'x,'b> T: Bar1<'x,'b>`,
651         //   where both `'x` and `'b` would have a DB index of 1.
652         //   The substitution from the input trait-ref is therefore going to be
653         //   `'a => 'x` (where `'x` has a DB index of 1).
654         // - The supertrait-ref is `for<'b> Bar1<'a,'b>`, where `'a` is an
655         //   early-bound parameter and `'b' is a late-bound parameter with a
656         //   DB index of 1.
657         // - If we replace `'a` with `'x` from the input, it too will have
658         //   a DB index of 1, and thus we'll have `for<'x,'b> Bar1<'x,'b>`
659         //   just as we wanted.
660         //
661         // There is only one catch. If we just apply the substitution `'a
662         // => 'x` to `for<'b> Bar1<'a,'b>`, the substitution code will
663         // adjust the DB index because we substituting into a binder (it
664         // tries to be so smart...) resulting in `for<'x> for<'b>
665         // Bar1<'x,'b>` (we have no syntax for this, so use your
666         // imagination). Basically the 'x will have DB index of 2 and 'b
667         // will have DB index of 1. Not quite what we want. So we apply
668         // the substitution to the *contents* of the trait reference,
669         // rather than the trait reference itself (put another way, the
670         // substitution code expects equal binding levels in the values
671         // from the substitution and the value being substituted into, and
672         // this trick achieves that).
673
674         // Working through the second example:
675         // trait_ref: for<'x> T: Foo1<'^0.0>; substs: [T, '^0.0]
676         // predicate: for<'b> Self: Bar1<'a, '^0.0>; substs: [Self, 'a, '^0.0]
677         // We want to end up with:
678         //     for<'x, 'b> T: Bar1<'^0.0, '^0.1>
679         // To do this:
680         // 1) We must shift all bound vars in predicate by the length
681         //    of trait ref's bound vars. So, we would end up with predicate like
682         //    Self: Bar1<'a, '^0.1>
683         // 2) We can then apply the trait substs to this, ending up with
684         //    T: Bar1<'^0.0, '^0.1>
685         // 3) Finally, to create the final bound vars, we concatenate the bound
686         //    vars of the trait ref with those of the predicate:
687         //    ['x, 'b]
688         let bound_pred = self.kind();
689         let pred_bound_vars = bound_pred.bound_vars();
690         let trait_bound_vars = trait_ref.bound_vars();
691         // 1) Self: Bar1<'a, '^0.0> -> Self: Bar1<'a, '^0.1>
692         let shifted_pred =
693             tcx.shift_bound_var_indices(trait_bound_vars.len(), bound_pred.skip_binder());
694         // 2) Self: Bar1<'a, '^0.1> -> T: Bar1<'^0.0, '^0.1>
695         let new = shifted_pred.subst(tcx, trait_ref.skip_binder().substs);
696         // 3) ['x] + ['b] -> ['x, 'b]
697         let bound_vars =
698             tcx.mk_bound_variable_kinds(trait_bound_vars.iter().chain(pred_bound_vars));
699         tcx.reuse_or_mk_predicate(self, ty::Binder::bind_with_vars(new, bound_vars))
700     }
701 }
702
703 #[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
704 #[derive(HashStable, TypeFoldable)]
705 pub struct TraitPredicate<'tcx> {
706     pub trait_ref: TraitRef<'tcx>,
707
708     pub constness: BoundConstness,
709
710     pub polarity: ImplPolarity,
711 }
712
713 pub type PolyTraitPredicate<'tcx> = ty::Binder<'tcx, TraitPredicate<'tcx>>;
714
715 impl<'tcx> TraitPredicate<'tcx> {
716     pub fn def_id(self) -> DefId {
717         self.trait_ref.def_id
718     }
719
720     pub fn self_ty(self) -> Ty<'tcx> {
721         self.trait_ref.self_ty()
722     }
723 }
724
725 impl<'tcx> PolyTraitPredicate<'tcx> {
726     pub fn def_id(self) -> DefId {
727         // Ok to skip binder since trait `DefId` does not care about regions.
728         self.skip_binder().def_id()
729     }
730
731     pub fn self_ty(self) -> ty::Binder<'tcx, Ty<'tcx>> {
732         self.map_bound(|trait_ref| trait_ref.self_ty())
733     }
734 }
735
736 #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, TyEncodable, TyDecodable)]
737 #[derive(HashStable, TypeFoldable)]
738 pub struct OutlivesPredicate<A, B>(pub A, pub B); // `A: B`
739 pub type RegionOutlivesPredicate<'tcx> = OutlivesPredicate<ty::Region<'tcx>, ty::Region<'tcx>>;
740 pub type TypeOutlivesPredicate<'tcx> = OutlivesPredicate<Ty<'tcx>, ty::Region<'tcx>>;
741 pub type PolyRegionOutlivesPredicate<'tcx> = ty::Binder<'tcx, RegionOutlivesPredicate<'tcx>>;
742 pub type PolyTypeOutlivesPredicate<'tcx> = ty::Binder<'tcx, TypeOutlivesPredicate<'tcx>>;
743
744 /// Encodes that `a` must be a subtype of `b`. The `a_is_expected` flag indicates
745 /// whether the `a` type is the type that we should label as "expected" when
746 /// presenting user diagnostics.
747 #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, TyEncodable, TyDecodable)]
748 #[derive(HashStable, TypeFoldable)]
749 pub struct SubtypePredicate<'tcx> {
750     pub a_is_expected: bool,
751     pub a: Ty<'tcx>,
752     pub b: Ty<'tcx>,
753 }
754 pub type PolySubtypePredicate<'tcx> = ty::Binder<'tcx, SubtypePredicate<'tcx>>;
755
756 /// Encodes that we have to coerce *from* the `a` type to the `b` type.
757 #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, TyEncodable, TyDecodable)]
758 #[derive(HashStable, TypeFoldable)]
759 pub struct CoercePredicate<'tcx> {
760     pub a: Ty<'tcx>,
761     pub b: Ty<'tcx>,
762 }
763 pub type PolyCoercePredicate<'tcx> = ty::Binder<'tcx, CoercePredicate<'tcx>>;
764
765 /// This kind of predicate has no *direct* correspondent in the
766 /// syntax, but it roughly corresponds to the syntactic forms:
767 ///
768 /// 1. `T: TraitRef<..., Item = Type>`
769 /// 2. `<T as TraitRef<...>>::Item == Type` (NYI)
770 ///
771 /// In particular, form #1 is "desugared" to the combination of a
772 /// normal trait predicate (`T: TraitRef<...>`) and one of these
773 /// predicates. Form #2 is a broader form in that it also permits
774 /// equality between arbitrary types. Processing an instance of
775 /// Form #2 eventually yields one of these `ProjectionPredicate`
776 /// instances to normalize the LHS.
777 #[derive(Copy, Clone, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
778 #[derive(HashStable, TypeFoldable)]
779 pub struct ProjectionPredicate<'tcx> {
780     pub projection_ty: ProjectionTy<'tcx>,
781     pub ty: Ty<'tcx>,
782 }
783
784 pub type PolyProjectionPredicate<'tcx> = Binder<'tcx, ProjectionPredicate<'tcx>>;
785
786 impl<'tcx> PolyProjectionPredicate<'tcx> {
787     /// Returns the `DefId` of the trait of the associated item being projected.
788     #[inline]
789     pub fn trait_def_id(&self, tcx: TyCtxt<'tcx>) -> DefId {
790         self.skip_binder().projection_ty.trait_def_id(tcx)
791     }
792
793     /// Get the [PolyTraitRef] required for this projection to be well formed.
794     /// Note that for generic associated types the predicates of the associated
795     /// type also need to be checked.
796     #[inline]
797     pub fn required_poly_trait_ref(&self, tcx: TyCtxt<'tcx>) -> PolyTraitRef<'tcx> {
798         // Note: unlike with `TraitRef::to_poly_trait_ref()`,
799         // `self.0.trait_ref` is permitted to have escaping regions.
800         // This is because here `self` has a `Binder` and so does our
801         // return value, so we are preserving the number of binding
802         // levels.
803         self.map_bound(|predicate| predicate.projection_ty.trait_ref(tcx))
804     }
805
806     pub fn ty(&self) -> Binder<'tcx, Ty<'tcx>> {
807         self.map_bound(|predicate| predicate.ty)
808     }
809
810     /// The `DefId` of the `TraitItem` for the associated type.
811     ///
812     /// Note that this is not the `DefId` of the `TraitRef` containing this
813     /// associated type, which is in `tcx.associated_item(projection_def_id()).container`.
814     pub fn projection_def_id(&self) -> DefId {
815         // Ok to skip binder since trait `DefId` does not care about regions.
816         self.skip_binder().projection_ty.item_def_id
817     }
818 }
819
820 pub trait ToPolyTraitRef<'tcx> {
821     fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx>;
822 }
823
824 impl<'tcx> ToPolyTraitRef<'tcx> for PolyTraitPredicate<'tcx> {
825     fn to_poly_trait_ref(&self) -> PolyTraitRef<'tcx> {
826         self.map_bound_ref(|trait_pred| trait_pred.trait_ref)
827     }
828 }
829
830 pub trait ToPredicate<'tcx> {
831     fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx>;
832 }
833
834 impl ToPredicate<'tcx> for Binder<'tcx, PredicateKind<'tcx>> {
835     #[inline(always)]
836     fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
837         tcx.mk_predicate(self)
838     }
839 }
840
841 impl<'tcx> ToPredicate<'tcx> for ConstnessAnd<PolyTraitRef<'tcx>> {
842     fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
843         self.value
844             .map_bound(|trait_ref| {
845                 PredicateKind::Trait(ty::TraitPredicate {
846                     trait_ref,
847                     constness: self.constness,
848                     polarity: ty::ImplPolarity::Positive,
849                 })
850             })
851             .to_predicate(tcx)
852     }
853 }
854
855 impl<'tcx> ToPredicate<'tcx> for PolyTraitPredicate<'tcx> {
856     fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
857         self.map_bound(PredicateKind::Trait).to_predicate(tcx)
858     }
859 }
860
861 impl<'tcx> ToPredicate<'tcx> for PolyRegionOutlivesPredicate<'tcx> {
862     fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
863         self.map_bound(PredicateKind::RegionOutlives).to_predicate(tcx)
864     }
865 }
866
867 impl<'tcx> ToPredicate<'tcx> for PolyTypeOutlivesPredicate<'tcx> {
868     fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
869         self.map_bound(PredicateKind::TypeOutlives).to_predicate(tcx)
870     }
871 }
872
873 impl<'tcx> ToPredicate<'tcx> for PolyProjectionPredicate<'tcx> {
874     fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> {
875         self.map_bound(PredicateKind::Projection).to_predicate(tcx)
876     }
877 }
878
879 impl<'tcx> Predicate<'tcx> {
880     pub fn to_opt_poly_trait_ref(self) -> Option<ConstnessAnd<PolyTraitRef<'tcx>>> {
881         let predicate = self.kind();
882         match predicate.skip_binder() {
883             PredicateKind::Trait(t) => {
884                 Some(ConstnessAnd { constness: t.constness, value: predicate.rebind(t.trait_ref) })
885             }
886             PredicateKind::Projection(..)
887             | PredicateKind::Subtype(..)
888             | PredicateKind::Coerce(..)
889             | PredicateKind::RegionOutlives(..)
890             | PredicateKind::WellFormed(..)
891             | PredicateKind::ObjectSafe(..)
892             | PredicateKind::ClosureKind(..)
893             | PredicateKind::TypeOutlives(..)
894             | PredicateKind::ConstEvaluatable(..)
895             | PredicateKind::ConstEquate(..)
896             | PredicateKind::TypeWellFormedFromEnv(..) => None,
897         }
898     }
899
900     pub fn to_opt_type_outlives(self) -> Option<PolyTypeOutlivesPredicate<'tcx>> {
901         let predicate = self.kind();
902         match predicate.skip_binder() {
903             PredicateKind::TypeOutlives(data) => Some(predicate.rebind(data)),
904             PredicateKind::Trait(..)
905             | PredicateKind::Projection(..)
906             | PredicateKind::Subtype(..)
907             | PredicateKind::Coerce(..)
908             | PredicateKind::RegionOutlives(..)
909             | PredicateKind::WellFormed(..)
910             | PredicateKind::ObjectSafe(..)
911             | PredicateKind::ClosureKind(..)
912             | PredicateKind::ConstEvaluatable(..)
913             | PredicateKind::ConstEquate(..)
914             | PredicateKind::TypeWellFormedFromEnv(..) => None,
915         }
916     }
917 }
918
919 /// Represents the bounds declared on a particular set of type
920 /// parameters. Should eventually be generalized into a flag list of
921 /// where-clauses. You can obtain an `InstantiatedPredicates` list from a
922 /// `GenericPredicates` by using the `instantiate` method. Note that this method
923 /// reflects an important semantic invariant of `InstantiatedPredicates`: while
924 /// the `GenericPredicates` are expressed in terms of the bound type
925 /// parameters of the impl/trait/whatever, an `InstantiatedPredicates` instance
926 /// represented a set of bounds for some particular instantiation,
927 /// meaning that the generic parameters have been substituted with
928 /// their values.
929 ///
930 /// Example:
931 ///
932 ///     struct Foo<T, U: Bar<T>> { ... }
933 ///
934 /// Here, the `GenericPredicates` for `Foo` would contain a list of bounds like
935 /// `[[], [U:Bar<T>]]`. Now if there were some particular reference
936 /// like `Foo<isize,usize>`, then the `InstantiatedPredicates` would be `[[],
937 /// [usize:Bar<isize>]]`.
938 #[derive(Clone, Debug, TypeFoldable)]
939 pub struct InstantiatedPredicates<'tcx> {
940     pub predicates: Vec<Predicate<'tcx>>,
941     pub spans: Vec<Span>,
942 }
943
944 impl<'tcx> InstantiatedPredicates<'tcx> {
945     pub fn empty() -> InstantiatedPredicates<'tcx> {
946         InstantiatedPredicates { predicates: vec![], spans: vec![] }
947     }
948
949     pub fn is_empty(&self) -> bool {
950         self.predicates.is_empty()
951     }
952 }
953
954 #[derive(Copy, Clone, Debug, PartialEq, Eq, HashStable, TyEncodable, TyDecodable, TypeFoldable)]
955 pub struct OpaqueTypeKey<'tcx> {
956     pub def_id: DefId,
957     pub substs: SubstsRef<'tcx>,
958 }
959
960 rustc_index::newtype_index! {
961     /// "Universes" are used during type- and trait-checking in the
962     /// presence of `for<..>` binders to control what sets of names are
963     /// visible. Universes are arranged into a tree: the root universe
964     /// contains names that are always visible. Each child then adds a new
965     /// set of names that are visible, in addition to those of its parent.
966     /// We say that the child universe "extends" the parent universe with
967     /// new names.
968     ///
969     /// To make this more concrete, consider this program:
970     ///
971     /// ```
972     /// struct Foo { }
973     /// fn bar<T>(x: T) {
974     ///   let y: for<'a> fn(&'a u8, Foo) = ...;
975     /// }
976     /// ```
977     ///
978     /// The struct name `Foo` is in the root universe U0. But the type
979     /// parameter `T`, introduced on `bar`, is in an extended universe U1
980     /// -- i.e., within `bar`, we can name both `T` and `Foo`, but outside
981     /// of `bar`, we cannot name `T`. Then, within the type of `y`, the
982     /// region `'a` is in a universe U2 that extends U1, because we can
983     /// name it inside the fn type but not outside.
984     ///
985     /// Universes are used to do type- and trait-checking around these
986     /// "forall" binders (also called **universal quantification**). The
987     /// idea is that when, in the body of `bar`, we refer to `T` as a
988     /// type, we aren't referring to any type in particular, but rather a
989     /// kind of "fresh" type that is distinct from all other types we have
990     /// actually declared. This is called a **placeholder** type, and we
991     /// use universes to talk about this. In other words, a type name in
992     /// universe 0 always corresponds to some "ground" type that the user
993     /// declared, but a type name in a non-zero universe is a placeholder
994     /// type -- an idealized representative of "types in general" that we
995     /// use for checking generic functions.
996     pub struct UniverseIndex {
997         derive [HashStable]
998         DEBUG_FORMAT = "U{}",
999     }
1000 }
1001
1002 impl UniverseIndex {
1003     pub const ROOT: UniverseIndex = UniverseIndex::from_u32(0);
1004
1005     /// Returns the "next" universe index in order -- this new index
1006     /// is considered to extend all previous universes. This
1007     /// corresponds to entering a `forall` quantifier. So, for
1008     /// example, suppose we have this type in universe `U`:
1009     ///
1010     /// ```
1011     /// for<'a> fn(&'a u32)
1012     /// ```
1013     ///
1014     /// Once we "enter" into this `for<'a>` quantifier, we are in a
1015     /// new universe that extends `U` -- in this new universe, we can
1016     /// name the region `'a`, but that region was not nameable from
1017     /// `U` because it was not in scope there.
1018     pub fn next_universe(self) -> UniverseIndex {
1019         UniverseIndex::from_u32(self.private.checked_add(1).unwrap())
1020     }
1021
1022     /// Returns `true` if `self` can name a name from `other` -- in other words,
1023     /// if the set of names in `self` is a superset of those in
1024     /// `other` (`self >= other`).
1025     pub fn can_name(self, other: UniverseIndex) -> bool {
1026         self.private >= other.private
1027     }
1028
1029     /// Returns `true` if `self` cannot name some names from `other` -- in other
1030     /// words, if the set of names in `self` is a strict subset of
1031     /// those in `other` (`self < other`).
1032     pub fn cannot_name(self, other: UniverseIndex) -> bool {
1033         self.private < other.private
1034     }
1035 }
1036
1037 /// The "placeholder index" fully defines a placeholder region, type, or const. Placeholders are
1038 /// identified by both a universe, as well as a name residing within that universe. Distinct bound
1039 /// regions/types/consts within the same universe simply have an unknown relationship to one
1040 /// another.
1041 #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, TyEncodable, TyDecodable, PartialOrd, Ord)]
1042 pub struct Placeholder<T> {
1043     pub universe: UniverseIndex,
1044     pub name: T,
1045 }
1046
1047 impl<'a, T> HashStable<StableHashingContext<'a>> for Placeholder<T>
1048 where
1049     T: HashStable<StableHashingContext<'a>>,
1050 {
1051     fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
1052         self.universe.hash_stable(hcx, hasher);
1053         self.name.hash_stable(hcx, hasher);
1054     }
1055 }
1056
1057 pub type PlaceholderRegion = Placeholder<BoundRegionKind>;
1058
1059 pub type PlaceholderType = Placeholder<BoundVar>;
1060
1061 #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, HashStable)]
1062 #[derive(TyEncodable, TyDecodable, PartialOrd, Ord)]
1063 pub struct BoundConst<'tcx> {
1064     pub var: BoundVar,
1065     pub ty: Ty<'tcx>,
1066 }
1067
1068 pub type PlaceholderConst<'tcx> = Placeholder<BoundConst<'tcx>>;
1069
1070 /// A `DefId` which, in case it is a const argument, is potentially bundled with
1071 /// the `DefId` of the generic parameter it instantiates.
1072 ///
1073 /// This is used to avoid calls to `type_of` for const arguments during typeck
1074 /// which cause cycle errors.
1075 ///
1076 /// ```rust
1077 /// struct A;
1078 /// impl A {
1079 ///     fn foo<const N: usize>(&self) -> [u8; N] { [0; N] }
1080 ///     //           ^ const parameter
1081 /// }
1082 /// struct B;
1083 /// impl B {
1084 ///     fn foo<const M: u8>(&self) -> usize { 42 }
1085 ///     //           ^ const parameter
1086 /// }
1087 ///
1088 /// fn main() {
1089 ///     let a = A;
1090 ///     let _b = a.foo::<{ 3 + 7 }>();
1091 ///     //               ^^^^^^^^^ const argument
1092 /// }
1093 /// ```
1094 ///
1095 /// Let's look at the call `a.foo::<{ 3 + 7 }>()` here. We do not know
1096 /// which `foo` is used until we know the type of `a`.
1097 ///
1098 /// We only know the type of `a` once we are inside of `typeck(main)`.
1099 /// We also end up normalizing the type of `_b` during `typeck(main)` which
1100 /// requires us to evaluate the const argument.
1101 ///
1102 /// To evaluate that const argument we need to know its type,
1103 /// which we would get using `type_of(const_arg)`. This requires us to
1104 /// resolve `foo` as it can be either `usize` or `u8` in this example.
1105 /// However, resolving `foo` once again requires `typeck(main)` to get the type of `a`,
1106 /// which results in a cycle.
1107 ///
1108 /// In short we must not call `type_of(const_arg)` during `typeck(main)`.
1109 ///
1110 /// When first creating the `ty::Const` of the const argument inside of `typeck` we have
1111 /// already resolved `foo` so we know which const parameter this argument instantiates.
1112 /// This means that we also know the expected result of `type_of(const_arg)` even if we
1113 /// aren't allowed to call that query: it is equal to `type_of(const_param)` which is
1114 /// trivial to compute.
1115 ///
1116 /// If we now want to use that constant in a place which potentionally needs its type
1117 /// we also pass the type of its `const_param`. This is the point of `WithOptConstParam`,
1118 /// except that instead of a `Ty` we bundle the `DefId` of the const parameter.
1119 /// Meaning that we need to use `type_of(const_param_did)` if `const_param_did` is `Some`
1120 /// to get the type of `did`.
1121 #[derive(Copy, Clone, Debug, TypeFoldable, Lift, TyEncodable, TyDecodable)]
1122 #[derive(PartialEq, Eq, PartialOrd, Ord)]
1123 #[derive(Hash, HashStable)]
1124 pub struct WithOptConstParam<T> {
1125     pub did: T,
1126     /// The `DefId` of the corresponding generic parameter in case `did` is
1127     /// a const argument.
1128     ///
1129     /// Note that even if `did` is a const argument, this may still be `None`.
1130     /// All queries taking `WithOptConstParam` start by calling `tcx.opt_const_param_of(def.did)`
1131     /// to potentially update `param_did` in the case it is `None`.
1132     pub const_param_did: Option<DefId>,
1133 }
1134
1135 impl<T> WithOptConstParam<T> {
1136     /// Creates a new `WithOptConstParam` setting `const_param_did` to `None`.
1137     #[inline(always)]
1138     pub fn unknown(did: T) -> WithOptConstParam<T> {
1139         WithOptConstParam { did, const_param_did: None }
1140     }
1141 }
1142
1143 impl WithOptConstParam<LocalDefId> {
1144     /// Returns `Some((did, param_did))` if `def_id` is a const argument,
1145     /// `None` otherwise.
1146     #[inline(always)]
1147     pub fn try_lookup(did: LocalDefId, tcx: TyCtxt<'_>) -> Option<(LocalDefId, DefId)> {
1148         tcx.opt_const_param_of(did).map(|param_did| (did, param_did))
1149     }
1150
1151     /// In case `self` is unknown but `self.did` is a const argument, this returns
1152     /// a `WithOptConstParam` with the correct `const_param_did`.
1153     #[inline(always)]
1154     pub fn try_upgrade(self, tcx: TyCtxt<'_>) -> Option<WithOptConstParam<LocalDefId>> {
1155         if self.const_param_did.is_none() {
1156             if let const_param_did @ Some(_) = tcx.opt_const_param_of(self.did) {
1157                 return Some(WithOptConstParam { did: self.did, const_param_did });
1158             }
1159         }
1160
1161         None
1162     }
1163
1164     pub fn to_global(self) -> WithOptConstParam<DefId> {
1165         WithOptConstParam { did: self.did.to_def_id(), const_param_did: self.const_param_did }
1166     }
1167
1168     pub fn def_id_for_type_of(self) -> DefId {
1169         if let Some(did) = self.const_param_did { did } else { self.did.to_def_id() }
1170     }
1171 }
1172
1173 impl WithOptConstParam<DefId> {
1174     pub fn as_local(self) -> Option<WithOptConstParam<LocalDefId>> {
1175         self.did
1176             .as_local()
1177             .map(|did| WithOptConstParam { did, const_param_did: self.const_param_did })
1178     }
1179
1180     pub fn as_const_arg(self) -> Option<(LocalDefId, DefId)> {
1181         if let Some(param_did) = self.const_param_did {
1182             if let Some(did) = self.did.as_local() {
1183                 return Some((did, param_did));
1184             }
1185         }
1186
1187         None
1188     }
1189
1190     pub fn is_local(self) -> bool {
1191         self.did.is_local()
1192     }
1193
1194     pub fn def_id_for_type_of(self) -> DefId {
1195         self.const_param_did.unwrap_or(self.did)
1196     }
1197 }
1198
1199 /// When type checking, we use the `ParamEnv` to track
1200 /// details about the set of where-clauses that are in scope at this
1201 /// particular point.
1202 #[derive(Copy, Clone, Hash, PartialEq, Eq)]
1203 pub struct ParamEnv<'tcx> {
1204     /// This packs both caller bounds and the reveal enum into one pointer.
1205     ///
1206     /// Caller bounds are `Obligation`s that the caller must satisfy. This is
1207     /// basically the set of bounds on the in-scope type parameters, translated
1208     /// into `Obligation`s, and elaborated and normalized.
1209     ///
1210     /// Use the `caller_bounds()` method to access.
1211     ///
1212     /// Typically, this is `Reveal::UserFacing`, but during codegen we
1213     /// want `Reveal::All`.
1214     ///
1215     /// Note: This is packed, use the reveal() method to access it.
1216     packed: CopyTaggedPtr<&'tcx List<Predicate<'tcx>>, traits::Reveal, true>,
1217 }
1218
1219 unsafe impl rustc_data_structures::tagged_ptr::Tag for traits::Reveal {
1220     const BITS: usize = 1;
1221     #[inline]
1222     fn into_usize(self) -> usize {
1223         match self {
1224             traits::Reveal::UserFacing => 0,
1225             traits::Reveal::All => 1,
1226         }
1227     }
1228     #[inline]
1229     unsafe fn from_usize(ptr: usize) -> Self {
1230         match ptr {
1231             0 => traits::Reveal::UserFacing,
1232             1 => traits::Reveal::All,
1233             _ => std::hint::unreachable_unchecked(),
1234         }
1235     }
1236 }
1237
1238 impl<'tcx> fmt::Debug for ParamEnv<'tcx> {
1239     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1240         f.debug_struct("ParamEnv")
1241             .field("caller_bounds", &self.caller_bounds())
1242             .field("reveal", &self.reveal())
1243             .finish()
1244     }
1245 }
1246
1247 impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for ParamEnv<'tcx> {
1248     fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
1249         self.caller_bounds().hash_stable(hcx, hasher);
1250         self.reveal().hash_stable(hcx, hasher);
1251     }
1252 }
1253
1254 impl<'tcx> TypeFoldable<'tcx> for ParamEnv<'tcx> {
1255     fn super_fold_with<F: ty::fold::TypeFolder<'tcx>>(self, folder: &mut F) -> Self {
1256         ParamEnv::new(self.caller_bounds().fold_with(folder), self.reveal().fold_with(folder))
1257     }
1258
1259     fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
1260         self.caller_bounds().visit_with(visitor)?;
1261         self.reveal().visit_with(visitor)
1262     }
1263 }
1264
1265 impl<'tcx> ParamEnv<'tcx> {
1266     /// Construct a trait environment suitable for contexts where
1267     /// there are no where-clauses in scope. Hidden types (like `impl
1268     /// Trait`) are left hidden, so this is suitable for ordinary
1269     /// type-checking.
1270     #[inline]
1271     pub fn empty() -> Self {
1272         Self::new(List::empty(), Reveal::UserFacing)
1273     }
1274
1275     #[inline]
1276     pub fn caller_bounds(self) -> &'tcx List<Predicate<'tcx>> {
1277         self.packed.pointer()
1278     }
1279
1280     #[inline]
1281     pub fn reveal(self) -> traits::Reveal {
1282         self.packed.tag()
1283     }
1284
1285     /// Construct a trait environment with no where-clauses in scope
1286     /// where the values of all `impl Trait` and other hidden types
1287     /// are revealed. This is suitable for monomorphized, post-typeck
1288     /// environments like codegen or doing optimizations.
1289     ///
1290     /// N.B., if you want to have predicates in scope, use `ParamEnv::new`,
1291     /// or invoke `param_env.with_reveal_all()`.
1292     #[inline]
1293     pub fn reveal_all() -> Self {
1294         Self::new(List::empty(), Reveal::All)
1295     }
1296
1297     /// Construct a trait environment with the given set of predicates.
1298     #[inline]
1299     pub fn new(caller_bounds: &'tcx List<Predicate<'tcx>>, reveal: Reveal) -> Self {
1300         ty::ParamEnv { packed: CopyTaggedPtr::new(caller_bounds, reveal) }
1301     }
1302
1303     pub fn with_user_facing(mut self) -> Self {
1304         self.packed.set_tag(Reveal::UserFacing);
1305         self
1306     }
1307
1308     /// Returns a new parameter environment with the same clauses, but
1309     /// which "reveals" the true results of projections in all cases
1310     /// (even for associated types that are specializable). This is
1311     /// the desired behavior during codegen and certain other special
1312     /// contexts; normally though we want to use `Reveal::UserFacing`,
1313     /// which is the default.
1314     /// All opaque types in the caller_bounds of the `ParamEnv`
1315     /// will be normalized to their underlying types.
1316     /// See PR #65989 and issue #65918 for more details
1317     pub fn with_reveal_all_normalized(self, tcx: TyCtxt<'tcx>) -> Self {
1318         if self.packed.tag() == traits::Reveal::All {
1319             return self;
1320         }
1321
1322         ParamEnv::new(tcx.normalize_opaque_types(self.caller_bounds()), Reveal::All)
1323     }
1324
1325     /// Returns this same environment but with no caller bounds.
1326     #[inline]
1327     pub fn without_caller_bounds(self) -> Self {
1328         Self::new(List::empty(), self.reveal())
1329     }
1330
1331     /// Creates a suitable environment in which to perform trait
1332     /// queries on the given value. When type-checking, this is simply
1333     /// the pair of the environment plus value. But when reveal is set to
1334     /// All, then if `value` does not reference any type parameters, we will
1335     /// pair it with the empty environment. This improves caching and is generally
1336     /// invisible.
1337     ///
1338     /// N.B., we preserve the environment when type-checking because it
1339     /// is possible for the user to have wacky where-clauses like
1340     /// `where Box<u32>: Copy`, which are clearly never
1341     /// satisfiable. We generally want to behave as if they were true,
1342     /// although the surrounding function is never reachable.
1343     pub fn and<T: TypeFoldable<'tcx>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1344         match self.reveal() {
1345             Reveal::UserFacing => ParamEnvAnd { param_env: self, value },
1346
1347             Reveal::All => {
1348                 if value.is_known_global() {
1349                     ParamEnvAnd { param_env: self.without_caller_bounds(), value }
1350                 } else {
1351                     ParamEnvAnd { param_env: self, value }
1352                 }
1353             }
1354         }
1355     }
1356 }
1357
1358 #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, TypeFoldable)]
1359 pub struct ConstnessAnd<T> {
1360     pub constness: BoundConstness,
1361     pub value: T,
1362 }
1363
1364 // FIXME(ecstaticmorse): Audit all occurrences of `without_const().to_predicate(tcx)` to ensure that
1365 // the constness of trait bounds is being propagated correctly.
1366 pub trait WithConstness: Sized {
1367     #[inline]
1368     fn with_constness(self, constness: BoundConstness) -> ConstnessAnd<Self> {
1369         ConstnessAnd { constness, value: self }
1370     }
1371
1372     #[inline]
1373     fn with_const_if_const(self) -> ConstnessAnd<Self> {
1374         self.with_constness(BoundConstness::ConstIfConst)
1375     }
1376
1377     #[inline]
1378     fn without_const(self) -> ConstnessAnd<Self> {
1379         self.with_constness(BoundConstness::NotConst)
1380     }
1381 }
1382
1383 impl<T> WithConstness for T {}
1384
1385 #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, TypeFoldable)]
1386 pub struct ParamEnvAnd<'tcx, T> {
1387     pub param_env: ParamEnv<'tcx>,
1388     pub value: T,
1389 }
1390
1391 impl<'tcx, T> ParamEnvAnd<'tcx, T> {
1392     pub fn into_parts(self) -> (ParamEnv<'tcx>, T) {
1393         (self.param_env, self.value)
1394     }
1395 }
1396
1397 impl<'a, 'tcx, T> HashStable<StableHashingContext<'a>> for ParamEnvAnd<'tcx, T>
1398 where
1399     T: HashStable<StableHashingContext<'a>>,
1400 {
1401     fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
1402         let ParamEnvAnd { ref param_env, ref value } = *self;
1403
1404         param_env.hash_stable(hcx, hasher);
1405         value.hash_stable(hcx, hasher);
1406     }
1407 }
1408
1409 #[derive(Copy, Clone, Debug, HashStable)]
1410 pub struct Destructor {
1411     /// The `DefId` of the destructor method
1412     pub did: DefId,
1413     /// The constness of the destructor method
1414     pub constness: hir::Constness,
1415 }
1416
1417 bitflags! {
1418     #[derive(HashStable)]
1419     pub struct VariantFlags: u32 {
1420         const NO_VARIANT_FLAGS        = 0;
1421         /// Indicates whether the field list of this variant is `#[non_exhaustive]`.
1422         const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1423         /// Indicates whether this variant was obtained as part of recovering from
1424         /// a syntactic error. May be incomplete or bogus.
1425         const IS_RECOVERED = 1 << 1;
1426     }
1427 }
1428
1429 /// Definition of a variant -- a struct's fields or an enum variant.
1430 #[derive(Debug, HashStable)]
1431 pub struct VariantDef {
1432     /// `DefId` that identifies the variant itself.
1433     /// If this variant belongs to a struct or union, then this is a copy of its `DefId`.
1434     pub def_id: DefId,
1435     /// `DefId` that identifies the variant's constructor.
1436     /// If this variant is a struct variant, then this is `None`.
1437     pub ctor_def_id: Option<DefId>,
1438     /// Variant or struct name.
1439     #[stable_hasher(project(name))]
1440     pub ident: Ident,
1441     /// Discriminant of this variant.
1442     pub discr: VariantDiscr,
1443     /// Fields of this variant.
1444     pub fields: Vec<FieldDef>,
1445     /// Type of constructor of variant.
1446     pub ctor_kind: CtorKind,
1447     /// Flags of the variant (e.g. is field list non-exhaustive)?
1448     flags: VariantFlags,
1449 }
1450
1451 impl VariantDef {
1452     /// Creates a new `VariantDef`.
1453     ///
1454     /// `variant_did` is the `DefId` that identifies the enum variant (if this `VariantDef`
1455     /// represents an enum variant).
1456     ///
1457     /// `ctor_did` is the `DefId` that identifies the constructor of unit or
1458     /// tuple-variants/structs. If this is a `struct`-variant then this should be `None`.
1459     ///
1460     /// `parent_did` is the `DefId` of the `AdtDef` representing the enum or struct that
1461     /// owns this variant. It is used for checking if a struct has `#[non_exhaustive]` w/out having
1462     /// to go through the redirect of checking the ctor's attributes - but compiling a small crate
1463     /// requires loading the `AdtDef`s for all the structs in the universe (e.g., coherence for any
1464     /// built-in trait), and we do not want to load attributes twice.
1465     ///
1466     /// If someone speeds up attribute loading to not be a performance concern, they can
1467     /// remove this hack and use the constructor `DefId` everywhere.
1468     pub fn new(
1469         ident: Ident,
1470         variant_did: Option<DefId>,
1471         ctor_def_id: Option<DefId>,
1472         discr: VariantDiscr,
1473         fields: Vec<FieldDef>,
1474         ctor_kind: CtorKind,
1475         adt_kind: AdtKind,
1476         parent_did: DefId,
1477         recovered: bool,
1478         is_field_list_non_exhaustive: bool,
1479     ) -> Self {
1480         debug!(
1481             "VariantDef::new(ident = {:?}, variant_did = {:?}, ctor_def_id = {:?}, discr = {:?},
1482              fields = {:?}, ctor_kind = {:?}, adt_kind = {:?}, parent_did = {:?})",
1483             ident, variant_did, ctor_def_id, discr, fields, ctor_kind, adt_kind, parent_did,
1484         );
1485
1486         let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1487         if is_field_list_non_exhaustive {
1488             flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1489         }
1490
1491         if recovered {
1492             flags |= VariantFlags::IS_RECOVERED;
1493         }
1494
1495         VariantDef {
1496             def_id: variant_did.unwrap_or(parent_did),
1497             ctor_def_id,
1498             ident,
1499             discr,
1500             fields,
1501             ctor_kind,
1502             flags,
1503         }
1504     }
1505
1506     /// Is this field list non-exhaustive?
1507     #[inline]
1508     pub fn is_field_list_non_exhaustive(&self) -> bool {
1509         self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1510     }
1511
1512     /// Was this variant obtained as part of recovering from a syntactic error?
1513     #[inline]
1514     pub fn is_recovered(&self) -> bool {
1515         self.flags.intersects(VariantFlags::IS_RECOVERED)
1516     }
1517 }
1518
1519 #[derive(Copy, Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, HashStable)]
1520 pub enum VariantDiscr {
1521     /// Explicit value for this variant, i.e., `X = 123`.
1522     /// The `DefId` corresponds to the embedded constant.
1523     Explicit(DefId),
1524
1525     /// The previous variant's discriminant plus one.
1526     /// For efficiency reasons, the distance from the
1527     /// last `Explicit` discriminant is being stored,
1528     /// or `0` for the first variant, if it has none.
1529     Relative(u32),
1530 }
1531
1532 #[derive(Debug, HashStable)]
1533 pub struct FieldDef {
1534     pub did: DefId,
1535     #[stable_hasher(project(name))]
1536     pub ident: Ident,
1537     pub vis: Visibility,
1538 }
1539
1540 bitflags! {
1541     #[derive(TyEncodable, TyDecodable, Default, HashStable)]
1542     pub struct ReprFlags: u8 {
1543         const IS_C               = 1 << 0;
1544         const IS_SIMD            = 1 << 1;
1545         const IS_TRANSPARENT     = 1 << 2;
1546         // Internal only for now. If true, don't reorder fields.
1547         const IS_LINEAR          = 1 << 3;
1548         // If true, don't expose any niche to type's context.
1549         const HIDE_NICHE         = 1 << 4;
1550         // If true, the type's layout can be randomized using
1551         // the seed stored in `ReprOptions.layout_seed`
1552         const RANDOMIZE_LAYOUT   = 1 << 5;
1553         // Any of these flags being set prevent field reordering optimisation.
1554         const IS_UNOPTIMISABLE   = ReprFlags::IS_C.bits |
1555                                    ReprFlags::IS_SIMD.bits |
1556                                    ReprFlags::IS_LINEAR.bits;
1557     }
1558 }
1559
1560 /// Represents the repr options provided by the user,
1561 #[derive(Copy, Clone, Debug, Eq, PartialEq, TyEncodable, TyDecodable, Default, HashStable)]
1562 pub struct ReprOptions {
1563     pub int: Option<attr::IntType>,
1564     pub align: Option<Align>,
1565     pub pack: Option<Align>,
1566     pub flags: ReprFlags,
1567     /// The seed to be used for randomizing a type's layout
1568     ///
1569     /// Note: This could technically be a `[u8; 16]` (a `u128`) which would
1570     /// be the "most accurate" hash as it'd encompass the item and crate
1571     /// hash without loss, but it does pay the price of being larger.
1572     /// Everything's a tradeoff, a `u64` seed should be sufficient for our
1573     /// purposes (primarily `-Z randomize-layout`)
1574     pub field_shuffle_seed: u64,
1575 }
1576
1577 impl ReprOptions {
1578     pub fn new(tcx: TyCtxt<'_>, did: DefId) -> ReprOptions {
1579         let mut flags = ReprFlags::empty();
1580         let mut size = None;
1581         let mut max_align: Option<Align> = None;
1582         let mut min_pack: Option<Align> = None;
1583
1584         // Generate a deterministically-derived seed from the item's path hash
1585         // to allow for cross-crate compilation to actually work
1586         let field_shuffle_seed = tcx.def_path_hash(did).0.to_smaller_hash();
1587
1588         for attr in tcx.get_attrs(did).iter() {
1589             for r in attr::find_repr_attrs(&tcx.sess, attr) {
1590                 flags.insert(match r {
1591                     attr::ReprC => ReprFlags::IS_C,
1592                     attr::ReprPacked(pack) => {
1593                         let pack = Align::from_bytes(pack as u64).unwrap();
1594                         min_pack = Some(if let Some(min_pack) = min_pack {
1595                             min_pack.min(pack)
1596                         } else {
1597                             pack
1598                         });
1599                         ReprFlags::empty()
1600                     }
1601                     attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1602                     attr::ReprNoNiche => ReprFlags::HIDE_NICHE,
1603                     attr::ReprSimd => ReprFlags::IS_SIMD,
1604                     attr::ReprInt(i) => {
1605                         size = Some(i);
1606                         ReprFlags::empty()
1607                     }
1608                     attr::ReprAlign(align) => {
1609                         max_align = max_align.max(Some(Align::from_bytes(align as u64).unwrap()));
1610                         ReprFlags::empty()
1611                     }
1612                 });
1613             }
1614         }
1615
1616         // If `-Z randomize-layout` was enabled for the type definition then we can
1617         // consider performing layout randomization
1618         if tcx.sess.opts.debugging_opts.randomize_layout {
1619             flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1620         }
1621
1622         // This is here instead of layout because the choice must make it into metadata.
1623         if !tcx.consider_optimizing(|| format!("Reorder fields of {:?}", tcx.def_path_str(did))) {
1624             flags.insert(ReprFlags::IS_LINEAR);
1625         }
1626
1627         Self { int: size, align: max_align, pack: min_pack, flags, field_shuffle_seed }
1628     }
1629
1630     #[inline]
1631     pub fn simd(&self) -> bool {
1632         self.flags.contains(ReprFlags::IS_SIMD)
1633     }
1634
1635     #[inline]
1636     pub fn c(&self) -> bool {
1637         self.flags.contains(ReprFlags::IS_C)
1638     }
1639
1640     #[inline]
1641     pub fn packed(&self) -> bool {
1642         self.pack.is_some()
1643     }
1644
1645     #[inline]
1646     pub fn transparent(&self) -> bool {
1647         self.flags.contains(ReprFlags::IS_TRANSPARENT)
1648     }
1649
1650     #[inline]
1651     pub fn linear(&self) -> bool {
1652         self.flags.contains(ReprFlags::IS_LINEAR)
1653     }
1654
1655     #[inline]
1656     pub fn hide_niche(&self) -> bool {
1657         self.flags.contains(ReprFlags::HIDE_NICHE)
1658     }
1659
1660     /// Returns the discriminant type, given these `repr` options.
1661     /// This must only be called on enums!
1662     pub fn discr_type(&self) -> attr::IntType {
1663         self.int.unwrap_or(attr::SignedInt(ast::IntTy::Isize))
1664     }
1665
1666     /// Returns `true` if this `#[repr()]` should inhabit "smart enum
1667     /// layout" optimizations, such as representing `Foo<&T>` as a
1668     /// single pointer.
1669     pub fn inhibit_enum_layout_opt(&self) -> bool {
1670         self.c() || self.int.is_some()
1671     }
1672
1673     /// Returns `true` if this `#[repr()]` should inhibit struct field reordering
1674     /// optimizations, such as with `repr(C)`, `repr(packed(1))`, or `repr(<int>)`.
1675     pub fn inhibit_struct_field_reordering_opt(&self) -> bool {
1676         if let Some(pack) = self.pack {
1677             if pack.bytes() == 1 {
1678                 return true;
1679             }
1680         }
1681
1682         self.flags.intersects(ReprFlags::IS_UNOPTIMISABLE) || self.int.is_some()
1683     }
1684
1685     /// Returns `true` if this type is valid for reordering and `-Z randomize-layout`
1686     /// was enabled for its declaration crate
1687     pub fn can_randomize_type_layout(&self) -> bool {
1688         !self.inhibit_struct_field_reordering_opt()
1689             && self.flags.contains(ReprFlags::RANDOMIZE_LAYOUT)
1690     }
1691
1692     /// Returns `true` if this `#[repr()]` should inhibit union ABI optimisations.
1693     pub fn inhibit_union_abi_opt(&self) -> bool {
1694         self.c()
1695     }
1696 }
1697
1698 impl<'tcx> FieldDef {
1699     /// Returns the type of this field. The resulting type is not normalized. The `subst` is
1700     /// typically obtained via the second field of `TyKind::AdtDef`.
1701     pub fn ty(&self, tcx: TyCtxt<'tcx>, subst: SubstsRef<'tcx>) -> Ty<'tcx> {
1702         tcx.type_of(self.did).subst(tcx, subst)
1703     }
1704 }
1705
1706 pub type Attributes<'tcx> = &'tcx [ast::Attribute];
1707
1708 #[derive(Debug, PartialEq, Eq)]
1709 pub enum ImplOverlapKind {
1710     /// These impls are always allowed to overlap.
1711     Permitted {
1712         /// Whether or not the impl is permitted due to the trait being a `#[marker]` trait
1713         marker: bool,
1714     },
1715     /// These impls are allowed to overlap, but that raises
1716     /// an issue #33140 future-compatibility warning.
1717     ///
1718     /// Some background: in Rust 1.0, the trait-object types `Send + Sync` (today's
1719     /// `dyn Send + Sync`) and `Sync + Send` (now `dyn Sync + Send`) were different.
1720     ///
1721     /// The widely-used version 0.1.0 of the crate `traitobject` had accidentally relied
1722     /// that difference, making what reduces to the following set of impls:
1723     ///
1724     /// ```
1725     /// trait Trait {}
1726     /// impl Trait for dyn Send + Sync {}
1727     /// impl Trait for dyn Sync + Send {}
1728     /// ```
1729     ///
1730     /// Obviously, once we made these types be identical, that code causes a coherence
1731     /// error and a fairly big headache for us. However, luckily for us, the trait
1732     /// `Trait` used in this case is basically a marker trait, and therefore having
1733     /// overlapping impls for it is sound.
1734     ///
1735     /// To handle this, we basically regard the trait as a marker trait, with an additional
1736     /// future-compatibility warning. To avoid accidentally "stabilizing" this feature,
1737     /// it has the following restrictions:
1738     ///
1739     /// 1. The trait must indeed be a marker-like trait (i.e., no items), and must be
1740     /// positive impls.
1741     /// 2. The trait-ref of both impls must be equal.
1742     /// 3. The trait-ref of both impls must be a trait object type consisting only of
1743     /// marker traits.
1744     /// 4. Neither of the impls can have any where-clauses.
1745     ///
1746     /// Once `traitobject` 0.1.0 is no longer an active concern, this hack can be removed.
1747     Issue33140,
1748 }
1749
1750 impl<'tcx> TyCtxt<'tcx> {
1751     pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1752         self.typeck(self.hir().body_owner_def_id(body))
1753     }
1754
1755     pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1756         self.associated_items(id)
1757             .in_definition_order()
1758             .filter(|item| item.kind == AssocKind::Fn && item.defaultness.has_value())
1759     }
1760
1761     fn item_name_from_hir(self, def_id: DefId) -> Option<Ident> {
1762         self.hir().get_if_local(def_id).and_then(|node| node.ident())
1763     }
1764
1765     fn item_name_from_def_id(self, def_id: DefId) -> Option<Symbol> {
1766         if def_id.index == CRATE_DEF_INDEX {
1767             Some(self.crate_name(def_id.krate))
1768         } else {
1769             let def_key = self.def_key(def_id);
1770             match def_key.disambiguated_data.data {
1771                 // The name of a constructor is that of its parent.
1772                 rustc_hir::definitions::DefPathData::Ctor => self.item_name_from_def_id(DefId {
1773                     krate: def_id.krate,
1774                     index: def_key.parent.unwrap(),
1775                 }),
1776                 _ => def_key.disambiguated_data.data.get_opt_name(),
1777             }
1778         }
1779     }
1780
1781     /// Look up the name of an item across crates. This does not look at HIR.
1782     ///
1783     /// When possible, this function should be used for cross-crate lookups over
1784     /// [`opt_item_name`] to avoid invalidating the incremental cache. If you
1785     /// need to handle items without a name, or HIR items that will not be
1786     /// serialized cross-crate, or if you need the span of the item, use
1787     /// [`opt_item_name`] instead.
1788     ///
1789     /// [`opt_item_name`]: Self::opt_item_name
1790     pub fn item_name(self, id: DefId) -> Symbol {
1791         // Look at cross-crate items first to avoid invalidating the incremental cache
1792         // unless we have to.
1793         self.item_name_from_def_id(id).unwrap_or_else(|| {
1794             bug!("item_name: no name for {:?}", self.def_path(id));
1795         })
1796     }
1797
1798     /// Look up the name and span of an item or [`Node`].
1799     ///
1800     /// See [`item_name`][Self::item_name] for more information.
1801     pub fn opt_item_name(self, def_id: DefId) -> Option<Ident> {
1802         // Look at the HIR first so the span will be correct if this is a local item.
1803         self.item_name_from_hir(def_id)
1804             .or_else(|| self.item_name_from_def_id(def_id).map(Ident::with_dummy_span))
1805     }
1806
1807     pub fn opt_associated_item(self, def_id: DefId) -> Option<&'tcx AssocItem> {
1808         if let DefKind::AssocConst | DefKind::AssocFn | DefKind::AssocTy = self.def_kind(def_id) {
1809             Some(self.associated_item(def_id))
1810         } else {
1811             None
1812         }
1813     }
1814
1815     pub fn field_index(self, hir_id: hir::HirId, typeck_results: &TypeckResults<'_>) -> usize {
1816         typeck_results.field_indices().get(hir_id).cloned().expect("no index for a field")
1817     }
1818
1819     pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<usize> {
1820         variant.fields.iter().position(|field| self.hygienic_eq(ident, field.ident, variant.def_id))
1821     }
1822
1823     /// Returns `true` if the impls are the same polarity and the trait either
1824     /// has no items or is annotated `#[marker]` and prevents item overrides.
1825     pub fn impls_are_allowed_to_overlap(
1826         self,
1827         def_id1: DefId,
1828         def_id2: DefId,
1829     ) -> Option<ImplOverlapKind> {
1830         // If either trait impl references an error, they're allowed to overlap,
1831         // as one of them essentially doesn't exist.
1832         if self.impl_trait_ref(def_id1).map_or(false, |tr| tr.references_error())
1833             || self.impl_trait_ref(def_id2).map_or(false, |tr| tr.references_error())
1834         {
1835             return Some(ImplOverlapKind::Permitted { marker: false });
1836         }
1837
1838         match (self.impl_polarity(def_id1), self.impl_polarity(def_id2)) {
1839             (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1840                 // `#[rustc_reservation_impl]` impls don't overlap with anything
1841                 debug!(
1842                     "impls_are_allowed_to_overlap({:?}, {:?}) = Some(Permitted) (reservations)",
1843                     def_id1, def_id2
1844                 );
1845                 return Some(ImplOverlapKind::Permitted { marker: false });
1846             }
1847             (ImplPolarity::Positive, ImplPolarity::Negative)
1848             | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1849                 // `impl AutoTrait for Type` + `impl !AutoTrait for Type`
1850                 debug!(
1851                     "impls_are_allowed_to_overlap({:?}, {:?}) - None (differing polarities)",
1852                     def_id1, def_id2
1853                 );
1854                 return None;
1855             }
1856             (ImplPolarity::Positive, ImplPolarity::Positive)
1857             | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1858         };
1859
1860         let is_marker_overlap = {
1861             let is_marker_impl = |def_id: DefId| -> bool {
1862                 let trait_ref = self.impl_trait_ref(def_id);
1863                 trait_ref.map_or(false, |tr| self.trait_def(tr.def_id).is_marker)
1864             };
1865             is_marker_impl(def_id1) && is_marker_impl(def_id2)
1866         };
1867
1868         if is_marker_overlap {
1869             debug!(
1870                 "impls_are_allowed_to_overlap({:?}, {:?}) = Some(Permitted) (marker overlap)",
1871                 def_id1, def_id2
1872             );
1873             Some(ImplOverlapKind::Permitted { marker: true })
1874         } else {
1875             if let Some(self_ty1) = self.issue33140_self_ty(def_id1) {
1876                 if let Some(self_ty2) = self.issue33140_self_ty(def_id2) {
1877                     if self_ty1 == self_ty2 {
1878                         debug!(
1879                             "impls_are_allowed_to_overlap({:?}, {:?}) - issue #33140 HACK",
1880                             def_id1, def_id2
1881                         );
1882                         return Some(ImplOverlapKind::Issue33140);
1883                     } else {
1884                         debug!(
1885                             "impls_are_allowed_to_overlap({:?}, {:?}) - found {:?} != {:?}",
1886                             def_id1, def_id2, self_ty1, self_ty2
1887                         );
1888                     }
1889                 }
1890             }
1891
1892             debug!("impls_are_allowed_to_overlap({:?}, {:?}) = None", def_id1, def_id2);
1893             None
1894         }
1895     }
1896
1897     /// Returns `ty::VariantDef` if `res` refers to a struct,
1898     /// or variant or their constructors, panics otherwise.
1899     pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1900         match res {
1901             Res::Def(DefKind::Variant, did) => {
1902                 let enum_did = self.parent(did).unwrap();
1903                 self.adt_def(enum_did).variant_with_id(did)
1904             }
1905             Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1906             Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1907                 let variant_did = self.parent(variant_ctor_did).unwrap();
1908                 let enum_did = self.parent(variant_did).unwrap();
1909                 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1910             }
1911             Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1912                 let struct_did = self.parent(ctor_did).expect("struct ctor has no parent");
1913                 self.adt_def(struct_did).non_enum_variant()
1914             }
1915             _ => bug!("expect_variant_res used with unexpected res {:?}", res),
1916         }
1917     }
1918
1919     /// Returns the possibly-auto-generated MIR of a `(DefId, Subst)` pair.
1920     pub fn instance_mir(self, instance: ty::InstanceDef<'tcx>) -> &'tcx Body<'tcx> {
1921         match instance {
1922             ty::InstanceDef::Item(def) => match self.def_kind(def.did) {
1923                 DefKind::Const
1924                 | DefKind::Static
1925                 | DefKind::AssocConst
1926                 | DefKind::Ctor(..)
1927                 | DefKind::AnonConst => self.mir_for_ctfe_opt_const_arg(def),
1928                 // If the caller wants `mir_for_ctfe` of a function they should not be using
1929                 // `instance_mir`, so we'll assume const fn also wants the optimized version.
1930                 _ => {
1931                     assert_eq!(def.const_param_did, None);
1932                     self.optimized_mir(def.did)
1933                 }
1934             },
1935             ty::InstanceDef::VtableShim(..)
1936             | ty::InstanceDef::ReifyShim(..)
1937             | ty::InstanceDef::Intrinsic(..)
1938             | ty::InstanceDef::FnPtrShim(..)
1939             | ty::InstanceDef::Virtual(..)
1940             | ty::InstanceDef::ClosureOnceShim { .. }
1941             | ty::InstanceDef::DropGlue(..)
1942             | ty::InstanceDef::CloneShim(..) => self.mir_shims(instance),
1943         }
1944     }
1945
1946     /// Gets the attributes of a definition.
1947     pub fn get_attrs(self, did: DefId) -> Attributes<'tcx> {
1948         if let Some(did) = did.as_local() {
1949             self.hir().attrs(self.hir().local_def_id_to_hir_id(did))
1950         } else {
1951             self.item_attrs(did)
1952         }
1953     }
1954
1955     /// Determines whether an item is annotated with an attribute.
1956     pub fn has_attr(self, did: DefId, attr: Symbol) -> bool {
1957         self.sess.contains_name(&self.get_attrs(did), attr)
1958     }
1959
1960     /// Determines whether an item is annotated with `doc(hidden)`.
1961     pub fn is_doc_hidden(self, did: DefId) -> bool {
1962         self.get_attrs(did)
1963             .iter()
1964             .filter_map(|attr| if attr.has_name(sym::doc) { attr.meta_item_list() } else { None })
1965             .any(|items| items.iter().any(|item| item.has_name(sym::hidden)))
1966     }
1967
1968     /// Returns `true` if this is an `auto trait`.
1969     pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1970         self.trait_def(trait_def_id).has_auto_impl
1971     }
1972
1973     /// Returns layout of a generator. Layout might be unavailable if the
1974     /// generator is tainted by errors.
1975     pub fn generator_layout(self, def_id: DefId) -> Option<&'tcx GeneratorLayout<'tcx>> {
1976         self.optimized_mir(def_id).generator_layout()
1977     }
1978
1979     /// Given the `DefId` of an impl, returns the `DefId` of the trait it implements.
1980     /// If it implements no trait, returns `None`.
1981     pub fn trait_id_of_impl(self, def_id: DefId) -> Option<DefId> {
1982         self.impl_trait_ref(def_id).map(|tr| tr.def_id)
1983     }
1984
1985     /// If the given defid describes a method belonging to an impl, returns the
1986     /// `DefId` of the impl that the method belongs to; otherwise, returns `None`.
1987     pub fn impl_of_method(self, def_id: DefId) -> Option<DefId> {
1988         self.opt_associated_item(def_id).and_then(|trait_item| match trait_item.container {
1989             TraitContainer(_) => None,
1990             ImplContainer(def_id) => Some(def_id),
1991         })
1992     }
1993
1994     /// Looks up the span of `impl_did` if the impl is local; otherwise returns `Err`
1995     /// with the name of the crate containing the impl.
1996     pub fn span_of_impl(self, impl_did: DefId) -> Result<Span, Symbol> {
1997         if let Some(impl_did) = impl_did.as_local() {
1998             let hir_id = self.hir().local_def_id_to_hir_id(impl_did);
1999             Ok(self.hir().span(hir_id))
2000         } else {
2001             Err(self.crate_name(impl_did.krate))
2002         }
2003     }
2004
2005     /// Hygienically compares a use-site name (`use_name`) for a field or an associated item with
2006     /// its supposed definition name (`def_name`). The method also needs `DefId` of the supposed
2007     /// definition's parent/scope to perform comparison.
2008     pub fn hygienic_eq(self, use_name: Ident, def_name: Ident, def_parent_def_id: DefId) -> bool {
2009         // We could use `Ident::eq` here, but we deliberately don't. The name
2010         // comparison fails frequently, and we want to avoid the expensive
2011         // `normalize_to_macros_2_0()` calls required for the span comparison whenever possible.
2012         use_name.name == def_name.name
2013             && use_name
2014                 .span
2015                 .ctxt()
2016                 .hygienic_eq(def_name.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2017     }
2018
2019     pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2020         ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2021         ident
2022     }
2023
2024     pub fn adjust_ident_and_get_scope(
2025         self,
2026         mut ident: Ident,
2027         scope: DefId,
2028         block: hir::HirId,
2029     ) -> (Ident, DefId) {
2030         let scope = ident
2031             .span
2032             .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2033             .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2034             .unwrap_or_else(|| self.parent_module(block).to_def_id());
2035         (ident, scope)
2036     }
2037
2038     pub fn is_object_safe(self, key: DefId) -> bool {
2039         self.object_safety_violations(key).is_empty()
2040     }
2041 }
2042
2043 /// Yields the parent function's `DefId` if `def_id` is an `impl Trait` definition.
2044 pub fn is_impl_trait_defn(tcx: TyCtxt<'_>, def_id: DefId) -> Option<DefId> {
2045     if let Some(def_id) = def_id.as_local() {
2046         if let Node::Item(item) = tcx.hir().get(tcx.hir().local_def_id_to_hir_id(def_id)) {
2047             if let hir::ItemKind::OpaqueTy(ref opaque_ty) = item.kind {
2048                 return opaque_ty.impl_trait_fn;
2049             }
2050         }
2051     }
2052     None
2053 }
2054
2055 pub fn int_ty(ity: ast::IntTy) -> IntTy {
2056     match ity {
2057         ast::IntTy::Isize => IntTy::Isize,
2058         ast::IntTy::I8 => IntTy::I8,
2059         ast::IntTy::I16 => IntTy::I16,
2060         ast::IntTy::I32 => IntTy::I32,
2061         ast::IntTy::I64 => IntTy::I64,
2062         ast::IntTy::I128 => IntTy::I128,
2063     }
2064 }
2065
2066 pub fn uint_ty(uty: ast::UintTy) -> UintTy {
2067     match uty {
2068         ast::UintTy::Usize => UintTy::Usize,
2069         ast::UintTy::U8 => UintTy::U8,
2070         ast::UintTy::U16 => UintTy::U16,
2071         ast::UintTy::U32 => UintTy::U32,
2072         ast::UintTy::U64 => UintTy::U64,
2073         ast::UintTy::U128 => UintTy::U128,
2074     }
2075 }
2076
2077 pub fn float_ty(fty: ast::FloatTy) -> FloatTy {
2078     match fty {
2079         ast::FloatTy::F32 => FloatTy::F32,
2080         ast::FloatTy::F64 => FloatTy::F64,
2081     }
2082 }
2083
2084 pub fn ast_int_ty(ity: IntTy) -> ast::IntTy {
2085     match ity {
2086         IntTy::Isize => ast::IntTy::Isize,
2087         IntTy::I8 => ast::IntTy::I8,
2088         IntTy::I16 => ast::IntTy::I16,
2089         IntTy::I32 => ast::IntTy::I32,
2090         IntTy::I64 => ast::IntTy::I64,
2091         IntTy::I128 => ast::IntTy::I128,
2092     }
2093 }
2094
2095 pub fn ast_uint_ty(uty: UintTy) -> ast::UintTy {
2096     match uty {
2097         UintTy::Usize => ast::UintTy::Usize,
2098         UintTy::U8 => ast::UintTy::U8,
2099         UintTy::U16 => ast::UintTy::U16,
2100         UintTy::U32 => ast::UintTy::U32,
2101         UintTy::U64 => ast::UintTy::U64,
2102         UintTy::U128 => ast::UintTy::U128,
2103     }
2104 }
2105
2106 pub fn provide(providers: &mut ty::query::Providers) {
2107     closure::provide(providers);
2108     context::provide(providers);
2109     erase_regions::provide(providers);
2110     layout::provide(providers);
2111     util::provide(providers);
2112     print::provide(providers);
2113     super::util::bug::provide(providers);
2114     super::middle::provide(providers);
2115     *providers = ty::query::Providers {
2116         trait_impls_of: trait_def::trait_impls_of_provider,
2117         type_uninhabited_from: inhabitedness::type_uninhabited_from,
2118         const_param_default: consts::const_param_default,
2119         vtable_allocation: vtable::vtable_allocation_provider,
2120         ..*providers
2121     };
2122 }
2123
2124 /// A map for the local crate mapping each type to a vector of its
2125 /// inherent impls. This is not meant to be used outside of coherence;
2126 /// rather, you should request the vector for a specific type via
2127 /// `tcx.inherent_impls(def_id)` so as to minimize your dependencies
2128 /// (constructing this map requires touching the entire crate).
2129 #[derive(Clone, Debug, Default, HashStable)]
2130 pub struct CrateInherentImpls {
2131     pub inherent_impls: LocalDefIdMap<Vec<DefId>>,
2132 }
2133
2134 #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, TyEncodable, HashStable)]
2135 pub struct SymbolName<'tcx> {
2136     /// `&str` gives a consistent ordering, which ensures reproducible builds.
2137     pub name: &'tcx str,
2138 }
2139
2140 impl<'tcx> SymbolName<'tcx> {
2141     pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2142         SymbolName {
2143             name: unsafe { str::from_utf8_unchecked(tcx.arena.alloc_slice(name.as_bytes())) },
2144         }
2145     }
2146 }
2147
2148 impl<'tcx> fmt::Display for SymbolName<'tcx> {
2149     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2150         fmt::Display::fmt(&self.name, fmt)
2151     }
2152 }
2153
2154 impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2155     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2156         fmt::Display::fmt(&self.name, fmt)
2157     }
2158 }
2159
2160 #[derive(Debug, Default, Copy, Clone)]
2161 pub struct FoundRelationships {
2162     /// This is true if we identified that this Ty (`?T`) is found in a `?T: Foo`
2163     /// obligation, where:
2164     ///
2165     ///  * `Foo` is not `Sized`
2166     ///  * `(): Foo` may be satisfied
2167     pub self_in_trait: bool,
2168     /// This is true if we identified that this Ty (`?T`) is found in a `<_ as
2169     /// _>::AssocType = ?T`
2170     pub output: bool,
2171 }