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