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