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