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