]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_middle/src/ty/context.rs
Make allocator_kind a query.
[rust.git] / compiler / rustc_middle / src / ty / context.rs
1 //! Type context book-keeping.
2
3 use crate::arena::Arena;
4 use crate::dep_graph::DepGraph;
5 use crate::hir::exports::ExportMap;
6 use crate::hir::place::Place as HirPlace;
7 use crate::ich::{NodeIdHashingMode, StableHashingContext};
8 use crate::infer::canonical::{Canonical, CanonicalVarInfo, CanonicalVarInfos};
9 use crate::lint::{struct_lint_level, LintDiagnosticBuilder, LintLevelSource};
10 use crate::middle;
11 use crate::middle::cstore::{CrateStoreDyn, EncodedMetadata};
12 use crate::middle::resolve_lifetime::{self, LifetimeScopeForPath, ObjectLifetimeDefault};
13 use crate::middle::stability;
14 use crate::mir::interpret::{self, Allocation, ConstValue, Scalar};
15 use crate::mir::{Body, Field, Local, Place, PlaceElem, ProjectionKind, Promoted};
16 use crate::thir::Thir;
17 use crate::traits;
18 use crate::ty::query::{self, OnDiskCache, TyCtxtAt};
19 use crate::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef, UserSubsts};
20 use crate::ty::TyKind::*;
21 use crate::ty::{
22     self, AdtDef, AdtKind, Binder, BindingMode, BoundVar, CanonicalPolyFnSig, Const, ConstVid,
23     DefIdTree, ExistentialPredicate, FloatTy, FloatVar, FloatVid, GenericParamDefKind, InferConst,
24     InferTy, IntTy, IntVar, IntVid, List, MainDefinition, ParamConst, ParamTy, PolyFnSig,
25     Predicate, PredicateInner, PredicateKind, ProjectionTy, Region, RegionKind, ReprOptions,
26     TraitObjectVisitor, Ty, TyKind, TyS, TyVar, TyVid, TypeAndMut, UintTy, Visibility,
27 };
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::profiling::SelfProfilerRef;
32 use rustc_data_structures::sharded::{IntoPointer, ShardedHashMap};
33 use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
34 use rustc_data_structures::steal::Steal;
35 use rustc_data_structures::sync::{self, Lock, Lrc, WorkerLocal};
36 use rustc_data_structures::vec_map::VecMap;
37 use rustc_errors::ErrorReported;
38 use rustc_hir as hir;
39 use rustc_hir::def::{DefKind, Res};
40 use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE};
41 use rustc_hir::definitions::Definitions;
42 use rustc_hir::intravisit::Visitor;
43 use rustc_hir::lang_items::LangItem;
44 use rustc_hir::{
45     Constness, HirId, ItemKind, ItemLocalId, ItemLocalMap, ItemLocalSet, Node, TraitCandidate,
46 };
47 use rustc_index::vec::{Idx, IndexVec};
48 use rustc_macros::HashStable;
49 use rustc_middle::mir::FakeReadCause;
50 use rustc_middle::ty::OpaqueTypeKey;
51 use rustc_serialize::opaque::{FileEncodeResult, FileEncoder};
52 use rustc_session::config::{BorrowckMode, CrateType, OutputFilenames};
53 use rustc_session::lint::{Level, Lint};
54 use rustc_session::Session;
55 use rustc_span::def_id::StableCrateId;
56 use rustc_span::source_map::MultiSpan;
57 use rustc_span::symbol::{kw, sym, Ident, Symbol};
58 use rustc_span::{Span, DUMMY_SP};
59 use rustc_target::abi::{Layout, TargetDataLayout, VariantIdx};
60 use rustc_target::spec::abi;
61
62 use smallvec::SmallVec;
63 use std::any::Any;
64 use std::borrow::Borrow;
65 use std::cmp::Ordering;
66 use std::collections::hash_map::{self, Entry};
67 use std::fmt;
68 use std::hash::{Hash, Hasher};
69 use std::iter;
70 use std::mem;
71 use std::ops::{Bound, Deref};
72 use std::sync::Arc;
73
74 /// A type that is not publicly constructable. This prevents people from making [`TyKind::Error`]s
75 /// except through the error-reporting functions on a [`tcx`][TyCtxt].
76 #[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
77 #[derive(TyEncodable, TyDecodable, HashStable)]
78 pub struct DelaySpanBugEmitted(());
79
80 type InternedSet<'tcx, T> = ShardedHashMap<Interned<'tcx, T>, ()>;
81
82 pub struct CtxtInterners<'tcx> {
83     /// The arena that types, regions, etc. are allocated from.
84     arena: &'tcx WorkerLocal<Arena<'tcx>>,
85
86     /// Specifically use a speedy hash algorithm for these hash sets, since
87     /// they're accessed quite often.
88     type_: InternedSet<'tcx, TyS<'tcx>>,
89     type_list: InternedSet<'tcx, List<Ty<'tcx>>>,
90     substs: InternedSet<'tcx, InternalSubsts<'tcx>>,
91     canonical_var_infos: InternedSet<'tcx, List<CanonicalVarInfo<'tcx>>>,
92     region: InternedSet<'tcx, RegionKind>,
93     poly_existential_predicates:
94         InternedSet<'tcx, List<ty::Binder<'tcx, ExistentialPredicate<'tcx>>>>,
95     predicate: InternedSet<'tcx, PredicateInner<'tcx>>,
96     predicates: InternedSet<'tcx, List<Predicate<'tcx>>>,
97     projs: InternedSet<'tcx, List<ProjectionKind>>,
98     place_elems: InternedSet<'tcx, List<PlaceElem<'tcx>>>,
99     const_: InternedSet<'tcx, Const<'tcx>>,
100     /// Const allocations.
101     allocation: InternedSet<'tcx, Allocation>,
102     bound_variable_kinds: InternedSet<'tcx, List<ty::BoundVariableKind>>,
103 }
104
105 impl<'tcx> CtxtInterners<'tcx> {
106     fn new(arena: &'tcx WorkerLocal<Arena<'tcx>>) -> CtxtInterners<'tcx> {
107         CtxtInterners {
108             arena,
109             type_: Default::default(),
110             type_list: Default::default(),
111             substs: Default::default(),
112             region: Default::default(),
113             poly_existential_predicates: Default::default(),
114             canonical_var_infos: Default::default(),
115             predicate: Default::default(),
116             predicates: Default::default(),
117             projs: Default::default(),
118             place_elems: Default::default(),
119             const_: Default::default(),
120             allocation: Default::default(),
121             bound_variable_kinds: Default::default(),
122         }
123     }
124
125     /// Interns a type.
126     #[allow(rustc::usage_of_ty_tykind)]
127     #[inline(never)]
128     fn intern_ty(&self, kind: TyKind<'tcx>) -> Ty<'tcx> {
129         self.type_
130             .intern(kind, |kind| {
131                 let flags = super::flags::FlagComputation::for_kind(&kind);
132
133                 let ty_struct = TyS {
134                     kind,
135                     flags: flags.flags,
136                     outer_exclusive_binder: flags.outer_exclusive_binder,
137                 };
138
139                 Interned(self.arena.alloc(ty_struct))
140             })
141             .0
142     }
143
144     #[inline(never)]
145     fn intern_predicate(
146         &self,
147         kind: Binder<'tcx, PredicateKind<'tcx>>,
148     ) -> &'tcx PredicateInner<'tcx> {
149         self.predicate
150             .intern(kind, |kind| {
151                 let flags = super::flags::FlagComputation::for_predicate(kind);
152
153                 let predicate_struct = PredicateInner {
154                     kind,
155                     flags: flags.flags,
156                     outer_exclusive_binder: flags.outer_exclusive_binder,
157                 };
158
159                 Interned(self.arena.alloc(predicate_struct))
160             })
161             .0
162     }
163 }
164
165 pub struct CommonTypes<'tcx> {
166     pub unit: Ty<'tcx>,
167     pub bool: Ty<'tcx>,
168     pub char: Ty<'tcx>,
169     pub isize: Ty<'tcx>,
170     pub i8: Ty<'tcx>,
171     pub i16: Ty<'tcx>,
172     pub i32: Ty<'tcx>,
173     pub i64: Ty<'tcx>,
174     pub i128: Ty<'tcx>,
175     pub usize: Ty<'tcx>,
176     pub u8: Ty<'tcx>,
177     pub u16: Ty<'tcx>,
178     pub u32: Ty<'tcx>,
179     pub u64: Ty<'tcx>,
180     pub u128: Ty<'tcx>,
181     pub f32: Ty<'tcx>,
182     pub f64: Ty<'tcx>,
183     pub str_: Ty<'tcx>,
184     pub never: Ty<'tcx>,
185     pub self_param: Ty<'tcx>,
186
187     /// Dummy type used for the `Self` of a `TraitRef` created for converting
188     /// a trait object, and which gets removed in `ExistentialTraitRef`.
189     /// This type must not appear anywhere in other converted types.
190     pub trait_object_dummy_self: Ty<'tcx>,
191 }
192
193 pub struct CommonLifetimes<'tcx> {
194     /// `ReEmpty` in the root universe.
195     pub re_root_empty: Region<'tcx>,
196
197     /// `ReStatic`
198     pub re_static: Region<'tcx>,
199
200     /// Erased region, used after type-checking
201     pub re_erased: Region<'tcx>,
202 }
203
204 pub struct CommonConsts<'tcx> {
205     pub unit: &'tcx Const<'tcx>,
206 }
207
208 pub struct LocalTableInContext<'a, V> {
209     hir_owner: LocalDefId,
210     data: &'a ItemLocalMap<V>,
211 }
212
213 /// Validate that the given HirId (respectively its `local_id` part) can be
214 /// safely used as a key in the maps of a TypeckResults. For that to be
215 /// the case, the HirId must have the same `owner` as all the other IDs in
216 /// this table (signified by `hir_owner`). Otherwise the HirId
217 /// would be in a different frame of reference and using its `local_id`
218 /// would result in lookup errors, or worse, in silently wrong data being
219 /// stored/returned.
220 #[inline]
221 fn validate_hir_id_for_typeck_results(hir_owner: LocalDefId, hir_id: hir::HirId) {
222     if hir_id.owner != hir_owner {
223         invalid_hir_id_for_typeck_results(hir_owner, hir_id);
224     }
225 }
226
227 #[cold]
228 #[inline(never)]
229 fn invalid_hir_id_for_typeck_results(hir_owner: LocalDefId, hir_id: hir::HirId) {
230     ty::tls::with(|tcx| {
231         bug!(
232             "node {} with HirId::owner {:?} cannot be placed in TypeckResults with hir_owner {:?}",
233             tcx.hir().node_to_string(hir_id),
234             hir_id.owner,
235             hir_owner
236         )
237     });
238 }
239
240 impl<'a, V> LocalTableInContext<'a, V> {
241     pub fn contains_key(&self, id: hir::HirId) -> bool {
242         validate_hir_id_for_typeck_results(self.hir_owner, id);
243         self.data.contains_key(&id.local_id)
244     }
245
246     pub fn get(&self, id: hir::HirId) -> Option<&V> {
247         validate_hir_id_for_typeck_results(self.hir_owner, id);
248         self.data.get(&id.local_id)
249     }
250
251     pub fn iter(&self) -> hash_map::Iter<'_, hir::ItemLocalId, V> {
252         self.data.iter()
253     }
254 }
255
256 impl<'a, V> ::std::ops::Index<hir::HirId> for LocalTableInContext<'a, V> {
257     type Output = V;
258
259     fn index(&self, key: hir::HirId) -> &V {
260         self.get(key).expect("LocalTableInContext: key not found")
261     }
262 }
263
264 pub struct LocalTableInContextMut<'a, V> {
265     hir_owner: LocalDefId,
266     data: &'a mut ItemLocalMap<V>,
267 }
268
269 impl<'a, V> LocalTableInContextMut<'a, V> {
270     pub fn get_mut(&mut self, id: hir::HirId) -> Option<&mut V> {
271         validate_hir_id_for_typeck_results(self.hir_owner, id);
272         self.data.get_mut(&id.local_id)
273     }
274
275     pub fn entry(&mut self, id: hir::HirId) -> Entry<'_, hir::ItemLocalId, V> {
276         validate_hir_id_for_typeck_results(self.hir_owner, id);
277         self.data.entry(id.local_id)
278     }
279
280     pub fn insert(&mut self, id: hir::HirId, val: V) -> Option<V> {
281         validate_hir_id_for_typeck_results(self.hir_owner, id);
282         self.data.insert(id.local_id, val)
283     }
284
285     pub fn remove(&mut self, id: hir::HirId) -> Option<V> {
286         validate_hir_id_for_typeck_results(self.hir_owner, id);
287         self.data.remove(&id.local_id)
288     }
289 }
290
291 /// Whenever a value may be live across a generator yield, the type of that value winds up in the
292 /// `GeneratorInteriorTypeCause` struct. This struct adds additional information about such
293 /// captured types that can be useful for diagnostics. In particular, it stores the span that
294 /// caused a given type to be recorded, along with the scope that enclosed the value (which can
295 /// be used to find the await that the value is live across).
296 ///
297 /// For example:
298 ///
299 /// ```ignore (pseudo-Rust)
300 /// async move {
301 ///     let x: T = expr;
302 ///     foo.await
303 ///     ...
304 /// }
305 /// ```
306 ///
307 /// Here, we would store the type `T`, the span of the value `x`, the "scope-span" for
308 /// the scope that contains `x`, the expr `T` evaluated from, and the span of `foo.await`.
309 #[derive(TyEncodable, TyDecodable, Clone, Debug, Eq, Hash, PartialEq, HashStable)]
310 #[derive(TypeFoldable)]
311 pub struct GeneratorInteriorTypeCause<'tcx> {
312     /// Type of the captured binding.
313     pub ty: Ty<'tcx>,
314     /// Span of the binding that was captured.
315     pub span: Span,
316     /// Span of the scope of the captured binding.
317     pub scope_span: Option<Span>,
318     /// Span of `.await` or `yield` expression.
319     pub yield_span: Span,
320     /// Expr which the type evaluated from.
321     pub expr: Option<hir::HirId>,
322 }
323
324 #[derive(TyEncodable, TyDecodable, Debug)]
325 pub struct TypeckResults<'tcx> {
326     /// The `HirId::owner` all `ItemLocalId`s in this table are relative to.
327     pub hir_owner: LocalDefId,
328
329     /// Resolved definitions for `<T>::X` associated paths and
330     /// method calls, including those of overloaded operators.
331     type_dependent_defs: ItemLocalMap<Result<(DefKind, DefId), ErrorReported>>,
332
333     /// Resolved field indices for field accesses in expressions (`S { field }`, `obj.field`)
334     /// or patterns (`S { field }`). The index is often useful by itself, but to learn more
335     /// about the field you also need definition of the variant to which the field
336     /// belongs, but it may not exist if it's a tuple field (`tuple.0`).
337     field_indices: ItemLocalMap<usize>,
338
339     /// Stores the types for various nodes in the AST. Note that this table
340     /// is not guaranteed to be populated until after typeck. See
341     /// typeck::check::fn_ctxt for details.
342     node_types: ItemLocalMap<Ty<'tcx>>,
343
344     /// Stores the type parameters which were substituted to obtain the type
345     /// of this node. This only applies to nodes that refer to entities
346     /// parameterized by type parameters, such as generic fns, types, or
347     /// other items.
348     node_substs: ItemLocalMap<SubstsRef<'tcx>>,
349
350     /// This will either store the canonicalized types provided by the user
351     /// or the substitutions that the user explicitly gave (if any) attached
352     /// to `id`. These will not include any inferred values. The canonical form
353     /// is used to capture things like `_` or other unspecified values.
354     ///
355     /// For example, if the user wrote `foo.collect::<Vec<_>>()`, then the
356     /// canonical substitutions would include only `for<X> { Vec<X> }`.
357     ///
358     /// See also `AscribeUserType` statement in MIR.
359     user_provided_types: ItemLocalMap<CanonicalUserType<'tcx>>,
360
361     /// Stores the canonicalized types provided by the user. See also
362     /// `AscribeUserType` statement in MIR.
363     pub user_provided_sigs: DefIdMap<CanonicalPolyFnSig<'tcx>>,
364
365     adjustments: ItemLocalMap<Vec<ty::adjustment::Adjustment<'tcx>>>,
366
367     /// Stores the actual binding mode for all instances of hir::BindingAnnotation.
368     pat_binding_modes: ItemLocalMap<BindingMode>,
369
370     /// Stores the types which were implicitly dereferenced in pattern binding modes
371     /// for later usage in THIR lowering. For example,
372     ///
373     /// ```
374     /// match &&Some(5i32) {
375     ///     Some(n) => {},
376     ///     _ => {},
377     /// }
378     /// ```
379     /// leads to a `vec![&&Option<i32>, &Option<i32>]`. Empty vectors are not stored.
380     ///
381     /// See:
382     /// <https://github.com/rust-lang/rfcs/blob/master/text/2005-match-ergonomics.md#definitions>
383     pat_adjustments: ItemLocalMap<Vec<Ty<'tcx>>>,
384
385     /// Records the reasons that we picked the kind of each closure;
386     /// not all closures are present in the map.
387     closure_kind_origins: ItemLocalMap<(Span, HirPlace<'tcx>)>,
388
389     /// For each fn, records the "liberated" types of its arguments
390     /// and return type. Liberated means that all bound regions
391     /// (including late-bound regions) are replaced with free
392     /// equivalents. This table is not used in codegen (since regions
393     /// are erased there) and hence is not serialized to metadata.
394     ///
395     /// This table also contains the "revealed" values for any `impl Trait`
396     /// that appear in the signature and whose values are being inferred
397     /// by this function.
398     ///
399     /// # Example
400     ///
401     /// ```rust
402     /// fn foo(x: &u32) -> impl Debug { *x }
403     /// ```
404     ///
405     /// The function signature here would be:
406     ///
407     /// ```
408     /// for<'a> fn(&'a u32) -> Foo
409     /// ```
410     ///
411     /// where `Foo` is an opaque type created for this function.
412     ///
413     ///
414     /// The *liberated* form of this would be
415     ///
416     /// ```
417     /// fn(&'a u32) -> u32
418     /// ```
419     ///
420     /// Note that `'a` is not bound (it would be an `ReFree`) and
421     /// that the `Foo` opaque type is replaced by its hidden type.
422     liberated_fn_sigs: ItemLocalMap<ty::FnSig<'tcx>>,
423
424     /// For each FRU expression, record the normalized types of the fields
425     /// of the struct - this is needed because it is non-trivial to
426     /// normalize while preserving regions. This table is used only in
427     /// MIR construction and hence is not serialized to metadata.
428     fru_field_types: ItemLocalMap<Vec<Ty<'tcx>>>,
429
430     /// For every coercion cast we add the HIR node ID of the cast
431     /// expression to this set.
432     coercion_casts: ItemLocalSet,
433
434     /// Set of trait imports actually used in the method resolution.
435     /// This is used for warning unused imports. During type
436     /// checking, this `Lrc` should not be cloned: it must have a ref-count
437     /// of 1 so that we can insert things into the set mutably.
438     pub used_trait_imports: Lrc<FxHashSet<LocalDefId>>,
439
440     /// If any errors occurred while type-checking this body,
441     /// this field will be set to `Some(ErrorReported)`.
442     pub tainted_by_errors: Option<ErrorReported>,
443
444     /// All the opaque types that are restricted to concrete types
445     /// by this function.
446     pub concrete_opaque_types: VecMap<OpaqueTypeKey<'tcx>, Ty<'tcx>>,
447
448     /// Tracks the minimum captures required for a closure;
449     /// see `MinCaptureInformationMap` for more details.
450     pub closure_min_captures: ty::MinCaptureInformationMap<'tcx>,
451
452     /// Tracks the fake reads required for a closure and the reason for the fake read.
453     /// When performing pattern matching for closures, there are times we don't end up
454     /// reading places that are mentioned in a closure (because of _ patterns). However,
455     /// to ensure the places are initialized, we introduce fake reads.
456     /// Consider these two examples:
457     /// ``` (discriminant matching with only wildcard arm)
458     /// let x: u8;
459     /// let c = || match x { _ => () };
460     /// ```
461     /// In this example, we don't need to actually read/borrow `x` in `c`, and so we don't
462     /// want to capture it. However, we do still want an error here, because `x` should have
463     /// to be initialized at the point where c is created. Therefore, we add a "fake read"
464     /// instead.
465     /// ``` (destructured assignments)
466     /// let c = || {
467     ///     let (t1, t2) = t;
468     /// }
469     /// ```
470     /// In the second example, we capture the disjoint fields of `t` (`t.0` & `t.1`), but
471     /// we never capture `t`. This becomes an issue when we build MIR as we require
472     /// information on `t` in order to create place `t.0` and `t.1`. We can solve this
473     /// issue by fake reading `t`.
474     pub closure_fake_reads: FxHashMap<DefId, Vec<(HirPlace<'tcx>, FakeReadCause, hir::HirId)>>,
475
476     /// Stores the type, expression, span and optional scope span of all types
477     /// that are live across the yield of this generator (if a generator).
478     pub generator_interior_types: ty::Binder<'tcx, Vec<GeneratorInteriorTypeCause<'tcx>>>,
479
480     /// We sometimes treat byte string literals (which are of type `&[u8; N]`)
481     /// as `&[u8]`, depending on the pattern  in which they are used.
482     /// This hashset records all instances where we behave
483     /// like this to allow `const_to_pat` to reliably handle this situation.
484     pub treat_byte_string_as_slice: ItemLocalSet,
485 }
486
487 impl<'tcx> TypeckResults<'tcx> {
488     pub fn new(hir_owner: LocalDefId) -> TypeckResults<'tcx> {
489         TypeckResults {
490             hir_owner,
491             type_dependent_defs: Default::default(),
492             field_indices: Default::default(),
493             user_provided_types: Default::default(),
494             user_provided_sigs: Default::default(),
495             node_types: Default::default(),
496             node_substs: Default::default(),
497             adjustments: Default::default(),
498             pat_binding_modes: Default::default(),
499             pat_adjustments: Default::default(),
500             closure_kind_origins: Default::default(),
501             liberated_fn_sigs: Default::default(),
502             fru_field_types: Default::default(),
503             coercion_casts: Default::default(),
504             used_trait_imports: Lrc::new(Default::default()),
505             tainted_by_errors: None,
506             concrete_opaque_types: Default::default(),
507             closure_min_captures: Default::default(),
508             closure_fake_reads: Default::default(),
509             generator_interior_types: ty::Binder::dummy(Default::default()),
510             treat_byte_string_as_slice: Default::default(),
511         }
512     }
513
514     /// Returns the final resolution of a `QPath` in an `Expr` or `Pat` node.
515     pub fn qpath_res(&self, qpath: &hir::QPath<'_>, id: hir::HirId) -> Res {
516         match *qpath {
517             hir::QPath::Resolved(_, ref path) => path.res,
518             hir::QPath::TypeRelative(..) | hir::QPath::LangItem(..) => self
519                 .type_dependent_def(id)
520                 .map_or(Res::Err, |(kind, def_id)| Res::Def(kind, def_id)),
521         }
522     }
523
524     pub fn type_dependent_defs(
525         &self,
526     ) -> LocalTableInContext<'_, Result<(DefKind, DefId), ErrorReported>> {
527         LocalTableInContext { hir_owner: self.hir_owner, data: &self.type_dependent_defs }
528     }
529
530     pub fn type_dependent_def(&self, id: HirId) -> Option<(DefKind, DefId)> {
531         validate_hir_id_for_typeck_results(self.hir_owner, id);
532         self.type_dependent_defs.get(&id.local_id).cloned().and_then(|r| r.ok())
533     }
534
535     pub fn type_dependent_def_id(&self, id: HirId) -> Option<DefId> {
536         self.type_dependent_def(id).map(|(_, def_id)| def_id)
537     }
538
539     pub fn type_dependent_defs_mut(
540         &mut self,
541     ) -> LocalTableInContextMut<'_, Result<(DefKind, DefId), ErrorReported>> {
542         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.type_dependent_defs }
543     }
544
545     pub fn field_indices(&self) -> LocalTableInContext<'_, usize> {
546         LocalTableInContext { hir_owner: self.hir_owner, data: &self.field_indices }
547     }
548
549     pub fn field_indices_mut(&mut self) -> LocalTableInContextMut<'_, usize> {
550         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.field_indices }
551     }
552
553     pub fn user_provided_types(&self) -> LocalTableInContext<'_, CanonicalUserType<'tcx>> {
554         LocalTableInContext { hir_owner: self.hir_owner, data: &self.user_provided_types }
555     }
556
557     pub fn user_provided_types_mut(
558         &mut self,
559     ) -> LocalTableInContextMut<'_, CanonicalUserType<'tcx>> {
560         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.user_provided_types }
561     }
562
563     pub fn node_types(&self) -> LocalTableInContext<'_, Ty<'tcx>> {
564         LocalTableInContext { hir_owner: self.hir_owner, data: &self.node_types }
565     }
566
567     pub fn node_types_mut(&mut self) -> LocalTableInContextMut<'_, Ty<'tcx>> {
568         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.node_types }
569     }
570
571     pub fn node_type(&self, id: hir::HirId) -> Ty<'tcx> {
572         self.node_type_opt(id).unwrap_or_else(|| {
573             bug!("node_type: no type for node `{}`", tls::with(|tcx| tcx.hir().node_to_string(id)))
574         })
575     }
576
577     pub fn node_type_opt(&self, id: hir::HirId) -> Option<Ty<'tcx>> {
578         validate_hir_id_for_typeck_results(self.hir_owner, id);
579         self.node_types.get(&id.local_id).cloned()
580     }
581
582     pub fn node_substs_mut(&mut self) -> LocalTableInContextMut<'_, SubstsRef<'tcx>> {
583         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.node_substs }
584     }
585
586     pub fn node_substs(&self, id: hir::HirId) -> SubstsRef<'tcx> {
587         validate_hir_id_for_typeck_results(self.hir_owner, id);
588         self.node_substs.get(&id.local_id).cloned().unwrap_or_else(|| InternalSubsts::empty())
589     }
590
591     pub fn node_substs_opt(&self, id: hir::HirId) -> Option<SubstsRef<'tcx>> {
592         validate_hir_id_for_typeck_results(self.hir_owner, id);
593         self.node_substs.get(&id.local_id).cloned()
594     }
595
596     // Returns the type of a pattern as a monotype. Like @expr_ty, this function
597     // doesn't provide type parameter substitutions.
598     pub fn pat_ty(&self, pat: &hir::Pat<'_>) -> Ty<'tcx> {
599         self.node_type(pat.hir_id)
600     }
601
602     // Returns the type of an expression as a monotype.
603     //
604     // NB (1): This is the PRE-ADJUSTMENT TYPE for the expression.  That is, in
605     // some cases, we insert `Adjustment` annotations such as auto-deref or
606     // auto-ref.  The type returned by this function does not consider such
607     // adjustments.  See `expr_ty_adjusted()` instead.
608     //
609     // NB (2): This type doesn't provide type parameter substitutions; e.g., if you
610     // ask for the type of "id" in "id(3)", it will return "fn(&isize) -> isize"
611     // instead of "fn(ty) -> T with T = isize".
612     pub fn expr_ty(&self, expr: &hir::Expr<'_>) -> Ty<'tcx> {
613         self.node_type(expr.hir_id)
614     }
615
616     pub fn expr_ty_opt(&self, expr: &hir::Expr<'_>) -> Option<Ty<'tcx>> {
617         self.node_type_opt(expr.hir_id)
618     }
619
620     pub fn adjustments(&self) -> LocalTableInContext<'_, Vec<ty::adjustment::Adjustment<'tcx>>> {
621         LocalTableInContext { hir_owner: self.hir_owner, data: &self.adjustments }
622     }
623
624     pub fn adjustments_mut(
625         &mut self,
626     ) -> LocalTableInContextMut<'_, Vec<ty::adjustment::Adjustment<'tcx>>> {
627         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.adjustments }
628     }
629
630     pub fn expr_adjustments(&self, expr: &hir::Expr<'_>) -> &[ty::adjustment::Adjustment<'tcx>] {
631         validate_hir_id_for_typeck_results(self.hir_owner, expr.hir_id);
632         self.adjustments.get(&expr.hir_id.local_id).map_or(&[], |a| &a[..])
633     }
634
635     /// Returns the type of `expr`, considering any `Adjustment`
636     /// entry recorded for that expression.
637     pub fn expr_ty_adjusted(&self, expr: &hir::Expr<'_>) -> Ty<'tcx> {
638         self.expr_adjustments(expr).last().map_or_else(|| self.expr_ty(expr), |adj| adj.target)
639     }
640
641     pub fn expr_ty_adjusted_opt(&self, expr: &hir::Expr<'_>) -> Option<Ty<'tcx>> {
642         self.expr_adjustments(expr).last().map(|adj| adj.target).or_else(|| self.expr_ty_opt(expr))
643     }
644
645     pub fn is_method_call(&self, expr: &hir::Expr<'_>) -> bool {
646         // Only paths and method calls/overloaded operators have
647         // entries in type_dependent_defs, ignore the former here.
648         if let hir::ExprKind::Path(_) = expr.kind {
649             return false;
650         }
651
652         matches!(self.type_dependent_defs().get(expr.hir_id), Some(Ok((DefKind::AssocFn, _))))
653     }
654
655     pub fn extract_binding_mode(&self, s: &Session, id: HirId, sp: Span) -> Option<BindingMode> {
656         self.pat_binding_modes().get(id).copied().or_else(|| {
657             s.delay_span_bug(sp, "missing binding mode");
658             None
659         })
660     }
661
662     pub fn pat_binding_modes(&self) -> LocalTableInContext<'_, BindingMode> {
663         LocalTableInContext { hir_owner: self.hir_owner, data: &self.pat_binding_modes }
664     }
665
666     pub fn pat_binding_modes_mut(&mut self) -> LocalTableInContextMut<'_, BindingMode> {
667         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.pat_binding_modes }
668     }
669
670     pub fn pat_adjustments(&self) -> LocalTableInContext<'_, Vec<Ty<'tcx>>> {
671         LocalTableInContext { hir_owner: self.hir_owner, data: &self.pat_adjustments }
672     }
673
674     pub fn pat_adjustments_mut(&mut self) -> LocalTableInContextMut<'_, Vec<Ty<'tcx>>> {
675         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.pat_adjustments }
676     }
677
678     /// For a given closure, returns the iterator of `ty::CapturedPlace`s that are captured
679     /// by the closure.
680     pub fn closure_min_captures_flattened(
681         &self,
682         closure_def_id: DefId,
683     ) -> impl Iterator<Item = &ty::CapturedPlace<'tcx>> {
684         self.closure_min_captures
685             .get(&closure_def_id)
686             .map(|closure_min_captures| closure_min_captures.values().flat_map(|v| v.iter()))
687             .into_iter()
688             .flatten()
689     }
690
691     pub fn closure_kind_origins(&self) -> LocalTableInContext<'_, (Span, HirPlace<'tcx>)> {
692         LocalTableInContext { hir_owner: self.hir_owner, data: &self.closure_kind_origins }
693     }
694
695     pub fn closure_kind_origins_mut(
696         &mut self,
697     ) -> LocalTableInContextMut<'_, (Span, HirPlace<'tcx>)> {
698         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.closure_kind_origins }
699     }
700
701     pub fn liberated_fn_sigs(&self) -> LocalTableInContext<'_, ty::FnSig<'tcx>> {
702         LocalTableInContext { hir_owner: self.hir_owner, data: &self.liberated_fn_sigs }
703     }
704
705     pub fn liberated_fn_sigs_mut(&mut self) -> LocalTableInContextMut<'_, ty::FnSig<'tcx>> {
706         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.liberated_fn_sigs }
707     }
708
709     pub fn fru_field_types(&self) -> LocalTableInContext<'_, Vec<Ty<'tcx>>> {
710         LocalTableInContext { hir_owner: self.hir_owner, data: &self.fru_field_types }
711     }
712
713     pub fn fru_field_types_mut(&mut self) -> LocalTableInContextMut<'_, Vec<Ty<'tcx>>> {
714         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.fru_field_types }
715     }
716
717     pub fn is_coercion_cast(&self, hir_id: hir::HirId) -> bool {
718         validate_hir_id_for_typeck_results(self.hir_owner, hir_id);
719         self.coercion_casts.contains(&hir_id.local_id)
720     }
721
722     pub fn set_coercion_cast(&mut self, id: ItemLocalId) {
723         self.coercion_casts.insert(id);
724     }
725
726     pub fn coercion_casts(&self) -> &ItemLocalSet {
727         &self.coercion_casts
728     }
729 }
730
731 impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for TypeckResults<'tcx> {
732     fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
733         let ty::TypeckResults {
734             hir_owner,
735             ref type_dependent_defs,
736             ref field_indices,
737             ref user_provided_types,
738             ref user_provided_sigs,
739             ref node_types,
740             ref node_substs,
741             ref adjustments,
742             ref pat_binding_modes,
743             ref pat_adjustments,
744             ref closure_kind_origins,
745             ref liberated_fn_sigs,
746             ref fru_field_types,
747             ref coercion_casts,
748             ref used_trait_imports,
749             tainted_by_errors,
750             ref concrete_opaque_types,
751             ref closure_min_captures,
752             ref closure_fake_reads,
753             ref generator_interior_types,
754             ref treat_byte_string_as_slice,
755         } = *self;
756
757         hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| {
758             hcx.local_def_path_hash(hir_owner);
759
760             type_dependent_defs.hash_stable(hcx, hasher);
761             field_indices.hash_stable(hcx, hasher);
762             user_provided_types.hash_stable(hcx, hasher);
763             user_provided_sigs.hash_stable(hcx, hasher);
764             node_types.hash_stable(hcx, hasher);
765             node_substs.hash_stable(hcx, hasher);
766             adjustments.hash_stable(hcx, hasher);
767             pat_binding_modes.hash_stable(hcx, hasher);
768             pat_adjustments.hash_stable(hcx, hasher);
769
770             closure_kind_origins.hash_stable(hcx, hasher);
771             liberated_fn_sigs.hash_stable(hcx, hasher);
772             fru_field_types.hash_stable(hcx, hasher);
773             coercion_casts.hash_stable(hcx, hasher);
774             used_trait_imports.hash_stable(hcx, hasher);
775             tainted_by_errors.hash_stable(hcx, hasher);
776             concrete_opaque_types.hash_stable(hcx, hasher);
777             closure_min_captures.hash_stable(hcx, hasher);
778             closure_fake_reads.hash_stable(hcx, hasher);
779             generator_interior_types.hash_stable(hcx, hasher);
780             treat_byte_string_as_slice.hash_stable(hcx, hasher);
781         })
782     }
783 }
784
785 rustc_index::newtype_index! {
786     pub struct UserTypeAnnotationIndex {
787         derive [HashStable]
788         DEBUG_FORMAT = "UserType({})",
789         const START_INDEX = 0,
790     }
791 }
792
793 /// Mapping of type annotation indices to canonical user type annotations.
794 pub type CanonicalUserTypeAnnotations<'tcx> =
795     IndexVec<UserTypeAnnotationIndex, CanonicalUserTypeAnnotation<'tcx>>;
796
797 #[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable, TypeFoldable, Lift)]
798 pub struct CanonicalUserTypeAnnotation<'tcx> {
799     pub user_ty: CanonicalUserType<'tcx>,
800     pub span: Span,
801     pub inferred_ty: Ty<'tcx>,
802 }
803
804 /// Canonicalized user type annotation.
805 pub type CanonicalUserType<'tcx> = Canonical<'tcx, UserType<'tcx>>;
806
807 impl CanonicalUserType<'tcx> {
808     /// Returns `true` if this represents a substitution of the form `[?0, ?1, ?2]`,
809     /// i.e., each thing is mapped to a canonical variable with the same index.
810     pub fn is_identity(&self) -> bool {
811         match self.value {
812             UserType::Ty(_) => false,
813             UserType::TypeOf(_, user_substs) => {
814                 if user_substs.user_self_ty.is_some() {
815                     return false;
816                 }
817
818                 iter::zip(user_substs.substs, BoundVar::new(0)..).all(|(kind, cvar)| {
819                     match kind.unpack() {
820                         GenericArgKind::Type(ty) => match ty.kind() {
821                             ty::Bound(debruijn, b) => {
822                                 // We only allow a `ty::INNERMOST` index in substitutions.
823                                 assert_eq!(*debruijn, ty::INNERMOST);
824                                 cvar == b.var
825                             }
826                             _ => false,
827                         },
828
829                         GenericArgKind::Lifetime(r) => match r {
830                             ty::ReLateBound(debruijn, br) => {
831                                 // We only allow a `ty::INNERMOST` index in substitutions.
832                                 assert_eq!(*debruijn, ty::INNERMOST);
833                                 cvar == br.var
834                             }
835                             _ => false,
836                         },
837
838                         GenericArgKind::Const(ct) => match ct.val {
839                             ty::ConstKind::Bound(debruijn, b) => {
840                                 // We only allow a `ty::INNERMOST` index in substitutions.
841                                 assert_eq!(debruijn, ty::INNERMOST);
842                                 cvar == b
843                             }
844                             _ => false,
845                         },
846                     }
847                 })
848             }
849         }
850     }
851 }
852
853 /// A user-given type annotation attached to a constant. These arise
854 /// from constants that are named via paths, like `Foo::<A>::new` and
855 /// so forth.
856 #[derive(Copy, Clone, Debug, PartialEq, TyEncodable, TyDecodable)]
857 #[derive(HashStable, TypeFoldable, Lift)]
858 pub enum UserType<'tcx> {
859     Ty(Ty<'tcx>),
860
861     /// The canonical type is the result of `type_of(def_id)` with the
862     /// given substitutions applied.
863     TypeOf(DefId, UserSubsts<'tcx>),
864 }
865
866 impl<'tcx> CommonTypes<'tcx> {
867     fn new(interners: &CtxtInterners<'tcx>) -> CommonTypes<'tcx> {
868         let mk = |ty| interners.intern_ty(ty);
869
870         CommonTypes {
871             unit: mk(Tuple(List::empty())),
872             bool: mk(Bool),
873             char: mk(Char),
874             never: mk(Never),
875             isize: mk(Int(ty::IntTy::Isize)),
876             i8: mk(Int(ty::IntTy::I8)),
877             i16: mk(Int(ty::IntTy::I16)),
878             i32: mk(Int(ty::IntTy::I32)),
879             i64: mk(Int(ty::IntTy::I64)),
880             i128: mk(Int(ty::IntTy::I128)),
881             usize: mk(Uint(ty::UintTy::Usize)),
882             u8: mk(Uint(ty::UintTy::U8)),
883             u16: mk(Uint(ty::UintTy::U16)),
884             u32: mk(Uint(ty::UintTy::U32)),
885             u64: mk(Uint(ty::UintTy::U64)),
886             u128: mk(Uint(ty::UintTy::U128)),
887             f32: mk(Float(ty::FloatTy::F32)),
888             f64: mk(Float(ty::FloatTy::F64)),
889             str_: mk(Str),
890             self_param: mk(ty::Param(ty::ParamTy { index: 0, name: kw::SelfUpper })),
891
892             trait_object_dummy_self: mk(Infer(ty::FreshTy(0))),
893         }
894     }
895 }
896
897 impl<'tcx> CommonLifetimes<'tcx> {
898     fn new(interners: &CtxtInterners<'tcx>) -> CommonLifetimes<'tcx> {
899         let mk = |r| interners.region.intern(r, |r| Interned(interners.arena.alloc(r))).0;
900
901         CommonLifetimes {
902             re_root_empty: mk(RegionKind::ReEmpty(ty::UniverseIndex::ROOT)),
903             re_static: mk(RegionKind::ReStatic),
904             re_erased: mk(RegionKind::ReErased),
905         }
906     }
907 }
908
909 impl<'tcx> CommonConsts<'tcx> {
910     fn new(interners: &CtxtInterners<'tcx>, types: &CommonTypes<'tcx>) -> CommonConsts<'tcx> {
911         let mk_const = |c| interners.const_.intern(c, |c| Interned(interners.arena.alloc(c))).0;
912
913         CommonConsts {
914             unit: mk_const(ty::Const {
915                 val: ty::ConstKind::Value(ConstValue::Scalar(Scalar::ZST)),
916                 ty: types.unit,
917             }),
918         }
919     }
920 }
921
922 // This struct contains information regarding the `ReFree(FreeRegion)` corresponding to a lifetime
923 // conflict.
924 #[derive(Debug)]
925 pub struct FreeRegionInfo {
926     // `LocalDefId` corresponding to FreeRegion
927     pub def_id: LocalDefId,
928     // the bound region corresponding to FreeRegion
929     pub boundregion: ty::BoundRegionKind,
930     // checks if bound region is in Impl Item
931     pub is_impl_item: bool,
932 }
933
934 /// The central data structure of the compiler. It stores references
935 /// to the various **arenas** and also houses the results of the
936 /// various **compiler queries** that have been performed. See the
937 /// [rustc dev guide] for more details.
938 ///
939 /// [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/ty.html
940 #[derive(Copy, Clone)]
941 #[rustc_diagnostic_item = "TyCtxt"]
942 pub struct TyCtxt<'tcx> {
943     gcx: &'tcx GlobalCtxt<'tcx>,
944 }
945
946 impl<'tcx> Deref for TyCtxt<'tcx> {
947     type Target = &'tcx GlobalCtxt<'tcx>;
948     #[inline(always)]
949     fn deref(&self) -> &Self::Target {
950         &self.gcx
951     }
952 }
953
954 pub struct GlobalCtxt<'tcx> {
955     pub arena: &'tcx WorkerLocal<Arena<'tcx>>,
956
957     interners: CtxtInterners<'tcx>,
958
959     pub(crate) cstore: Box<CrateStoreDyn>,
960
961     pub sess: &'tcx Session,
962
963     /// This only ever stores a `LintStore` but we don't want a dependency on that type here.
964     ///
965     /// FIXME(Centril): consider `dyn LintStoreMarker` once
966     /// we can upcast to `Any` for some additional type safety.
967     pub lint_store: Lrc<dyn Any + sync::Sync + sync::Send>,
968
969     pub dep_graph: DepGraph,
970
971     pub prof: SelfProfilerRef,
972
973     /// Common types, pre-interned for your convenience.
974     pub types: CommonTypes<'tcx>,
975
976     /// Common lifetimes, pre-interned for your convenience.
977     pub lifetimes: CommonLifetimes<'tcx>,
978
979     /// Common consts, pre-interned for your convenience.
980     pub consts: CommonConsts<'tcx>,
981
982     /// Visibilities produced by resolver.
983     pub visibilities: FxHashMap<LocalDefId, Visibility>,
984
985     /// Resolutions of `extern crate` items produced by resolver.
986     extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
987
988     /// Export map produced by name resolution.
989     export_map: ExportMap<LocalDefId>,
990
991     pub(crate) untracked_crate: &'tcx hir::Crate<'tcx>,
992     pub(crate) definitions: Definitions,
993
994     /// This provides access to the incremental compilation on-disk cache for query results.
995     /// Do not access this directly. It is only meant to be used by
996     /// `DepGraph::try_mark_green()` and the query infrastructure.
997     /// This is `None` if we are not incremental compilation mode
998     pub on_disk_cache: Option<OnDiskCache<'tcx>>,
999
1000     pub queries: &'tcx dyn query::QueryEngine<'tcx>,
1001     pub query_caches: query::QueryCaches<'tcx>,
1002
1003     maybe_unused_trait_imports: FxHashSet<LocalDefId>,
1004     maybe_unused_extern_crates: Vec<(LocalDefId, Span)>,
1005     /// A map of glob use to a set of names it actually imports. Currently only
1006     /// used in save-analysis.
1007     pub(crate) glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>,
1008     /// Extern prelude entries. The value is `true` if the entry was introduced
1009     /// via `extern crate` item and not `--extern` option or compiler built-in.
1010     pub extern_prelude: FxHashMap<Symbol, bool>,
1011
1012     // Internal caches for metadata decoding. No need to track deps on this.
1013     pub ty_rcache: Lock<FxHashMap<ty::CReaderCacheKey, Ty<'tcx>>>,
1014     pub pred_rcache: Lock<FxHashMap<ty::CReaderCacheKey, Predicate<'tcx>>>,
1015
1016     /// Caches the results of trait selection. This cache is used
1017     /// for things that do not have to do with the parameters in scope.
1018     pub selection_cache: traits::SelectionCache<'tcx>,
1019
1020     /// Caches the results of trait evaluation. This cache is used
1021     /// for things that do not have to do with the parameters in scope.
1022     /// Merge this with `selection_cache`?
1023     pub evaluation_cache: traits::EvaluationCache<'tcx>,
1024
1025     /// The definite name of the current crate after taking into account
1026     /// attributes, commandline parameters, etc.
1027     crate_name: Symbol,
1028
1029     /// Data layout specification for the current target.
1030     pub data_layout: TargetDataLayout,
1031
1032     /// `#[stable]` and `#[unstable]` attributes
1033     stability_interner: ShardedHashMap<&'tcx attr::Stability, ()>,
1034
1035     /// `#[rustc_const_stable]` and `#[rustc_const_unstable]` attributes
1036     const_stability_interner: ShardedHashMap<&'tcx attr::ConstStability, ()>,
1037
1038     /// Stores memory for globals (statics/consts).
1039     pub(crate) alloc_map: Lock<interpret::AllocMap<'tcx>>,
1040
1041     layout_interner: ShardedHashMap<&'tcx Layout, ()>,
1042
1043     output_filenames: Arc<OutputFilenames>,
1044
1045     pub main_def: Option<MainDefinition>,
1046 }
1047
1048 impl<'tcx> TyCtxt<'tcx> {
1049     pub fn typeck_opt_const_arg(
1050         self,
1051         def: ty::WithOptConstParam<LocalDefId>,
1052     ) -> &'tcx TypeckResults<'tcx> {
1053         if let Some(param_did) = def.const_param_did {
1054             self.typeck_const_arg((def.did, param_did))
1055         } else {
1056             self.typeck(def.did)
1057         }
1058     }
1059
1060     pub fn alloc_steal_thir(self, thir: Thir<'tcx>) -> &'tcx Steal<Thir<'tcx>> {
1061         self.arena.alloc(Steal::new(thir))
1062     }
1063
1064     pub fn alloc_steal_mir(self, mir: Body<'tcx>) -> &'tcx Steal<Body<'tcx>> {
1065         self.arena.alloc(Steal::new(mir))
1066     }
1067
1068     pub fn alloc_steal_promoted(
1069         self,
1070         promoted: IndexVec<Promoted, Body<'tcx>>,
1071     ) -> &'tcx Steal<IndexVec<Promoted, Body<'tcx>>> {
1072         self.arena.alloc(Steal::new(promoted))
1073     }
1074
1075     pub fn alloc_adt_def(
1076         self,
1077         did: DefId,
1078         kind: AdtKind,
1079         variants: IndexVec<VariantIdx, ty::VariantDef>,
1080         repr: ReprOptions,
1081     ) -> &'tcx ty::AdtDef {
1082         self.arena.alloc(ty::AdtDef::new(self, did, kind, variants, repr))
1083     }
1084
1085     pub fn intern_const_alloc(self, alloc: Allocation) -> &'tcx Allocation {
1086         self.interners
1087             .allocation
1088             .intern(alloc, |alloc| Interned(self.interners.arena.alloc(alloc)))
1089             .0
1090     }
1091
1092     /// Allocates a read-only byte or string literal for `mir::interpret`.
1093     pub fn allocate_bytes(self, bytes: &[u8]) -> interpret::AllocId {
1094         // Create an allocation that just contains these bytes.
1095         let alloc = interpret::Allocation::from_bytes_byte_aligned_immutable(bytes);
1096         let alloc = self.intern_const_alloc(alloc);
1097         self.create_memory_alloc(alloc)
1098     }
1099
1100     pub fn intern_stability(self, stab: attr::Stability) -> &'tcx attr::Stability {
1101         self.stability_interner.intern(stab, |stab| self.arena.alloc(stab))
1102     }
1103
1104     pub fn intern_const_stability(self, stab: attr::ConstStability) -> &'tcx attr::ConstStability {
1105         self.const_stability_interner.intern(stab, |stab| self.arena.alloc(stab))
1106     }
1107
1108     pub fn intern_layout(self, layout: Layout) -> &'tcx Layout {
1109         self.layout_interner.intern(layout, |layout| self.arena.alloc(layout))
1110     }
1111
1112     /// Returns a range of the start/end indices specified with the
1113     /// `rustc_layout_scalar_valid_range` attribute.
1114     pub fn layout_scalar_valid_range(self, def_id: DefId) -> (Bound<u128>, Bound<u128>) {
1115         let attrs = self.get_attrs(def_id);
1116         let get = |name| {
1117             let attr = match attrs.iter().find(|a| self.sess.check_name(a, name)) {
1118                 Some(attr) => attr,
1119                 None => return Bound::Unbounded,
1120             };
1121             debug!("layout_scalar_valid_range: attr={:?}", attr);
1122             if let Some(
1123                 &[ast::NestedMetaItem::Literal(ast::Lit { kind: ast::LitKind::Int(a, _), .. })],
1124             ) = attr.meta_item_list().as_deref()
1125             {
1126                 Bound::Included(a)
1127             } else {
1128                 self.sess
1129                     .delay_span_bug(attr.span, "invalid rustc_layout_scalar_valid_range attribute");
1130                 Bound::Unbounded
1131             }
1132         };
1133         (
1134             get(sym::rustc_layout_scalar_valid_range_start),
1135             get(sym::rustc_layout_scalar_valid_range_end),
1136         )
1137     }
1138
1139     pub fn lift<T: Lift<'tcx>>(self, value: T) -> Option<T::Lifted> {
1140         value.lift_to_tcx(self)
1141     }
1142
1143     /// Creates a type context and call the closure with a `TyCtxt` reference
1144     /// to the context. The closure enforces that the type context and any interned
1145     /// value (types, substs, etc.) can only be used while `ty::tls` has a valid
1146     /// reference to the context, to allow formatting values that need it.
1147     pub fn create_global_ctxt(
1148         s: &'tcx Session,
1149         lint_store: Lrc<dyn Any + sync::Send + sync::Sync>,
1150         arena: &'tcx WorkerLocal<Arena<'tcx>>,
1151         resolutions: ty::ResolverOutputs,
1152         krate: &'tcx hir::Crate<'tcx>,
1153         dep_graph: DepGraph,
1154         on_disk_cache: Option<query::OnDiskCache<'tcx>>,
1155         queries: &'tcx dyn query::QueryEngine<'tcx>,
1156         crate_name: &str,
1157         output_filenames: OutputFilenames,
1158     ) -> GlobalCtxt<'tcx> {
1159         let data_layout = TargetDataLayout::parse(&s.target).unwrap_or_else(|err| {
1160             s.fatal(&err);
1161         });
1162         let interners = CtxtInterners::new(arena);
1163         let common_types = CommonTypes::new(&interners);
1164         let common_lifetimes = CommonLifetimes::new(&interners);
1165         let common_consts = CommonConsts::new(&interners, &common_types);
1166         let cstore = resolutions.cstore;
1167
1168         GlobalCtxt {
1169             sess: s,
1170             lint_store,
1171             cstore,
1172             arena,
1173             interners,
1174             dep_graph,
1175             prof: s.prof.clone(),
1176             types: common_types,
1177             lifetimes: common_lifetimes,
1178             consts: common_consts,
1179             visibilities: resolutions.visibilities,
1180             extern_crate_map: resolutions.extern_crate_map,
1181             export_map: resolutions.export_map,
1182             maybe_unused_trait_imports: resolutions.maybe_unused_trait_imports,
1183             maybe_unused_extern_crates: resolutions.maybe_unused_extern_crates,
1184             glob_map: resolutions.glob_map,
1185             extern_prelude: resolutions.extern_prelude,
1186             untracked_crate: krate,
1187             definitions: resolutions.definitions,
1188             on_disk_cache,
1189             queries,
1190             query_caches: query::QueryCaches::default(),
1191             ty_rcache: Default::default(),
1192             pred_rcache: Default::default(),
1193             selection_cache: Default::default(),
1194             evaluation_cache: Default::default(),
1195             crate_name: Symbol::intern(crate_name),
1196             data_layout,
1197             layout_interner: Default::default(),
1198             stability_interner: Default::default(),
1199             const_stability_interner: Default::default(),
1200             alloc_map: Lock::new(interpret::AllocMap::new()),
1201             output_filenames: Arc::new(output_filenames),
1202             main_def: resolutions.main_def,
1203         }
1204     }
1205
1206     /// Constructs a `TyKind::Error` type and registers a `delay_span_bug` to ensure it gets used.
1207     #[track_caller]
1208     pub fn ty_error(self) -> Ty<'tcx> {
1209         self.ty_error_with_message(DUMMY_SP, "TyKind::Error constructed but no error reported")
1210     }
1211
1212     /// Constructs a `TyKind::Error` type and registers a `delay_span_bug` with the given `msg` to
1213     /// ensure it gets used.
1214     #[track_caller]
1215     pub fn ty_error_with_message<S: Into<MultiSpan>>(self, span: S, msg: &str) -> Ty<'tcx> {
1216         self.sess.delay_span_bug(span, msg);
1217         self.mk_ty(Error(DelaySpanBugEmitted(())))
1218     }
1219
1220     /// Like `err` but for constants.
1221     #[track_caller]
1222     pub fn const_error(self, ty: Ty<'tcx>) -> &'tcx Const<'tcx> {
1223         self.sess
1224             .delay_span_bug(DUMMY_SP, "ty::ConstKind::Error constructed but no error reported.");
1225         self.mk_const(ty::Const { val: ty::ConstKind::Error(DelaySpanBugEmitted(())), ty })
1226     }
1227
1228     pub fn consider_optimizing<T: Fn() -> String>(self, msg: T) -> bool {
1229         let cname = self.crate_name(LOCAL_CRATE).as_str();
1230         self.sess.consider_optimizing(&cname, msg)
1231     }
1232
1233     pub fn lib_features(self) -> &'tcx middle::lib_features::LibFeatures {
1234         self.get_lib_features(())
1235     }
1236
1237     /// Obtain all lang items of this crate and all dependencies (recursively)
1238     pub fn lang_items(self) -> &'tcx rustc_hir::lang_items::LanguageItems {
1239         self.get_lang_items(())
1240     }
1241
1242     /// Obtain the given diagnostic item's `DefId`. Use `is_diagnostic_item` if you just want to
1243     /// compare against another `DefId`, since `is_diagnostic_item` is cheaper.
1244     pub fn get_diagnostic_item(self, name: Symbol) -> Option<DefId> {
1245         self.all_diagnostic_items(()).get(&name).copied()
1246     }
1247
1248     /// Check whether the diagnostic item with the given `name` has the given `DefId`.
1249     pub fn is_diagnostic_item(self, name: Symbol, did: DefId) -> bool {
1250         self.diagnostic_items(did.krate).get(&name) == Some(&did)
1251     }
1252
1253     pub fn stability(self) -> &'tcx stability::Index<'tcx> {
1254         self.stability_index(())
1255     }
1256
1257     pub fn crates(self) -> &'tcx [CrateNum] {
1258         self.all_crate_nums(())
1259     }
1260
1261     pub fn features(self) -> &'tcx rustc_feature::Features {
1262         self.features_query(())
1263     }
1264
1265     pub fn def_key(self, id: DefId) -> rustc_hir::definitions::DefKey {
1266         if let Some(id) = id.as_local() { self.hir().def_key(id) } else { self.cstore.def_key(id) }
1267     }
1268
1269     /// Converts a `DefId` into its fully expanded `DefPath` (every
1270     /// `DefId` is really just an interned `DefPath`).
1271     ///
1272     /// Note that if `id` is not local to this crate, the result will
1273     ///  be a non-local `DefPath`.
1274     pub fn def_path(self, id: DefId) -> rustc_hir::definitions::DefPath {
1275         if let Some(id) = id.as_local() {
1276             self.hir().def_path(id)
1277         } else {
1278             self.cstore.def_path(id)
1279         }
1280     }
1281
1282     #[inline]
1283     pub fn def_path_hash(self, def_id: DefId) -> rustc_hir::definitions::DefPathHash {
1284         if let Some(def_id) = def_id.as_local() {
1285             self.definitions.def_path_hash(def_id)
1286         } else {
1287             self.cstore.def_path_hash(def_id)
1288         }
1289     }
1290
1291     #[inline]
1292     pub fn stable_crate_id(self, cnum: CrateNum) -> StableCrateId {
1293         self.def_path_hash(cnum.as_def_id()).stable_crate_id()
1294     }
1295
1296     pub fn def_path_debug_str(self, def_id: DefId) -> String {
1297         // We are explicitly not going through queries here in order to get
1298         // crate name and disambiguator since this code is called from debug!()
1299         // statements within the query system and we'd run into endless
1300         // recursion otherwise.
1301         let (crate_name, crate_disambiguator) = if def_id.is_local() {
1302             (self.crate_name, self.sess.local_crate_disambiguator())
1303         } else {
1304             (
1305                 self.cstore.crate_name_untracked(def_id.krate),
1306                 self.cstore.crate_disambiguator_untracked(def_id.krate),
1307             )
1308         };
1309
1310         format!(
1311             "{}[{}]{}",
1312             crate_name,
1313             // Don't print the whole crate disambiguator. That's just
1314             // annoying in debug output.
1315             &(crate_disambiguator.to_fingerprint().to_hex())[..4],
1316             self.def_path(def_id).to_string_no_crate_verbose()
1317         )
1318     }
1319
1320     pub fn encode_metadata(self) -> EncodedMetadata {
1321         let _prof_timer = self.prof.verbose_generic_activity("generate_crate_metadata");
1322         self.cstore.encode_metadata(self)
1323     }
1324
1325     // Note that this is *untracked* and should only be used within the query
1326     // system if the result is otherwise tracked through queries
1327     pub fn cstore_as_any(self) -> &'tcx dyn Any {
1328         self.cstore.as_any()
1329     }
1330
1331     #[inline(always)]
1332     pub fn create_stable_hashing_context(self) -> StableHashingContext<'tcx> {
1333         let krate = self.gcx.untracked_crate;
1334
1335         StableHashingContext::new(self.sess, krate, &self.definitions, &*self.cstore)
1336     }
1337
1338     #[inline(always)]
1339     pub fn create_no_span_stable_hashing_context(self) -> StableHashingContext<'tcx> {
1340         let krate = self.gcx.untracked_crate;
1341
1342         StableHashingContext::ignore_spans(self.sess, krate, &self.definitions, &*self.cstore)
1343     }
1344
1345     pub fn serialize_query_result_cache(self, encoder: &mut FileEncoder) -> FileEncodeResult {
1346         self.on_disk_cache.as_ref().map_or(Ok(()), |c| c.serialize(self, encoder))
1347     }
1348
1349     /// If `true`, we should use the MIR-based borrowck, but also
1350     /// fall back on the AST borrowck if the MIR-based one errors.
1351     pub fn migrate_borrowck(self) -> bool {
1352         self.borrowck_mode().migrate()
1353     }
1354
1355     /// What mode(s) of borrowck should we run? AST? MIR? both?
1356     /// (Also considers the `#![feature(nll)]` setting.)
1357     pub fn borrowck_mode(self) -> BorrowckMode {
1358         // Here are the main constraints we need to deal with:
1359         //
1360         // 1. An opts.borrowck_mode of `BorrowckMode::Migrate` is
1361         //    synonymous with no `-Z borrowck=...` flag at all.
1362         //
1363         // 2. We want to allow developers on the Nightly channel
1364         //    to opt back into the "hard error" mode for NLL,
1365         //    (which they can do via specifying `#![feature(nll)]`
1366         //    explicitly in their crate).
1367         //
1368         // So, this precedence list is how pnkfelix chose to work with
1369         // the above constraints:
1370         //
1371         // * `#![feature(nll)]` *always* means use NLL with hard
1372         //   errors. (To simplify the code here, it now even overrides
1373         //   a user's attempt to specify `-Z borrowck=compare`, which
1374         //   we arguably do not need anymore and should remove.)
1375         //
1376         // * Otherwise, if no `-Z borrowck=...` then use migrate mode
1377         //
1378         // * Otherwise, use the behavior requested via `-Z borrowck=...`
1379
1380         if self.features().nll {
1381             return BorrowckMode::Mir;
1382         }
1383
1384         self.sess.opts.borrowck_mode
1385     }
1386
1387     /// If `true`, we should use lazy normalization for constants, otherwise
1388     /// we still evaluate them eagerly.
1389     #[inline]
1390     pub fn lazy_normalization(self) -> bool {
1391         let features = self.features();
1392         // Note: We do not enable lazy normalization for `min_const_generics`.
1393         features.const_generics || features.lazy_normalization_consts
1394     }
1395
1396     #[inline]
1397     pub fn local_crate_exports_generics(self) -> bool {
1398         debug_assert!(self.sess.opts.share_generics());
1399
1400         self.sess.crate_types().iter().any(|crate_type| {
1401             match crate_type {
1402                 CrateType::Executable
1403                 | CrateType::Staticlib
1404                 | CrateType::ProcMacro
1405                 | CrateType::Cdylib => false,
1406
1407                 // FIXME rust-lang/rust#64319, rust-lang/rust#64872:
1408                 // We want to block export of generics from dylibs,
1409                 // but we must fix rust-lang/rust#65890 before we can
1410                 // do that robustly.
1411                 CrateType::Dylib => true,
1412
1413                 CrateType::Rlib => true,
1414             }
1415         })
1416     }
1417
1418     // Returns the `DefId` and the `BoundRegionKind` corresponding to the given region.
1419     pub fn is_suitable_region(self, region: Region<'tcx>) -> Option<FreeRegionInfo> {
1420         let (suitable_region_binding_scope, bound_region) = match *region {
1421             ty::ReFree(ref free_region) => {
1422                 (free_region.scope.expect_local(), free_region.bound_region)
1423             }
1424             ty::ReEarlyBound(ref ebr) => (
1425                 self.parent(ebr.def_id).unwrap().expect_local(),
1426                 ty::BoundRegionKind::BrNamed(ebr.def_id, ebr.name),
1427             ),
1428             _ => return None, // not a free region
1429         };
1430
1431         let hir_id = self.hir().local_def_id_to_hir_id(suitable_region_binding_scope);
1432         let is_impl_item = match self.hir().find(hir_id) {
1433             Some(Node::Item(..) | Node::TraitItem(..)) => false,
1434             Some(Node::ImplItem(..)) => {
1435                 self.is_bound_region_in_impl_item(suitable_region_binding_scope)
1436             }
1437             _ => return None,
1438         };
1439
1440         Some(FreeRegionInfo {
1441             def_id: suitable_region_binding_scope,
1442             boundregion: bound_region,
1443             is_impl_item,
1444         })
1445     }
1446
1447     /// Given a `DefId` for an `fn`, return all the `dyn` and `impl` traits in its return type.
1448     pub fn return_type_impl_or_dyn_traits(
1449         self,
1450         scope_def_id: LocalDefId,
1451     ) -> Vec<&'tcx hir::Ty<'tcx>> {
1452         let hir_id = self.hir().local_def_id_to_hir_id(scope_def_id);
1453         let hir_output = match self.hir().get(hir_id) {
1454             Node::Item(hir::Item {
1455                 kind:
1456                     ItemKind::Fn(
1457                         hir::FnSig {
1458                             decl: hir::FnDecl { output: hir::FnRetTy::Return(ty), .. },
1459                             ..
1460                         },
1461                         ..,
1462                     ),
1463                 ..
1464             })
1465             | Node::ImplItem(hir::ImplItem {
1466                 kind:
1467                     hir::ImplItemKind::Fn(
1468                         hir::FnSig {
1469                             decl: hir::FnDecl { output: hir::FnRetTy::Return(ty), .. },
1470                             ..
1471                         },
1472                         _,
1473                     ),
1474                 ..
1475             })
1476             | Node::TraitItem(hir::TraitItem {
1477                 kind:
1478                     hir::TraitItemKind::Fn(
1479                         hir::FnSig {
1480                             decl: hir::FnDecl { output: hir::FnRetTy::Return(ty), .. },
1481                             ..
1482                         },
1483                         _,
1484                     ),
1485                 ..
1486             }) => ty,
1487             _ => return vec![],
1488         };
1489
1490         let mut v = TraitObjectVisitor(vec![], self.hir());
1491         v.visit_ty(hir_output);
1492         v.0
1493     }
1494
1495     pub fn return_type_impl_trait(self, scope_def_id: LocalDefId) -> Option<(Ty<'tcx>, Span)> {
1496         // HACK: `type_of_def_id()` will fail on these (#55796), so return `None`.
1497         let hir_id = self.hir().local_def_id_to_hir_id(scope_def_id);
1498         match self.hir().get(hir_id) {
1499             Node::Item(item) => {
1500                 match item.kind {
1501                     ItemKind::Fn(..) => { /* `type_of_def_id()` will work */ }
1502                     _ => {
1503                         return None;
1504                     }
1505                 }
1506             }
1507             _ => { /* `type_of_def_id()` will work or panic */ }
1508         }
1509
1510         let ret_ty = self.type_of(scope_def_id);
1511         match ret_ty.kind() {
1512             ty::FnDef(_, _) => {
1513                 let sig = ret_ty.fn_sig(self);
1514                 let output = self.erase_late_bound_regions(sig.output());
1515                 if output.is_impl_trait() {
1516                     let fn_decl = self.hir().fn_decl_by_hir_id(hir_id).unwrap();
1517                     Some((output, fn_decl.output.span()))
1518                 } else {
1519                     None
1520                 }
1521             }
1522             _ => None,
1523         }
1524     }
1525
1526     // Checks if the bound region is in Impl Item.
1527     pub fn is_bound_region_in_impl_item(self, suitable_region_binding_scope: LocalDefId) -> bool {
1528         let container_id =
1529             self.associated_item(suitable_region_binding_scope.to_def_id()).container.id();
1530         if self.impl_trait_ref(container_id).is_some() {
1531             // For now, we do not try to target impls of traits. This is
1532             // because this message is going to suggest that the user
1533             // change the fn signature, but they may not be free to do so,
1534             // since the signature must match the trait.
1535             //
1536             // FIXME(#42706) -- in some cases, we could do better here.
1537             return true;
1538         }
1539         false
1540     }
1541
1542     /// Determines whether identifiers in the assembly have strict naming rules.
1543     /// Currently, only NVPTX* targets need it.
1544     pub fn has_strict_asm_symbol_naming(self) -> bool {
1545         self.sess.target.arch.contains("nvptx")
1546     }
1547
1548     /// Returns `&'static core::panic::Location<'static>`.
1549     pub fn caller_location_ty(self) -> Ty<'tcx> {
1550         self.mk_imm_ref(
1551             self.lifetimes.re_static,
1552             self.type_of(self.require_lang_item(LangItem::PanicLocation, None))
1553                 .subst(self, self.mk_substs([self.lifetimes.re_static.into()].iter())),
1554         )
1555     }
1556
1557     /// Returns a displayable description and article for the given `def_id` (e.g. `("a", "struct")`).
1558     pub fn article_and_description(self, def_id: DefId) -> (&'static str, &'static str) {
1559         match self.def_kind(def_id) {
1560             DefKind::Generator => match self.generator_kind(def_id).unwrap() {
1561                 rustc_hir::GeneratorKind::Async(..) => ("an", "async closure"),
1562                 rustc_hir::GeneratorKind::Gen => ("a", "generator"),
1563             },
1564             def_kind => (def_kind.article(), def_kind.descr(def_id)),
1565         }
1566     }
1567 }
1568
1569 /// A trait implemented for all `X<'a>` types that can be safely and
1570 /// efficiently converted to `X<'tcx>` as long as they are part of the
1571 /// provided `TyCtxt<'tcx>`.
1572 /// This can be done, for example, for `Ty<'tcx>` or `SubstsRef<'tcx>`
1573 /// by looking them up in their respective interners.
1574 ///
1575 /// However, this is still not the best implementation as it does
1576 /// need to compare the components, even for interned values.
1577 /// It would be more efficient if `TypedArena` provided a way to
1578 /// determine whether the address is in the allocated range.
1579 ///
1580 /// `None` is returned if the value or one of the components is not part
1581 /// of the provided context.
1582 /// For `Ty`, `None` can be returned if either the type interner doesn't
1583 /// contain the `TyKind` key or if the address of the interned
1584 /// pointer differs. The latter case is possible if a primitive type,
1585 /// e.g., `()` or `u8`, was interned in a different context.
1586 pub trait Lift<'tcx>: fmt::Debug {
1587     type Lifted: fmt::Debug + 'tcx;
1588     fn lift_to_tcx(self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted>;
1589 }
1590
1591 macro_rules! nop_lift {
1592     ($set:ident; $ty:ty => $lifted:ty) => {
1593         impl<'a, 'tcx> Lift<'tcx> for $ty {
1594             type Lifted = $lifted;
1595             fn lift_to_tcx(self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
1596                 if tcx.interners.$set.contains_pointer_to(&Interned(self)) {
1597                     Some(unsafe { mem::transmute(self) })
1598                 } else {
1599                     None
1600                 }
1601             }
1602         }
1603     };
1604 }
1605
1606 macro_rules! nop_list_lift {
1607     ($set:ident; $ty:ty => $lifted:ty) => {
1608         impl<'a, 'tcx> Lift<'tcx> for &'a List<$ty> {
1609             type Lifted = &'tcx List<$lifted>;
1610             fn lift_to_tcx(self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
1611                 if self.is_empty() {
1612                     return Some(List::empty());
1613                 }
1614                 if tcx.interners.$set.contains_pointer_to(&Interned(self)) {
1615                     Some(unsafe { mem::transmute(self) })
1616                 } else {
1617                     None
1618                 }
1619             }
1620         }
1621     };
1622 }
1623
1624 nop_lift! {type_; Ty<'a> => Ty<'tcx>}
1625 nop_lift! {region; Region<'a> => Region<'tcx>}
1626 nop_lift! {const_; &'a Const<'a> => &'tcx Const<'tcx>}
1627 nop_lift! {allocation; &'a Allocation => &'tcx Allocation}
1628 nop_lift! {predicate; &'a PredicateInner<'a> => &'tcx PredicateInner<'tcx>}
1629
1630 nop_list_lift! {type_list; Ty<'a> => Ty<'tcx>}
1631 nop_list_lift! {poly_existential_predicates; ty::Binder<'a, ExistentialPredicate<'a>> => ty::Binder<'tcx, ExistentialPredicate<'tcx>>}
1632 nop_list_lift! {predicates; Predicate<'a> => Predicate<'tcx>}
1633 nop_list_lift! {canonical_var_infos; CanonicalVarInfo<'a> => CanonicalVarInfo<'tcx>}
1634 nop_list_lift! {projs; ProjectionKind => ProjectionKind}
1635 nop_list_lift! {bound_variable_kinds; ty::BoundVariableKind => ty::BoundVariableKind}
1636
1637 // This is the impl for `&'a InternalSubsts<'a>`.
1638 nop_list_lift! {substs; GenericArg<'a> => GenericArg<'tcx>}
1639
1640 CloneLiftImpls! { for<'tcx> { Constness, } }
1641
1642 pub mod tls {
1643     use super::{ptr_eq, GlobalCtxt, TyCtxt};
1644
1645     use crate::dep_graph::{DepKind, TaskDeps};
1646     use crate::ty::query;
1647     use rustc_data_structures::sync::{self, Lock};
1648     use rustc_data_structures::thin_vec::ThinVec;
1649     use rustc_errors::Diagnostic;
1650     use std::mem;
1651
1652     #[cfg(not(parallel_compiler))]
1653     use std::cell::Cell;
1654
1655     #[cfg(parallel_compiler)]
1656     use rustc_rayon_core as rayon_core;
1657
1658     /// This is the implicit state of rustc. It contains the current
1659     /// `TyCtxt` and query. It is updated when creating a local interner or
1660     /// executing a new query. Whenever there's a `TyCtxt` value available
1661     /// you should also have access to an `ImplicitCtxt` through the functions
1662     /// in this module.
1663     #[derive(Clone)]
1664     pub struct ImplicitCtxt<'a, 'tcx> {
1665         /// The current `TyCtxt`.
1666         pub tcx: TyCtxt<'tcx>,
1667
1668         /// The current query job, if any. This is updated by `JobOwner::start` in
1669         /// `ty::query::plumbing` when executing a query.
1670         pub query: Option<query::QueryJobId<DepKind>>,
1671
1672         /// Where to store diagnostics for the current query job, if any.
1673         /// This is updated by `JobOwner::start` in `ty::query::plumbing` when executing a query.
1674         pub diagnostics: Option<&'a Lock<ThinVec<Diagnostic>>>,
1675
1676         /// Used to prevent layout from recursing too deeply.
1677         pub layout_depth: usize,
1678
1679         /// The current dep graph task. This is used to add dependencies to queries
1680         /// when executing them.
1681         pub task_deps: Option<&'a Lock<TaskDeps>>,
1682     }
1683
1684     impl<'a, 'tcx> ImplicitCtxt<'a, 'tcx> {
1685         pub fn new(gcx: &'tcx GlobalCtxt<'tcx>) -> Self {
1686             let tcx = TyCtxt { gcx };
1687             ImplicitCtxt { tcx, query: None, diagnostics: None, layout_depth: 0, task_deps: None }
1688         }
1689     }
1690
1691     /// Sets Rayon's thread-local variable, which is preserved for Rayon jobs
1692     /// to `value` during the call to `f`. It is restored to its previous value after.
1693     /// This is used to set the pointer to the new `ImplicitCtxt`.
1694     #[cfg(parallel_compiler)]
1695     #[inline]
1696     fn set_tlv<F: FnOnce() -> R, R>(value: usize, f: F) -> R {
1697         rayon_core::tlv::with(value, f)
1698     }
1699
1700     /// Gets Rayon's thread-local variable, which is preserved for Rayon jobs.
1701     /// This is used to get the pointer to the current `ImplicitCtxt`.
1702     #[cfg(parallel_compiler)]
1703     #[inline]
1704     pub fn get_tlv() -> usize {
1705         rayon_core::tlv::get()
1706     }
1707
1708     #[cfg(not(parallel_compiler))]
1709     thread_local! {
1710         /// A thread local variable that stores a pointer to the current `ImplicitCtxt`.
1711         static TLV: Cell<usize> = const { Cell::new(0) };
1712     }
1713
1714     /// Sets TLV to `value` during the call to `f`.
1715     /// It is restored to its previous value after.
1716     /// This is used to set the pointer to the new `ImplicitCtxt`.
1717     #[cfg(not(parallel_compiler))]
1718     #[inline]
1719     fn set_tlv<F: FnOnce() -> R, R>(value: usize, f: F) -> R {
1720         let old = get_tlv();
1721         let _reset = rustc_data_structures::OnDrop(move || TLV.with(|tlv| tlv.set(old)));
1722         TLV.with(|tlv| tlv.set(value));
1723         f()
1724     }
1725
1726     /// Gets the pointer to the current `ImplicitCtxt`.
1727     #[cfg(not(parallel_compiler))]
1728     #[inline]
1729     fn get_tlv() -> usize {
1730         TLV.with(|tlv| tlv.get())
1731     }
1732
1733     /// Sets `context` as the new current `ImplicitCtxt` for the duration of the function `f`.
1734     #[inline]
1735     pub fn enter_context<'a, 'tcx, F, R>(context: &ImplicitCtxt<'a, 'tcx>, f: F) -> R
1736     where
1737         F: FnOnce(&ImplicitCtxt<'a, 'tcx>) -> R,
1738     {
1739         set_tlv(context as *const _ as usize, || f(&context))
1740     }
1741
1742     /// Allows access to the current `ImplicitCtxt` in a closure if one is available.
1743     #[inline]
1744     pub fn with_context_opt<F, R>(f: F) -> R
1745     where
1746         F: for<'a, 'tcx> FnOnce(Option<&ImplicitCtxt<'a, 'tcx>>) -> R,
1747     {
1748         let context = get_tlv();
1749         if context == 0 {
1750             f(None)
1751         } else {
1752             // We could get a `ImplicitCtxt` pointer from another thread.
1753             // Ensure that `ImplicitCtxt` is `Sync`.
1754             sync::assert_sync::<ImplicitCtxt<'_, '_>>();
1755
1756             unsafe { f(Some(&*(context as *const ImplicitCtxt<'_, '_>))) }
1757         }
1758     }
1759
1760     /// Allows access to the current `ImplicitCtxt`.
1761     /// Panics if there is no `ImplicitCtxt` available.
1762     #[inline]
1763     pub fn with_context<F, R>(f: F) -> R
1764     where
1765         F: for<'a, 'tcx> FnOnce(&ImplicitCtxt<'a, 'tcx>) -> R,
1766     {
1767         with_context_opt(|opt_context| f(opt_context.expect("no ImplicitCtxt stored in tls")))
1768     }
1769
1770     /// Allows access to the current `ImplicitCtxt` whose tcx field is the same as the tcx argument
1771     /// passed in. This means the closure is given an `ImplicitCtxt` with the same `'tcx` lifetime
1772     /// as the `TyCtxt` passed in.
1773     /// This will panic if you pass it a `TyCtxt` which is different from the current
1774     /// `ImplicitCtxt`'s `tcx` field.
1775     #[inline]
1776     pub fn with_related_context<'tcx, F, R>(tcx: TyCtxt<'tcx>, f: F) -> R
1777     where
1778         F: FnOnce(&ImplicitCtxt<'_, 'tcx>) -> R,
1779     {
1780         with_context(|context| unsafe {
1781             assert!(ptr_eq(context.tcx.gcx, tcx.gcx));
1782             let context: &ImplicitCtxt<'_, '_> = mem::transmute(context);
1783             f(context)
1784         })
1785     }
1786
1787     /// Allows access to the `TyCtxt` in the current `ImplicitCtxt`.
1788     /// Panics if there is no `ImplicitCtxt` available.
1789     #[inline]
1790     pub fn with<F, R>(f: F) -> R
1791     where
1792         F: for<'tcx> FnOnce(TyCtxt<'tcx>) -> R,
1793     {
1794         with_context(|context| f(context.tcx))
1795     }
1796
1797     /// Allows access to the `TyCtxt` in the current `ImplicitCtxt`.
1798     /// The closure is passed None if there is no `ImplicitCtxt` available.
1799     #[inline]
1800     pub fn with_opt<F, R>(f: F) -> R
1801     where
1802         F: for<'tcx> FnOnce(Option<TyCtxt<'tcx>>) -> R,
1803     {
1804         with_context_opt(|opt_context| f(opt_context.map(|context| context.tcx)))
1805     }
1806 }
1807
1808 macro_rules! sty_debug_print {
1809     ($fmt: expr, $ctxt: expr, $($variant: ident),*) => {{
1810         // Curious inner module to allow variant names to be used as
1811         // variable names.
1812         #[allow(non_snake_case)]
1813         mod inner {
1814             use crate::ty::{self, TyCtxt};
1815             use crate::ty::context::Interned;
1816
1817             #[derive(Copy, Clone)]
1818             struct DebugStat {
1819                 total: usize,
1820                 lt_infer: usize,
1821                 ty_infer: usize,
1822                 ct_infer: usize,
1823                 all_infer: usize,
1824             }
1825
1826             pub fn go(fmt: &mut std::fmt::Formatter<'_>, tcx: TyCtxt<'_>) -> std::fmt::Result {
1827                 let mut total = DebugStat {
1828                     total: 0,
1829                     lt_infer: 0,
1830                     ty_infer: 0,
1831                     ct_infer: 0,
1832                     all_infer: 0,
1833                 };
1834                 $(let mut $variant = total;)*
1835
1836                 let shards = tcx.interners.type_.lock_shards();
1837                 let types = shards.iter().flat_map(|shard| shard.keys());
1838                 for &Interned(t) in types {
1839                     let variant = match t.kind() {
1840                         ty::Bool | ty::Char | ty::Int(..) | ty::Uint(..) |
1841                             ty::Float(..) | ty::Str | ty::Never => continue,
1842                         ty::Error(_) => /* unimportant */ continue,
1843                         $(ty::$variant(..) => &mut $variant,)*
1844                     };
1845                     let lt = t.flags().intersects(ty::TypeFlags::HAS_RE_INFER);
1846                     let ty = t.flags().intersects(ty::TypeFlags::HAS_TY_INFER);
1847                     let ct = t.flags().intersects(ty::TypeFlags::HAS_CT_INFER);
1848
1849                     variant.total += 1;
1850                     total.total += 1;
1851                     if lt { total.lt_infer += 1; variant.lt_infer += 1 }
1852                     if ty { total.ty_infer += 1; variant.ty_infer += 1 }
1853                     if ct { total.ct_infer += 1; variant.ct_infer += 1 }
1854                     if lt && ty && ct { total.all_infer += 1; variant.all_infer += 1 }
1855                 }
1856                 writeln!(fmt, "Ty interner             total           ty lt ct all")?;
1857                 $(writeln!(fmt, "    {:18}: {uses:6} {usespc:4.1}%, \
1858                             {ty:4.1}% {lt:5.1}% {ct:4.1}% {all:4.1}%",
1859                     stringify!($variant),
1860                     uses = $variant.total,
1861                     usespc = $variant.total as f64 * 100.0 / total.total as f64,
1862                     ty = $variant.ty_infer as f64 * 100.0  / total.total as f64,
1863                     lt = $variant.lt_infer as f64 * 100.0  / total.total as f64,
1864                     ct = $variant.ct_infer as f64 * 100.0  / total.total as f64,
1865                     all = $variant.all_infer as f64 * 100.0  / total.total as f64)?;
1866                 )*
1867                 writeln!(fmt, "                  total {uses:6}        \
1868                           {ty:4.1}% {lt:5.1}% {ct:4.1}% {all:4.1}%",
1869                     uses = total.total,
1870                     ty = total.ty_infer as f64 * 100.0  / total.total as f64,
1871                     lt = total.lt_infer as f64 * 100.0  / total.total as f64,
1872                     ct = total.ct_infer as f64 * 100.0  / total.total as f64,
1873                     all = total.all_infer as f64 * 100.0  / total.total as f64)
1874             }
1875         }
1876
1877         inner::go($fmt, $ctxt)
1878     }}
1879 }
1880
1881 impl<'tcx> TyCtxt<'tcx> {
1882     pub fn debug_stats(self) -> impl std::fmt::Debug + 'tcx {
1883         struct DebugStats<'tcx>(TyCtxt<'tcx>);
1884
1885         impl std::fmt::Debug for DebugStats<'tcx> {
1886             fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1887                 sty_debug_print!(
1888                     fmt,
1889                     self.0,
1890                     Adt,
1891                     Array,
1892                     Slice,
1893                     RawPtr,
1894                     Ref,
1895                     FnDef,
1896                     FnPtr,
1897                     Placeholder,
1898                     Generator,
1899                     GeneratorWitness,
1900                     Dynamic,
1901                     Closure,
1902                     Tuple,
1903                     Bound,
1904                     Param,
1905                     Infer,
1906                     Projection,
1907                     Opaque,
1908                     Foreign
1909                 )?;
1910
1911                 writeln!(fmt, "InternalSubsts interner: #{}", self.0.interners.substs.len())?;
1912                 writeln!(fmt, "Region interner: #{}", self.0.interners.region.len())?;
1913                 writeln!(fmt, "Stability interner: #{}", self.0.stability_interner.len())?;
1914                 writeln!(
1915                     fmt,
1916                     "Const Stability interner: #{}",
1917                     self.0.const_stability_interner.len()
1918                 )?;
1919                 writeln!(fmt, "Allocation interner: #{}", self.0.interners.allocation.len())?;
1920                 writeln!(fmt, "Layout interner: #{}", self.0.layout_interner.len())?;
1921
1922                 Ok(())
1923             }
1924         }
1925
1926         DebugStats(self)
1927     }
1928 }
1929
1930 /// An entry in an interner.
1931 struct Interned<'tcx, T: ?Sized>(&'tcx T);
1932
1933 impl<'tcx, T: 'tcx + ?Sized> Clone for Interned<'tcx, T> {
1934     fn clone(&self) -> Self {
1935         Interned(self.0)
1936     }
1937 }
1938 impl<'tcx, T: 'tcx + ?Sized> Copy for Interned<'tcx, T> {}
1939
1940 impl<'tcx, T: 'tcx + ?Sized> IntoPointer for Interned<'tcx, T> {
1941     fn into_pointer(&self) -> *const () {
1942         self.0 as *const _ as *const ()
1943     }
1944 }
1945 // N.B., an `Interned<Ty>` compares and hashes as a `TyKind`.
1946 impl<'tcx> PartialEq for Interned<'tcx, TyS<'tcx>> {
1947     fn eq(&self, other: &Interned<'tcx, TyS<'tcx>>) -> bool {
1948         self.0.kind() == other.0.kind()
1949     }
1950 }
1951
1952 impl<'tcx> Eq for Interned<'tcx, TyS<'tcx>> {}
1953
1954 impl<'tcx> Hash for Interned<'tcx, TyS<'tcx>> {
1955     fn hash<H: Hasher>(&self, s: &mut H) {
1956         self.0.kind().hash(s)
1957     }
1958 }
1959
1960 #[allow(rustc::usage_of_ty_tykind)]
1961 impl<'tcx> Borrow<TyKind<'tcx>> for Interned<'tcx, TyS<'tcx>> {
1962     fn borrow<'a>(&'a self) -> &'a TyKind<'tcx> {
1963         &self.0.kind()
1964     }
1965 }
1966 // N.B., an `Interned<PredicateInner>` compares and hashes as a `PredicateKind`.
1967 impl<'tcx> PartialEq for Interned<'tcx, PredicateInner<'tcx>> {
1968     fn eq(&self, other: &Interned<'tcx, PredicateInner<'tcx>>) -> bool {
1969         self.0.kind == other.0.kind
1970     }
1971 }
1972
1973 impl<'tcx> Eq for Interned<'tcx, PredicateInner<'tcx>> {}
1974
1975 impl<'tcx> Hash for Interned<'tcx, PredicateInner<'tcx>> {
1976     fn hash<H: Hasher>(&self, s: &mut H) {
1977         self.0.kind.hash(s)
1978     }
1979 }
1980
1981 impl<'tcx> Borrow<Binder<'tcx, PredicateKind<'tcx>>> for Interned<'tcx, PredicateInner<'tcx>> {
1982     fn borrow<'a>(&'a self) -> &'a Binder<'tcx, PredicateKind<'tcx>> {
1983         &self.0.kind
1984     }
1985 }
1986
1987 // N.B., an `Interned<List<T>>` compares and hashes as its elements.
1988 impl<'tcx, T: PartialEq> PartialEq for Interned<'tcx, List<T>> {
1989     fn eq(&self, other: &Interned<'tcx, List<T>>) -> bool {
1990         self.0[..] == other.0[..]
1991     }
1992 }
1993
1994 impl<'tcx, T: Eq> Eq for Interned<'tcx, List<T>> {}
1995
1996 impl<'tcx, T: Hash> Hash for Interned<'tcx, List<T>> {
1997     fn hash<H: Hasher>(&self, s: &mut H) {
1998         self.0[..].hash(s)
1999     }
2000 }
2001
2002 impl<'tcx, T> Borrow<[T]> for Interned<'tcx, List<T>> {
2003     fn borrow<'a>(&'a self) -> &'a [T] {
2004         &self.0[..]
2005     }
2006 }
2007
2008 impl<'tcx> Borrow<RegionKind> for Interned<'tcx, RegionKind> {
2009     fn borrow(&self) -> &RegionKind {
2010         &self.0
2011     }
2012 }
2013
2014 impl<'tcx> Borrow<Const<'tcx>> for Interned<'tcx, Const<'tcx>> {
2015     fn borrow<'a>(&'a self) -> &'a Const<'tcx> {
2016         &self.0
2017     }
2018 }
2019
2020 impl<'tcx> Borrow<Allocation> for Interned<'tcx, Allocation> {
2021     fn borrow<'a>(&'a self) -> &'a Allocation {
2022         &self.0
2023     }
2024 }
2025
2026 impl<'tcx> PartialEq for Interned<'tcx, Allocation> {
2027     fn eq(&self, other: &Self) -> bool {
2028         self.0 == other.0
2029     }
2030 }
2031
2032 impl<'tcx> Eq for Interned<'tcx, Allocation> {}
2033
2034 impl<'tcx> Hash for Interned<'tcx, Allocation> {
2035     fn hash<H: Hasher>(&self, s: &mut H) {
2036         self.0.hash(s)
2037     }
2038 }
2039
2040 macro_rules! direct_interners {
2041     ($($name:ident: $method:ident($ty:ty),)+) => {
2042         $(impl<'tcx> PartialEq for Interned<'tcx, $ty> {
2043             fn eq(&self, other: &Self) -> bool {
2044                 self.0 == other.0
2045             }
2046         }
2047
2048         impl<'tcx> Eq for Interned<'tcx, $ty> {}
2049
2050         impl<'tcx> Hash for Interned<'tcx, $ty> {
2051             fn hash<H: Hasher>(&self, s: &mut H) {
2052                 self.0.hash(s)
2053             }
2054         }
2055
2056         impl<'tcx> TyCtxt<'tcx> {
2057             pub fn $method(self, v: $ty) -> &'tcx $ty {
2058                 self.interners.$name.intern_ref(&v, || {
2059                     Interned(self.interners.arena.alloc(v))
2060                 }).0
2061             }
2062         })+
2063     }
2064 }
2065
2066 direct_interners! {
2067     region: mk_region(RegionKind),
2068     const_: mk_const(Const<'tcx>),
2069 }
2070
2071 macro_rules! slice_interners {
2072     ($($field:ident: $method:ident($ty:ty)),+ $(,)?) => (
2073         impl<'tcx> TyCtxt<'tcx> {
2074             $(pub fn $method(self, v: &[$ty]) -> &'tcx List<$ty> {
2075                 self.interners.$field.intern_ref(v, || {
2076                     Interned(List::from_arena(&*self.arena, v))
2077                 }).0
2078             })+
2079         }
2080     );
2081 }
2082
2083 slice_interners!(
2084     type_list: _intern_type_list(Ty<'tcx>),
2085     substs: _intern_substs(GenericArg<'tcx>),
2086     canonical_var_infos: _intern_canonical_var_infos(CanonicalVarInfo<'tcx>),
2087     poly_existential_predicates:
2088         _intern_poly_existential_predicates(ty::Binder<'tcx, ExistentialPredicate<'tcx>>),
2089     predicates: _intern_predicates(Predicate<'tcx>),
2090     projs: _intern_projs(ProjectionKind),
2091     place_elems: _intern_place_elems(PlaceElem<'tcx>),
2092     bound_variable_kinds: _intern_bound_variable_kinds(ty::BoundVariableKind),
2093 );
2094
2095 impl<'tcx> TyCtxt<'tcx> {
2096     /// Given a `fn` type, returns an equivalent `unsafe fn` type;
2097     /// that is, a `fn` type that is equivalent in every way for being
2098     /// unsafe.
2099     pub fn safe_to_unsafe_fn_ty(self, sig: PolyFnSig<'tcx>) -> Ty<'tcx> {
2100         assert_eq!(sig.unsafety(), hir::Unsafety::Normal);
2101         self.mk_fn_ptr(sig.map_bound(|sig| ty::FnSig { unsafety: hir::Unsafety::Unsafe, ..sig }))
2102     }
2103
2104     /// Given the def_id of a Trait `trait_def_id` and the name of an associated item `assoc_name`
2105     /// returns true if the `trait_def_id` defines an associated item of name `assoc_name`.
2106     pub fn trait_may_define_assoc_type(self, trait_def_id: DefId, assoc_name: Ident) -> bool {
2107         self.super_traits_of(trait_def_id).any(|trait_did| {
2108             self.associated_items(trait_did)
2109                 .find_by_name_and_kind(self, assoc_name, ty::AssocKind::Type, trait_did)
2110                 .is_some()
2111         })
2112     }
2113
2114     /// Computes the def-ids of the transitive super-traits of `trait_def_id`. This (intentionally)
2115     /// does not compute the full elaborated super-predicates but just the set of def-ids. It is used
2116     /// to identify which traits may define a given associated type to help avoid cycle errors.
2117     /// Returns a `DefId` iterator.
2118     fn super_traits_of(self, trait_def_id: DefId) -> impl Iterator<Item = DefId> + 'tcx {
2119         let mut set = FxHashSet::default();
2120         let mut stack = vec![trait_def_id];
2121
2122         set.insert(trait_def_id);
2123
2124         iter::from_fn(move || -> Option<DefId> {
2125             let trait_did = stack.pop()?;
2126             let generic_predicates = self.super_predicates_of(trait_did);
2127
2128             for (predicate, _) in generic_predicates.predicates {
2129                 if let ty::PredicateKind::Trait(data, _) = predicate.kind().skip_binder() {
2130                     if set.insert(data.def_id()) {
2131                         stack.push(data.def_id());
2132                     }
2133                 }
2134             }
2135
2136             Some(trait_did)
2137         })
2138     }
2139
2140     /// Given a closure signature, returns an equivalent fn signature. Detuples
2141     /// and so forth -- so e.g., if we have a sig with `Fn<(u32, i32)>` then
2142     /// you would get a `fn(u32, i32)`.
2143     /// `unsafety` determines the unsafety of the fn signature. If you pass
2144     /// `hir::Unsafety::Unsafe` in the previous example, then you would get
2145     /// an `unsafe fn (u32, i32)`.
2146     /// It cannot convert a closure that requires unsafe.
2147     pub fn signature_unclosure(
2148         self,
2149         sig: PolyFnSig<'tcx>,
2150         unsafety: hir::Unsafety,
2151     ) -> PolyFnSig<'tcx> {
2152         sig.map_bound(|s| {
2153             let params_iter = match s.inputs()[0].kind() {
2154                 ty::Tuple(params) => params.into_iter().map(|k| k.expect_ty()),
2155                 _ => bug!(),
2156             };
2157             self.mk_fn_sig(params_iter, s.output(), s.c_variadic, unsafety, abi::Abi::Rust)
2158         })
2159     }
2160
2161     /// Same a `self.mk_region(kind)`, but avoids accessing the interners if
2162     /// `*r == kind`.
2163     #[inline]
2164     pub fn reuse_or_mk_region(self, r: Region<'tcx>, kind: RegionKind) -> Region<'tcx> {
2165         if *r == kind { r } else { self.mk_region(kind) }
2166     }
2167
2168     #[allow(rustc::usage_of_ty_tykind)]
2169     #[inline]
2170     pub fn mk_ty(self, st: TyKind<'tcx>) -> Ty<'tcx> {
2171         self.interners.intern_ty(st)
2172     }
2173
2174     #[inline]
2175     pub fn mk_predicate(self, binder: Binder<'tcx, PredicateKind<'tcx>>) -> Predicate<'tcx> {
2176         let inner = self.interners.intern_predicate(binder);
2177         Predicate { inner }
2178     }
2179
2180     #[inline]
2181     pub fn reuse_or_mk_predicate(
2182         self,
2183         pred: Predicate<'tcx>,
2184         binder: Binder<'tcx, PredicateKind<'tcx>>,
2185     ) -> Predicate<'tcx> {
2186         if pred.kind() != binder { self.mk_predicate(binder) } else { pred }
2187     }
2188
2189     pub fn mk_mach_int(self, tm: IntTy) -> Ty<'tcx> {
2190         match tm {
2191             IntTy::Isize => self.types.isize,
2192             IntTy::I8 => self.types.i8,
2193             IntTy::I16 => self.types.i16,
2194             IntTy::I32 => self.types.i32,
2195             IntTy::I64 => self.types.i64,
2196             IntTy::I128 => self.types.i128,
2197         }
2198     }
2199
2200     pub fn mk_mach_uint(self, tm: UintTy) -> Ty<'tcx> {
2201         match tm {
2202             UintTy::Usize => self.types.usize,
2203             UintTy::U8 => self.types.u8,
2204             UintTy::U16 => self.types.u16,
2205             UintTy::U32 => self.types.u32,
2206             UintTy::U64 => self.types.u64,
2207             UintTy::U128 => self.types.u128,
2208         }
2209     }
2210
2211     pub fn mk_mach_float(self, tm: FloatTy) -> Ty<'tcx> {
2212         match tm {
2213             FloatTy::F32 => self.types.f32,
2214             FloatTy::F64 => self.types.f64,
2215         }
2216     }
2217
2218     #[inline]
2219     pub fn mk_static_str(self) -> Ty<'tcx> {
2220         self.mk_imm_ref(self.lifetimes.re_static, self.types.str_)
2221     }
2222
2223     #[inline]
2224     pub fn mk_adt(self, def: &'tcx AdtDef, substs: SubstsRef<'tcx>) -> Ty<'tcx> {
2225         // Take a copy of substs so that we own the vectors inside.
2226         self.mk_ty(Adt(def, substs))
2227     }
2228
2229     #[inline]
2230     pub fn mk_foreign(self, def_id: DefId) -> Ty<'tcx> {
2231         self.mk_ty(Foreign(def_id))
2232     }
2233
2234     fn mk_generic_adt(self, wrapper_def_id: DefId, ty_param: Ty<'tcx>) -> Ty<'tcx> {
2235         let adt_def = self.adt_def(wrapper_def_id);
2236         let substs =
2237             InternalSubsts::for_item(self, wrapper_def_id, |param, substs| match param.kind {
2238                 GenericParamDefKind::Lifetime | GenericParamDefKind::Const { .. } => bug!(),
2239                 GenericParamDefKind::Type { has_default, .. } => {
2240                     if param.index == 0 {
2241                         ty_param.into()
2242                     } else {
2243                         assert!(has_default);
2244                         self.type_of(param.def_id).subst(self, substs).into()
2245                     }
2246                 }
2247             });
2248         self.mk_ty(Adt(adt_def, substs))
2249     }
2250
2251     #[inline]
2252     pub fn mk_box(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2253         let def_id = self.require_lang_item(LangItem::OwnedBox, None);
2254         self.mk_generic_adt(def_id, ty)
2255     }
2256
2257     #[inline]
2258     pub fn mk_lang_item(self, ty: Ty<'tcx>, item: LangItem) -> Option<Ty<'tcx>> {
2259         let def_id = self.lang_items().require(item).ok()?;
2260         Some(self.mk_generic_adt(def_id, ty))
2261     }
2262
2263     #[inline]
2264     pub fn mk_diagnostic_item(self, ty: Ty<'tcx>, name: Symbol) -> Option<Ty<'tcx>> {
2265         let def_id = self.get_diagnostic_item(name)?;
2266         Some(self.mk_generic_adt(def_id, ty))
2267     }
2268
2269     #[inline]
2270     pub fn mk_maybe_uninit(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2271         let def_id = self.require_lang_item(LangItem::MaybeUninit, None);
2272         self.mk_generic_adt(def_id, ty)
2273     }
2274
2275     #[inline]
2276     pub fn mk_ptr(self, tm: TypeAndMut<'tcx>) -> Ty<'tcx> {
2277         self.mk_ty(RawPtr(tm))
2278     }
2279
2280     #[inline]
2281     pub fn mk_ref(self, r: Region<'tcx>, tm: TypeAndMut<'tcx>) -> Ty<'tcx> {
2282         self.mk_ty(Ref(r, tm.ty, tm.mutbl))
2283     }
2284
2285     #[inline]
2286     pub fn mk_mut_ref(self, r: Region<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> {
2287         self.mk_ref(r, TypeAndMut { ty, mutbl: hir::Mutability::Mut })
2288     }
2289
2290     #[inline]
2291     pub fn mk_imm_ref(self, r: Region<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> {
2292         self.mk_ref(r, TypeAndMut { ty, mutbl: hir::Mutability::Not })
2293     }
2294
2295     #[inline]
2296     pub fn mk_mut_ptr(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2297         self.mk_ptr(TypeAndMut { ty, mutbl: hir::Mutability::Mut })
2298     }
2299
2300     #[inline]
2301     pub fn mk_imm_ptr(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2302         self.mk_ptr(TypeAndMut { ty, mutbl: hir::Mutability::Not })
2303     }
2304
2305     #[inline]
2306     pub fn mk_array(self, ty: Ty<'tcx>, n: u64) -> Ty<'tcx> {
2307         self.mk_ty(Array(ty, ty::Const::from_usize(self, n)))
2308     }
2309
2310     #[inline]
2311     pub fn mk_slice(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2312         self.mk_ty(Slice(ty))
2313     }
2314
2315     #[inline]
2316     pub fn intern_tup(self, ts: &[Ty<'tcx>]) -> Ty<'tcx> {
2317         let kinds: Vec<_> = ts.iter().map(|&t| GenericArg::from(t)).collect();
2318         self.mk_ty(Tuple(self.intern_substs(&kinds)))
2319     }
2320
2321     pub fn mk_tup<I: InternAs<[Ty<'tcx>], Ty<'tcx>>>(self, iter: I) -> I::Output {
2322         iter.intern_with(|ts| {
2323             let kinds: Vec<_> = ts.iter().map(|&t| GenericArg::from(t)).collect();
2324             self.mk_ty(Tuple(self.intern_substs(&kinds)))
2325         })
2326     }
2327
2328     #[inline]
2329     pub fn mk_unit(self) -> Ty<'tcx> {
2330         self.types.unit
2331     }
2332
2333     #[inline]
2334     pub fn mk_diverging_default(self) -> Ty<'tcx> {
2335         if self.features().never_type_fallback { self.types.never } else { self.types.unit }
2336     }
2337
2338     #[inline]
2339     pub fn mk_fn_def(self, def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'tcx> {
2340         self.mk_ty(FnDef(def_id, substs))
2341     }
2342
2343     #[inline]
2344     pub fn mk_fn_ptr(self, fty: PolyFnSig<'tcx>) -> Ty<'tcx> {
2345         self.mk_ty(FnPtr(fty))
2346     }
2347
2348     #[inline]
2349     pub fn mk_dynamic(
2350         self,
2351         obj: &'tcx List<ty::Binder<'tcx, ExistentialPredicate<'tcx>>>,
2352         reg: ty::Region<'tcx>,
2353     ) -> Ty<'tcx> {
2354         self.mk_ty(Dynamic(obj, reg))
2355     }
2356
2357     #[inline]
2358     pub fn mk_projection(self, item_def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'tcx> {
2359         self.mk_ty(Projection(ProjectionTy { item_def_id, substs }))
2360     }
2361
2362     #[inline]
2363     pub fn mk_closure(self, closure_id: DefId, closure_substs: SubstsRef<'tcx>) -> Ty<'tcx> {
2364         self.mk_ty(Closure(closure_id, closure_substs))
2365     }
2366
2367     #[inline]
2368     pub fn mk_generator(
2369         self,
2370         id: DefId,
2371         generator_substs: SubstsRef<'tcx>,
2372         movability: hir::Movability,
2373     ) -> Ty<'tcx> {
2374         self.mk_ty(Generator(id, generator_substs, movability))
2375     }
2376
2377     #[inline]
2378     pub fn mk_generator_witness(self, types: ty::Binder<'tcx, &'tcx List<Ty<'tcx>>>) -> Ty<'tcx> {
2379         self.mk_ty(GeneratorWitness(types))
2380     }
2381
2382     #[inline]
2383     pub fn mk_ty_var(self, v: TyVid) -> Ty<'tcx> {
2384         self.mk_ty_infer(TyVar(v))
2385     }
2386
2387     #[inline]
2388     pub fn mk_const_var(self, v: ConstVid<'tcx>, ty: Ty<'tcx>) -> &'tcx Const<'tcx> {
2389         self.mk_const(ty::Const { val: ty::ConstKind::Infer(InferConst::Var(v)), ty })
2390     }
2391
2392     #[inline]
2393     pub fn mk_int_var(self, v: IntVid) -> Ty<'tcx> {
2394         self.mk_ty_infer(IntVar(v))
2395     }
2396
2397     #[inline]
2398     pub fn mk_float_var(self, v: FloatVid) -> Ty<'tcx> {
2399         self.mk_ty_infer(FloatVar(v))
2400     }
2401
2402     #[inline]
2403     pub fn mk_ty_infer(self, it: InferTy) -> Ty<'tcx> {
2404         self.mk_ty(Infer(it))
2405     }
2406
2407     #[inline]
2408     pub fn mk_const_infer(self, ic: InferConst<'tcx>, ty: Ty<'tcx>) -> &'tcx ty::Const<'tcx> {
2409         self.mk_const(ty::Const { val: ty::ConstKind::Infer(ic), ty })
2410     }
2411
2412     #[inline]
2413     pub fn mk_ty_param(self, index: u32, name: Symbol) -> Ty<'tcx> {
2414         self.mk_ty(Param(ParamTy { index, name }))
2415     }
2416
2417     #[inline]
2418     pub fn mk_const_param(self, index: u32, name: Symbol, ty: Ty<'tcx>) -> &'tcx Const<'tcx> {
2419         self.mk_const(ty::Const { val: ty::ConstKind::Param(ParamConst { index, name }), ty })
2420     }
2421
2422     pub fn mk_param_from_def(self, param: &ty::GenericParamDef) -> GenericArg<'tcx> {
2423         match param.kind {
2424             GenericParamDefKind::Lifetime => {
2425                 self.mk_region(ty::ReEarlyBound(param.to_early_bound_region_data())).into()
2426             }
2427             GenericParamDefKind::Type { .. } => self.mk_ty_param(param.index, param.name).into(),
2428             GenericParamDefKind::Const { .. } => {
2429                 self.mk_const_param(param.index, param.name, self.type_of(param.def_id)).into()
2430             }
2431         }
2432     }
2433
2434     #[inline]
2435     pub fn mk_opaque(self, def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'tcx> {
2436         self.mk_ty(Opaque(def_id, substs))
2437     }
2438
2439     pub fn mk_place_field(self, place: Place<'tcx>, f: Field, ty: Ty<'tcx>) -> Place<'tcx> {
2440         self.mk_place_elem(place, PlaceElem::Field(f, ty))
2441     }
2442
2443     pub fn mk_place_deref(self, place: Place<'tcx>) -> Place<'tcx> {
2444         self.mk_place_elem(place, PlaceElem::Deref)
2445     }
2446
2447     pub fn mk_place_downcast(
2448         self,
2449         place: Place<'tcx>,
2450         adt_def: &'tcx AdtDef,
2451         variant_index: VariantIdx,
2452     ) -> Place<'tcx> {
2453         self.mk_place_elem(
2454             place,
2455             PlaceElem::Downcast(Some(adt_def.variants[variant_index].ident.name), variant_index),
2456         )
2457     }
2458
2459     pub fn mk_place_downcast_unnamed(
2460         self,
2461         place: Place<'tcx>,
2462         variant_index: VariantIdx,
2463     ) -> Place<'tcx> {
2464         self.mk_place_elem(place, PlaceElem::Downcast(None, variant_index))
2465     }
2466
2467     pub fn mk_place_index(self, place: Place<'tcx>, index: Local) -> Place<'tcx> {
2468         self.mk_place_elem(place, PlaceElem::Index(index))
2469     }
2470
2471     /// This method copies `Place`'s projection, add an element and reintern it. Should not be used
2472     /// to build a full `Place` it's just a convenient way to grab a projection and modify it in
2473     /// flight.
2474     pub fn mk_place_elem(self, place: Place<'tcx>, elem: PlaceElem<'tcx>) -> Place<'tcx> {
2475         let mut projection = place.projection.to_vec();
2476         projection.push(elem);
2477
2478         Place { local: place.local, projection: self.intern_place_elems(&projection) }
2479     }
2480
2481     pub fn intern_poly_existential_predicates(
2482         self,
2483         eps: &[ty::Binder<'tcx, ExistentialPredicate<'tcx>>],
2484     ) -> &'tcx List<ty::Binder<'tcx, ExistentialPredicate<'tcx>>> {
2485         assert!(!eps.is_empty());
2486         assert!(
2487             eps.array_windows()
2488                 .all(|[a, b]| a.skip_binder().stable_cmp(self, &b.skip_binder())
2489                     != Ordering::Greater)
2490         );
2491         self._intern_poly_existential_predicates(eps)
2492     }
2493
2494     pub fn intern_predicates(self, preds: &[Predicate<'tcx>]) -> &'tcx List<Predicate<'tcx>> {
2495         // FIXME consider asking the input slice to be sorted to avoid
2496         // re-interning permutations, in which case that would be asserted
2497         // here.
2498         if preds.is_empty() {
2499             // The macro-generated method below asserts we don't intern an empty slice.
2500             List::empty()
2501         } else {
2502             self._intern_predicates(preds)
2503         }
2504     }
2505
2506     pub fn intern_type_list(self, ts: &[Ty<'tcx>]) -> &'tcx List<Ty<'tcx>> {
2507         if ts.is_empty() { List::empty() } else { self._intern_type_list(ts) }
2508     }
2509
2510     pub fn intern_substs(self, ts: &[GenericArg<'tcx>]) -> &'tcx List<GenericArg<'tcx>> {
2511         if ts.is_empty() { List::empty() } else { self._intern_substs(ts) }
2512     }
2513
2514     pub fn intern_projs(self, ps: &[ProjectionKind]) -> &'tcx List<ProjectionKind> {
2515         if ps.is_empty() { List::empty() } else { self._intern_projs(ps) }
2516     }
2517
2518     pub fn intern_place_elems(self, ts: &[PlaceElem<'tcx>]) -> &'tcx List<PlaceElem<'tcx>> {
2519         if ts.is_empty() { List::empty() } else { self._intern_place_elems(ts) }
2520     }
2521
2522     pub fn intern_canonical_var_infos(
2523         self,
2524         ts: &[CanonicalVarInfo<'tcx>],
2525     ) -> CanonicalVarInfos<'tcx> {
2526         if ts.is_empty() { List::empty() } else { self._intern_canonical_var_infos(ts) }
2527     }
2528
2529     pub fn intern_bound_variable_kinds(
2530         self,
2531         ts: &[ty::BoundVariableKind],
2532     ) -> &'tcx List<ty::BoundVariableKind> {
2533         if ts.is_empty() { List::empty() } else { self._intern_bound_variable_kinds(ts) }
2534     }
2535
2536     pub fn mk_fn_sig<I>(
2537         self,
2538         inputs: I,
2539         output: I::Item,
2540         c_variadic: bool,
2541         unsafety: hir::Unsafety,
2542         abi: abi::Abi,
2543     ) -> <I::Item as InternIteratorElement<Ty<'tcx>, ty::FnSig<'tcx>>>::Output
2544     where
2545         I: Iterator<Item: InternIteratorElement<Ty<'tcx>, ty::FnSig<'tcx>>>,
2546     {
2547         inputs.chain(iter::once(output)).intern_with(|xs| ty::FnSig {
2548             inputs_and_output: self.intern_type_list(xs),
2549             c_variadic,
2550             unsafety,
2551             abi,
2552         })
2553     }
2554
2555     pub fn mk_poly_existential_predicates<
2556         I: InternAs<
2557             [ty::Binder<'tcx, ExistentialPredicate<'tcx>>],
2558             &'tcx List<ty::Binder<'tcx, ExistentialPredicate<'tcx>>>,
2559         >,
2560     >(
2561         self,
2562         iter: I,
2563     ) -> I::Output {
2564         iter.intern_with(|xs| self.intern_poly_existential_predicates(xs))
2565     }
2566
2567     pub fn mk_predicates<I: InternAs<[Predicate<'tcx>], &'tcx List<Predicate<'tcx>>>>(
2568         self,
2569         iter: I,
2570     ) -> I::Output {
2571         iter.intern_with(|xs| self.intern_predicates(xs))
2572     }
2573
2574     pub fn mk_type_list<I: InternAs<[Ty<'tcx>], &'tcx List<Ty<'tcx>>>>(self, iter: I) -> I::Output {
2575         iter.intern_with(|xs| self.intern_type_list(xs))
2576     }
2577
2578     pub fn mk_substs<I: InternAs<[GenericArg<'tcx>], &'tcx List<GenericArg<'tcx>>>>(
2579         self,
2580         iter: I,
2581     ) -> I::Output {
2582         iter.intern_with(|xs| self.intern_substs(xs))
2583     }
2584
2585     pub fn mk_place_elems<I: InternAs<[PlaceElem<'tcx>], &'tcx List<PlaceElem<'tcx>>>>(
2586         self,
2587         iter: I,
2588     ) -> I::Output {
2589         iter.intern_with(|xs| self.intern_place_elems(xs))
2590     }
2591
2592     pub fn mk_substs_trait(self, self_ty: Ty<'tcx>, rest: &[GenericArg<'tcx>]) -> SubstsRef<'tcx> {
2593         self.mk_substs(iter::once(self_ty.into()).chain(rest.iter().cloned()))
2594     }
2595
2596     pub fn mk_bound_variable_kinds<
2597         I: InternAs<[ty::BoundVariableKind], &'tcx List<ty::BoundVariableKind>>,
2598     >(
2599         self,
2600         iter: I,
2601     ) -> I::Output {
2602         iter.intern_with(|xs| self.intern_bound_variable_kinds(xs))
2603     }
2604
2605     /// Walks upwards from `id` to find a node which might change lint levels with attributes.
2606     /// It stops at `bound` and just returns it if reached.
2607     pub fn maybe_lint_level_root_bounded(self, mut id: HirId, bound: HirId) -> HirId {
2608         let hir = self.hir();
2609         loop {
2610             if id == bound {
2611                 return bound;
2612             }
2613
2614             if hir.attrs(id).iter().any(|attr| Level::from_symbol(attr.name_or_empty()).is_some()) {
2615                 return id;
2616             }
2617             let next = hir.get_parent_node(id);
2618             if next == id {
2619                 bug!("lint traversal reached the root of the crate");
2620             }
2621             id = next;
2622         }
2623     }
2624
2625     pub fn lint_level_at_node(
2626         self,
2627         lint: &'static Lint,
2628         mut id: hir::HirId,
2629     ) -> (Level, LintLevelSource) {
2630         let sets = self.lint_levels(());
2631         loop {
2632             if let Some(pair) = sets.level_and_source(lint, id, self.sess) {
2633                 return pair;
2634             }
2635             let next = self.hir().get_parent_node(id);
2636             if next == id {
2637                 bug!("lint traversal reached the root of the crate");
2638             }
2639             id = next;
2640         }
2641     }
2642
2643     pub fn struct_span_lint_hir(
2644         self,
2645         lint: &'static Lint,
2646         hir_id: HirId,
2647         span: impl Into<MultiSpan>,
2648         decorate: impl for<'a> FnOnce(LintDiagnosticBuilder<'a>),
2649     ) {
2650         let (level, src) = self.lint_level_at_node(lint, hir_id);
2651         struct_lint_level(self.sess, lint, level, src, Some(span.into()), decorate);
2652     }
2653
2654     pub fn struct_lint_node(
2655         self,
2656         lint: &'static Lint,
2657         id: HirId,
2658         decorate: impl for<'a> FnOnce(LintDiagnosticBuilder<'a>),
2659     ) {
2660         let (level, src) = self.lint_level_at_node(lint, id);
2661         struct_lint_level(self.sess, lint, level, src, None, decorate);
2662     }
2663
2664     pub fn in_scope_traits(self, id: HirId) -> Option<&'tcx [TraitCandidate]> {
2665         let map = self.in_scope_traits_map(id.owner)?;
2666         let candidates = map.get(&id.local_id)?;
2667         Some(&*candidates)
2668     }
2669
2670     pub fn named_region(self, id: HirId) -> Option<resolve_lifetime::Region> {
2671         debug!(?id, "named_region");
2672         self.named_region_map(id.owner).and_then(|map| map.get(&id.local_id).cloned())
2673     }
2674
2675     pub fn is_late_bound(self, id: HirId) -> bool {
2676         self.is_late_bound_map(id.owner)
2677             .map_or(false, |(owner, set)| owner == id.owner && set.contains(&id.local_id))
2678     }
2679
2680     pub fn object_lifetime_defaults(self, id: HirId) -> Option<Vec<ObjectLifetimeDefault>> {
2681         self.object_lifetime_defaults_map(id.owner)
2682     }
2683
2684     pub fn late_bound_vars(self, id: HirId) -> &'tcx List<ty::BoundVariableKind> {
2685         self.mk_bound_variable_kinds(
2686             self.late_bound_vars_map(id.owner)
2687                 .and_then(|map| map.get(&id.local_id).cloned())
2688                 .unwrap_or_else(|| {
2689                     bug!("No bound vars found for {:?} ({:?})", self.hir().node_to_string(id), id)
2690                 })
2691                 .iter(),
2692         )
2693     }
2694
2695     pub fn lifetime_scope(self, id: HirId) -> Option<LifetimeScopeForPath> {
2696         self.lifetime_scope_map(id.owner).and_then(|mut map| map.remove(&id.local_id))
2697     }
2698 }
2699
2700 impl TyCtxtAt<'tcx> {
2701     /// Constructs a `TyKind::Error` type and registers a `delay_span_bug` to ensure it gets used.
2702     #[track_caller]
2703     pub fn ty_error(self) -> Ty<'tcx> {
2704         self.tcx.ty_error_with_message(self.span, "TyKind::Error constructed but no error reported")
2705     }
2706
2707     /// Constructs a `TyKind::Error` type and registers a `delay_span_bug` with the given `msg to
2708     /// ensure it gets used.
2709     #[track_caller]
2710     pub fn ty_error_with_message(self, msg: &str) -> Ty<'tcx> {
2711         self.tcx.ty_error_with_message(self.span, msg)
2712     }
2713 }
2714
2715 pub trait InternAs<T: ?Sized, R> {
2716     type Output;
2717     fn intern_with<F>(self, f: F) -> Self::Output
2718     where
2719         F: FnOnce(&T) -> R;
2720 }
2721
2722 impl<I, T, R, E> InternAs<[T], R> for I
2723 where
2724     E: InternIteratorElement<T, R>,
2725     I: Iterator<Item = E>,
2726 {
2727     type Output = E::Output;
2728     fn intern_with<F>(self, f: F) -> Self::Output
2729     where
2730         F: FnOnce(&[T]) -> R,
2731     {
2732         E::intern_with(self, f)
2733     }
2734 }
2735
2736 pub trait InternIteratorElement<T, R>: Sized {
2737     type Output;
2738     fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output;
2739 }
2740
2741 impl<T, R> InternIteratorElement<T, R> for T {
2742     type Output = R;
2743     fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output {
2744         f(&iter.collect::<SmallVec<[_; 8]>>())
2745     }
2746 }
2747
2748 impl<'a, T, R> InternIteratorElement<T, R> for &'a T
2749 where
2750     T: Clone + 'a,
2751 {
2752     type Output = R;
2753     fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output {
2754         f(&iter.cloned().collect::<SmallVec<[_; 8]>>())
2755     }
2756 }
2757
2758 impl<T, R, E> InternIteratorElement<T, R> for Result<T, E> {
2759     type Output = Result<R, E>;
2760     fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(
2761         mut iter: I,
2762         f: F,
2763     ) -> Self::Output {
2764         // This code is hot enough that it's worth specializing for the most
2765         // common length lists, to avoid the overhead of `SmallVec` creation.
2766         // The match arms are in order of frequency. The 1, 2, and 0 cases are
2767         // typically hit in ~95% of cases. We assume that if the upper and
2768         // lower bounds from `size_hint` agree they are correct.
2769         Ok(match iter.size_hint() {
2770             (1, Some(1)) => {
2771                 let t0 = iter.next().unwrap()?;
2772                 assert!(iter.next().is_none());
2773                 f(&[t0])
2774             }
2775             (2, Some(2)) => {
2776                 let t0 = iter.next().unwrap()?;
2777                 let t1 = iter.next().unwrap()?;
2778                 assert!(iter.next().is_none());
2779                 f(&[t0, t1])
2780             }
2781             (0, Some(0)) => {
2782                 assert!(iter.next().is_none());
2783                 f(&[])
2784             }
2785             _ => f(&iter.collect::<Result<SmallVec<[_; 8]>, _>>()?),
2786         })
2787     }
2788 }
2789
2790 // We are comparing types with different invariant lifetimes, so `ptr::eq`
2791 // won't work for us.
2792 fn ptr_eq<T, U>(t: *const T, u: *const U) -> bool {
2793     t as *const () == u as *const ()
2794 }
2795
2796 pub fn provide(providers: &mut ty::query::Providers) {
2797     providers.in_scope_traits_map = |tcx, id| tcx.hir_crate(()).trait_map.get(&id);
2798     providers.module_exports = |tcx, id| tcx.gcx.export_map.get(&id).map(|v| &v[..]);
2799     providers.crate_name = |tcx, id| {
2800         assert_eq!(id, LOCAL_CRATE);
2801         tcx.crate_name
2802     };
2803     providers.maybe_unused_trait_import = |tcx, id| tcx.maybe_unused_trait_imports.contains(&id);
2804     providers.maybe_unused_extern_crates = |tcx, ()| &tcx.maybe_unused_extern_crates[..];
2805     providers.names_imported_by_glob_use =
2806         |tcx, id| tcx.arena.alloc(tcx.glob_map.get(&id).cloned().unwrap_or_default());
2807
2808     providers.lookup_stability = |tcx, id| {
2809         let id = tcx.hir().local_def_id_to_hir_id(id.expect_local());
2810         tcx.stability().local_stability(id)
2811     };
2812     providers.lookup_const_stability = |tcx, id| {
2813         let id = tcx.hir().local_def_id_to_hir_id(id.expect_local());
2814         tcx.stability().local_const_stability(id)
2815     };
2816     providers.lookup_deprecation_entry = |tcx, id| {
2817         let id = tcx.hir().local_def_id_to_hir_id(id.expect_local());
2818         tcx.stability().local_deprecation_entry(id)
2819     };
2820     providers.extern_mod_stmt_cnum = |tcx, id| tcx.extern_crate_map.get(&id).cloned();
2821     providers.all_crate_nums = |tcx, ()| tcx.arena.alloc_slice(&tcx.cstore.crates_untracked());
2822     providers.output_filenames = |tcx, ()| tcx.output_filenames.clone();
2823     providers.features_query = |tcx, ()| tcx.sess.features_untracked();
2824     providers.is_panic_runtime = |tcx, cnum| {
2825         assert_eq!(cnum, LOCAL_CRATE);
2826         tcx.sess.contains_name(tcx.hir().krate_attrs(), sym::panic_runtime)
2827     };
2828     providers.is_compiler_builtins = |tcx, cnum| {
2829         assert_eq!(cnum, LOCAL_CRATE);
2830         tcx.sess.contains_name(tcx.hir().krate_attrs(), sym::compiler_builtins)
2831     };
2832     providers.has_panic_handler = |tcx, cnum| {
2833         assert_eq!(cnum, LOCAL_CRATE);
2834         // We want to check if the panic handler was defined in this crate
2835         tcx.lang_items().panic_impl().map_or(false, |did| did.is_local())
2836     };
2837     providers.allocator_kind = |tcx, ()| tcx.cstore.allocator_kind();
2838 }