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