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