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