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