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