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