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