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