]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_middle/src/ty/context.rs
[fuchsia] Propagate the userspace UTC clock
[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,
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`
70 /// except through `tcx.err*()`, which are in this module.
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     /// Stores the type, expression, span and optional scope span of all types
419     /// that are live across the yield of this generator (if a generator).
420     pub generator_interior_types: Vec<GeneratorInteriorTypeCause<'tcx>>,
421 }
422
423 impl<'tcx> TypeckResults<'tcx> {
424     pub fn new(hir_owner: LocalDefId) -> TypeckResults<'tcx> {
425         TypeckResults {
426             hir_owner,
427             type_dependent_defs: Default::default(),
428             field_indices: Default::default(),
429             user_provided_types: Default::default(),
430             user_provided_sigs: Default::default(),
431             node_types: Default::default(),
432             node_substs: Default::default(),
433             adjustments: Default::default(),
434             pat_binding_modes: Default::default(),
435             pat_adjustments: Default::default(),
436             upvar_capture_map: Default::default(),
437             closure_kind_origins: Default::default(),
438             liberated_fn_sigs: Default::default(),
439             fru_field_types: Default::default(),
440             coercion_casts: Default::default(),
441             used_trait_imports: Lrc::new(Default::default()),
442             tainted_by_errors: None,
443             concrete_opaque_types: Default::default(),
444             closure_captures: Default::default(),
445             generator_interior_types: Default::default(),
446         }
447     }
448
449     /// Returns the final resolution of a `QPath` in an `Expr` or `Pat` node.
450     pub fn qpath_res(&self, qpath: &hir::QPath<'_>, id: hir::HirId) -> Res {
451         match *qpath {
452             hir::QPath::Resolved(_, ref path) => path.res,
453             hir::QPath::TypeRelative(..) | hir::QPath::LangItem(..) => self
454                 .type_dependent_def(id)
455                 .map_or(Res::Err, |(kind, def_id)| Res::Def(kind, def_id)),
456         }
457     }
458
459     pub fn type_dependent_defs(
460         &self,
461     ) -> LocalTableInContext<'_, Result<(DefKind, DefId), ErrorReported>> {
462         LocalTableInContext { hir_owner: self.hir_owner, data: &self.type_dependent_defs }
463     }
464
465     pub fn type_dependent_def(&self, id: HirId) -> Option<(DefKind, DefId)> {
466         validate_hir_id_for_typeck_results(self.hir_owner, id);
467         self.type_dependent_defs.get(&id.local_id).cloned().and_then(|r| r.ok())
468     }
469
470     pub fn type_dependent_def_id(&self, id: HirId) -> Option<DefId> {
471         self.type_dependent_def(id).map(|(_, def_id)| def_id)
472     }
473
474     pub fn type_dependent_defs_mut(
475         &mut self,
476     ) -> LocalTableInContextMut<'_, Result<(DefKind, DefId), ErrorReported>> {
477         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.type_dependent_defs }
478     }
479
480     pub fn field_indices(&self) -> LocalTableInContext<'_, usize> {
481         LocalTableInContext { hir_owner: self.hir_owner, data: &self.field_indices }
482     }
483
484     pub fn field_indices_mut(&mut self) -> LocalTableInContextMut<'_, usize> {
485         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.field_indices }
486     }
487
488     pub fn user_provided_types(&self) -> LocalTableInContext<'_, CanonicalUserType<'tcx>> {
489         LocalTableInContext { hir_owner: self.hir_owner, data: &self.user_provided_types }
490     }
491
492     pub fn user_provided_types_mut(
493         &mut self,
494     ) -> LocalTableInContextMut<'_, CanonicalUserType<'tcx>> {
495         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.user_provided_types }
496     }
497
498     pub fn node_types(&self) -> LocalTableInContext<'_, Ty<'tcx>> {
499         LocalTableInContext { hir_owner: self.hir_owner, data: &self.node_types }
500     }
501
502     pub fn node_types_mut(&mut self) -> LocalTableInContextMut<'_, Ty<'tcx>> {
503         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.node_types }
504     }
505
506     pub fn node_type(&self, id: hir::HirId) -> Ty<'tcx> {
507         self.node_type_opt(id).unwrap_or_else(|| {
508             bug!("node_type: no type for node `{}`", tls::with(|tcx| tcx.hir().node_to_string(id)))
509         })
510     }
511
512     pub fn node_type_opt(&self, id: hir::HirId) -> Option<Ty<'tcx>> {
513         validate_hir_id_for_typeck_results(self.hir_owner, id);
514         self.node_types.get(&id.local_id).cloned()
515     }
516
517     pub fn node_substs_mut(&mut self) -> LocalTableInContextMut<'_, SubstsRef<'tcx>> {
518         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.node_substs }
519     }
520
521     pub fn node_substs(&self, id: hir::HirId) -> SubstsRef<'tcx> {
522         validate_hir_id_for_typeck_results(self.hir_owner, id);
523         self.node_substs.get(&id.local_id).cloned().unwrap_or_else(|| InternalSubsts::empty())
524     }
525
526     pub fn node_substs_opt(&self, id: hir::HirId) -> Option<SubstsRef<'tcx>> {
527         validate_hir_id_for_typeck_results(self.hir_owner, id);
528         self.node_substs.get(&id.local_id).cloned()
529     }
530
531     // Returns the type of a pattern as a monotype. Like @expr_ty, this function
532     // doesn't provide type parameter substitutions.
533     pub fn pat_ty(&self, pat: &hir::Pat<'_>) -> Ty<'tcx> {
534         self.node_type(pat.hir_id)
535     }
536
537     pub fn pat_ty_opt(&self, pat: &hir::Pat<'_>) -> Option<Ty<'tcx>> {
538         self.node_type_opt(pat.hir_id)
539     }
540
541     // Returns the type of an expression as a monotype.
542     //
543     // NB (1): This is the PRE-ADJUSTMENT TYPE for the expression.  That is, in
544     // some cases, we insert `Adjustment` annotations such as auto-deref or
545     // auto-ref.  The type returned by this function does not consider such
546     // adjustments.  See `expr_ty_adjusted()` instead.
547     //
548     // NB (2): This type doesn't provide type parameter substitutions; e.g., if you
549     // ask for the type of "id" in "id(3)", it will return "fn(&isize) -> isize"
550     // instead of "fn(ty) -> T with T = isize".
551     pub fn expr_ty(&self, expr: &hir::Expr<'_>) -> Ty<'tcx> {
552         self.node_type(expr.hir_id)
553     }
554
555     pub fn expr_ty_opt(&self, expr: &hir::Expr<'_>) -> Option<Ty<'tcx>> {
556         self.node_type_opt(expr.hir_id)
557     }
558
559     pub fn adjustments(&self) -> LocalTableInContext<'_, Vec<ty::adjustment::Adjustment<'tcx>>> {
560         LocalTableInContext { hir_owner: self.hir_owner, data: &self.adjustments }
561     }
562
563     pub fn adjustments_mut(
564         &mut self,
565     ) -> LocalTableInContextMut<'_, Vec<ty::adjustment::Adjustment<'tcx>>> {
566         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.adjustments }
567     }
568
569     pub fn expr_adjustments(&self, expr: &hir::Expr<'_>) -> &[ty::adjustment::Adjustment<'tcx>] {
570         validate_hir_id_for_typeck_results(self.hir_owner, expr.hir_id);
571         self.adjustments.get(&expr.hir_id.local_id).map_or(&[], |a| &a[..])
572     }
573
574     /// Returns the type of `expr`, considering any `Adjustment`
575     /// entry recorded for that expression.
576     pub fn expr_ty_adjusted(&self, expr: &hir::Expr<'_>) -> Ty<'tcx> {
577         self.expr_adjustments(expr).last().map_or_else(|| self.expr_ty(expr), |adj| adj.target)
578     }
579
580     pub fn expr_ty_adjusted_opt(&self, expr: &hir::Expr<'_>) -> Option<Ty<'tcx>> {
581         self.expr_adjustments(expr).last().map(|adj| adj.target).or_else(|| self.expr_ty_opt(expr))
582     }
583
584     pub fn is_method_call(&self, expr: &hir::Expr<'_>) -> bool {
585         // Only paths and method calls/overloaded operators have
586         // entries in type_dependent_defs, ignore the former here.
587         if let hir::ExprKind::Path(_) = expr.kind {
588             return false;
589         }
590
591         match self.type_dependent_defs().get(expr.hir_id) {
592             Some(Ok((DefKind::AssocFn, _))) => true,
593             _ => false,
594         }
595     }
596
597     pub fn extract_binding_mode(&self, s: &Session, id: HirId, sp: Span) -> Option<BindingMode> {
598         self.pat_binding_modes().get(id).copied().or_else(|| {
599             s.delay_span_bug(sp, "missing binding mode");
600             None
601         })
602     }
603
604     pub fn pat_binding_modes(&self) -> LocalTableInContext<'_, BindingMode> {
605         LocalTableInContext { hir_owner: self.hir_owner, data: &self.pat_binding_modes }
606     }
607
608     pub fn pat_binding_modes_mut(&mut self) -> LocalTableInContextMut<'_, BindingMode> {
609         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.pat_binding_modes }
610     }
611
612     pub fn pat_adjustments(&self) -> LocalTableInContext<'_, Vec<Ty<'tcx>>> {
613         LocalTableInContext { hir_owner: self.hir_owner, data: &self.pat_adjustments }
614     }
615
616     pub fn pat_adjustments_mut(&mut self) -> LocalTableInContextMut<'_, Vec<Ty<'tcx>>> {
617         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.pat_adjustments }
618     }
619
620     pub fn upvar_capture(&self, upvar_id: ty::UpvarId) -> ty::UpvarCapture<'tcx> {
621         self.upvar_capture_map[&upvar_id]
622     }
623
624     pub fn closure_kind_origins(&self) -> LocalTableInContext<'_, (Span, Symbol)> {
625         LocalTableInContext { hir_owner: self.hir_owner, data: &self.closure_kind_origins }
626     }
627
628     pub fn closure_kind_origins_mut(&mut self) -> LocalTableInContextMut<'_, (Span, Symbol)> {
629         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.closure_kind_origins }
630     }
631
632     pub fn liberated_fn_sigs(&self) -> LocalTableInContext<'_, ty::FnSig<'tcx>> {
633         LocalTableInContext { hir_owner: self.hir_owner, data: &self.liberated_fn_sigs }
634     }
635
636     pub fn liberated_fn_sigs_mut(&mut self) -> LocalTableInContextMut<'_, ty::FnSig<'tcx>> {
637         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.liberated_fn_sigs }
638     }
639
640     pub fn fru_field_types(&self) -> LocalTableInContext<'_, Vec<Ty<'tcx>>> {
641         LocalTableInContext { hir_owner: self.hir_owner, data: &self.fru_field_types }
642     }
643
644     pub fn fru_field_types_mut(&mut self) -> LocalTableInContextMut<'_, Vec<Ty<'tcx>>> {
645         LocalTableInContextMut { hir_owner: self.hir_owner, data: &mut self.fru_field_types }
646     }
647
648     pub fn is_coercion_cast(&self, hir_id: hir::HirId) -> bool {
649         validate_hir_id_for_typeck_results(self.hir_owner, hir_id);
650         self.coercion_casts.contains(&hir_id.local_id)
651     }
652
653     pub fn set_coercion_cast(&mut self, id: ItemLocalId) {
654         self.coercion_casts.insert(id);
655     }
656
657     pub fn coercion_casts(&self) -> &ItemLocalSet {
658         &self.coercion_casts
659     }
660 }
661
662 impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for TypeckResults<'tcx> {
663     fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
664         let ty::TypeckResults {
665             hir_owner,
666             ref type_dependent_defs,
667             ref field_indices,
668             ref user_provided_types,
669             ref user_provided_sigs,
670             ref node_types,
671             ref node_substs,
672             ref adjustments,
673             ref pat_binding_modes,
674             ref pat_adjustments,
675             ref upvar_capture_map,
676             ref closure_kind_origins,
677             ref liberated_fn_sigs,
678             ref fru_field_types,
679
680             ref coercion_casts,
681
682             ref used_trait_imports,
683             tainted_by_errors,
684             ref concrete_opaque_types,
685             ref closure_captures,
686             ref generator_interior_types,
687         } = *self;
688
689         hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| {
690             type_dependent_defs.hash_stable(hcx, hasher);
691             field_indices.hash_stable(hcx, hasher);
692             user_provided_types.hash_stable(hcx, hasher);
693             user_provided_sigs.hash_stable(hcx, hasher);
694             node_types.hash_stable(hcx, hasher);
695             node_substs.hash_stable(hcx, hasher);
696             adjustments.hash_stable(hcx, hasher);
697             pat_binding_modes.hash_stable(hcx, hasher);
698             pat_adjustments.hash_stable(hcx, hasher);
699             hash_stable_hashmap(hcx, hasher, upvar_capture_map, |up_var_id, hcx| {
700                 let ty::UpvarId { var_path, closure_expr_id } = *up_var_id;
701
702                 assert_eq!(var_path.hir_id.owner, hir_owner);
703
704                 (
705                     hcx.local_def_path_hash(var_path.hir_id.owner),
706                     var_path.hir_id.local_id,
707                     hcx.local_def_path_hash(closure_expr_id),
708                 )
709             });
710
711             closure_kind_origins.hash_stable(hcx, hasher);
712             liberated_fn_sigs.hash_stable(hcx, hasher);
713             fru_field_types.hash_stable(hcx, hasher);
714             coercion_casts.hash_stable(hcx, hasher);
715             used_trait_imports.hash_stable(hcx, hasher);
716             tainted_by_errors.hash_stable(hcx, hasher);
717             concrete_opaque_types.hash_stable(hcx, hasher);
718             closure_captures.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     /// Resolutions of `extern crate` items produced by resolver.
922     extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
923
924     /// Map indicating what traits are in scope for places where this
925     /// is relevant; generated by resolve.
926     trait_map: FxHashMap<LocalDefId, FxHashMap<ItemLocalId, StableVec<TraitCandidate>>>,
927
928     /// Export map produced by name resolution.
929     export_map: ExportMap<LocalDefId>,
930
931     pub(crate) untracked_crate: &'tcx hir::Crate<'tcx>,
932     pub(crate) definitions: &'tcx Definitions,
933
934     /// A map from `DefPathHash` -> `DefId`. Includes `DefId`s from the local crate
935     /// as well as all upstream crates. Only populated in incremental mode.
936     pub def_path_hash_to_def_id: Option<UnhashMap<DefPathHash, DefId>>,
937
938     pub queries: query::Queries<'tcx>,
939
940     maybe_unused_trait_imports: FxHashSet<LocalDefId>,
941     maybe_unused_extern_crates: Vec<(LocalDefId, Span)>,
942     /// A map of glob use to a set of names it actually imports. Currently only
943     /// used in save-analysis.
944     pub(crate) glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>,
945     /// Extern prelude entries. The value is `true` if the entry was introduced
946     /// via `extern crate` item and not `--extern` option or compiler built-in.
947     pub extern_prelude: FxHashMap<Symbol, bool>,
948
949     // Internal caches for metadata decoding. No need to track deps on this.
950     pub ty_rcache: Lock<FxHashMap<ty::CReaderCacheKey, Ty<'tcx>>>,
951     pub pred_rcache: Lock<FxHashMap<ty::CReaderCacheKey, Predicate<'tcx>>>,
952
953     /// Caches the results of trait selection. This cache is used
954     /// for things that do not have to do with the parameters in scope.
955     pub selection_cache: traits::SelectionCache<'tcx>,
956
957     /// Caches the results of trait evaluation. This cache is used
958     /// for things that do not have to do with the parameters in scope.
959     /// Merge this with `selection_cache`?
960     pub evaluation_cache: traits::EvaluationCache<'tcx>,
961
962     /// The definite name of the current crate after taking into account
963     /// attributes, commandline parameters, etc.
964     pub crate_name: Symbol,
965
966     /// Data layout specification for the current target.
967     pub data_layout: TargetDataLayout,
968
969     /// `#[stable]` and `#[unstable]` attributes
970     stability_interner: ShardedHashMap<&'tcx attr::Stability, ()>,
971
972     /// `#[rustc_const_stable]` and `#[rustc_const_unstable]` attributes
973     const_stability_interner: ShardedHashMap<&'tcx attr::ConstStability, ()>,
974
975     /// Stores the value of constants (and deduplicates the actual memory)
976     allocation_interner: ShardedHashMap<&'tcx Allocation, ()>,
977
978     /// Stores memory for globals (statics/consts).
979     pub(crate) alloc_map: Lock<interpret::AllocMap<'tcx>>,
980
981     layout_interner: ShardedHashMap<&'tcx Layout, ()>,
982
983     output_filenames: Arc<OutputFilenames>,
984 }
985
986 impl<'tcx> TyCtxt<'tcx> {
987     pub fn typeck_opt_const_arg(
988         self,
989         def: ty::WithOptConstParam<LocalDefId>,
990     ) -> &'tcx TypeckResults<'tcx> {
991         if let Some(param_did) = def.const_param_did {
992             self.typeck_const_arg((def.did, param_did))
993         } else {
994             self.typeck(def.did)
995         }
996     }
997
998     pub fn alloc_steal_mir(self, mir: Body<'tcx>) -> &'tcx Steal<Body<'tcx>> {
999         self.arena.alloc(Steal::new(mir))
1000     }
1001
1002     pub fn alloc_steal_promoted(
1003         self,
1004         promoted: IndexVec<Promoted, Body<'tcx>>,
1005     ) -> &'tcx Steal<IndexVec<Promoted, Body<'tcx>>> {
1006         self.arena.alloc(Steal::new(promoted))
1007     }
1008
1009     pub fn alloc_adt_def(
1010         self,
1011         did: DefId,
1012         kind: AdtKind,
1013         variants: IndexVec<VariantIdx, ty::VariantDef>,
1014         repr: ReprOptions,
1015     ) -> &'tcx ty::AdtDef {
1016         self.arena.alloc(ty::AdtDef::new(self, did, kind, variants, repr))
1017     }
1018
1019     pub fn intern_const_alloc(self, alloc: Allocation) -> &'tcx Allocation {
1020         self.allocation_interner.intern(alloc, |alloc| self.arena.alloc(alloc))
1021     }
1022
1023     /// Allocates a read-only byte or string literal for `mir::interpret`.
1024     pub fn allocate_bytes(self, bytes: &[u8]) -> interpret::AllocId {
1025         // Create an allocation that just contains these bytes.
1026         let alloc = interpret::Allocation::from_byte_aligned_bytes(bytes);
1027         let alloc = self.intern_const_alloc(alloc);
1028         self.create_memory_alloc(alloc)
1029     }
1030
1031     pub fn intern_stability(self, stab: attr::Stability) -> &'tcx attr::Stability {
1032         self.stability_interner.intern(stab, |stab| self.arena.alloc(stab))
1033     }
1034
1035     pub fn intern_const_stability(self, stab: attr::ConstStability) -> &'tcx attr::ConstStability {
1036         self.const_stability_interner.intern(stab, |stab| self.arena.alloc(stab))
1037     }
1038
1039     pub fn intern_layout(self, layout: Layout) -> &'tcx Layout {
1040         self.layout_interner.intern(layout, |layout| self.arena.alloc(layout))
1041     }
1042
1043     /// Returns a range of the start/end indices specified with the
1044     /// `rustc_layout_scalar_valid_range` attribute.
1045     pub fn layout_scalar_valid_range(self, def_id: DefId) -> (Bound<u128>, Bound<u128>) {
1046         let attrs = self.get_attrs(def_id);
1047         let get = |name| {
1048             let attr = match attrs.iter().find(|a| self.sess.check_name(a, name)) {
1049                 Some(attr) => attr,
1050                 None => return Bound::Unbounded,
1051             };
1052             debug!("layout_scalar_valid_range: attr={:?}", attr);
1053             for meta in attr.meta_item_list().expect("rustc_layout_scalar_valid_range takes args") {
1054                 match meta.literal().expect("attribute takes lit").kind {
1055                     ast::LitKind::Int(a, _) => return Bound::Included(a),
1056                     _ => span_bug!(attr.span, "rustc_layout_scalar_valid_range expects int arg"),
1057                 }
1058             }
1059             span_bug!(attr.span, "no arguments to `rustc_layout_scalar_valid_range` attribute");
1060         };
1061         (
1062             get(sym::rustc_layout_scalar_valid_range_start),
1063             get(sym::rustc_layout_scalar_valid_range_end),
1064         )
1065     }
1066
1067     pub fn lift<T: ?Sized + Lift<'tcx>>(self, value: &T) -> Option<T::Lifted> {
1068         value.lift_to_tcx(self)
1069     }
1070
1071     /// Creates a type context and call the closure with a `TyCtxt` reference
1072     /// to the context. The closure enforces that the type context and any interned
1073     /// value (types, substs, etc.) can only be used while `ty::tls` has a valid
1074     /// reference to the context, to allow formatting values that need it.
1075     pub fn create_global_ctxt(
1076         s: &'tcx Session,
1077         lint_store: Lrc<dyn Any + sync::Send + sync::Sync>,
1078         local_providers: ty::query::Providers,
1079         extern_providers: ty::query::Providers,
1080         arena: &'tcx WorkerLocal<Arena<'tcx>>,
1081         resolutions: ty::ResolverOutputs,
1082         krate: &'tcx hir::Crate<'tcx>,
1083         definitions: &'tcx Definitions,
1084         dep_graph: DepGraph,
1085         on_disk_query_result_cache: query::OnDiskCache<'tcx>,
1086         crate_name: &str,
1087         output_filenames: &OutputFilenames,
1088     ) -> GlobalCtxt<'tcx> {
1089         let data_layout = TargetDataLayout::parse(&s.target.target).unwrap_or_else(|err| {
1090             s.fatal(&err);
1091         });
1092         let interners = CtxtInterners::new(arena);
1093         let common_types = CommonTypes::new(&interners);
1094         let common_lifetimes = CommonLifetimes::new(&interners);
1095         let common_consts = CommonConsts::new(&interners, &common_types);
1096         let cstore = resolutions.cstore;
1097         let crates = cstore.crates_untracked();
1098         let max_cnum = crates.iter().map(|c| c.as_usize()).max().unwrap_or(0);
1099         let mut providers = IndexVec::from_elem_n(extern_providers, max_cnum + 1);
1100         providers[LOCAL_CRATE] = local_providers;
1101
1102         let def_path_hash_to_def_id = if s.opts.build_dep_graph() {
1103             let capacity = definitions.def_path_table().num_def_ids()
1104                 + crates.iter().map(|cnum| cstore.num_def_ids(*cnum)).sum::<usize>();
1105             let mut map = UnhashMap::with_capacity_and_hasher(capacity, Default::default());
1106
1107             map.extend(definitions.def_path_table().all_def_path_hashes_and_def_ids(LOCAL_CRATE));
1108             for cnum in &crates {
1109                 map.extend(cstore.all_def_path_hashes_and_def_ids(*cnum).into_iter());
1110             }
1111
1112             Some(map)
1113         } else {
1114             None
1115         };
1116
1117         let mut trait_map: FxHashMap<_, FxHashMap<_, _>> = FxHashMap::default();
1118         for (hir_id, v) in krate.trait_map.iter() {
1119             let map = trait_map.entry(hir_id.owner).or_default();
1120             map.insert(hir_id.local_id, StableVec::new(v.to_vec()));
1121         }
1122
1123         GlobalCtxt {
1124             sess: s,
1125             lint_store,
1126             cstore,
1127             arena,
1128             interners,
1129             dep_graph,
1130             prof: s.prof.clone(),
1131             types: common_types,
1132             lifetimes: common_lifetimes,
1133             consts: common_consts,
1134             extern_crate_map: resolutions.extern_crate_map,
1135             trait_map,
1136             export_map: resolutions.export_map,
1137             maybe_unused_trait_imports: resolutions.maybe_unused_trait_imports,
1138             maybe_unused_extern_crates: resolutions.maybe_unused_extern_crates,
1139             glob_map: resolutions.glob_map,
1140             extern_prelude: resolutions.extern_prelude,
1141             untracked_crate: krate,
1142             definitions,
1143             def_path_hash_to_def_id,
1144             queries: query::Queries::new(providers, extern_providers, on_disk_query_result_cache),
1145             ty_rcache: Default::default(),
1146             pred_rcache: Default::default(),
1147             selection_cache: Default::default(),
1148             evaluation_cache: Default::default(),
1149             crate_name: Symbol::intern(crate_name),
1150             data_layout,
1151             layout_interner: Default::default(),
1152             stability_interner: Default::default(),
1153             const_stability_interner: Default::default(),
1154             allocation_interner: Default::default(),
1155             alloc_map: Lock::new(interpret::AllocMap::new()),
1156             output_filenames: Arc::new(output_filenames.clone()),
1157         }
1158     }
1159
1160     /// Constructs a `TyKind::Error` type and registers a `delay_span_bug` to ensure it gets used.
1161     #[track_caller]
1162     pub fn ty_error(self) -> Ty<'tcx> {
1163         self.ty_error_with_message(DUMMY_SP, "TyKind::Error constructed but no error reported")
1164     }
1165
1166     /// Constructs a `TyKind::Error` type and registers a `delay_span_bug` with the given `msg` to
1167     /// ensure it gets used.
1168     #[track_caller]
1169     pub fn ty_error_with_message<S: Into<MultiSpan>>(self, span: S, msg: &str) -> Ty<'tcx> {
1170         self.sess.delay_span_bug(span, msg);
1171         self.mk_ty(Error(DelaySpanBugEmitted(())))
1172     }
1173
1174     /// Like `err` but for constants.
1175     #[track_caller]
1176     pub fn const_error(self, ty: Ty<'tcx>) -> &'tcx Const<'tcx> {
1177         self.sess
1178             .delay_span_bug(DUMMY_SP, "ty::ConstKind::Error constructed but no error reported.");
1179         self.mk_const(ty::Const { val: ty::ConstKind::Error(DelaySpanBugEmitted(())), ty })
1180     }
1181
1182     pub fn consider_optimizing<T: Fn() -> String>(&self, msg: T) -> bool {
1183         let cname = self.crate_name(LOCAL_CRATE).as_str();
1184         self.sess.consider_optimizing(&cname, msg)
1185     }
1186
1187     pub fn lib_features(self) -> &'tcx middle::lib_features::LibFeatures {
1188         self.get_lib_features(LOCAL_CRATE)
1189     }
1190
1191     /// Obtain all lang items of this crate and all dependencies (recursively)
1192     pub fn lang_items(self) -> &'tcx rustc_hir::lang_items::LanguageItems {
1193         self.get_lang_items(LOCAL_CRATE)
1194     }
1195
1196     /// Obtain the given diagnostic item's `DefId`. Use `is_diagnostic_item` if you just want to
1197     /// compare against another `DefId`, since `is_diagnostic_item` is cheaper.
1198     pub fn get_diagnostic_item(self, name: Symbol) -> Option<DefId> {
1199         self.all_diagnostic_items(LOCAL_CRATE).get(&name).copied()
1200     }
1201
1202     /// Check whether the diagnostic item with the given `name` has the given `DefId`.
1203     pub fn is_diagnostic_item(self, name: Symbol, did: DefId) -> bool {
1204         self.diagnostic_items(did.krate).get(&name) == Some(&did)
1205     }
1206
1207     pub fn stability(self) -> &'tcx stability::Index<'tcx> {
1208         self.stability_index(LOCAL_CRATE)
1209     }
1210
1211     pub fn crates(self) -> &'tcx [CrateNum] {
1212         self.all_crate_nums(LOCAL_CRATE)
1213     }
1214
1215     pub fn allocator_kind(self) -> Option<AllocatorKind> {
1216         self.cstore.allocator_kind()
1217     }
1218
1219     pub fn features(self) -> &'tcx rustc_feature::Features {
1220         self.features_query(LOCAL_CRATE)
1221     }
1222
1223     pub fn def_key(self, id: DefId) -> rustc_hir::definitions::DefKey {
1224         if let Some(id) = id.as_local() { self.hir().def_key(id) } else { self.cstore.def_key(id) }
1225     }
1226
1227     /// Converts a `DefId` into its fully expanded `DefPath` (every
1228     /// `DefId` is really just an interned `DefPath`).
1229     ///
1230     /// Note that if `id` is not local to this crate, the result will
1231     ///  be a non-local `DefPath`.
1232     pub fn def_path(self, id: DefId) -> rustc_hir::definitions::DefPath {
1233         if let Some(id) = id.as_local() {
1234             self.hir().def_path(id)
1235         } else {
1236             self.cstore.def_path(id)
1237         }
1238     }
1239
1240     /// Returns whether or not the crate with CrateNum 'cnum'
1241     /// is marked as a private dependency
1242     pub fn is_private_dep(self, cnum: CrateNum) -> bool {
1243         if cnum == LOCAL_CRATE { false } else { self.cstore.crate_is_private_dep_untracked(cnum) }
1244     }
1245
1246     #[inline]
1247     pub fn def_path_hash(self, def_id: DefId) -> rustc_hir::definitions::DefPathHash {
1248         if let Some(def_id) = def_id.as_local() {
1249             self.definitions.def_path_hash(def_id)
1250         } else {
1251             self.cstore.def_path_hash(def_id)
1252         }
1253     }
1254
1255     pub fn def_path_debug_str(self, def_id: DefId) -> String {
1256         // We are explicitly not going through queries here in order to get
1257         // crate name and disambiguator since this code is called from debug!()
1258         // statements within the query system and we'd run into endless
1259         // recursion otherwise.
1260         let (crate_name, crate_disambiguator) = if def_id.is_local() {
1261             (self.crate_name, self.sess.local_crate_disambiguator())
1262         } else {
1263             (
1264                 self.cstore.crate_name_untracked(def_id.krate),
1265                 self.cstore.crate_disambiguator_untracked(def_id.krate),
1266             )
1267         };
1268
1269         format!(
1270             "{}[{}]{}",
1271             crate_name,
1272             // Don't print the whole crate disambiguator. That's just
1273             // annoying in debug output.
1274             &(crate_disambiguator.to_fingerprint().to_hex())[..4],
1275             self.def_path(def_id).to_string_no_crate()
1276         )
1277     }
1278
1279     pub fn metadata_encoding_version(self) -> Vec<u8> {
1280         self.cstore.metadata_encoding_version().to_vec()
1281     }
1282
1283     pub fn encode_metadata(self) -> EncodedMetadata {
1284         let _prof_timer = self.prof.verbose_generic_activity("generate_crate_metadata");
1285         self.cstore.encode_metadata(self)
1286     }
1287
1288     // Note that this is *untracked* and should only be used within the query
1289     // system if the result is otherwise tracked through queries
1290     pub fn cstore_as_any(self) -> &'tcx dyn Any {
1291         self.cstore.as_any()
1292     }
1293
1294     #[inline(always)]
1295     pub fn create_stable_hashing_context(self) -> StableHashingContext<'tcx> {
1296         let krate = self.gcx.untracked_crate;
1297
1298         StableHashingContext::new(self.sess, krate, self.definitions, &*self.cstore)
1299     }
1300
1301     #[inline(always)]
1302     pub fn create_no_span_stable_hashing_context(self) -> StableHashingContext<'tcx> {
1303         let krate = self.gcx.untracked_crate;
1304
1305         StableHashingContext::ignore_spans(self.sess, krate, self.definitions, &*self.cstore)
1306     }
1307
1308     // This method makes sure that we have a DepNode and a Fingerprint for
1309     // every upstream crate. It needs to be called once right after the tcx is
1310     // created.
1311     // With full-fledged red/green, the method will probably become unnecessary
1312     // as this will be done on-demand.
1313     pub fn allocate_metadata_dep_nodes(self) {
1314         // We cannot use the query versions of crates() and crate_hash(), since
1315         // those would need the DepNodes that we are allocating here.
1316         for cnum in self.cstore.crates_untracked() {
1317             let dep_node = DepConstructor::CrateMetadata(self, cnum);
1318             let crate_hash = self.cstore.crate_hash_untracked(cnum);
1319             self.dep_graph.with_task(
1320                 dep_node,
1321                 self,
1322                 crate_hash,
1323                 |_, x| x, // No transformation needed
1324                 dep_graph::hash_result,
1325             );
1326         }
1327     }
1328
1329     pub fn serialize_query_result_cache<E>(self, encoder: &mut E) -> Result<(), E::Error>
1330     where
1331         E: ty::codec::OpaqueEncoder,
1332     {
1333         self.queries.on_disk_cache.serialize(self, encoder)
1334     }
1335
1336     /// If `true`, we should use the MIR-based borrowck, but also
1337     /// fall back on the AST borrowck if the MIR-based one errors.
1338     pub fn migrate_borrowck(self) -> bool {
1339         self.borrowck_mode().migrate()
1340     }
1341
1342     /// What mode(s) of borrowck should we run? AST? MIR? both?
1343     /// (Also considers the `#![feature(nll)]` setting.)
1344     pub fn borrowck_mode(self) -> BorrowckMode {
1345         // Here are the main constraints we need to deal with:
1346         //
1347         // 1. An opts.borrowck_mode of `BorrowckMode::Migrate` is
1348         //    synonymous with no `-Z borrowck=...` flag at all.
1349         //
1350         // 2. We want to allow developers on the Nightly channel
1351         //    to opt back into the "hard error" mode for NLL,
1352         //    (which they can do via specifying `#![feature(nll)]`
1353         //    explicitly in their crate).
1354         //
1355         // So, this precedence list is how pnkfelix chose to work with
1356         // the above constraints:
1357         //
1358         // * `#![feature(nll)]` *always* means use NLL with hard
1359         //   errors. (To simplify the code here, it now even overrides
1360         //   a user's attempt to specify `-Z borrowck=compare`, which
1361         //   we arguably do not need anymore and should remove.)
1362         //
1363         // * Otherwise, if no `-Z borrowck=...` then use migrate mode
1364         //
1365         // * Otherwise, use the behavior requested via `-Z borrowck=...`
1366
1367         if self.features().nll {
1368             return BorrowckMode::Mir;
1369         }
1370
1371         self.sess.opts.borrowck_mode
1372     }
1373
1374     /// If `true`, we should use lazy normalization for constants, otherwise
1375     /// we still evaluate them eagerly.
1376     #[inline]
1377     pub fn lazy_normalization(self) -> bool {
1378         let features = self.features();
1379         // Note: We do not enable lazy normalization for `features.min_const_generics`.
1380         features.const_generics || features.lazy_normalization_consts
1381     }
1382
1383     #[inline]
1384     pub fn local_crate_exports_generics(self) -> bool {
1385         debug_assert!(self.sess.opts.share_generics());
1386
1387         self.sess.crate_types().iter().any(|crate_type| {
1388             match crate_type {
1389                 CrateType::Executable
1390                 | CrateType::Staticlib
1391                 | CrateType::ProcMacro
1392                 | CrateType::Cdylib => false,
1393
1394                 // FIXME rust-lang/rust#64319, rust-lang/rust#64872:
1395                 // We want to block export of generics from dylibs,
1396                 // but we must fix rust-lang/rust#65890 before we can
1397                 // do that robustly.
1398                 CrateType::Dylib => true,
1399
1400                 CrateType::Rlib => true,
1401             }
1402         })
1403     }
1404
1405     // Returns the `DefId` and the `BoundRegion` corresponding to the given region.
1406     pub fn is_suitable_region(&self, region: Region<'tcx>) -> Option<FreeRegionInfo> {
1407         let (suitable_region_binding_scope, bound_region) = match *region {
1408             ty::ReFree(ref free_region) => {
1409                 (free_region.scope.expect_local(), free_region.bound_region)
1410             }
1411             ty::ReEarlyBound(ref ebr) => (
1412                 self.parent(ebr.def_id).unwrap().expect_local(),
1413                 ty::BoundRegion::BrNamed(ebr.def_id, ebr.name),
1414             ),
1415             _ => return None, // not a free region
1416         };
1417
1418         let hir_id = self.hir().local_def_id_to_hir_id(suitable_region_binding_scope);
1419         let is_impl_item = match self.hir().find(hir_id) {
1420             Some(Node::Item(..) | Node::TraitItem(..)) => false,
1421             Some(Node::ImplItem(..)) => {
1422                 self.is_bound_region_in_impl_item(suitable_region_binding_scope)
1423             }
1424             _ => return None,
1425         };
1426
1427         Some(FreeRegionInfo {
1428             def_id: suitable_region_binding_scope,
1429             boundregion: bound_region,
1430             is_impl_item,
1431         })
1432     }
1433
1434     /// Given a `DefId` for an `fn`, return all the `dyn` and `impl` traits in its return type.
1435     pub fn return_type_impl_or_dyn_traits(
1436         &self,
1437         scope_def_id: LocalDefId,
1438     ) -> Vec<&'tcx hir::Ty<'tcx>> {
1439         let hir_id = self.hir().local_def_id_to_hir_id(scope_def_id);
1440         let hir_output = match self.hir().get(hir_id) {
1441             Node::Item(hir::Item {
1442                 kind:
1443                     ItemKind::Fn(
1444                         hir::FnSig {
1445                             decl: hir::FnDecl { output: hir::FnRetTy::Return(ty), .. },
1446                             ..
1447                         },
1448                         ..,
1449                     ),
1450                 ..
1451             })
1452             | Node::ImplItem(hir::ImplItem {
1453                 kind:
1454                     hir::ImplItemKind::Fn(
1455                         hir::FnSig {
1456                             decl: hir::FnDecl { output: hir::FnRetTy::Return(ty), .. },
1457                             ..
1458                         },
1459                         _,
1460                     ),
1461                 ..
1462             })
1463             | Node::TraitItem(hir::TraitItem {
1464                 kind:
1465                     hir::TraitItemKind::Fn(
1466                         hir::FnSig {
1467                             decl: hir::FnDecl { output: hir::FnRetTy::Return(ty), .. },
1468                             ..
1469                         },
1470                         _,
1471                     ),
1472                 ..
1473             }) => ty,
1474             _ => return vec![],
1475         };
1476
1477         let mut v = TraitObjectVisitor(vec![], self.hir());
1478         v.visit_ty(hir_output);
1479         v.0
1480     }
1481
1482     pub fn return_type_impl_trait(&self, scope_def_id: LocalDefId) -> Option<(Ty<'tcx>, Span)> {
1483         // HACK: `type_of_def_id()` will fail on these (#55796), so return `None`.
1484         let hir_id = self.hir().local_def_id_to_hir_id(scope_def_id);
1485         match self.hir().get(hir_id) {
1486             Node::Item(item) => {
1487                 match item.kind {
1488                     ItemKind::Fn(..) => { /* `type_of_def_id()` will work */ }
1489                     _ => {
1490                         return None;
1491                     }
1492                 }
1493             }
1494             _ => { /* `type_of_def_id()` will work or panic */ }
1495         }
1496
1497         let ret_ty = self.type_of(scope_def_id);
1498         match ret_ty.kind() {
1499             ty::FnDef(_, _) => {
1500                 let sig = ret_ty.fn_sig(*self);
1501                 let output = self.erase_late_bound_regions(&sig.output());
1502                 if output.is_impl_trait() {
1503                     let fn_decl = self.hir().fn_decl_by_hir_id(hir_id).unwrap();
1504                     Some((output, fn_decl.output.span()))
1505                 } else {
1506                     None
1507                 }
1508             }
1509             _ => None,
1510         }
1511     }
1512
1513     // Checks if the bound region is in Impl Item.
1514     pub fn is_bound_region_in_impl_item(&self, suitable_region_binding_scope: LocalDefId) -> bool {
1515         let container_id =
1516             self.associated_item(suitable_region_binding_scope.to_def_id()).container.id();
1517         if self.impl_trait_ref(container_id).is_some() {
1518             // For now, we do not try to target impls of traits. This is
1519             // because this message is going to suggest that the user
1520             // change the fn signature, but they may not be free to do so,
1521             // since the signature must match the trait.
1522             //
1523             // FIXME(#42706) -- in some cases, we could do better here.
1524             return true;
1525         }
1526         false
1527     }
1528
1529     /// Determines whether identifiers in the assembly have strict naming rules.
1530     /// Currently, only NVPTX* targets need it.
1531     pub fn has_strict_asm_symbol_naming(&self) -> bool {
1532         self.sess.target.target.arch.contains("nvptx")
1533     }
1534
1535     /// Returns `&'static core::panic::Location<'static>`.
1536     pub fn caller_location_ty(&self) -> Ty<'tcx> {
1537         self.mk_imm_ref(
1538             self.lifetimes.re_static,
1539             self.type_of(self.require_lang_item(LangItem::PanicLocation, None))
1540                 .subst(*self, self.mk_substs([self.lifetimes.re_static.into()].iter())),
1541         )
1542     }
1543
1544     /// Returns a displayable description and article for the given `def_id` (e.g. `("a", "struct")`).
1545     pub fn article_and_description(&self, def_id: DefId) -> (&'static str, &'static str) {
1546         match self.def_kind(def_id) {
1547             DefKind::Generator => match self.generator_kind(def_id).unwrap() {
1548                 rustc_hir::GeneratorKind::Async(..) => ("an", "async closure"),
1549                 rustc_hir::GeneratorKind::Gen => ("a", "generator"),
1550             },
1551             def_kind => (def_kind.article(), def_kind.descr(def_id)),
1552         }
1553     }
1554 }
1555
1556 /// A trait implemented for all `X<'a>` types that can be safely and
1557 /// efficiently converted to `X<'tcx>` as long as they are part of the
1558 /// provided `TyCtxt<'tcx>`.
1559 /// This can be done, for example, for `Ty<'tcx>` or `SubstsRef<'tcx>`
1560 /// by looking them up in their respective interners.
1561 ///
1562 /// However, this is still not the best implementation as it does
1563 /// need to compare the components, even for interned values.
1564 /// It would be more efficient if `TypedArena` provided a way to
1565 /// determine whether the address is in the allocated range.
1566 ///
1567 /// `None` is returned if the value or one of the components is not part
1568 /// of the provided context.
1569 /// For `Ty`, `None` can be returned if either the type interner doesn't
1570 /// contain the `TyKind` key or if the address of the interned
1571 /// pointer differs. The latter case is possible if a primitive type,
1572 /// e.g., `()` or `u8`, was interned in a different context.
1573 pub trait Lift<'tcx>: fmt::Debug {
1574     type Lifted: fmt::Debug + 'tcx;
1575     fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted>;
1576 }
1577
1578 macro_rules! nop_lift {
1579     ($set:ident; $ty:ty => $lifted:ty) => {
1580         impl<'a, 'tcx> Lift<'tcx> for $ty {
1581             type Lifted = $lifted;
1582             fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
1583                 if tcx.interners.$set.contains_pointer_to(&Interned(*self)) {
1584                     Some(unsafe { mem::transmute(*self) })
1585                 } else {
1586                     None
1587                 }
1588             }
1589         }
1590     };
1591 }
1592
1593 macro_rules! nop_list_lift {
1594     ($set:ident; $ty:ty => $lifted:ty) => {
1595         impl<'a, 'tcx> Lift<'tcx> for &'a List<$ty> {
1596             type Lifted = &'tcx List<$lifted>;
1597             fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
1598                 if self.is_empty() {
1599                     return Some(List::empty());
1600                 }
1601                 if tcx.interners.$set.contains_pointer_to(&Interned(*self)) {
1602                     Some(unsafe { mem::transmute(*self) })
1603                 } else {
1604                     None
1605                 }
1606             }
1607         }
1608     };
1609 }
1610
1611 nop_lift! {type_; Ty<'a> => Ty<'tcx>}
1612 nop_lift! {region; Region<'a> => Region<'tcx>}
1613 nop_lift! {const_; &'a Const<'a> => &'tcx Const<'tcx>}
1614 nop_lift! {predicate; &'a PredicateInner<'a> => &'tcx PredicateInner<'tcx>}
1615
1616 nop_list_lift! {type_list; Ty<'a> => Ty<'tcx>}
1617 nop_list_lift! {existential_predicates; ExistentialPredicate<'a> => ExistentialPredicate<'tcx>}
1618 nop_list_lift! {predicates; Predicate<'a> => Predicate<'tcx>}
1619 nop_list_lift! {canonical_var_infos; CanonicalVarInfo => CanonicalVarInfo}
1620 nop_list_lift! {projs; ProjectionKind => ProjectionKind}
1621
1622 // This is the impl for `&'a InternalSubsts<'a>`.
1623 nop_list_lift! {substs; GenericArg<'a> => GenericArg<'tcx>}
1624
1625 pub mod tls {
1626     use super::{ptr_eq, GlobalCtxt, TyCtxt};
1627
1628     use crate::dep_graph::{DepKind, TaskDeps};
1629     use crate::ty::query;
1630     use rustc_data_structures::sync::{self, Lock};
1631     use rustc_data_structures::thin_vec::ThinVec;
1632     use rustc_errors::Diagnostic;
1633     use std::mem;
1634
1635     #[cfg(not(parallel_compiler))]
1636     use std::cell::Cell;
1637
1638     #[cfg(parallel_compiler)]
1639     use rustc_rayon_core as rayon_core;
1640
1641     /// This is the implicit state of rustc. It contains the current
1642     /// `TyCtxt` and query. It is updated when creating a local interner or
1643     /// executing a new query. Whenever there's a `TyCtxt` value available
1644     /// you should also have access to an `ImplicitCtxt` through the functions
1645     /// in this module.
1646     #[derive(Clone)]
1647     pub struct ImplicitCtxt<'a, 'tcx> {
1648         /// The current `TyCtxt`.
1649         pub tcx: TyCtxt<'tcx>,
1650
1651         /// The current query job, if any. This is updated by `JobOwner::start` in
1652         /// `ty::query::plumbing` when executing a query.
1653         pub query: Option<query::QueryJobId<DepKind>>,
1654
1655         /// Where to store diagnostics for the current query job, if any.
1656         /// This is updated by `JobOwner::start` in `ty::query::plumbing` when executing a query.
1657         pub diagnostics: Option<&'a Lock<ThinVec<Diagnostic>>>,
1658
1659         /// Used to prevent layout from recursing too deeply.
1660         pub layout_depth: usize,
1661
1662         /// The current dep graph task. This is used to add dependencies to queries
1663         /// when executing them.
1664         pub task_deps: Option<&'a Lock<TaskDeps>>,
1665     }
1666
1667     impl<'a, 'tcx> ImplicitCtxt<'a, 'tcx> {
1668         pub fn new(gcx: &'tcx GlobalCtxt<'tcx>) -> Self {
1669             let tcx = TyCtxt { gcx };
1670             ImplicitCtxt { tcx, query: None, diagnostics: None, layout_depth: 0, task_deps: None }
1671         }
1672     }
1673
1674     /// Sets Rayon's thread-local variable, which is preserved for Rayon jobs
1675     /// to `value` during the call to `f`. It is restored to its previous value after.
1676     /// This is used to set the pointer to the new `ImplicitCtxt`.
1677     #[cfg(parallel_compiler)]
1678     #[inline]
1679     fn set_tlv<F: FnOnce() -> R, R>(value: usize, f: F) -> R {
1680         rayon_core::tlv::with(value, f)
1681     }
1682
1683     /// Gets Rayon's thread-local variable, which is preserved for Rayon jobs.
1684     /// This is used to get the pointer to the current `ImplicitCtxt`.
1685     #[cfg(parallel_compiler)]
1686     #[inline]
1687     pub fn get_tlv() -> usize {
1688         rayon_core::tlv::get()
1689     }
1690
1691     #[cfg(not(parallel_compiler))]
1692     thread_local! {
1693         /// A thread local variable that stores a pointer to the current `ImplicitCtxt`.
1694         static TLV: Cell<usize> = Cell::new(0);
1695     }
1696
1697     /// Sets TLV to `value` during the call to `f`.
1698     /// It is restored to its previous value after.
1699     /// This is used to set the pointer to the new `ImplicitCtxt`.
1700     #[cfg(not(parallel_compiler))]
1701     #[inline]
1702     fn set_tlv<F: FnOnce() -> R, R>(value: usize, f: F) -> R {
1703         let old = get_tlv();
1704         let _reset = rustc_data_structures::OnDrop(move || TLV.with(|tlv| tlv.set(old)));
1705         TLV.with(|tlv| tlv.set(value));
1706         f()
1707     }
1708
1709     /// Gets the pointer to the current `ImplicitCtxt`.
1710     #[cfg(not(parallel_compiler))]
1711     #[inline]
1712     fn get_tlv() -> usize {
1713         TLV.with(|tlv| tlv.get())
1714     }
1715
1716     /// Sets `context` as the new current `ImplicitCtxt` for the duration of the function `f`.
1717     #[inline]
1718     pub fn enter_context<'a, 'tcx, F, R>(context: &ImplicitCtxt<'a, 'tcx>, f: F) -> R
1719     where
1720         F: FnOnce(&ImplicitCtxt<'a, 'tcx>) -> R,
1721     {
1722         set_tlv(context as *const _ as usize, || f(&context))
1723     }
1724
1725     /// Allows access to the current `ImplicitCtxt` in a closure if one is available.
1726     #[inline]
1727     pub fn with_context_opt<F, R>(f: F) -> R
1728     where
1729         F: for<'a, 'tcx> FnOnce(Option<&ImplicitCtxt<'a, 'tcx>>) -> R,
1730     {
1731         let context = get_tlv();
1732         if context == 0 {
1733             f(None)
1734         } else {
1735             // We could get a `ImplicitCtxt` pointer from another thread.
1736             // Ensure that `ImplicitCtxt` is `Sync`.
1737             sync::assert_sync::<ImplicitCtxt<'_, '_>>();
1738
1739             unsafe { f(Some(&*(context as *const ImplicitCtxt<'_, '_>))) }
1740         }
1741     }
1742
1743     /// Allows access to the current `ImplicitCtxt`.
1744     /// Panics if there is no `ImplicitCtxt` available.
1745     #[inline]
1746     pub fn with_context<F, R>(f: F) -> R
1747     where
1748         F: for<'a, 'tcx> FnOnce(&ImplicitCtxt<'a, 'tcx>) -> R,
1749     {
1750         with_context_opt(|opt_context| f(opt_context.expect("no ImplicitCtxt stored in tls")))
1751     }
1752
1753     /// Allows access to the current `ImplicitCtxt` whose tcx field is the same as the tcx argument
1754     /// passed in. This means the closure is given an `ImplicitCtxt` with the same `'tcx` lifetime
1755     /// as the `TyCtxt` passed in.
1756     /// This will panic if you pass it a `TyCtxt` which is different from the current
1757     /// `ImplicitCtxt`'s `tcx` field.
1758     #[inline]
1759     pub fn with_related_context<'tcx, F, R>(tcx: TyCtxt<'tcx>, f: F) -> R
1760     where
1761         F: FnOnce(&ImplicitCtxt<'_, 'tcx>) -> R,
1762     {
1763         with_context(|context| unsafe {
1764             assert!(ptr_eq(context.tcx.gcx, tcx.gcx));
1765             let context: &ImplicitCtxt<'_, '_> = mem::transmute(context);
1766             f(context)
1767         })
1768     }
1769
1770     /// Allows access to the `TyCtxt` in the current `ImplicitCtxt`.
1771     /// Panics if there is no `ImplicitCtxt` available.
1772     #[inline]
1773     pub fn with<F, R>(f: F) -> R
1774     where
1775         F: for<'tcx> FnOnce(TyCtxt<'tcx>) -> R,
1776     {
1777         with_context(|context| f(context.tcx))
1778     }
1779
1780     /// Allows access to the `TyCtxt` in the current `ImplicitCtxt`.
1781     /// The closure is passed None if there is no `ImplicitCtxt` available.
1782     #[inline]
1783     pub fn with_opt<F, R>(f: F) -> R
1784     where
1785         F: for<'tcx> FnOnce(Option<TyCtxt<'tcx>>) -> R,
1786     {
1787         with_context_opt(|opt_context| f(opt_context.map(|context| context.tcx)))
1788     }
1789 }
1790
1791 macro_rules! sty_debug_print {
1792     ($fmt: expr, $ctxt: expr, $($variant: ident),*) => {{
1793         // Curious inner module to allow variant names to be used as
1794         // variable names.
1795         #[allow(non_snake_case)]
1796         mod inner {
1797             use crate::ty::{self, TyCtxt};
1798             use crate::ty::context::Interned;
1799
1800             #[derive(Copy, Clone)]
1801             struct DebugStat {
1802                 total: usize,
1803                 lt_infer: usize,
1804                 ty_infer: usize,
1805                 ct_infer: usize,
1806                 all_infer: usize,
1807             }
1808
1809             pub fn go(fmt: &mut std::fmt::Formatter<'_>, tcx: TyCtxt<'_>) -> std::fmt::Result {
1810                 let mut total = DebugStat {
1811                     total: 0,
1812                     lt_infer: 0,
1813                     ty_infer: 0,
1814                     ct_infer: 0,
1815                     all_infer: 0,
1816                 };
1817                 $(let mut $variant = total;)*
1818
1819                 let shards = tcx.interners.type_.lock_shards();
1820                 let types = shards.iter().flat_map(|shard| shard.keys());
1821                 for &Interned(t) in types {
1822                     let variant = match t.kind() {
1823                         ty::Bool | ty::Char | ty::Int(..) | ty::Uint(..) |
1824                             ty::Float(..) | ty::Str | ty::Never => continue,
1825                         ty::Error(_) => /* unimportant */ continue,
1826                         $(ty::$variant(..) => &mut $variant,)*
1827                     };
1828                     let lt = t.flags().intersects(ty::TypeFlags::HAS_RE_INFER);
1829                     let ty = t.flags().intersects(ty::TypeFlags::HAS_TY_INFER);
1830                     let ct = t.flags().intersects(ty::TypeFlags::HAS_CT_INFER);
1831
1832                     variant.total += 1;
1833                     total.total += 1;
1834                     if lt { total.lt_infer += 1; variant.lt_infer += 1 }
1835                     if ty { total.ty_infer += 1; variant.ty_infer += 1 }
1836                     if ct { total.ct_infer += 1; variant.ct_infer += 1 }
1837                     if lt && ty && ct { total.all_infer += 1; variant.all_infer += 1 }
1838                 }
1839                 writeln!(fmt, "Ty interner             total           ty lt ct all")?;
1840                 $(writeln!(fmt, "    {:18}: {uses:6} {usespc:4.1}%, \
1841                             {ty:4.1}% {lt:5.1}% {ct:4.1}% {all:4.1}%",
1842                     stringify!($variant),
1843                     uses = $variant.total,
1844                     usespc = $variant.total as f64 * 100.0 / total.total as f64,
1845                     ty = $variant.ty_infer as f64 * 100.0  / total.total as f64,
1846                     lt = $variant.lt_infer as f64 * 100.0  / total.total as f64,
1847                     ct = $variant.ct_infer as f64 * 100.0  / total.total as f64,
1848                     all = $variant.all_infer as f64 * 100.0  / total.total as f64)?;
1849                 )*
1850                 writeln!(fmt, "                  total {uses:6}        \
1851                           {ty:4.1}% {lt:5.1}% {ct:4.1}% {all:4.1}%",
1852                     uses = total.total,
1853                     ty = total.ty_infer as f64 * 100.0  / total.total as f64,
1854                     lt = total.lt_infer as f64 * 100.0  / total.total as f64,
1855                     ct = total.ct_infer as f64 * 100.0  / total.total as f64,
1856                     all = total.all_infer as f64 * 100.0  / total.total as f64)
1857             }
1858         }
1859
1860         inner::go($fmt, $ctxt)
1861     }}
1862 }
1863
1864 impl<'tcx> TyCtxt<'tcx> {
1865     pub fn debug_stats(self) -> impl std::fmt::Debug + 'tcx {
1866         struct DebugStats<'tcx>(TyCtxt<'tcx>);
1867
1868         impl std::fmt::Debug for DebugStats<'tcx> {
1869             fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1870                 sty_debug_print!(
1871                     fmt,
1872                     self.0,
1873                     Adt,
1874                     Array,
1875                     Slice,
1876                     RawPtr,
1877                     Ref,
1878                     FnDef,
1879                     FnPtr,
1880                     Placeholder,
1881                     Generator,
1882                     GeneratorWitness,
1883                     Dynamic,
1884                     Closure,
1885                     Tuple,
1886                     Bound,
1887                     Param,
1888                     Infer,
1889                     Projection,
1890                     Opaque,
1891                     Foreign
1892                 )?;
1893
1894                 writeln!(fmt, "InternalSubsts interner: #{}", self.0.interners.substs.len())?;
1895                 writeln!(fmt, "Region interner: #{}", self.0.interners.region.len())?;
1896                 writeln!(fmt, "Stability interner: #{}", self.0.stability_interner.len())?;
1897                 writeln!(
1898                     fmt,
1899                     "Const Stability interner: #{}",
1900                     self.0.const_stability_interner.len()
1901                 )?;
1902                 writeln!(fmt, "Allocation interner: #{}", self.0.allocation_interner.len())?;
1903                 writeln!(fmt, "Layout interner: #{}", self.0.layout_interner.len())?;
1904
1905                 Ok(())
1906             }
1907         }
1908
1909         DebugStats(self)
1910     }
1911 }
1912
1913 /// An entry in an interner.
1914 struct Interned<'tcx, T: ?Sized>(&'tcx T);
1915
1916 impl<'tcx, T: 'tcx + ?Sized> Clone for Interned<'tcx, T> {
1917     fn clone(&self) -> Self {
1918         Interned(self.0)
1919     }
1920 }
1921 impl<'tcx, T: 'tcx + ?Sized> Copy for Interned<'tcx, T> {}
1922
1923 impl<'tcx, T: 'tcx + ?Sized> IntoPointer for Interned<'tcx, T> {
1924     fn into_pointer(&self) -> *const () {
1925         self.0 as *const _ as *const ()
1926     }
1927 }
1928 // N.B., an `Interned<Ty>` compares and hashes as a `TyKind`.
1929 impl<'tcx> PartialEq for Interned<'tcx, TyS<'tcx>> {
1930     fn eq(&self, other: &Interned<'tcx, TyS<'tcx>>) -> bool {
1931         self.0.kind() == other.0.kind()
1932     }
1933 }
1934
1935 impl<'tcx> Eq for Interned<'tcx, TyS<'tcx>> {}
1936
1937 impl<'tcx> Hash for Interned<'tcx, TyS<'tcx>> {
1938     fn hash<H: Hasher>(&self, s: &mut H) {
1939         self.0.kind().hash(s)
1940     }
1941 }
1942
1943 #[allow(rustc::usage_of_ty_tykind)]
1944 impl<'tcx> Borrow<TyKind<'tcx>> for Interned<'tcx, TyS<'tcx>> {
1945     fn borrow<'a>(&'a self) -> &'a TyKind<'tcx> {
1946         &self.0.kind()
1947     }
1948 }
1949 // N.B., an `Interned<PredicateInner>` compares and hashes as a `PredicateKind`.
1950 impl<'tcx> PartialEq for Interned<'tcx, PredicateInner<'tcx>> {
1951     fn eq(&self, other: &Interned<'tcx, PredicateInner<'tcx>>) -> bool {
1952         self.0.kind == other.0.kind
1953     }
1954 }
1955
1956 impl<'tcx> Eq for Interned<'tcx, PredicateInner<'tcx>> {}
1957
1958 impl<'tcx> Hash for Interned<'tcx, PredicateInner<'tcx>> {
1959     fn hash<H: Hasher>(&self, s: &mut H) {
1960         self.0.kind.hash(s)
1961     }
1962 }
1963
1964 impl<'tcx> Borrow<PredicateKind<'tcx>> for Interned<'tcx, PredicateInner<'tcx>> {
1965     fn borrow<'a>(&'a self) -> &'a PredicateKind<'tcx> {
1966         &self.0.kind
1967     }
1968 }
1969
1970 // N.B., an `Interned<List<T>>` compares and hashes as its elements.
1971 impl<'tcx, T: PartialEq> PartialEq for Interned<'tcx, List<T>> {
1972     fn eq(&self, other: &Interned<'tcx, List<T>>) -> bool {
1973         self.0[..] == other.0[..]
1974     }
1975 }
1976
1977 impl<'tcx, T: Eq> Eq for Interned<'tcx, List<T>> {}
1978
1979 impl<'tcx, T: Hash> Hash for Interned<'tcx, List<T>> {
1980     fn hash<H: Hasher>(&self, s: &mut H) {
1981         self.0[..].hash(s)
1982     }
1983 }
1984
1985 impl<'tcx, T> Borrow<[T]> for Interned<'tcx, List<T>> {
1986     fn borrow<'a>(&'a self) -> &'a [T] {
1987         &self.0[..]
1988     }
1989 }
1990
1991 impl<'tcx> Borrow<RegionKind> for Interned<'tcx, RegionKind> {
1992     fn borrow(&self) -> &RegionKind {
1993         &self.0
1994     }
1995 }
1996
1997 impl<'tcx> Borrow<Const<'tcx>> for Interned<'tcx, Const<'tcx>> {
1998     fn borrow<'a>(&'a self) -> &'a Const<'tcx> {
1999         &self.0
2000     }
2001 }
2002
2003 impl<'tcx> Borrow<PredicateKind<'tcx>> for Interned<'tcx, PredicateKind<'tcx>> {
2004     fn borrow<'a>(&'a self) -> &'a PredicateKind<'tcx> {
2005         &self.0
2006     }
2007 }
2008
2009 macro_rules! direct_interners {
2010     ($($name:ident: $method:ident($ty:ty),)+) => {
2011         $(impl<'tcx> PartialEq for Interned<'tcx, $ty> {
2012             fn eq(&self, other: &Self) -> bool {
2013                 self.0 == other.0
2014             }
2015         }
2016
2017         impl<'tcx> Eq for Interned<'tcx, $ty> {}
2018
2019         impl<'tcx> Hash for Interned<'tcx, $ty> {
2020             fn hash<H: Hasher>(&self, s: &mut H) {
2021                 self.0.hash(s)
2022             }
2023         }
2024
2025         impl<'tcx> TyCtxt<'tcx> {
2026             pub fn $method(self, v: $ty) -> &'tcx $ty {
2027                 self.interners.$name.intern_ref(&v, || {
2028                     Interned(self.interners.arena.alloc(v))
2029                 }).0
2030             }
2031         })+
2032     }
2033 }
2034
2035 direct_interners! {
2036     region: mk_region(RegionKind),
2037     const_: mk_const(Const<'tcx>),
2038 }
2039
2040 macro_rules! slice_interners {
2041     ($($field:ident: $method:ident($ty:ty)),+ $(,)?) => (
2042         $(impl<'tcx> TyCtxt<'tcx> {
2043             pub fn $method(self, v: &[$ty]) -> &'tcx List<$ty> {
2044                 self.interners.$field.intern_ref(v, || {
2045                     Interned(List::from_arena(&*self.arena, v))
2046                 }).0
2047             }
2048         })+
2049     );
2050 }
2051
2052 slice_interners!(
2053     type_list: _intern_type_list(Ty<'tcx>),
2054     substs: _intern_substs(GenericArg<'tcx>),
2055     canonical_var_infos: _intern_canonical_var_infos(CanonicalVarInfo),
2056     existential_predicates: _intern_existential_predicates(ExistentialPredicate<'tcx>),
2057     predicates: _intern_predicates(Predicate<'tcx>),
2058     projs: _intern_projs(ProjectionKind),
2059     place_elems: _intern_place_elems(PlaceElem<'tcx>),
2060 );
2061
2062 impl<'tcx> TyCtxt<'tcx> {
2063     /// Given a `fn` type, returns an equivalent `unsafe fn` type;
2064     /// that is, a `fn` type that is equivalent in every way for being
2065     /// unsafe.
2066     pub fn safe_to_unsafe_fn_ty(self, sig: PolyFnSig<'tcx>) -> Ty<'tcx> {
2067         assert_eq!(sig.unsafety(), hir::Unsafety::Normal);
2068         self.mk_fn_ptr(sig.map_bound(|sig| ty::FnSig { unsafety: hir::Unsafety::Unsafe, ..sig }))
2069     }
2070
2071     /// Given a closure signature, returns an equivalent fn signature. Detuples
2072     /// and so forth -- so e.g., if we have a sig with `Fn<(u32, i32)>` then
2073     /// you would get a `fn(u32, i32)`.
2074     /// `unsafety` determines the unsafety of the fn signature. If you pass
2075     /// `hir::Unsafety::Unsafe` in the previous example, then you would get
2076     /// an `unsafe fn (u32, i32)`.
2077     /// It cannot convert a closure that requires unsafe.
2078     pub fn signature_unclosure(
2079         self,
2080         sig: PolyFnSig<'tcx>,
2081         unsafety: hir::Unsafety,
2082     ) -> PolyFnSig<'tcx> {
2083         sig.map_bound(|s| {
2084             let params_iter = match s.inputs()[0].kind() {
2085                 ty::Tuple(params) => params.into_iter().map(|k| k.expect_ty()),
2086                 _ => bug!(),
2087             };
2088             self.mk_fn_sig(params_iter, s.output(), s.c_variadic, unsafety, abi::Abi::Rust)
2089         })
2090     }
2091
2092     /// Same a `self.mk_region(kind)`, but avoids accessing the interners if
2093     /// `*r == kind`.
2094     #[inline]
2095     pub fn reuse_or_mk_region(self, r: Region<'tcx>, kind: RegionKind) -> Region<'tcx> {
2096         if *r == kind { r } else { self.mk_region(kind) }
2097     }
2098
2099     #[allow(rustc::usage_of_ty_tykind)]
2100     #[inline]
2101     pub fn mk_ty(self, st: TyKind<'tcx>) -> Ty<'tcx> {
2102         self.interners.intern_ty(st)
2103     }
2104
2105     #[inline]
2106     pub fn mk_predicate(self, kind: PredicateKind<'tcx>) -> Predicate<'tcx> {
2107         let inner = self.interners.intern_predicate(kind);
2108         Predicate { inner }
2109     }
2110
2111     #[inline]
2112     pub fn reuse_or_mk_predicate(
2113         self,
2114         pred: Predicate<'tcx>,
2115         kind: PredicateKind<'tcx>,
2116     ) -> Predicate<'tcx> {
2117         if *pred.kind() != kind { self.mk_predicate(kind) } else { pred }
2118     }
2119
2120     pub fn mk_mach_int(self, tm: ast::IntTy) -> Ty<'tcx> {
2121         match tm {
2122             ast::IntTy::Isize => self.types.isize,
2123             ast::IntTy::I8 => self.types.i8,
2124             ast::IntTy::I16 => self.types.i16,
2125             ast::IntTy::I32 => self.types.i32,
2126             ast::IntTy::I64 => self.types.i64,
2127             ast::IntTy::I128 => self.types.i128,
2128         }
2129     }
2130
2131     pub fn mk_mach_uint(self, tm: ast::UintTy) -> Ty<'tcx> {
2132         match tm {
2133             ast::UintTy::Usize => self.types.usize,
2134             ast::UintTy::U8 => self.types.u8,
2135             ast::UintTy::U16 => self.types.u16,
2136             ast::UintTy::U32 => self.types.u32,
2137             ast::UintTy::U64 => self.types.u64,
2138             ast::UintTy::U128 => self.types.u128,
2139         }
2140     }
2141
2142     pub fn mk_mach_float(self, tm: ast::FloatTy) -> Ty<'tcx> {
2143         match tm {
2144             ast::FloatTy::F32 => self.types.f32,
2145             ast::FloatTy::F64 => self.types.f64,
2146         }
2147     }
2148
2149     #[inline]
2150     pub fn mk_static_str(self) -> Ty<'tcx> {
2151         self.mk_imm_ref(self.lifetimes.re_static, self.types.str_)
2152     }
2153
2154     #[inline]
2155     pub fn mk_adt(self, def: &'tcx AdtDef, substs: SubstsRef<'tcx>) -> Ty<'tcx> {
2156         // Take a copy of substs so that we own the vectors inside.
2157         self.mk_ty(Adt(def, substs))
2158     }
2159
2160     #[inline]
2161     pub fn mk_foreign(self, def_id: DefId) -> Ty<'tcx> {
2162         self.mk_ty(Foreign(def_id))
2163     }
2164
2165     fn mk_generic_adt(self, wrapper_def_id: DefId, ty_param: Ty<'tcx>) -> Ty<'tcx> {
2166         let adt_def = self.adt_def(wrapper_def_id);
2167         let substs =
2168             InternalSubsts::for_item(self, wrapper_def_id, |param, substs| match param.kind {
2169                 GenericParamDefKind::Lifetime | GenericParamDefKind::Const => bug!(),
2170                 GenericParamDefKind::Type { has_default, .. } => {
2171                     if param.index == 0 {
2172                         ty_param.into()
2173                     } else {
2174                         assert!(has_default);
2175                         self.type_of(param.def_id).subst(self, substs).into()
2176                     }
2177                 }
2178             });
2179         self.mk_ty(Adt(adt_def, substs))
2180     }
2181
2182     #[inline]
2183     pub fn mk_box(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2184         let def_id = self.require_lang_item(LangItem::OwnedBox, None);
2185         self.mk_generic_adt(def_id, ty)
2186     }
2187
2188     #[inline]
2189     pub fn mk_lang_item(self, ty: Ty<'tcx>, item: LangItem) -> Option<Ty<'tcx>> {
2190         let def_id = self.lang_items().require(item).ok()?;
2191         Some(self.mk_generic_adt(def_id, ty))
2192     }
2193
2194     #[inline]
2195     pub fn mk_diagnostic_item(self, ty: Ty<'tcx>, name: Symbol) -> Option<Ty<'tcx>> {
2196         let def_id = self.get_diagnostic_item(name)?;
2197         Some(self.mk_generic_adt(def_id, ty))
2198     }
2199
2200     #[inline]
2201     pub fn mk_maybe_uninit(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2202         let def_id = self.require_lang_item(LangItem::MaybeUninit, None);
2203         self.mk_generic_adt(def_id, ty)
2204     }
2205
2206     #[inline]
2207     pub fn mk_ptr(self, tm: TypeAndMut<'tcx>) -> Ty<'tcx> {
2208         self.mk_ty(RawPtr(tm))
2209     }
2210
2211     #[inline]
2212     pub fn mk_ref(self, r: Region<'tcx>, tm: TypeAndMut<'tcx>) -> Ty<'tcx> {
2213         self.mk_ty(Ref(r, tm.ty, tm.mutbl))
2214     }
2215
2216     #[inline]
2217     pub fn mk_mut_ref(self, r: Region<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> {
2218         self.mk_ref(r, TypeAndMut { ty, mutbl: hir::Mutability::Mut })
2219     }
2220
2221     #[inline]
2222     pub fn mk_imm_ref(self, r: Region<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> {
2223         self.mk_ref(r, TypeAndMut { ty, mutbl: hir::Mutability::Not })
2224     }
2225
2226     #[inline]
2227     pub fn mk_mut_ptr(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2228         self.mk_ptr(TypeAndMut { ty, mutbl: hir::Mutability::Mut })
2229     }
2230
2231     #[inline]
2232     pub fn mk_imm_ptr(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2233         self.mk_ptr(TypeAndMut { ty, mutbl: hir::Mutability::Not })
2234     }
2235
2236     #[inline]
2237     pub fn mk_nil_ptr(self) -> Ty<'tcx> {
2238         self.mk_imm_ptr(self.mk_unit())
2239     }
2240
2241     #[inline]
2242     pub fn mk_array(self, ty: Ty<'tcx>, n: u64) -> Ty<'tcx> {
2243         self.mk_ty(Array(ty, ty::Const::from_usize(self, n)))
2244     }
2245
2246     #[inline]
2247     pub fn mk_slice(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2248         self.mk_ty(Slice(ty))
2249     }
2250
2251     #[inline]
2252     pub fn intern_tup(self, ts: &[Ty<'tcx>]) -> Ty<'tcx> {
2253         let kinds: Vec<_> = ts.iter().map(|&t| GenericArg::from(t)).collect();
2254         self.mk_ty(Tuple(self.intern_substs(&kinds)))
2255     }
2256
2257     pub fn mk_tup<I: InternAs<[Ty<'tcx>], Ty<'tcx>>>(self, iter: I) -> I::Output {
2258         iter.intern_with(|ts| {
2259             let kinds: Vec<_> = ts.iter().map(|&t| GenericArg::from(t)).collect();
2260             self.mk_ty(Tuple(self.intern_substs(&kinds)))
2261         })
2262     }
2263
2264     #[inline]
2265     pub fn mk_unit(self) -> Ty<'tcx> {
2266         self.types.unit
2267     }
2268
2269     #[inline]
2270     pub fn mk_diverging_default(self) -> Ty<'tcx> {
2271         if self.features().never_type_fallback { self.types.never } else { self.types.unit }
2272     }
2273
2274     #[inline]
2275     pub fn mk_fn_def(self, def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'tcx> {
2276         self.mk_ty(FnDef(def_id, substs))
2277     }
2278
2279     #[inline]
2280     pub fn mk_fn_ptr(self, fty: PolyFnSig<'tcx>) -> Ty<'tcx> {
2281         self.mk_ty(FnPtr(fty))
2282     }
2283
2284     #[inline]
2285     pub fn mk_dynamic(
2286         self,
2287         obj: ty::Binder<&'tcx List<ExistentialPredicate<'tcx>>>,
2288         reg: ty::Region<'tcx>,
2289     ) -> Ty<'tcx> {
2290         self.mk_ty(Dynamic(obj, reg))
2291     }
2292
2293     #[inline]
2294     pub fn mk_projection(self, item_def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'tcx> {
2295         self.mk_ty(Projection(ProjectionTy { item_def_id, substs }))
2296     }
2297
2298     #[inline]
2299     pub fn mk_closure(self, closure_id: DefId, closure_substs: SubstsRef<'tcx>) -> Ty<'tcx> {
2300         self.mk_ty(Closure(closure_id, closure_substs))
2301     }
2302
2303     #[inline]
2304     pub fn mk_generator(
2305         self,
2306         id: DefId,
2307         generator_substs: SubstsRef<'tcx>,
2308         movability: hir::Movability,
2309     ) -> Ty<'tcx> {
2310         self.mk_ty(Generator(id, generator_substs, movability))
2311     }
2312
2313     #[inline]
2314     pub fn mk_generator_witness(self, types: ty::Binder<&'tcx List<Ty<'tcx>>>) -> Ty<'tcx> {
2315         self.mk_ty(GeneratorWitness(types))
2316     }
2317
2318     #[inline]
2319     pub fn mk_ty_var(self, v: TyVid) -> Ty<'tcx> {
2320         self.mk_ty_infer(TyVar(v))
2321     }
2322
2323     #[inline]
2324     pub fn mk_const_var(self, v: ConstVid<'tcx>, ty: Ty<'tcx>) -> &'tcx Const<'tcx> {
2325         self.mk_const(ty::Const { val: ty::ConstKind::Infer(InferConst::Var(v)), ty })
2326     }
2327
2328     #[inline]
2329     pub fn mk_int_var(self, v: IntVid) -> Ty<'tcx> {
2330         self.mk_ty_infer(IntVar(v))
2331     }
2332
2333     #[inline]
2334     pub fn mk_float_var(self, v: FloatVid) -> Ty<'tcx> {
2335         self.mk_ty_infer(FloatVar(v))
2336     }
2337
2338     #[inline]
2339     pub fn mk_ty_infer(self, it: InferTy) -> Ty<'tcx> {
2340         self.mk_ty(Infer(it))
2341     }
2342
2343     #[inline]
2344     pub fn mk_const_infer(self, ic: InferConst<'tcx>, ty: Ty<'tcx>) -> &'tcx ty::Const<'tcx> {
2345         self.mk_const(ty::Const { val: ty::ConstKind::Infer(ic), ty })
2346     }
2347
2348     #[inline]
2349     pub fn mk_ty_param(self, index: u32, name: Symbol) -> Ty<'tcx> {
2350         self.mk_ty(Param(ParamTy { index, name }))
2351     }
2352
2353     #[inline]
2354     pub fn mk_const_param(self, index: u32, name: Symbol, ty: Ty<'tcx>) -> &'tcx Const<'tcx> {
2355         self.mk_const(ty::Const { val: ty::ConstKind::Param(ParamConst { index, name }), ty })
2356     }
2357
2358     pub fn mk_param_from_def(self, param: &ty::GenericParamDef) -> GenericArg<'tcx> {
2359         match param.kind {
2360             GenericParamDefKind::Lifetime => {
2361                 self.mk_region(ty::ReEarlyBound(param.to_early_bound_region_data())).into()
2362             }
2363             GenericParamDefKind::Type { .. } => self.mk_ty_param(param.index, param.name).into(),
2364             GenericParamDefKind::Const => {
2365                 self.mk_const_param(param.index, param.name, self.type_of(param.def_id)).into()
2366             }
2367         }
2368     }
2369
2370     #[inline]
2371     pub fn mk_opaque(self, def_id: DefId, substs: SubstsRef<'tcx>) -> Ty<'tcx> {
2372         self.mk_ty(Opaque(def_id, substs))
2373     }
2374
2375     pub fn mk_place_field(self, place: Place<'tcx>, f: Field, ty: Ty<'tcx>) -> Place<'tcx> {
2376         self.mk_place_elem(place, PlaceElem::Field(f, ty))
2377     }
2378
2379     pub fn mk_place_deref(self, place: Place<'tcx>) -> Place<'tcx> {
2380         self.mk_place_elem(place, PlaceElem::Deref)
2381     }
2382
2383     pub fn mk_place_downcast(
2384         self,
2385         place: Place<'tcx>,
2386         adt_def: &'tcx AdtDef,
2387         variant_index: VariantIdx,
2388     ) -> Place<'tcx> {
2389         self.mk_place_elem(
2390             place,
2391             PlaceElem::Downcast(Some(adt_def.variants[variant_index].ident.name), variant_index),
2392         )
2393     }
2394
2395     pub fn mk_place_downcast_unnamed(
2396         self,
2397         place: Place<'tcx>,
2398         variant_index: VariantIdx,
2399     ) -> Place<'tcx> {
2400         self.mk_place_elem(place, PlaceElem::Downcast(None, variant_index))
2401     }
2402
2403     pub fn mk_place_index(self, place: Place<'tcx>, index: Local) -> Place<'tcx> {
2404         self.mk_place_elem(place, PlaceElem::Index(index))
2405     }
2406
2407     /// This method copies `Place`'s projection, add an element and reintern it. Should not be used
2408     /// to build a full `Place` it's just a convenient way to grab a projection and modify it in
2409     /// flight.
2410     pub fn mk_place_elem(self, place: Place<'tcx>, elem: PlaceElem<'tcx>) -> Place<'tcx> {
2411         let mut projection = place.projection.to_vec();
2412         projection.push(elem);
2413
2414         Place { local: place.local, projection: self.intern_place_elems(&projection) }
2415     }
2416
2417     pub fn intern_existential_predicates(
2418         self,
2419         eps: &[ExistentialPredicate<'tcx>],
2420     ) -> &'tcx List<ExistentialPredicate<'tcx>> {
2421         assert!(!eps.is_empty());
2422         assert!(eps.windows(2).all(|w| w[0].stable_cmp(self, &w[1]) != Ordering::Greater));
2423         self._intern_existential_predicates(eps)
2424     }
2425
2426     pub fn intern_predicates(self, preds: &[Predicate<'tcx>]) -> &'tcx List<Predicate<'tcx>> {
2427         // FIXME consider asking the input slice to be sorted to avoid
2428         // re-interning permutations, in which case that would be asserted
2429         // here.
2430         if preds.is_empty() {
2431             // The macro-generated method below asserts we don't intern an empty slice.
2432             List::empty()
2433         } else {
2434             self._intern_predicates(preds)
2435         }
2436     }
2437
2438     pub fn intern_type_list(self, ts: &[Ty<'tcx>]) -> &'tcx List<Ty<'tcx>> {
2439         if ts.is_empty() { List::empty() } else { self._intern_type_list(ts) }
2440     }
2441
2442     pub fn intern_substs(self, ts: &[GenericArg<'tcx>]) -> &'tcx List<GenericArg<'tcx>> {
2443         if ts.is_empty() { List::empty() } else { self._intern_substs(ts) }
2444     }
2445
2446     pub fn intern_projs(self, ps: &[ProjectionKind]) -> &'tcx List<ProjectionKind> {
2447         if ps.is_empty() { List::empty() } else { self._intern_projs(ps) }
2448     }
2449
2450     pub fn intern_place_elems(self, ts: &[PlaceElem<'tcx>]) -> &'tcx List<PlaceElem<'tcx>> {
2451         if ts.is_empty() { List::empty() } else { self._intern_place_elems(ts) }
2452     }
2453
2454     pub fn intern_canonical_var_infos(self, ts: &[CanonicalVarInfo]) -> CanonicalVarInfos<'tcx> {
2455         if ts.is_empty() { List::empty() } else { self._intern_canonical_var_infos(ts) }
2456     }
2457
2458     pub fn mk_fn_sig<I>(
2459         self,
2460         inputs: I,
2461         output: I::Item,
2462         c_variadic: bool,
2463         unsafety: hir::Unsafety,
2464         abi: abi::Abi,
2465     ) -> <I::Item as InternIteratorElement<Ty<'tcx>, ty::FnSig<'tcx>>>::Output
2466     where
2467         I: Iterator<Item: InternIteratorElement<Ty<'tcx>, ty::FnSig<'tcx>>>,
2468     {
2469         inputs.chain(iter::once(output)).intern_with(|xs| ty::FnSig {
2470             inputs_and_output: self.intern_type_list(xs),
2471             c_variadic,
2472             unsafety,
2473             abi,
2474         })
2475     }
2476
2477     pub fn mk_existential_predicates<
2478         I: InternAs<[ExistentialPredicate<'tcx>], &'tcx List<ExistentialPredicate<'tcx>>>,
2479     >(
2480         self,
2481         iter: I,
2482     ) -> I::Output {
2483         iter.intern_with(|xs| self.intern_existential_predicates(xs))
2484     }
2485
2486     pub fn mk_predicates<I: InternAs<[Predicate<'tcx>], &'tcx List<Predicate<'tcx>>>>(
2487         self,
2488         iter: I,
2489     ) -> I::Output {
2490         iter.intern_with(|xs| self.intern_predicates(xs))
2491     }
2492
2493     pub fn mk_type_list<I: InternAs<[Ty<'tcx>], &'tcx List<Ty<'tcx>>>>(self, iter: I) -> I::Output {
2494         iter.intern_with(|xs| self.intern_type_list(xs))
2495     }
2496
2497     pub fn mk_substs<I: InternAs<[GenericArg<'tcx>], &'tcx List<GenericArg<'tcx>>>>(
2498         self,
2499         iter: I,
2500     ) -> I::Output {
2501         iter.intern_with(|xs| self.intern_substs(xs))
2502     }
2503
2504     pub fn mk_place_elems<I: InternAs<[PlaceElem<'tcx>], &'tcx List<PlaceElem<'tcx>>>>(
2505         self,
2506         iter: I,
2507     ) -> I::Output {
2508         iter.intern_with(|xs| self.intern_place_elems(xs))
2509     }
2510
2511     pub fn mk_substs_trait(self, self_ty: Ty<'tcx>, rest: &[GenericArg<'tcx>]) -> SubstsRef<'tcx> {
2512         self.mk_substs(iter::once(self_ty.into()).chain(rest.iter().cloned()))
2513     }
2514
2515     /// Walks upwards from `id` to find a node which might change lint levels with attributes.
2516     /// It stops at `bound` and just returns it if reached.
2517     pub fn maybe_lint_level_root_bounded(self, mut id: HirId, bound: HirId) -> HirId {
2518         let hir = self.hir();
2519         loop {
2520             if id == bound {
2521                 return bound;
2522             }
2523
2524             if hir.attrs(id).iter().any(|attr| Level::from_symbol(attr.name_or_empty()).is_some()) {
2525                 return id;
2526             }
2527             let next = hir.get_parent_node(id);
2528             if next == id {
2529                 bug!("lint traversal reached the root of the crate");
2530             }
2531             id = next;
2532         }
2533     }
2534
2535     pub fn lint_level_at_node(
2536         self,
2537         lint: &'static Lint,
2538         mut id: hir::HirId,
2539     ) -> (Level, LintSource) {
2540         let sets = self.lint_levels(LOCAL_CRATE);
2541         loop {
2542             if let Some(pair) = sets.level_and_source(lint, id, self.sess) {
2543                 return pair;
2544             }
2545             let next = self.hir().get_parent_node(id);
2546             if next == id {
2547                 bug!("lint traversal reached the root of the crate");
2548             }
2549             id = next;
2550         }
2551     }
2552
2553     pub fn struct_span_lint_hir(
2554         self,
2555         lint: &'static Lint,
2556         hir_id: HirId,
2557         span: impl Into<MultiSpan>,
2558         decorate: impl for<'a> FnOnce(LintDiagnosticBuilder<'a>),
2559     ) {
2560         let (level, src) = self.lint_level_at_node(lint, hir_id);
2561         struct_lint_level(self.sess, lint, level, src, Some(span.into()), decorate);
2562     }
2563
2564     pub fn struct_lint_node(
2565         self,
2566         lint: &'static Lint,
2567         id: HirId,
2568         decorate: impl for<'a> FnOnce(LintDiagnosticBuilder<'a>),
2569     ) {
2570         let (level, src) = self.lint_level_at_node(lint, id);
2571         struct_lint_level(self.sess, lint, level, src, None, decorate);
2572     }
2573
2574     pub fn in_scope_traits(self, id: HirId) -> Option<&'tcx StableVec<TraitCandidate>> {
2575         self.in_scope_traits_map(id.owner).and_then(|map| map.get(&id.local_id))
2576     }
2577
2578     pub fn named_region(self, id: HirId) -> Option<resolve_lifetime::Region> {
2579         self.named_region_map(id.owner).and_then(|map| map.get(&id.local_id).cloned())
2580     }
2581
2582     pub fn is_late_bound(self, id: HirId) -> bool {
2583         self.is_late_bound_map(id.owner).map(|set| set.contains(&id.local_id)).unwrap_or(false)
2584     }
2585
2586     pub fn object_lifetime_defaults(self, id: HirId) -> Option<&'tcx [ObjectLifetimeDefault]> {
2587         self.object_lifetime_defaults_map(id.owner)
2588             .and_then(|map| map.get(&id.local_id).map(|v| &**v))
2589     }
2590 }
2591
2592 impl TyCtxtAt<'tcx> {
2593     /// Constructs a `TyKind::Error` type and registers a `delay_span_bug` to ensure it gets used.
2594     #[track_caller]
2595     pub fn ty_error(self) -> Ty<'tcx> {
2596         self.tcx.ty_error_with_message(self.span, "TyKind::Error constructed but no error reported")
2597     }
2598
2599     /// Constructs a `TyKind::Error` type and registers a `delay_span_bug` with the given `msg to
2600     /// ensure it gets used.
2601     #[track_caller]
2602     pub fn ty_error_with_message(self, msg: &str) -> Ty<'tcx> {
2603         self.tcx.ty_error_with_message(self.span, msg)
2604     }
2605 }
2606
2607 pub trait InternAs<T: ?Sized, R> {
2608     type Output;
2609     fn intern_with<F>(self, f: F) -> Self::Output
2610     where
2611         F: FnOnce(&T) -> R;
2612 }
2613
2614 impl<I, T, R, E> InternAs<[T], R> for I
2615 where
2616     E: InternIteratorElement<T, R>,
2617     I: Iterator<Item = E>,
2618 {
2619     type Output = E::Output;
2620     fn intern_with<F>(self, f: F) -> Self::Output
2621     where
2622         F: FnOnce(&[T]) -> R,
2623     {
2624         E::intern_with(self, f)
2625     }
2626 }
2627
2628 pub trait InternIteratorElement<T, R>: Sized {
2629     type Output;
2630     fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output;
2631 }
2632
2633 impl<T, R> InternIteratorElement<T, R> for T {
2634     type Output = R;
2635     fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output {
2636         f(&iter.collect::<SmallVec<[_; 8]>>())
2637     }
2638 }
2639
2640 impl<'a, T, R> InternIteratorElement<T, R> for &'a T
2641 where
2642     T: Clone + 'a,
2643 {
2644     type Output = R;
2645     fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output {
2646         f(&iter.cloned().collect::<SmallVec<[_; 8]>>())
2647     }
2648 }
2649
2650 impl<T, R, E> InternIteratorElement<T, R> for Result<T, E> {
2651     type Output = Result<R, E>;
2652     fn intern_with<I: Iterator<Item = Self>, F: FnOnce(&[T]) -> R>(
2653         mut iter: I,
2654         f: F,
2655     ) -> Self::Output {
2656         // This code is hot enough that it's worth specializing for the most
2657         // common length lists, to avoid the overhead of `SmallVec` creation.
2658         // The match arms are in order of frequency. The 1, 2, and 0 cases are
2659         // typically hit in ~95% of cases. We assume that if the upper and
2660         // lower bounds from `size_hint` agree they are correct.
2661         Ok(match iter.size_hint() {
2662             (1, Some(1)) => {
2663                 let t0 = iter.next().unwrap()?;
2664                 assert!(iter.next().is_none());
2665                 f(&[t0])
2666             }
2667             (2, Some(2)) => {
2668                 let t0 = iter.next().unwrap()?;
2669                 let t1 = iter.next().unwrap()?;
2670                 assert!(iter.next().is_none());
2671                 f(&[t0, t1])
2672             }
2673             (0, Some(0)) => {
2674                 assert!(iter.next().is_none());
2675                 f(&[])
2676             }
2677             _ => f(&iter.collect::<Result<SmallVec<[_; 8]>, _>>()?),
2678         })
2679     }
2680 }
2681
2682 // We are comparing types with different invariant lifetimes, so `ptr::eq`
2683 // won't work for us.
2684 fn ptr_eq<T, U>(t: *const T, u: *const U) -> bool {
2685     t as *const () == u as *const ()
2686 }
2687
2688 pub fn provide(providers: &mut ty::query::Providers) {
2689     providers.in_scope_traits_map = |tcx, id| tcx.gcx.trait_map.get(&id);
2690     providers.module_exports = |tcx, id| tcx.gcx.export_map.get(&id).map(|v| &v[..]);
2691     providers.crate_name = |tcx, id| {
2692         assert_eq!(id, LOCAL_CRATE);
2693         tcx.crate_name
2694     };
2695     providers.maybe_unused_trait_import = |tcx, id| tcx.maybe_unused_trait_imports.contains(&id);
2696     providers.maybe_unused_extern_crates = |tcx, cnum| {
2697         assert_eq!(cnum, LOCAL_CRATE);
2698         &tcx.maybe_unused_extern_crates[..]
2699     };
2700     providers.names_imported_by_glob_use =
2701         |tcx, id| tcx.arena.alloc(tcx.glob_map.get(&id).cloned().unwrap_or_default());
2702
2703     providers.lookup_stability = |tcx, id| {
2704         let id = tcx.hir().local_def_id_to_hir_id(id.expect_local());
2705         tcx.stability().local_stability(id)
2706     };
2707     providers.lookup_const_stability = |tcx, id| {
2708         let id = tcx.hir().local_def_id_to_hir_id(id.expect_local());
2709         tcx.stability().local_const_stability(id)
2710     };
2711     providers.lookup_deprecation_entry = |tcx, id| {
2712         let id = tcx.hir().local_def_id_to_hir_id(id.expect_local());
2713         tcx.stability().local_deprecation_entry(id)
2714     };
2715     providers.extern_mod_stmt_cnum = |tcx, id| tcx.extern_crate_map.get(&id).cloned();
2716     providers.all_crate_nums = |tcx, cnum| {
2717         assert_eq!(cnum, LOCAL_CRATE);
2718         tcx.arena.alloc_slice(&tcx.cstore.crates_untracked())
2719     };
2720     providers.output_filenames = |tcx, cnum| {
2721         assert_eq!(cnum, LOCAL_CRATE);
2722         tcx.output_filenames.clone()
2723     };
2724     providers.features_query = |tcx, cnum| {
2725         assert_eq!(cnum, LOCAL_CRATE);
2726         tcx.sess.features_untracked()
2727     };
2728     providers.is_panic_runtime = |tcx, cnum| {
2729         assert_eq!(cnum, LOCAL_CRATE);
2730         tcx.sess.contains_name(tcx.hir().krate_attrs(), sym::panic_runtime)
2731     };
2732     providers.is_compiler_builtins = |tcx, cnum| {
2733         assert_eq!(cnum, LOCAL_CRATE);
2734         tcx.sess.contains_name(tcx.hir().krate_attrs(), sym::compiler_builtins)
2735     };
2736     providers.has_panic_handler = |tcx, cnum| {
2737         assert_eq!(cnum, LOCAL_CRATE);
2738         // We want to check if the panic handler was defined in this crate
2739         tcx.lang_items().panic_impl().map_or(false, |did| did.is_local())
2740     };
2741 }