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