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