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