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