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