]> git.lizzy.rs Git - rust.git/blob - src/librustc/ty/context.rs
Auto merge of #49836 - nikomatsakis:nll-facts-prep, r=pnkfelix
[rust.git] / src / librustc / ty / context.rs
1 // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 //! type context book-keeping
12
13 use dep_graph::DepGraph;
14 use dep_graph::{DepNode, DepConstructor};
15 use errors::DiagnosticBuilder;
16 use session::Session;
17 use session::config::{BorrowckMode, OutputFilenames, OptLevel};
18 use session::config::CrateType::*;
19 use middle;
20 use hir::{TraitCandidate, HirId, ItemLocalId};
21 use hir::def::{Def, Export};
22 use hir::def_id::{CrateNum, DefId, DefIndex, LOCAL_CRATE};
23 use hir::map as hir_map;
24 use hir::map::DefPathHash;
25 use lint::{self, Lint};
26 use ich::{StableHashingContext, NodeIdHashingMode};
27 use infer::canonical::{CanonicalVarInfo, CanonicalVarInfos};
28 use infer::outlives::free_region_map::FreeRegionMap;
29 use middle::const_val::ConstVal;
30 use middle::cstore::{CrateStore, LinkMeta};
31 use middle::cstore::EncodedMetadata;
32 use middle::lang_items;
33 use middle::resolve_lifetime::{self, ObjectLifetimeDefault};
34 use middle::stability;
35 use mir::{self, Mir, interpret};
36 use mir::interpret::{Value, PrimVal};
37 use ty::subst::{Kind, Substs};
38 use ty::ReprOptions;
39 use ty::Instance;
40 use traits;
41 use traits::{Clause, Goal};
42 use ty::{self, Ty, TypeAndMut};
43 use ty::{TyS, TypeVariants, Slice};
44 use ty::{AdtKind, AdtDef, ClosureSubsts, GeneratorInterior, Region, Const};
45 use ty::{PolyFnSig, InferTy, ParamTy, ProjectionTy, ExistentialPredicate, Predicate};
46 use ty::RegionKind;
47 use ty::{TyVar, TyVid, IntVar, IntVid, FloatVar, FloatVid};
48 use ty::TypeVariants::*;
49 use ty::layout::{LayoutDetails, TargetDataLayout};
50 use ty::maps;
51 use ty::steal::Steal;
52 use ty::BindingMode;
53 use ty::CanonicalTy;
54 use util::nodemap::{DefIdSet, ItemLocalMap};
55 use util::nodemap::{FxHashMap, FxHashSet};
56 use rustc_data_structures::accumulate_vec::AccumulateVec;
57 use rustc_data_structures::stable_hasher::{HashStable, hash_stable_hashmap,
58                                            StableHasher, StableHasherResult,
59                                            StableVec};
60 use arena::{TypedArena, SyncDroplessArena};
61 use rustc_data_structures::indexed_vec::IndexVec;
62 use rustc_data_structures::sync::{Lrc, Lock};
63 use std::any::Any;
64 use std::borrow::Borrow;
65 use std::cmp::Ordering;
66 use std::collections::hash_map::{self, Entry};
67 use std::hash::{Hash, Hasher};
68 use std::mem;
69 use std::ops::Deref;
70 use std::iter;
71 use std::sync::mpsc;
72 use std::sync::Arc;
73 use syntax::abi;
74 use syntax::ast::{self, NodeId};
75 use syntax::attr;
76 use syntax::codemap::MultiSpan;
77 use syntax::feature_gate;
78 use syntax::symbol::{Symbol, keywords, InternedString};
79 use syntax_pos::Span;
80
81 use hir;
82
83 pub struct AllArenas<'tcx> {
84     pub global: GlobalArenas<'tcx>,
85     pub interner: SyncDroplessArena,
86 }
87
88 impl<'tcx> AllArenas<'tcx> {
89     pub fn new() -> Self {
90         AllArenas {
91             global: GlobalArenas::new(),
92             interner: SyncDroplessArena::new(),
93         }
94     }
95 }
96
97 /// Internal storage
98 pub struct GlobalArenas<'tcx> {
99     // internings
100     layout: TypedArena<LayoutDetails>,
101
102     // references
103     generics: TypedArena<ty::Generics>,
104     trait_def: TypedArena<ty::TraitDef>,
105     adt_def: TypedArena<ty::AdtDef>,
106     steal_mir: TypedArena<Steal<Mir<'tcx>>>,
107     mir: TypedArena<Mir<'tcx>>,
108     tables: TypedArena<ty::TypeckTables<'tcx>>,
109     /// miri allocations
110     const_allocs: TypedArena<interpret::Allocation>,
111 }
112
113 impl<'tcx> GlobalArenas<'tcx> {
114     pub fn new() -> GlobalArenas<'tcx> {
115         GlobalArenas {
116             layout: TypedArena::new(),
117             generics: TypedArena::new(),
118             trait_def: TypedArena::new(),
119             adt_def: TypedArena::new(),
120             steal_mir: TypedArena::new(),
121             mir: TypedArena::new(),
122             tables: TypedArena::new(),
123             const_allocs: TypedArena::new(),
124         }
125     }
126 }
127
128 type InternedSet<'tcx, T> = Lock<FxHashSet<Interned<'tcx, T>>>;
129
130 pub struct CtxtInterners<'tcx> {
131     /// The arena that types, regions, etc are allocated from
132     arena: &'tcx SyncDroplessArena,
133
134     /// Specifically use a speedy hash algorithm for these hash sets,
135     /// they're accessed quite often.
136     type_: InternedSet<'tcx, TyS<'tcx>>,
137     type_list: InternedSet<'tcx, Slice<Ty<'tcx>>>,
138     substs: InternedSet<'tcx, Substs<'tcx>>,
139     canonical_var_infos: InternedSet<'tcx, Slice<CanonicalVarInfo>>,
140     region: InternedSet<'tcx, RegionKind>,
141     existential_predicates: InternedSet<'tcx, Slice<ExistentialPredicate<'tcx>>>,
142     predicates: InternedSet<'tcx, Slice<Predicate<'tcx>>>,
143     const_: InternedSet<'tcx, Const<'tcx>>,
144     clauses: InternedSet<'tcx, Slice<Clause<'tcx>>>,
145     goals: InternedSet<'tcx, Slice<Goal<'tcx>>>,
146 }
147
148 impl<'gcx: 'tcx, 'tcx> CtxtInterners<'tcx> {
149     fn new(arena: &'tcx SyncDroplessArena) -> CtxtInterners<'tcx> {
150         CtxtInterners {
151             arena,
152             type_: Default::default(),
153             type_list: Default::default(),
154             substs: Default::default(),
155             region: Default::default(),
156             existential_predicates: Default::default(),
157             canonical_var_infos: Default::default(),
158             predicates: Default::default(),
159             const_: Default::default(),
160             clauses: Default::default(),
161             goals: Default::default(),
162         }
163     }
164
165     /// Intern a type. global_interners is Some only if this is
166     /// a local interner and global_interners is its counterpart.
167     fn intern_ty(&self, st: TypeVariants<'tcx>,
168                  global_interners: Option<&CtxtInterners<'gcx>>)
169                  -> Ty<'tcx> {
170         let ty = {
171             let mut interner = self.type_.borrow_mut();
172             if let Some(&Interned(ty)) = interner.get(&st) {
173                 return ty;
174             }
175             let global_interner = global_interners.map(|interners| {
176                 (interners.type_.borrow_mut(), &interners.arena)
177             });
178             if let Some((ref type_, _)) = global_interner {
179                 if let Some(&Interned(ty)) = type_.get(&st) {
180                     return ty;
181                 }
182             }
183
184             let flags = super::flags::FlagComputation::for_sty(&st);
185             let ty_struct = TyS {
186                 sty: st,
187                 flags: flags.flags,
188                 region_depth: flags.depth,
189             };
190
191             // HACK(eddyb) Depend on flags being accurate to
192             // determine that all contents are in the global tcx.
193             // See comments on Lift for why we can't use that.
194             if !flags.flags.intersects(ty::TypeFlags::KEEP_IN_LOCAL_TCX) {
195                 if let Some((mut type_, arena)) = global_interner {
196                     let ty_struct: TyS<'gcx> = unsafe {
197                         mem::transmute(ty_struct)
198                     };
199                     let ty: Ty<'gcx> = arena.alloc(ty_struct);
200                     type_.insert(Interned(ty));
201                     return ty;
202                 }
203             } else {
204                 // Make sure we don't end up with inference
205                 // types/regions in the global tcx.
206                 if global_interner.is_none() {
207                     drop(interner);
208                     bug!("Attempted to intern `{:?}` which contains \
209                           inference types/regions in the global type context",
210                          &ty_struct);
211                 }
212             }
213
214             // Don't be &mut TyS.
215             let ty: Ty<'tcx> = self.arena.alloc(ty_struct);
216             interner.insert(Interned(ty));
217             ty
218         };
219
220         debug!("Interned type: {:?} Pointer: {:?}",
221             ty, ty as *const TyS);
222         ty
223     }
224
225 }
226
227 pub struct CommonTypes<'tcx> {
228     pub bool: Ty<'tcx>,
229     pub char: Ty<'tcx>,
230     pub isize: Ty<'tcx>,
231     pub i8: Ty<'tcx>,
232     pub i16: Ty<'tcx>,
233     pub i32: Ty<'tcx>,
234     pub i64: Ty<'tcx>,
235     pub i128: Ty<'tcx>,
236     pub usize: Ty<'tcx>,
237     pub u8: Ty<'tcx>,
238     pub u16: Ty<'tcx>,
239     pub u32: Ty<'tcx>,
240     pub u64: Ty<'tcx>,
241     pub u128: Ty<'tcx>,
242     pub f32: Ty<'tcx>,
243     pub f64: Ty<'tcx>,
244     pub never: Ty<'tcx>,
245     pub err: Ty<'tcx>,
246
247     pub re_empty: Region<'tcx>,
248     pub re_static: Region<'tcx>,
249     pub re_erased: Region<'tcx>,
250 }
251
252 pub struct LocalTableInContext<'a, V: 'a> {
253     local_id_root: Option<DefId>,
254     data: &'a ItemLocalMap<V>
255 }
256
257 /// Validate that the given HirId (respectively its `local_id` part) can be
258 /// safely used as a key in the tables of a TypeckTable. For that to be
259 /// the case, the HirId must have the same `owner` as all the other IDs in
260 /// this table (signified by `local_id_root`). Otherwise the HirId
261 /// would be in a different frame of reference and using its `local_id`
262 /// would result in lookup errors, or worse, in silently wrong data being
263 /// stored/returned.
264 fn validate_hir_id_for_typeck_tables(local_id_root: Option<DefId>,
265                                      hir_id: hir::HirId,
266                                      mut_access: bool) {
267     if cfg!(debug_assertions) {
268         if let Some(local_id_root) = local_id_root {
269             if hir_id.owner != local_id_root.index {
270                 ty::tls::with(|tcx| {
271                     let node_id = tcx.hir
272                                      .definitions()
273                                      .find_node_for_hir_id(hir_id);
274
275                     bug!("node {} with HirId::owner {:?} cannot be placed in \
276                           TypeckTables with local_id_root {:?}",
277                           tcx.hir.node_to_string(node_id),
278                           DefId::local(hir_id.owner),
279                           local_id_root)
280                 });
281             }
282         } else {
283             // We use "Null Object" TypeckTables in some of the analysis passes.
284             // These are just expected to be empty and their `local_id_root` is
285             // `None`. Therefore we cannot verify whether a given `HirId` would
286             // be a valid key for the given table. Instead we make sure that
287             // nobody tries to write to such a Null Object table.
288             if mut_access {
289                 bug!("access to invalid TypeckTables")
290             }
291         }
292     }
293 }
294
295 impl<'a, V> LocalTableInContext<'a, V> {
296     pub fn contains_key(&self, id: hir::HirId) -> bool {
297         validate_hir_id_for_typeck_tables(self.local_id_root, id, false);
298         self.data.contains_key(&id.local_id)
299     }
300
301     pub fn get(&self, id: hir::HirId) -> Option<&V> {
302         validate_hir_id_for_typeck_tables(self.local_id_root, id, false);
303         self.data.get(&id.local_id)
304     }
305
306     pub fn iter(&self) -> hash_map::Iter<hir::ItemLocalId, V> {
307         self.data.iter()
308     }
309 }
310
311 impl<'a, V> ::std::ops::Index<hir::HirId> for LocalTableInContext<'a, V> {
312     type Output = V;
313
314     fn index(&self, key: hir::HirId) -> &V {
315         self.get(key).expect("LocalTableInContext: key not found")
316     }
317 }
318
319 pub struct LocalTableInContextMut<'a, V: 'a> {
320     local_id_root: Option<DefId>,
321     data: &'a mut ItemLocalMap<V>
322 }
323
324 impl<'a, V> LocalTableInContextMut<'a, V> {
325     pub fn get_mut(&mut self, id: hir::HirId) -> Option<&mut V> {
326         validate_hir_id_for_typeck_tables(self.local_id_root, id, true);
327         self.data.get_mut(&id.local_id)
328     }
329
330     pub fn entry(&mut self, id: hir::HirId) -> Entry<hir::ItemLocalId, V> {
331         validate_hir_id_for_typeck_tables(self.local_id_root, id, true);
332         self.data.entry(id.local_id)
333     }
334
335     pub fn insert(&mut self, id: hir::HirId, val: V) -> Option<V> {
336         validate_hir_id_for_typeck_tables(self.local_id_root, id, true);
337         self.data.insert(id.local_id, val)
338     }
339
340     pub fn remove(&mut self, id: hir::HirId) -> Option<V> {
341         validate_hir_id_for_typeck_tables(self.local_id_root, id, true);
342         self.data.remove(&id.local_id)
343     }
344 }
345
346 #[derive(RustcEncodable, RustcDecodable, Debug)]
347 pub struct TypeckTables<'tcx> {
348     /// The HirId::owner all ItemLocalIds in this table are relative to.
349     pub local_id_root: Option<DefId>,
350
351     /// Resolved definitions for `<T>::X` associated paths and
352     /// method calls, including those of overloaded operators.
353     type_dependent_defs: ItemLocalMap<Def>,
354
355     /// Resolved field indices for field accesses in expressions (`S { field }`, `obj.field`)
356     /// or patterns (`S { field }`). The index is often useful by itself, but to learn more
357     /// about the field you also need definition of the variant to which the field
358     /// belongs, but it may not exist if it's a tuple field (`tuple.0`).
359     field_indices: ItemLocalMap<usize>,
360
361     /// Stores the canonicalized types provided by the user. See also `UserAssertTy` statement in
362     /// MIR.
363     user_provided_tys: ItemLocalMap<CanonicalTy<'tcx>>,
364
365     /// Stores the types for various nodes in the AST.  Note that this table
366     /// is not guaranteed to be populated until after typeck.  See
367     /// typeck::check::fn_ctxt for details.
368     node_types: ItemLocalMap<Ty<'tcx>>,
369
370     /// Stores the type parameters which were substituted to obtain the type
371     /// of this node.  This only applies to nodes that refer to entities
372     /// parameterized by type parameters, such as generic fns, types, or
373     /// other items.
374     node_substs: ItemLocalMap<&'tcx Substs<'tcx>>,
375
376     adjustments: ItemLocalMap<Vec<ty::adjustment::Adjustment<'tcx>>>,
377
378     /// Stores the actual binding mode for all instances of hir::BindingAnnotation.
379     pat_binding_modes: ItemLocalMap<BindingMode>,
380
381     /// Stores the types which were implicitly dereferenced in pattern binding modes
382     /// for later usage in HAIR lowering. For example,
383     ///
384     /// ```
385     /// match &&Some(5i32) {
386     ///     Some(n) => {},
387     ///     _ => {},
388     /// }
389     /// ```
390     /// leads to a `vec![&&Option<i32>, &Option<i32>]`. Empty vectors are not stored.
391     ///
392     /// See:
393     /// https://github.com/rust-lang/rfcs/blob/master/text/2005-match-ergonomics.md#definitions
394     pat_adjustments: ItemLocalMap<Vec<Ty<'tcx>>>,
395
396     /// Borrows
397     pub upvar_capture_map: ty::UpvarCaptureMap<'tcx>,
398
399     /// Records the reasons that we picked the kind of each closure;
400     /// not all closures are present in the map.
401     closure_kind_origins: ItemLocalMap<(Span, ast::Name)>,
402
403     /// For each fn, records the "liberated" types of its arguments
404     /// and return type. Liberated means that all bound regions
405     /// (including late-bound regions) are replaced with free
406     /// equivalents. This table is not used in trans (since regions
407     /// are erased there) and hence is not serialized to metadata.
408     liberated_fn_sigs: ItemLocalMap<ty::FnSig<'tcx>>,
409
410     /// For each FRU expression, record the normalized types of the fields
411     /// of the struct - this is needed because it is non-trivial to
412     /// normalize while preserving regions. This table is used only in
413     /// MIR construction and hence is not serialized to metadata.
414     fru_field_types: ItemLocalMap<Vec<Ty<'tcx>>>,
415
416     /// Maps a cast expression to its kind. This is keyed on the
417     /// *from* expression of the cast, not the cast itself.
418     cast_kinds: ItemLocalMap<ty::cast::CastKind>,
419
420     /// Set of trait imports actually used in the method resolution.
421     /// This is used for warning unused imports. During type
422     /// checking, this `Lrc` should not be cloned: it must have a ref-count
423     /// of 1 so that we can insert things into the set mutably.
424     pub used_trait_imports: Lrc<DefIdSet>,
425
426     /// If any errors occurred while type-checking this body,
427     /// this field will be set to `true`.
428     pub tainted_by_errors: bool,
429
430     /// Stores the free-region relationships that were deduced from
431     /// its where clauses and parameter types. These are then
432     /// read-again by borrowck.
433     pub free_region_map: FreeRegionMap<'tcx>,
434 }
435
436 impl<'tcx> TypeckTables<'tcx> {
437     pub fn empty(local_id_root: Option<DefId>) -> TypeckTables<'tcx> {
438         TypeckTables {
439             local_id_root,
440             type_dependent_defs: ItemLocalMap(),
441             field_indices: ItemLocalMap(),
442             user_provided_tys: ItemLocalMap(),
443             node_types: ItemLocalMap(),
444             node_substs: ItemLocalMap(),
445             adjustments: ItemLocalMap(),
446             pat_binding_modes: ItemLocalMap(),
447             pat_adjustments: ItemLocalMap(),
448             upvar_capture_map: FxHashMap(),
449             closure_kind_origins: ItemLocalMap(),
450             liberated_fn_sigs: ItemLocalMap(),
451             fru_field_types: ItemLocalMap(),
452             cast_kinds: ItemLocalMap(),
453             used_trait_imports: Lrc::new(DefIdSet()),
454             tainted_by_errors: false,
455             free_region_map: FreeRegionMap::new(),
456         }
457     }
458
459     /// Returns the final resolution of a `QPath` in an `Expr` or `Pat` node.
460     pub fn qpath_def(&self, qpath: &hir::QPath, id: hir::HirId) -> Def {
461         match *qpath {
462             hir::QPath::Resolved(_, ref path) => path.def,
463             hir::QPath::TypeRelative(..) => {
464                 validate_hir_id_for_typeck_tables(self.local_id_root, id, false);
465                 self.type_dependent_defs.get(&id.local_id).cloned().unwrap_or(Def::Err)
466             }
467         }
468     }
469
470     pub fn type_dependent_defs(&self) -> LocalTableInContext<Def> {
471         LocalTableInContext {
472             local_id_root: self.local_id_root,
473             data: &self.type_dependent_defs
474         }
475     }
476
477     pub fn type_dependent_defs_mut(&mut self) -> LocalTableInContextMut<Def> {
478         LocalTableInContextMut {
479             local_id_root: self.local_id_root,
480             data: &mut self.type_dependent_defs
481         }
482     }
483
484     pub fn field_indices(&self) -> LocalTableInContext<usize> {
485         LocalTableInContext {
486             local_id_root: self.local_id_root,
487             data: &self.field_indices
488         }
489     }
490
491     pub fn field_indices_mut(&mut self) -> LocalTableInContextMut<usize> {
492         LocalTableInContextMut {
493             local_id_root: self.local_id_root,
494             data: &mut self.field_indices
495         }
496     }
497
498     pub fn user_provided_tys(&self) -> LocalTableInContext<CanonicalTy<'tcx>> {
499         LocalTableInContext {
500             local_id_root: self.local_id_root,
501             data: &self.user_provided_tys
502         }
503     }
504
505     pub fn user_provided_tys_mut(&mut self) -> LocalTableInContextMut<CanonicalTy<'tcx>> {
506         LocalTableInContextMut {
507             local_id_root: self.local_id_root,
508             data: &mut self.user_provided_tys
509         }
510     }
511
512     pub fn node_types(&self) -> LocalTableInContext<Ty<'tcx>> {
513         LocalTableInContext {
514             local_id_root: self.local_id_root,
515             data: &self.node_types
516         }
517     }
518
519     pub fn node_types_mut(&mut self) -> LocalTableInContextMut<Ty<'tcx>> {
520         LocalTableInContextMut {
521             local_id_root: self.local_id_root,
522             data: &mut self.node_types
523         }
524     }
525
526     pub fn node_id_to_type(&self, id: hir::HirId) -> Ty<'tcx> {
527         match self.node_id_to_type_opt(id) {
528             Some(ty) => ty,
529             None => {
530                 bug!("node_id_to_type: no type for node `{}`",
531                     tls::with(|tcx| {
532                         let id = tcx.hir.definitions().find_node_for_hir_id(id);
533                         tcx.hir.node_to_string(id)
534                     }))
535             }
536         }
537     }
538
539     pub fn node_id_to_type_opt(&self, id: hir::HirId) -> Option<Ty<'tcx>> {
540         validate_hir_id_for_typeck_tables(self.local_id_root, id, false);
541         self.node_types.get(&id.local_id).cloned()
542     }
543
544     pub fn node_substs_mut(&mut self) -> LocalTableInContextMut<&'tcx Substs<'tcx>> {
545         LocalTableInContextMut {
546             local_id_root: self.local_id_root,
547             data: &mut self.node_substs
548         }
549     }
550
551     pub fn node_substs(&self, id: hir::HirId) -> &'tcx Substs<'tcx> {
552         validate_hir_id_for_typeck_tables(self.local_id_root, id, false);
553         self.node_substs.get(&id.local_id).cloned().unwrap_or(Substs::empty())
554     }
555
556     pub fn node_substs_opt(&self, id: hir::HirId) -> Option<&'tcx Substs<'tcx>> {
557         validate_hir_id_for_typeck_tables(self.local_id_root, id, false);
558         self.node_substs.get(&id.local_id).cloned()
559     }
560
561     // Returns the type of a pattern as a monotype. Like @expr_ty, this function
562     // doesn't provide type parameter substitutions.
563     pub fn pat_ty(&self, pat: &hir::Pat) -> Ty<'tcx> {
564         self.node_id_to_type(pat.hir_id)
565     }
566
567     pub fn pat_ty_opt(&self, pat: &hir::Pat) -> Option<Ty<'tcx>> {
568         self.node_id_to_type_opt(pat.hir_id)
569     }
570
571     // Returns the type of an expression as a monotype.
572     //
573     // NB (1): This is the PRE-ADJUSTMENT TYPE for the expression.  That is, in
574     // some cases, we insert `Adjustment` annotations such as auto-deref or
575     // auto-ref.  The type returned by this function does not consider such
576     // adjustments.  See `expr_ty_adjusted()` instead.
577     //
578     // NB (2): This type doesn't provide type parameter substitutions; e.g. if you
579     // ask for the type of "id" in "id(3)", it will return "fn(&isize) -> isize"
580     // instead of "fn(ty) -> T with T = isize".
581     pub fn expr_ty(&self, expr: &hir::Expr) -> Ty<'tcx> {
582         self.node_id_to_type(expr.hir_id)
583     }
584
585     pub fn expr_ty_opt(&self, expr: &hir::Expr) -> Option<Ty<'tcx>> {
586         self.node_id_to_type_opt(expr.hir_id)
587     }
588
589     pub fn adjustments(&self) -> LocalTableInContext<Vec<ty::adjustment::Adjustment<'tcx>>> {
590         LocalTableInContext {
591             local_id_root: self.local_id_root,
592             data: &self.adjustments
593         }
594     }
595
596     pub fn adjustments_mut(&mut self)
597                            -> LocalTableInContextMut<Vec<ty::adjustment::Adjustment<'tcx>>> {
598         LocalTableInContextMut {
599             local_id_root: self.local_id_root,
600             data: &mut self.adjustments
601         }
602     }
603
604     pub fn expr_adjustments(&self, expr: &hir::Expr)
605                             -> &[ty::adjustment::Adjustment<'tcx>] {
606         validate_hir_id_for_typeck_tables(self.local_id_root, expr.hir_id, false);
607         self.adjustments.get(&expr.hir_id.local_id).map_or(&[], |a| &a[..])
608     }
609
610     /// Returns the type of `expr`, considering any `Adjustment`
611     /// entry recorded for that expression.
612     pub fn expr_ty_adjusted(&self, expr: &hir::Expr) -> Ty<'tcx> {
613         self.expr_adjustments(expr)
614             .last()
615             .map_or_else(|| self.expr_ty(expr), |adj| adj.target)
616     }
617
618     pub fn expr_ty_adjusted_opt(&self, expr: &hir::Expr) -> Option<Ty<'tcx>> {
619         self.expr_adjustments(expr)
620             .last()
621             .map(|adj| adj.target)
622             .or_else(|| self.expr_ty_opt(expr))
623     }
624
625     pub fn is_method_call(&self, expr: &hir::Expr) -> bool {
626         // Only paths and method calls/overloaded operators have
627         // entries in type_dependent_defs, ignore the former here.
628         if let hir::ExprPath(_) = expr.node {
629             return false;
630         }
631
632         match self.type_dependent_defs().get(expr.hir_id) {
633             Some(&Def::Method(_)) => true,
634             _ => false
635         }
636     }
637
638     pub fn pat_binding_modes(&self) -> LocalTableInContext<BindingMode> {
639         LocalTableInContext {
640             local_id_root: self.local_id_root,
641             data: &self.pat_binding_modes
642         }
643     }
644
645     pub fn pat_binding_modes_mut(&mut self)
646                            -> LocalTableInContextMut<BindingMode> {
647         LocalTableInContextMut {
648             local_id_root: self.local_id_root,
649             data: &mut self.pat_binding_modes
650         }
651     }
652
653     pub fn pat_adjustments(&self) -> LocalTableInContext<Vec<Ty<'tcx>>> {
654         LocalTableInContext {
655             local_id_root: self.local_id_root,
656             data: &self.pat_adjustments,
657         }
658     }
659
660     pub fn pat_adjustments_mut(&mut self)
661                            -> LocalTableInContextMut<Vec<Ty<'tcx>>> {
662         LocalTableInContextMut {
663             local_id_root: self.local_id_root,
664             data: &mut self.pat_adjustments,
665         }
666     }
667
668     pub fn upvar_capture(&self, upvar_id: ty::UpvarId) -> ty::UpvarCapture<'tcx> {
669         self.upvar_capture_map[&upvar_id]
670     }
671
672     pub fn closure_kind_origins(&self) -> LocalTableInContext<(Span, ast::Name)> {
673         LocalTableInContext {
674             local_id_root: self.local_id_root,
675             data: &self.closure_kind_origins
676         }
677     }
678
679     pub fn closure_kind_origins_mut(&mut self) -> LocalTableInContextMut<(Span, ast::Name)> {
680         LocalTableInContextMut {
681             local_id_root: self.local_id_root,
682             data: &mut self.closure_kind_origins
683         }
684     }
685
686     pub fn liberated_fn_sigs(&self) -> LocalTableInContext<ty::FnSig<'tcx>> {
687         LocalTableInContext {
688             local_id_root: self.local_id_root,
689             data: &self.liberated_fn_sigs
690         }
691     }
692
693     pub fn liberated_fn_sigs_mut(&mut self) -> LocalTableInContextMut<ty::FnSig<'tcx>> {
694         LocalTableInContextMut {
695             local_id_root: self.local_id_root,
696             data: &mut self.liberated_fn_sigs
697         }
698     }
699
700     pub fn fru_field_types(&self) -> LocalTableInContext<Vec<Ty<'tcx>>> {
701         LocalTableInContext {
702             local_id_root: self.local_id_root,
703             data: &self.fru_field_types
704         }
705     }
706
707     pub fn fru_field_types_mut(&mut self) -> LocalTableInContextMut<Vec<Ty<'tcx>>> {
708         LocalTableInContextMut {
709             local_id_root: self.local_id_root,
710             data: &mut self.fru_field_types
711         }
712     }
713
714     pub fn cast_kinds(&self) -> LocalTableInContext<ty::cast::CastKind> {
715         LocalTableInContext {
716             local_id_root: self.local_id_root,
717             data: &self.cast_kinds
718         }
719     }
720
721     pub fn cast_kinds_mut(&mut self) -> LocalTableInContextMut<ty::cast::CastKind> {
722         LocalTableInContextMut {
723             local_id_root: self.local_id_root,
724             data: &mut self.cast_kinds
725         }
726     }
727 }
728
729 impl<'a, 'gcx> HashStable<StableHashingContext<'a>> for TypeckTables<'gcx> {
730     fn hash_stable<W: StableHasherResult>(&self,
731                                           hcx: &mut StableHashingContext<'a>,
732                                           hasher: &mut StableHasher<W>) {
733         let ty::TypeckTables {
734             local_id_root,
735             ref type_dependent_defs,
736             ref field_indices,
737             ref user_provided_tys,
738             ref node_types,
739             ref node_substs,
740             ref adjustments,
741             ref pat_binding_modes,
742             ref pat_adjustments,
743             ref upvar_capture_map,
744             ref closure_kind_origins,
745             ref liberated_fn_sigs,
746             ref fru_field_types,
747
748             ref cast_kinds,
749
750             ref used_trait_imports,
751             tainted_by_errors,
752             ref free_region_map,
753         } = *self;
754
755         hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| {
756             type_dependent_defs.hash_stable(hcx, hasher);
757             field_indices.hash_stable(hcx, hasher);
758             user_provided_tys.hash_stable(hcx, hasher);
759             node_types.hash_stable(hcx, hasher);
760             node_substs.hash_stable(hcx, hasher);
761             adjustments.hash_stable(hcx, hasher);
762             pat_binding_modes.hash_stable(hcx, hasher);
763             pat_adjustments.hash_stable(hcx, hasher);
764             hash_stable_hashmap(hcx, hasher, upvar_capture_map, |up_var_id, hcx| {
765                 let ty::UpvarId {
766                     var_id,
767                     closure_expr_id
768                 } = *up_var_id;
769
770                 let local_id_root =
771                     local_id_root.expect("trying to hash invalid TypeckTables");
772
773                 let var_owner_def_id = DefId {
774                     krate: local_id_root.krate,
775                     index: var_id.owner,
776                 };
777                 let closure_def_id = DefId {
778                     krate: local_id_root.krate,
779                     index: closure_expr_id.to_def_id().index,
780                 };
781                 (hcx.def_path_hash(var_owner_def_id),
782                  var_id.local_id,
783                  hcx.def_path_hash(closure_def_id))
784             });
785
786             closure_kind_origins.hash_stable(hcx, hasher);
787             liberated_fn_sigs.hash_stable(hcx, hasher);
788             fru_field_types.hash_stable(hcx, hasher);
789             cast_kinds.hash_stable(hcx, hasher);
790             used_trait_imports.hash_stable(hcx, hasher);
791             tainted_by_errors.hash_stable(hcx, hasher);
792             free_region_map.hash_stable(hcx, hasher);
793         })
794     }
795 }
796
797 impl<'tcx> CommonTypes<'tcx> {
798     fn new(interners: &CtxtInterners<'tcx>) -> CommonTypes<'tcx> {
799         let mk = |sty| interners.intern_ty(sty, None);
800         let mk_region = |r| {
801             if let Some(r) = interners.region.borrow().get(&r) {
802                 return r.0;
803             }
804             let r = interners.arena.alloc(r);
805             interners.region.borrow_mut().insert(Interned(r));
806             &*r
807         };
808         CommonTypes {
809             bool: mk(TyBool),
810             char: mk(TyChar),
811             never: mk(TyNever),
812             err: mk(TyError),
813             isize: mk(TyInt(ast::IntTy::Isize)),
814             i8: mk(TyInt(ast::IntTy::I8)),
815             i16: mk(TyInt(ast::IntTy::I16)),
816             i32: mk(TyInt(ast::IntTy::I32)),
817             i64: mk(TyInt(ast::IntTy::I64)),
818             i128: mk(TyInt(ast::IntTy::I128)),
819             usize: mk(TyUint(ast::UintTy::Usize)),
820             u8: mk(TyUint(ast::UintTy::U8)),
821             u16: mk(TyUint(ast::UintTy::U16)),
822             u32: mk(TyUint(ast::UintTy::U32)),
823             u64: mk(TyUint(ast::UintTy::U64)),
824             u128: mk(TyUint(ast::UintTy::U128)),
825             f32: mk(TyFloat(ast::FloatTy::F32)),
826             f64: mk(TyFloat(ast::FloatTy::F64)),
827
828             re_empty: mk_region(RegionKind::ReEmpty),
829             re_static: mk_region(RegionKind::ReStatic),
830             re_erased: mk_region(RegionKind::ReErased),
831         }
832     }
833 }
834
835 /// The central data structure of the compiler. It stores references
836 /// to the various **arenas** and also houses the results of the
837 /// various **compiler queries** that have been performed. See the
838 /// [rustc guide] for more details.
839 ///
840 /// [rustc guide]: https://rust-lang-nursery.github.io/rustc-guide/ty.html
841 #[derive(Copy, Clone)]
842 pub struct TyCtxt<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
843     gcx: &'a GlobalCtxt<'gcx>,
844     interners: &'a CtxtInterners<'tcx>
845 }
846
847 impl<'a, 'gcx, 'tcx> Deref for TyCtxt<'a, 'gcx, 'tcx> {
848     type Target = &'a GlobalCtxt<'gcx>;
849     fn deref(&self) -> &Self::Target {
850         &self.gcx
851     }
852 }
853
854 pub struct GlobalCtxt<'tcx> {
855     global_arenas: &'tcx GlobalArenas<'tcx>,
856     global_interners: CtxtInterners<'tcx>,
857
858     cstore: &'tcx dyn CrateStore,
859
860     pub sess: &'tcx Session,
861
862     pub dep_graph: DepGraph,
863
864     /// This provides access to the incr. comp. on-disk cache for query results.
865     /// Do not access this directly. It is only meant to be used by
866     /// `DepGraph::try_mark_green()` and the query infrastructure in `ty::maps`.
867     pub(crate) on_disk_query_result_cache: maps::OnDiskCache<'tcx>,
868
869     /// Common types, pre-interned for your convenience.
870     pub types: CommonTypes<'tcx>,
871
872     /// Map indicating what traits are in scope for places where this
873     /// is relevant; generated by resolve.
874     trait_map: FxHashMap<DefIndex,
875                          Lrc<FxHashMap<ItemLocalId,
876                                        Lrc<StableVec<TraitCandidate>>>>>,
877
878     /// Export map produced by name resolution.
879     export_map: FxHashMap<DefId, Lrc<Vec<Export>>>,
880
881     pub hir: hir_map::Map<'tcx>,
882
883     /// A map from DefPathHash -> DefId. Includes DefIds from the local crate
884     /// as well as all upstream crates. Only populated in incremental mode.
885     pub def_path_hash_to_def_id: Option<FxHashMap<DefPathHash, DefId>>,
886
887     pub maps: maps::Maps<'tcx>,
888
889     // Records the free variables refrenced by every closure
890     // expression. Do not track deps for this, just recompute it from
891     // scratch every time.
892     freevars: FxHashMap<DefId, Lrc<Vec<hir::Freevar>>>,
893
894     maybe_unused_trait_imports: FxHashSet<DefId>,
895
896     maybe_unused_extern_crates: Vec<(DefId, Span)>,
897
898     // Internal cache for metadata decoding. No need to track deps on this.
899     pub rcache: Lock<FxHashMap<ty::CReaderCacheKey, Ty<'tcx>>>,
900
901     /// Caches the results of trait selection. This cache is used
902     /// for things that do not have to do with the parameters in scope.
903     pub selection_cache: traits::SelectionCache<'tcx>,
904
905     /// Caches the results of trait evaluation. This cache is used
906     /// for things that do not have to do with the parameters in scope.
907     /// Merge this with `selection_cache`?
908     pub evaluation_cache: traits::EvaluationCache<'tcx>,
909
910     /// The definite name of the current crate after taking into account
911     /// attributes, commandline parameters, etc.
912     pub crate_name: Symbol,
913
914     /// Data layout specification for the current target.
915     pub data_layout: TargetDataLayout,
916
917     stability_interner: Lock<FxHashSet<&'tcx attr::Stability>>,
918
919     pub interpret_interner: InterpretInterner<'tcx>,
920
921     layout_interner: Lock<FxHashSet<&'tcx LayoutDetails>>,
922
923     /// A general purpose channel to throw data out the back towards LLVM worker
924     /// threads.
925     ///
926     /// This is intended to only get used during the trans phase of the compiler
927     /// when satisfying the query for a particular codegen unit. Internally in
928     /// the query it'll send data along this channel to get processed later.
929     pub tx_to_llvm_workers: Lock<mpsc::Sender<Box<dyn Any + Send>>>,
930
931     output_filenames: Arc<OutputFilenames>,
932 }
933
934 /// Everything needed to efficiently work with interned allocations
935 #[derive(Debug, Default)]
936 pub struct InterpretInterner<'tcx> {
937     inner: Lock<InterpretInternerInner<'tcx>>,
938 }
939
940 #[derive(Debug, Default)]
941 struct InterpretInternerInner<'tcx> {
942     /// Stores the value of constants (and deduplicates the actual memory)
943     allocs: FxHashSet<&'tcx interpret::Allocation>,
944
945     /// Allows obtaining function instance handles via a unique identifier
946     functions: FxHashMap<interpret::AllocId, Instance<'tcx>>,
947
948     /// Inverse map of `interpret_functions`.
949     /// Used so we don't allocate a new pointer every time we need one
950     function_cache: FxHashMap<Instance<'tcx>, interpret::AllocId>,
951
952     /// Allows obtaining const allocs via a unique identifier
953     alloc_by_id: FxHashMap<interpret::AllocId, &'tcx interpret::Allocation>,
954
955     /// Allows obtaining static def ids via a unique id
956     statics: FxHashMap<interpret::AllocId, DefId>,
957
958     /// The AllocId to assign to the next new regular allocation.
959     /// Always incremented, never gets smaller.
960     next_id: interpret::AllocId,
961
962     /// Inverse map of `statics`
963     /// Used so we don't allocate a new pointer every time we need one
964     static_cache: FxHashMap<DefId, interpret::AllocId>,
965
966     /// A cache for basic byte allocations keyed by their contents. This is used to deduplicate
967     /// allocations for string and bytestring literals.
968     literal_alloc_cache: FxHashMap<Vec<u8>, interpret::AllocId>,
969 }
970
971 impl<'tcx> InterpretInterner<'tcx> {
972     pub fn create_fn_alloc(&self, instance: Instance<'tcx>) -> interpret::AllocId {
973         if let Some(&alloc_id) = self.inner.borrow().function_cache.get(&instance) {
974             return alloc_id;
975         }
976         let id = self.reserve();
977         debug!("creating fn ptr: {}", id);
978         let mut inner = self.inner.borrow_mut();
979         inner.functions.insert(id, instance);
980         inner.function_cache.insert(instance, id);
981         id
982     }
983
984     pub fn get_fn(
985         &self,
986         id: interpret::AllocId,
987     ) -> Option<Instance<'tcx>> {
988         self.inner.borrow().functions.get(&id).cloned()
989     }
990
991     pub fn get_alloc(
992         &self,
993         id: interpret::AllocId,
994     ) -> Option<&'tcx interpret::Allocation> {
995         self.inner.borrow().alloc_by_id.get(&id).cloned()
996     }
997
998     pub fn cache_static(
999         &self,
1000         static_id: DefId,
1001     ) -> interpret::AllocId {
1002         if let Some(alloc_id) = self.inner.borrow().static_cache.get(&static_id).cloned() {
1003             return alloc_id;
1004         }
1005         let alloc_id = self.reserve();
1006         let mut inner = self.inner.borrow_mut();
1007         inner.static_cache.insert(static_id, alloc_id);
1008         inner.statics.insert(alloc_id, static_id);
1009         alloc_id
1010     }
1011
1012     pub fn get_static(
1013         &self,
1014         ptr: interpret::AllocId,
1015     ) -> Option<DefId> {
1016         self.inner.borrow().statics.get(&ptr).cloned()
1017     }
1018
1019     pub fn intern_at_reserved(
1020         &self,
1021         id: interpret::AllocId,
1022         alloc: &'tcx interpret::Allocation,
1023     ) {
1024         if let Some(old) = self.inner.borrow_mut().alloc_by_id.insert(id, alloc) {
1025             bug!("tried to intern allocation at {}, but was already existing as {:#?}", id, old);
1026         }
1027     }
1028
1029     /// obtains a new allocation ID that can be referenced but does not
1030     /// yet have an allocation backing it.
1031     pub fn reserve(
1032         &self,
1033     ) -> interpret::AllocId {
1034         let mut inner = self.inner.borrow_mut();
1035         let next = inner.next_id;
1036         inner.next_id.0 = inner.next_id.0
1037             .checked_add(1)
1038             .expect("You overflowed a u64 by incrementing by 1... \
1039                      You've just earned yourself a free drink if we ever meet. \
1040                      Seriously, how did you do that?!");
1041         next
1042     }
1043 }
1044
1045 impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
1046     /// Get the global TyCtxt.
1047     #[inline]
1048     pub fn global_tcx(self) -> TyCtxt<'a, 'gcx, 'gcx> {
1049         TyCtxt {
1050             gcx: self.gcx,
1051             interners: &self.gcx.global_interners,
1052         }
1053     }
1054
1055     pub fn alloc_generics(self, generics: ty::Generics) -> &'gcx ty::Generics {
1056         self.global_arenas.generics.alloc(generics)
1057     }
1058
1059     pub fn alloc_steal_mir(self, mir: Mir<'gcx>) -> &'gcx Steal<Mir<'gcx>> {
1060         self.global_arenas.steal_mir.alloc(Steal::new(mir))
1061     }
1062
1063     pub fn alloc_mir(self, mir: Mir<'gcx>) -> &'gcx Mir<'gcx> {
1064         self.global_arenas.mir.alloc(mir)
1065     }
1066
1067     pub fn alloc_tables(self, tables: ty::TypeckTables<'gcx>) -> &'gcx ty::TypeckTables<'gcx> {
1068         self.global_arenas.tables.alloc(tables)
1069     }
1070
1071     pub fn alloc_trait_def(self, def: ty::TraitDef) -> &'gcx ty::TraitDef {
1072         self.global_arenas.trait_def.alloc(def)
1073     }
1074
1075     pub fn alloc_adt_def(self,
1076                          did: DefId,
1077                          kind: AdtKind,
1078                          variants: Vec<ty::VariantDef>,
1079                          repr: ReprOptions)
1080                          -> &'gcx ty::AdtDef {
1081         let def = ty::AdtDef::new(self, did, kind, variants, repr);
1082         self.global_arenas.adt_def.alloc(def)
1083     }
1084
1085     pub fn alloc_byte_array(self, bytes: &[u8]) -> &'gcx [u8] {
1086         if bytes.is_empty() {
1087             &[]
1088         } else {
1089             self.global_interners.arena.alloc_slice(bytes)
1090         }
1091     }
1092
1093     pub fn alloc_const_slice(self, values: &[&'tcx ty::Const<'tcx>])
1094                              -> &'tcx [&'tcx ty::Const<'tcx>] {
1095         if values.is_empty() {
1096             &[]
1097         } else {
1098             self.interners.arena.alloc_slice(values)
1099         }
1100     }
1101
1102     pub fn alloc_name_const_slice(self, values: &[(ast::Name, &'tcx ty::Const<'tcx>)])
1103                                   -> &'tcx [(ast::Name, &'tcx ty::Const<'tcx>)] {
1104         if values.is_empty() {
1105             &[]
1106         } else {
1107             self.interners.arena.alloc_slice(values)
1108         }
1109     }
1110
1111     pub fn intern_const_alloc(
1112         self,
1113         alloc: interpret::Allocation,
1114     ) -> &'gcx interpret::Allocation {
1115         let allocs = &mut self.interpret_interner.inner.borrow_mut().allocs;
1116         if let Some(alloc) = allocs.get(&alloc) {
1117             return alloc;
1118         }
1119
1120         let interned = self.global_arenas.const_allocs.alloc(alloc);
1121         if let Some(prev) = allocs.replace(interned) {
1122             bug!("Tried to overwrite interned Allocation: {:#?}", prev)
1123         }
1124         interned
1125     }
1126
1127     /// Allocates a byte or string literal for `mir::interpret`
1128     pub fn allocate_cached(self, bytes: &[u8]) -> interpret::AllocId {
1129         // check whether we already allocated this literal or a constant with the same memory
1130         if let Some(&alloc_id) = self.interpret_interner.inner.borrow()
1131                                      .literal_alloc_cache.get(bytes) {
1132             return alloc_id;
1133         }
1134         // create an allocation that just contains these bytes
1135         let alloc = interpret::Allocation::from_bytes(bytes);
1136         let alloc = self.intern_const_alloc(alloc);
1137
1138         // the next unique id
1139         let id = self.interpret_interner.reserve();
1140         // make the allocation identifiable
1141         self.interpret_interner.inner.borrow_mut().alloc_by_id.insert(id, alloc);
1142         // cache it for the future
1143         self.interpret_interner.inner.borrow_mut().literal_alloc_cache.insert(bytes.to_owned(), id);
1144         id
1145     }
1146
1147     pub fn intern_stability(self, stab: attr::Stability) -> &'gcx attr::Stability {
1148         let mut stability_interner = self.stability_interner.borrow_mut();
1149         if let Some(st) = stability_interner.get(&stab) {
1150             return st;
1151         }
1152
1153         let interned = self.global_interners.arena.alloc(stab);
1154         if let Some(prev) = stability_interner.replace(interned) {
1155             bug!("Tried to overwrite interned Stability: {:?}", prev)
1156         }
1157         interned
1158     }
1159
1160     pub fn intern_layout(self, layout: LayoutDetails) -> &'gcx LayoutDetails {
1161         let mut layout_interner = self.layout_interner.borrow_mut();
1162         if let Some(layout) = layout_interner.get(&layout) {
1163             return layout;
1164         }
1165
1166         let interned = self.global_arenas.layout.alloc(layout);
1167         if let Some(prev) = layout_interner.replace(interned) {
1168             bug!("Tried to overwrite interned Layout: {:?}", prev)
1169         }
1170         interned
1171     }
1172
1173     pub fn lift<T: ?Sized + Lift<'tcx>>(self, value: &T) -> Option<T::Lifted> {
1174         value.lift_to_tcx(self)
1175     }
1176
1177     /// Like lift, but only tries in the global tcx.
1178     pub fn lift_to_global<T: ?Sized + Lift<'gcx>>(self, value: &T) -> Option<T::Lifted> {
1179         value.lift_to_tcx(self.global_tcx())
1180     }
1181
1182     /// Returns true if self is the same as self.global_tcx().
1183     fn is_global(self) -> bool {
1184         let local = self.interners as *const _;
1185         let global = &self.global_interners as *const _;
1186         local as usize == global as usize
1187     }
1188
1189     /// Create a type context and call the closure with a `TyCtxt` reference
1190     /// to the context. The closure enforces that the type context and any interned
1191     /// value (types, substs, etc.) can only be used while `ty::tls` has a valid
1192     /// reference to the context, to allow formatting values that need it.
1193     pub fn create_and_enter<F, R>(s: &'tcx Session,
1194                                   cstore: &'tcx dyn CrateStore,
1195                                   local_providers: ty::maps::Providers<'tcx>,
1196                                   extern_providers: ty::maps::Providers<'tcx>,
1197                                   arenas: &'tcx AllArenas<'tcx>,
1198                                   resolutions: ty::Resolutions,
1199                                   hir: hir_map::Map<'tcx>,
1200                                   on_disk_query_result_cache: maps::OnDiskCache<'tcx>,
1201                                   crate_name: &str,
1202                                   tx: mpsc::Sender<Box<dyn Any + Send>>,
1203                                   output_filenames: &OutputFilenames,
1204                                   f: F) -> R
1205                                   where F: for<'b> FnOnce(TyCtxt<'b, 'tcx, 'tcx>) -> R
1206     {
1207         let data_layout = TargetDataLayout::parse(s);
1208         let interners = CtxtInterners::new(&arenas.interner);
1209         let common_types = CommonTypes::new(&interners);
1210         let dep_graph = hir.dep_graph.clone();
1211         let max_cnum = cstore.crates_untracked().iter().map(|c| c.as_usize()).max().unwrap_or(0);
1212         let mut providers = IndexVec::from_elem_n(extern_providers, max_cnum + 1);
1213         providers[LOCAL_CRATE] = local_providers;
1214
1215         let def_path_hash_to_def_id = if s.opts.build_dep_graph() {
1216             let upstream_def_path_tables: Vec<(CrateNum, Lrc<_>)> = cstore
1217                 .crates_untracked()
1218                 .iter()
1219                 .map(|&cnum| (cnum, cstore.def_path_table(cnum)))
1220                 .collect();
1221
1222             let def_path_tables = || {
1223                 upstream_def_path_tables
1224                     .iter()
1225                     .map(|&(cnum, ref rc)| (cnum, &**rc))
1226                     .chain(iter::once((LOCAL_CRATE, hir.definitions().def_path_table())))
1227             };
1228
1229             // Precompute the capacity of the hashmap so we don't have to
1230             // re-allocate when populating it.
1231             let capacity = def_path_tables().map(|(_, t)| t.size()).sum::<usize>();
1232
1233             let mut map: FxHashMap<_, _> = FxHashMap::with_capacity_and_hasher(
1234                 capacity,
1235                 ::std::default::Default::default()
1236             );
1237
1238             for (cnum, def_path_table) in def_path_tables() {
1239                 def_path_table.add_def_path_hashes_to(cnum, &mut map);
1240             }
1241
1242             Some(map)
1243         } else {
1244             None
1245         };
1246
1247         let mut trait_map = FxHashMap();
1248         for (k, v) in resolutions.trait_map {
1249             let hir_id = hir.node_to_hir_id(k);
1250             let map = trait_map.entry(hir_id.owner)
1251                 .or_insert_with(|| Lrc::new(FxHashMap()));
1252             Lrc::get_mut(map).unwrap()
1253                             .insert(hir_id.local_id,
1254                                     Lrc::new(StableVec::new(v)));
1255         }
1256
1257         let gcx = &GlobalCtxt {
1258             sess: s,
1259             cstore,
1260             global_arenas: &arenas.global,
1261             global_interners: interners,
1262             dep_graph: dep_graph.clone(),
1263             on_disk_query_result_cache,
1264             types: common_types,
1265             trait_map,
1266             export_map: resolutions.export_map.into_iter().map(|(k, v)| {
1267                 (k, Lrc::new(v))
1268             }).collect(),
1269             freevars: resolutions.freevars.into_iter().map(|(k, v)| {
1270                 (hir.local_def_id(k), Lrc::new(v))
1271             }).collect(),
1272             maybe_unused_trait_imports:
1273                 resolutions.maybe_unused_trait_imports
1274                     .into_iter()
1275                     .map(|id| hir.local_def_id(id))
1276                     .collect(),
1277             maybe_unused_extern_crates:
1278                 resolutions.maybe_unused_extern_crates
1279                     .into_iter()
1280                     .map(|(id, sp)| (hir.local_def_id(id), sp))
1281                     .collect(),
1282             hir,
1283             def_path_hash_to_def_id,
1284             maps: maps::Maps::new(providers),
1285             rcache: Lock::new(FxHashMap()),
1286             selection_cache: traits::SelectionCache::new(),
1287             evaluation_cache: traits::EvaluationCache::new(),
1288             crate_name: Symbol::intern(crate_name),
1289             data_layout,
1290             layout_interner: Lock::new(FxHashSet()),
1291             stability_interner: Lock::new(FxHashSet()),
1292             interpret_interner: Default::default(),
1293             tx_to_llvm_workers: Lock::new(tx),
1294             output_filenames: Arc::new(output_filenames.clone()),
1295         };
1296
1297         tls::enter_global(gcx, f)
1298     }
1299
1300     pub fn consider_optimizing<T: Fn() -> String>(&self, msg: T) -> bool {
1301         let cname = self.crate_name(LOCAL_CRATE).as_str();
1302         self.sess.consider_optimizing(&cname, msg)
1303     }
1304
1305     pub fn lang_items(self) -> Lrc<middle::lang_items::LanguageItems> {
1306         self.get_lang_items(LOCAL_CRATE)
1307     }
1308
1309     /// Due to missing llvm support for lowering 128 bit math to software emulation
1310     /// (on some targets), the lowering can be done in MIR.
1311     ///
1312     /// This function only exists until said support is implemented.
1313     pub fn is_binop_lang_item(&self, def_id: DefId) -> Option<(mir::BinOp, bool)> {
1314         let items = self.lang_items();
1315         let def_id = Some(def_id);
1316         if items.i128_add_fn() == def_id { Some((mir::BinOp::Add, false)) }
1317         else if items.u128_add_fn() == def_id { Some((mir::BinOp::Add, false)) }
1318         else if items.i128_sub_fn() == def_id { Some((mir::BinOp::Sub, false)) }
1319         else if items.u128_sub_fn() == def_id { Some((mir::BinOp::Sub, false)) }
1320         else if items.i128_mul_fn() == def_id { Some((mir::BinOp::Mul, false)) }
1321         else if items.u128_mul_fn() == def_id { Some((mir::BinOp::Mul, false)) }
1322         else if items.i128_div_fn() == def_id { Some((mir::BinOp::Div, false)) }
1323         else if items.u128_div_fn() == def_id { Some((mir::BinOp::Div, false)) }
1324         else if items.i128_rem_fn() == def_id { Some((mir::BinOp::Rem, false)) }
1325         else if items.u128_rem_fn() == def_id { Some((mir::BinOp::Rem, false)) }
1326         else if items.i128_shl_fn() == def_id { Some((mir::BinOp::Shl, false)) }
1327         else if items.u128_shl_fn() == def_id { Some((mir::BinOp::Shl, false)) }
1328         else if items.i128_shr_fn() == def_id { Some((mir::BinOp::Shr, false)) }
1329         else if items.u128_shr_fn() == def_id { Some((mir::BinOp::Shr, false)) }
1330         else if items.i128_addo_fn() == def_id { Some((mir::BinOp::Add, true)) }
1331         else if items.u128_addo_fn() == def_id { Some((mir::BinOp::Add, true)) }
1332         else if items.i128_subo_fn() == def_id { Some((mir::BinOp::Sub, true)) }
1333         else if items.u128_subo_fn() == def_id { Some((mir::BinOp::Sub, true)) }
1334         else if items.i128_mulo_fn() == def_id { Some((mir::BinOp::Mul, true)) }
1335         else if items.u128_mulo_fn() == def_id { Some((mir::BinOp::Mul, true)) }
1336         else if items.i128_shlo_fn() == def_id { Some((mir::BinOp::Shl, true)) }
1337         else if items.u128_shlo_fn() == def_id { Some((mir::BinOp::Shl, true)) }
1338         else if items.i128_shro_fn() == def_id { Some((mir::BinOp::Shr, true)) }
1339         else if items.u128_shro_fn() == def_id { Some((mir::BinOp::Shr, true)) }
1340         else { None }
1341     }
1342
1343     pub fn stability(self) -> Lrc<stability::Index<'tcx>> {
1344         self.stability_index(LOCAL_CRATE)
1345     }
1346
1347     pub fn crates(self) -> Lrc<Vec<CrateNum>> {
1348         self.all_crate_nums(LOCAL_CRATE)
1349     }
1350
1351     pub fn features(self) -> Lrc<feature_gate::Features> {
1352         self.features_query(LOCAL_CRATE)
1353     }
1354
1355     pub fn def_key(self, id: DefId) -> hir_map::DefKey {
1356         if id.is_local() {
1357             self.hir.def_key(id)
1358         } else {
1359             self.cstore.def_key(id)
1360         }
1361     }
1362
1363     /// Convert a `DefId` into its fully expanded `DefPath` (every
1364     /// `DefId` is really just an interned def-path).
1365     ///
1366     /// Note that if `id` is not local to this crate, the result will
1367     ///  be a non-local `DefPath`.
1368     pub fn def_path(self, id: DefId) -> hir_map::DefPath {
1369         if id.is_local() {
1370             self.hir.def_path(id)
1371         } else {
1372             self.cstore.def_path(id)
1373         }
1374     }
1375
1376     #[inline]
1377     pub fn def_path_hash(self, def_id: DefId) -> hir_map::DefPathHash {
1378         if def_id.is_local() {
1379             self.hir.definitions().def_path_hash(def_id.index)
1380         } else {
1381             self.cstore.def_path_hash(def_id)
1382         }
1383     }
1384
1385     pub fn def_path_debug_str(self, def_id: DefId) -> String {
1386         // We are explicitly not going through queries here in order to get
1387         // crate name and disambiguator since this code is called from debug!()
1388         // statements within the query system and we'd run into endless
1389         // recursion otherwise.
1390         let (crate_name, crate_disambiguator) = if def_id.is_local() {
1391             (self.crate_name.clone(),
1392              self.sess.local_crate_disambiguator())
1393         } else {
1394             (self.cstore.crate_name_untracked(def_id.krate),
1395              self.cstore.crate_disambiguator_untracked(def_id.krate))
1396         };
1397
1398         format!("{}[{}]{}",
1399                 crate_name,
1400                 // Don't print the whole crate disambiguator. That's just
1401                 // annoying in debug output.
1402                 &(crate_disambiguator.to_fingerprint().to_hex())[..4],
1403                 self.def_path(def_id).to_string_no_crate())
1404     }
1405
1406     pub fn metadata_encoding_version(self) -> Vec<u8> {
1407         self.cstore.metadata_encoding_version().to_vec()
1408     }
1409
1410     // Note that this is *untracked* and should only be used within the query
1411     // system if the result is otherwise tracked through queries
1412     pub fn crate_data_as_rc_any(self, cnum: CrateNum) -> Lrc<dyn Any> {
1413         self.cstore.crate_data_as_rc_any(cnum)
1414     }
1415
1416     pub fn create_stable_hashing_context(self) -> StableHashingContext<'a> {
1417         let krate = self.dep_graph.with_ignore(|| self.gcx.hir.krate());
1418
1419         StableHashingContext::new(self.sess,
1420                                   krate,
1421                                   self.hir.definitions(),
1422                                   self.cstore)
1423     }
1424
1425     // This method makes sure that we have a DepNode and a Fingerprint for
1426     // every upstream crate. It needs to be called once right after the tcx is
1427     // created.
1428     // With full-fledged red/green, the method will probably become unnecessary
1429     // as this will be done on-demand.
1430     pub fn allocate_metadata_dep_nodes(self) {
1431         // We cannot use the query versions of crates() and crate_hash(), since
1432         // those would need the DepNodes that we are allocating here.
1433         for cnum in self.cstore.crates_untracked() {
1434             let dep_node = DepNode::new(self, DepConstructor::CrateMetadata(cnum));
1435             let crate_hash = self.cstore.crate_hash_untracked(cnum);
1436             self.dep_graph.with_task(dep_node,
1437                                      self,
1438                                      crate_hash,
1439                                      |_, x| x // No transformation needed
1440             );
1441         }
1442     }
1443
1444     // This method exercises the `in_scope_traits_map` query for all possible
1445     // values so that we have their fingerprints available in the DepGraph.
1446     // This is only required as long as we still use the old dependency tracking
1447     // which needs to have the fingerprints of all input nodes beforehand.
1448     pub fn precompute_in_scope_traits_hashes(self) {
1449         for &def_index in self.trait_map.keys() {
1450             self.in_scope_traits_map(def_index);
1451         }
1452     }
1453
1454     pub fn serialize_query_result_cache<E>(self,
1455                                            encoder: &mut E)
1456                                            -> Result<(), E::Error>
1457         where E: ty::codec::TyEncoder
1458     {
1459         self.on_disk_query_result_cache.serialize(self.global_tcx(), encoder)
1460     }
1461
1462     /// If true, we should use the MIR-based borrowck (we may *also* use
1463     /// the AST-based borrowck).
1464     pub fn use_mir_borrowck(self) -> bool {
1465         self.borrowck_mode().use_mir()
1466     }
1467
1468     /// If true, we should enable two-phase borrows checks. This is
1469     /// done with either `-Ztwo-phase-borrows` or with
1470     /// `#![feature(nll)]`.
1471     pub fn two_phase_borrows(self) -> bool {
1472         self.features().nll || self.sess.opts.debugging_opts.two_phase_borrows
1473     }
1474
1475     /// What mode(s) of borrowck should we run? AST? MIR? both?
1476     /// (Also considers the `#![feature(nll)]` setting.)
1477     pub fn borrowck_mode(&self) -> BorrowckMode {
1478         match self.sess.opts.borrowck_mode {
1479             mode @ BorrowckMode::Mir |
1480             mode @ BorrowckMode::Compare => mode,
1481
1482             mode @ BorrowckMode::Ast => {
1483                 if self.features().nll {
1484                     BorrowckMode::Mir
1485                 } else {
1486                     mode
1487                 }
1488             }
1489
1490         }
1491     }
1492
1493     /// Should we emit EndRegion MIR statements? These are consumed by
1494     /// MIR borrowck, but not when NLL is used. They are also consumed
1495     /// by the validation stuff.
1496     pub fn emit_end_regions(self) -> bool {
1497         self.sess.opts.debugging_opts.emit_end_regions ||
1498             self.sess.opts.debugging_opts.mir_emit_validate > 0 ||
1499             self.use_mir_borrowck()
1500     }
1501
1502     #[inline]
1503     pub fn share_generics(self) -> bool {
1504         match self.sess.opts.debugging_opts.share_generics {
1505             Some(setting) => setting,
1506             None => {
1507                 self.sess.opts.incremental.is_some() ||
1508                 match self.sess.opts.optimize {
1509                     OptLevel::No   |
1510                     OptLevel::Less |
1511                     OptLevel::Size |
1512                     OptLevel::SizeMin => true,
1513                     OptLevel::Default    |
1514                     OptLevel::Aggressive => false,
1515                 }
1516             }
1517         }
1518     }
1519
1520     #[inline]
1521     pub fn local_crate_exports_generics(self) -> bool {
1522         debug_assert!(self.share_generics());
1523
1524         self.sess.crate_types.borrow().iter().any(|crate_type| {
1525             match crate_type {
1526                 CrateTypeExecutable |
1527                 CrateTypeStaticlib  |
1528                 CrateTypeProcMacro  |
1529                 CrateTypeCdylib     => false,
1530                 CrateTypeRlib       |
1531                 CrateTypeDylib      => true,
1532             }
1533         })
1534     }
1535 }
1536
1537 impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
1538     pub fn encode_metadata(self, link_meta: &LinkMeta)
1539         -> EncodedMetadata
1540     {
1541         self.cstore.encode_metadata(self, link_meta)
1542     }
1543 }
1544
1545 impl<'gcx: 'tcx, 'tcx> GlobalCtxt<'gcx> {
1546     /// Call the closure with a local `TyCtxt` using the given arena.
1547     pub fn enter_local<F, R>(
1548         &self,
1549         arena: &'tcx SyncDroplessArena,
1550         f: F
1551     ) -> R
1552     where
1553         F: for<'a> FnOnce(TyCtxt<'a, 'gcx, 'tcx>) -> R
1554     {
1555         let interners = CtxtInterners::new(arena);
1556         let tcx = TyCtxt {
1557             gcx: self,
1558             interners: &interners,
1559         };
1560         ty::tls::with_related_context(tcx.global_tcx(), |icx| {
1561             let new_icx = ty::tls::ImplicitCtxt {
1562                 tcx,
1563                 query: icx.query.clone(),
1564                 layout_depth: icx.layout_depth,
1565             };
1566             ty::tls::enter_context(&new_icx, |new_icx| {
1567                 f(new_icx.tcx)
1568             })
1569         })
1570     }
1571 }
1572
1573 /// A trait implemented for all X<'a> types which can be safely and
1574 /// efficiently converted to X<'tcx> as long as they are part of the
1575 /// provided TyCtxt<'tcx>.
1576 /// This can be done, for example, for Ty<'tcx> or &'tcx Substs<'tcx>
1577 /// by looking them up in their respective interners.
1578 ///
1579 /// However, this is still not the best implementation as it does
1580 /// need to compare the components, even for interned values.
1581 /// It would be more efficient if TypedArena provided a way to
1582 /// determine whether the address is in the allocated range.
1583 ///
1584 /// None is returned if the value or one of the components is not part
1585 /// of the provided context.
1586 /// For Ty, None can be returned if either the type interner doesn't
1587 /// contain the TypeVariants key or if the address of the interned
1588 /// pointer differs. The latter case is possible if a primitive type,
1589 /// e.g. `()` or `u8`, was interned in a different context.
1590 pub trait Lift<'tcx> {
1591     type Lifted: 'tcx;
1592     fn lift_to_tcx<'a, 'gcx>(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Option<Self::Lifted>;
1593 }
1594
1595 impl<'a, 'tcx> Lift<'tcx> for Ty<'a> {
1596     type Lifted = Ty<'tcx>;
1597     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Ty<'tcx>> {
1598         if tcx.interners.arena.in_arena(*self as *const _) {
1599             return Some(unsafe { mem::transmute(*self) });
1600         }
1601         // Also try in the global tcx if we're not that.
1602         if !tcx.is_global() {
1603             self.lift_to_tcx(tcx.global_tcx())
1604         } else {
1605             None
1606         }
1607     }
1608 }
1609
1610 impl<'a, 'tcx> Lift<'tcx> for Region<'a> {
1611     type Lifted = Region<'tcx>;
1612     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Region<'tcx>> {
1613         if tcx.interners.arena.in_arena(*self as *const _) {
1614             return Some(unsafe { mem::transmute(*self) });
1615         }
1616         // Also try in the global tcx if we're not that.
1617         if !tcx.is_global() {
1618             self.lift_to_tcx(tcx.global_tcx())
1619         } else {
1620             None
1621         }
1622     }
1623 }
1624
1625 impl<'a, 'tcx> Lift<'tcx> for &'a Const<'a> {
1626     type Lifted = &'tcx Const<'tcx>;
1627     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<&'tcx Const<'tcx>> {
1628         if tcx.interners.arena.in_arena(*self as *const _) {
1629             return Some(unsafe { mem::transmute(*self) });
1630         }
1631         // Also try in the global tcx if we're not that.
1632         if !tcx.is_global() {
1633             self.lift_to_tcx(tcx.global_tcx())
1634         } else {
1635             None
1636         }
1637     }
1638 }
1639
1640 impl<'a, 'tcx> Lift<'tcx> for &'a Substs<'a> {
1641     type Lifted = &'tcx Substs<'tcx>;
1642     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<&'tcx Substs<'tcx>> {
1643         if self.len() == 0 {
1644             return Some(Slice::empty());
1645         }
1646         if tcx.interners.arena.in_arena(&self[..] as *const _) {
1647             return Some(unsafe { mem::transmute(*self) });
1648         }
1649         // Also try in the global tcx if we're not that.
1650         if !tcx.is_global() {
1651             self.lift_to_tcx(tcx.global_tcx())
1652         } else {
1653             None
1654         }
1655     }
1656 }
1657
1658 impl<'a, 'tcx> Lift<'tcx> for &'a Slice<Ty<'a>> {
1659     type Lifted = &'tcx Slice<Ty<'tcx>>;
1660     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>)
1661                              -> Option<&'tcx Slice<Ty<'tcx>>> {
1662         if self.len() == 0 {
1663             return Some(Slice::empty());
1664         }
1665         if tcx.interners.arena.in_arena(*self as *const _) {
1666             return Some(unsafe { mem::transmute(*self) });
1667         }
1668         // Also try in the global tcx if we're not that.
1669         if !tcx.is_global() {
1670             self.lift_to_tcx(tcx.global_tcx())
1671         } else {
1672             None
1673         }
1674     }
1675 }
1676
1677 impl<'a, 'tcx> Lift<'tcx> for &'a Slice<ExistentialPredicate<'a>> {
1678     type Lifted = &'tcx Slice<ExistentialPredicate<'tcx>>;
1679     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>)
1680         -> Option<&'tcx Slice<ExistentialPredicate<'tcx>>> {
1681         if self.is_empty() {
1682             return Some(Slice::empty());
1683         }
1684         if tcx.interners.arena.in_arena(*self as *const _) {
1685             return Some(unsafe { mem::transmute(*self) });
1686         }
1687         // Also try in the global tcx if we're not that.
1688         if !tcx.is_global() {
1689             self.lift_to_tcx(tcx.global_tcx())
1690         } else {
1691             None
1692         }
1693     }
1694 }
1695
1696 impl<'a, 'tcx> Lift<'tcx> for &'a Slice<Predicate<'a>> {
1697     type Lifted = &'tcx Slice<Predicate<'tcx>>;
1698     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>)
1699         -> Option<&'tcx Slice<Predicate<'tcx>>> {
1700         if self.is_empty() {
1701             return Some(Slice::empty());
1702         }
1703         if tcx.interners.arena.in_arena(*self as *const _) {
1704             return Some(unsafe { mem::transmute(*self) });
1705         }
1706         // Also try in the global tcx if we're not that.
1707         if !tcx.is_global() {
1708             self.lift_to_tcx(tcx.global_tcx())
1709         } else {
1710             None
1711         }
1712     }
1713 }
1714
1715 impl<'a, 'tcx> Lift<'tcx> for &'a Slice<CanonicalVarInfo> {
1716     type Lifted = &'tcx Slice<CanonicalVarInfo>;
1717     fn lift_to_tcx<'b, 'gcx>(&self, tcx: TyCtxt<'b, 'gcx, 'tcx>) -> Option<Self::Lifted> {
1718         if self.len() == 0 {
1719             return Some(Slice::empty());
1720         }
1721         if tcx.interners.arena.in_arena(*self as *const _) {
1722             return Some(unsafe { mem::transmute(*self) });
1723         }
1724         // Also try in the global tcx if we're not that.
1725         if !tcx.is_global() {
1726             self.lift_to_tcx(tcx.global_tcx())
1727         } else {
1728             None
1729         }
1730     }
1731 }
1732
1733 pub mod tls {
1734     use super::{GlobalCtxt, TyCtxt};
1735
1736     use std::cell::Cell;
1737     use std::fmt;
1738     use std::mem;
1739     use syntax_pos;
1740     use ty::maps;
1741     use errors::{Diagnostic, TRACK_DIAGNOSTICS};
1742     use rustc_data_structures::OnDrop;
1743     use rustc_data_structures::sync::Lrc;
1744
1745     /// This is the implicit state of rustc. It contains the current
1746     /// TyCtxt and query. It is updated when creating a local interner or
1747     /// executing a new query. Whenever there's a TyCtxt value available
1748     /// you should also have access to an ImplicitCtxt through the functions
1749     /// in this module.
1750     #[derive(Clone)]
1751     pub struct ImplicitCtxt<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
1752         /// The current TyCtxt. Initially created by `enter_global` and updated
1753         /// by `enter_local` with a new local interner
1754         pub tcx: TyCtxt<'a, 'gcx, 'tcx>,
1755
1756         /// The current query job, if any. This is updated by start_job in
1757         /// ty::maps::plumbing when executing a query
1758         pub query: Option<Lrc<maps::QueryJob<'gcx>>>,
1759
1760         /// Used to prevent layout from recursing too deeply.
1761         pub layout_depth: usize,
1762     }
1763
1764     // A thread local value which stores a pointer to the current ImplicitCtxt
1765     thread_local!(static TLV: Cell<usize> = Cell::new(0));
1766
1767     fn set_tlv<F: FnOnce() -> R, R>(value: usize, f: F) -> R {
1768         let old = get_tlv();
1769         let _reset = OnDrop(move || TLV.with(|tlv| tlv.set(old)));
1770         TLV.with(|tlv| tlv.set(value));
1771         f()
1772     }
1773
1774     fn get_tlv() -> usize {
1775         TLV.with(|tlv| tlv.get())
1776     }
1777
1778     /// This is a callback from libsyntax as it cannot access the implicit state
1779     /// in librustc otherwise
1780     fn span_debug(span: syntax_pos::Span, f: &mut fmt::Formatter) -> fmt::Result {
1781         with(|tcx| {
1782             write!(f, "{}", tcx.sess.codemap().span_to_string(span))
1783         })
1784     }
1785
1786     /// This is a callback from libsyntax as it cannot access the implicit state
1787     /// in librustc otherwise. It is used to when diagnostic messages are
1788     /// emitted and stores them in the current query, if there is one.
1789     fn track_diagnostic(diagnostic: &Diagnostic) {
1790         with_context(|context| {
1791             if let Some(ref query) = context.query {
1792                 query.diagnostics.lock().push(diagnostic.clone());
1793             }
1794         })
1795     }
1796
1797     /// Sets up the callbacks from libsyntax on the current thread
1798     pub fn with_thread_locals<F, R>(f: F) -> R
1799         where F: FnOnce() -> R
1800     {
1801         syntax_pos::SPAN_DEBUG.with(|span_dbg| {
1802             let original_span_debug = span_dbg.get();
1803             span_dbg.set(span_debug);
1804
1805             let _on_drop = OnDrop(move || {
1806                 span_dbg.set(original_span_debug);
1807             });
1808
1809             TRACK_DIAGNOSTICS.with(|current| {
1810                 let original = current.get();
1811                 current.set(track_diagnostic);
1812
1813                 let _on_drop = OnDrop(move || {
1814                     current.set(original);
1815                 });
1816
1817                 f()
1818             })
1819         })
1820     }
1821
1822     /// Sets `context` as the new current ImplicitCtxt for the duration of the function `f`
1823     pub fn enter_context<'a, 'gcx: 'tcx, 'tcx, F, R>(context: &ImplicitCtxt<'a, 'gcx, 'tcx>,
1824                                                      f: F) -> R
1825         where F: FnOnce(&ImplicitCtxt<'a, 'gcx, 'tcx>) -> R
1826     {
1827         set_tlv(context as *const _ as usize, || {
1828             f(&context)
1829         })
1830     }
1831
1832     /// Enters GlobalCtxt by setting up libsyntax callbacks and
1833     /// creating a initial TyCtxt and ImplicitCtxt.
1834     /// This happens once per rustc session and TyCtxts only exists
1835     /// inside the `f` function.
1836     pub fn enter_global<'gcx, F, R>(gcx: &GlobalCtxt<'gcx>, f: F) -> R
1837         where F: for<'a> FnOnce(TyCtxt<'a, 'gcx, 'gcx>) -> R
1838     {
1839         with_thread_locals(|| {
1840             let tcx = TyCtxt {
1841                 gcx,
1842                 interners: &gcx.global_interners,
1843             };
1844             let icx = ImplicitCtxt {
1845                 tcx,
1846                 query: None,
1847                 layout_depth: 0,
1848             };
1849             enter_context(&icx, |_| {
1850                 f(tcx)
1851             })
1852         })
1853     }
1854
1855     /// Allows access to the current ImplicitCtxt in a closure if one is available
1856     pub fn with_context_opt<F, R>(f: F) -> R
1857         where F: for<'a, 'gcx, 'tcx> FnOnce(Option<&ImplicitCtxt<'a, 'gcx, 'tcx>>) -> R
1858     {
1859         let context = get_tlv();
1860         if context == 0 {
1861             f(None)
1862         } else {
1863             unsafe { f(Some(&*(context as *const ImplicitCtxt))) }
1864         }
1865     }
1866
1867     /// Allows access to the current ImplicitCtxt.
1868     /// Panics if there is no ImplicitCtxt available
1869     pub fn with_context<F, R>(f: F) -> R
1870         where F: for<'a, 'gcx, 'tcx> FnOnce(&ImplicitCtxt<'a, 'gcx, 'tcx>) -> R
1871     {
1872         with_context_opt(|opt_context| f(opt_context.expect("no ImplicitCtxt stored in tls")))
1873     }
1874
1875     /// Allows access to the current ImplicitCtxt whose tcx field has the same global
1876     /// interner as the tcx argument passed in. This means the closure is given an ImplicitCtxt
1877     /// with the same 'gcx lifetime as the TyCtxt passed in.
1878     /// This will panic if you pass it a TyCtxt which has a different global interner from
1879     /// the current ImplicitCtxt's tcx field.
1880     pub fn with_related_context<'a, 'gcx, 'tcx1, F, R>(tcx: TyCtxt<'a, 'gcx, 'tcx1>, f: F) -> R
1881         where F: for<'b, 'tcx2> FnOnce(&ImplicitCtxt<'b, 'gcx, 'tcx2>) -> R
1882     {
1883         with_context(|context| {
1884             unsafe {
1885                 let gcx = tcx.gcx as *const _ as usize;
1886                 assert!(context.tcx.gcx as *const _ as usize == gcx);
1887                 let context: &ImplicitCtxt = mem::transmute(context);
1888                 f(context)
1889             }
1890         })
1891     }
1892
1893     /// Allows access to the current ImplicitCtxt whose tcx field has the same global
1894     /// interner and local interner as the tcx argument passed in. This means the closure
1895     /// is given an ImplicitCtxt with the same 'tcx and 'gcx lifetimes as the TyCtxt passed in.
1896     /// This will panic if you pass it a TyCtxt which has a different global interner or
1897     /// a different local interner from the current ImplicitCtxt's tcx field.
1898     pub fn with_fully_related_context<'a, 'gcx, 'tcx, F, R>(tcx: TyCtxt<'a, 'gcx, 'tcx>, f: F) -> R
1899         where F: for<'b> FnOnce(&ImplicitCtxt<'b, 'gcx, 'tcx>) -> R
1900     {
1901         with_context(|context| {
1902             unsafe {
1903                 let gcx = tcx.gcx as *const _ as usize;
1904                 let interners = tcx.interners as *const _ as usize;
1905                 assert!(context.tcx.gcx as *const _ as usize == gcx);
1906                 assert!(context.tcx.interners as *const _ as usize == interners);
1907                 let context: &ImplicitCtxt = mem::transmute(context);
1908                 f(context)
1909             }
1910         })
1911     }
1912
1913     /// Allows access to the TyCtxt in the current ImplicitCtxt.
1914     /// Panics if there is no ImplicitCtxt available
1915     pub fn with<F, R>(f: F) -> R
1916         where F: for<'a, 'gcx, 'tcx> FnOnce(TyCtxt<'a, 'gcx, 'tcx>) -> R
1917     {
1918         with_context(|context| f(context.tcx))
1919     }
1920
1921     /// Allows access to the TyCtxt in the current ImplicitCtxt.
1922     /// The closure is passed None if there is no ImplicitCtxt available
1923     pub fn with_opt<F, R>(f: F) -> R
1924         where F: for<'a, 'gcx, 'tcx> FnOnce(Option<TyCtxt<'a, 'gcx, 'tcx>>) -> R
1925     {
1926         with_context_opt(|opt_context| f(opt_context.map(|context| context.tcx)))
1927     }
1928 }
1929
1930 macro_rules! sty_debug_print {
1931     ($ctxt: expr, $($variant: ident),*) => {{
1932         // curious inner module to allow variant names to be used as
1933         // variable names.
1934         #[allow(non_snake_case)]
1935         mod inner {
1936             use ty::{self, TyCtxt};
1937             use ty::context::Interned;
1938
1939             #[derive(Copy, Clone)]
1940             struct DebugStat {
1941                 total: usize,
1942                 region_infer: usize,
1943                 ty_infer: usize,
1944                 both_infer: usize,
1945             }
1946
1947             pub fn go(tcx: TyCtxt) {
1948                 let mut total = DebugStat {
1949                     total: 0,
1950                     region_infer: 0, ty_infer: 0, both_infer: 0,
1951                 };
1952                 $(let mut $variant = total;)*
1953
1954
1955                 for &Interned(t) in tcx.interners.type_.borrow().iter() {
1956                     let variant = match t.sty {
1957                         ty::TyBool | ty::TyChar | ty::TyInt(..) | ty::TyUint(..) |
1958                             ty::TyFloat(..) | ty::TyStr | ty::TyNever => continue,
1959                         ty::TyError => /* unimportant */ continue,
1960                         $(ty::$variant(..) => &mut $variant,)*
1961                     };
1962                     let region = t.flags.intersects(ty::TypeFlags::HAS_RE_INFER);
1963                     let ty = t.flags.intersects(ty::TypeFlags::HAS_TY_INFER);
1964
1965                     variant.total += 1;
1966                     total.total += 1;
1967                     if region { total.region_infer += 1; variant.region_infer += 1 }
1968                     if ty { total.ty_infer += 1; variant.ty_infer += 1 }
1969                     if region && ty { total.both_infer += 1; variant.both_infer += 1 }
1970                 }
1971                 println!("Ty interner             total           ty region  both");
1972                 $(println!("    {:18}: {uses:6} {usespc:4.1}%, \
1973 {ty:4.1}% {region:5.1}% {both:4.1}%",
1974                            stringify!($variant),
1975                            uses = $variant.total,
1976                            usespc = $variant.total as f64 * 100.0 / total.total as f64,
1977                            ty = $variant.ty_infer as f64 * 100.0  / total.total as f64,
1978                            region = $variant.region_infer as f64 * 100.0  / total.total as f64,
1979                            both = $variant.both_infer as f64 * 100.0  / total.total as f64);
1980                   )*
1981                 println!("                  total {uses:6}        \
1982 {ty:4.1}% {region:5.1}% {both:4.1}%",
1983                          uses = total.total,
1984                          ty = total.ty_infer as f64 * 100.0  / total.total as f64,
1985                          region = total.region_infer as f64 * 100.0  / total.total as f64,
1986                          both = total.both_infer as f64 * 100.0  / total.total as f64)
1987             }
1988         }
1989
1990         inner::go($ctxt)
1991     }}
1992 }
1993
1994 impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
1995     pub fn print_debug_stats(self) {
1996         sty_debug_print!(
1997             self,
1998             TyAdt, TyArray, TySlice, TyRawPtr, TyRef, TyFnDef, TyFnPtr,
1999             TyGenerator, TyGeneratorWitness, TyDynamic, TyClosure, TyTuple,
2000             TyParam, TyInfer, TyProjection, TyAnon, TyForeign);
2001
2002         println!("Substs interner: #{}", self.interners.substs.borrow().len());
2003         println!("Region interner: #{}", self.interners.region.borrow().len());
2004         println!("Stability interner: #{}", self.stability_interner.borrow().len());
2005         println!("Interpret interner: #{}", self.interpret_interner.inner.borrow().allocs.len());
2006         println!("Layout interner: #{}", self.layout_interner.borrow().len());
2007     }
2008 }
2009
2010
2011 /// An entry in an interner.
2012 struct Interned<'tcx, T: 'tcx+?Sized>(&'tcx T);
2013
2014 // NB: An Interned<Ty> compares and hashes as a sty.
2015 impl<'tcx> PartialEq for Interned<'tcx, TyS<'tcx>> {
2016     fn eq(&self, other: &Interned<'tcx, TyS<'tcx>>) -> bool {
2017         self.0.sty == other.0.sty
2018     }
2019 }
2020
2021 impl<'tcx> Eq for Interned<'tcx, TyS<'tcx>> {}
2022
2023 impl<'tcx> Hash for Interned<'tcx, TyS<'tcx>> {
2024     fn hash<H: Hasher>(&self, s: &mut H) {
2025         self.0.sty.hash(s)
2026     }
2027 }
2028
2029 impl<'tcx: 'lcx, 'lcx> Borrow<TypeVariants<'lcx>> for Interned<'tcx, TyS<'tcx>> {
2030     fn borrow<'a>(&'a self) -> &'a TypeVariants<'lcx> {
2031         &self.0.sty
2032     }
2033 }
2034
2035 // NB: An Interned<Slice<T>> compares and hashes as its elements.
2036 impl<'tcx, T: PartialEq> PartialEq for Interned<'tcx, Slice<T>> {
2037     fn eq(&self, other: &Interned<'tcx, Slice<T>>) -> bool {
2038         self.0[..] == other.0[..]
2039     }
2040 }
2041
2042 impl<'tcx, T: Eq> Eq for Interned<'tcx, Slice<T>> {}
2043
2044 impl<'tcx, T: Hash> Hash for Interned<'tcx, Slice<T>> {
2045     fn hash<H: Hasher>(&self, s: &mut H) {
2046         self.0[..].hash(s)
2047     }
2048 }
2049
2050 impl<'tcx: 'lcx, 'lcx> Borrow<[Ty<'lcx>]> for Interned<'tcx, Slice<Ty<'tcx>>> {
2051     fn borrow<'a>(&'a self) -> &'a [Ty<'lcx>] {
2052         &self.0[..]
2053     }
2054 }
2055
2056 impl<'tcx: 'lcx, 'lcx> Borrow<[CanonicalVarInfo]> for Interned<'tcx, Slice<CanonicalVarInfo>> {
2057     fn borrow<'a>(&'a self) -> &'a [CanonicalVarInfo] {
2058         &self.0[..]
2059     }
2060 }
2061
2062 impl<'tcx: 'lcx, 'lcx> Borrow<[Kind<'lcx>]> for Interned<'tcx, Substs<'tcx>> {
2063     fn borrow<'a>(&'a self) -> &'a [Kind<'lcx>] {
2064         &self.0[..]
2065     }
2066 }
2067
2068 impl<'tcx> Borrow<RegionKind> for Interned<'tcx, RegionKind> {
2069     fn borrow<'a>(&'a self) -> &'a RegionKind {
2070         &self.0
2071     }
2072 }
2073
2074 impl<'tcx: 'lcx, 'lcx> Borrow<[ExistentialPredicate<'lcx>]>
2075     for Interned<'tcx, Slice<ExistentialPredicate<'tcx>>> {
2076     fn borrow<'a>(&'a self) -> &'a [ExistentialPredicate<'lcx>] {
2077         &self.0[..]
2078     }
2079 }
2080
2081 impl<'tcx: 'lcx, 'lcx> Borrow<[Predicate<'lcx>]>
2082     for Interned<'tcx, Slice<Predicate<'tcx>>> {
2083     fn borrow<'a>(&'a self) -> &'a [Predicate<'lcx>] {
2084         &self.0[..]
2085     }
2086 }
2087
2088 impl<'tcx: 'lcx, 'lcx> Borrow<Const<'lcx>> for Interned<'tcx, Const<'tcx>> {
2089     fn borrow<'a>(&'a self) -> &'a Const<'lcx> {
2090         &self.0
2091     }
2092 }
2093
2094 impl<'tcx: 'lcx, 'lcx> Borrow<[Clause<'lcx>]>
2095 for Interned<'tcx, Slice<Clause<'tcx>>> {
2096     fn borrow<'a>(&'a self) -> &'a [Clause<'lcx>] {
2097         &self.0[..]
2098     }
2099 }
2100
2101 impl<'tcx: 'lcx, 'lcx> Borrow<[Goal<'lcx>]>
2102 for Interned<'tcx, Slice<Goal<'tcx>>> {
2103     fn borrow<'a>(&'a self) -> &'a [Goal<'lcx>] {
2104         &self.0[..]
2105     }
2106 }
2107
2108 macro_rules! intern_method {
2109     ($lt_tcx:tt, $name:ident: $method:ident($alloc:ty,
2110                                             $alloc_method:ident,
2111                                             $alloc_to_key:expr,
2112                                             $alloc_to_ret:expr,
2113                                             $needs_infer:expr) -> $ty:ty) => {
2114         impl<'a, 'gcx, $lt_tcx> TyCtxt<'a, 'gcx, $lt_tcx> {
2115             pub fn $method(self, v: $alloc) -> &$lt_tcx $ty {
2116                 {
2117                     let key = ($alloc_to_key)(&v);
2118                     if let Some(i) = self.interners.$name.borrow().get(key) {
2119                         return i.0;
2120                     }
2121                     if !self.is_global() {
2122                         if let Some(i) = self.global_interners.$name.borrow().get(key) {
2123                             return i.0;
2124                         }
2125                     }
2126                 }
2127
2128                 // HACK(eddyb) Depend on flags being accurate to
2129                 // determine that all contents are in the global tcx.
2130                 // See comments on Lift for why we can't use that.
2131                 if !($needs_infer)(&v) {
2132                     if !self.is_global() {
2133                         let v = unsafe {
2134                             mem::transmute(v)
2135                         };
2136                         let i = ($alloc_to_ret)(self.global_interners.arena.$alloc_method(v));
2137                         self.global_interners.$name.borrow_mut().insert(Interned(i));
2138                         return i;
2139                     }
2140                 } else {
2141                     // Make sure we don't end up with inference
2142                     // types/regions in the global tcx.
2143                     if self.is_global() {
2144                         bug!("Attempted to intern `{:?}` which contains \
2145                               inference types/regions in the global type context",
2146                              v);
2147                     }
2148                 }
2149
2150                 let i = ($alloc_to_ret)(self.interners.arena.$alloc_method(v));
2151                 self.interners.$name.borrow_mut().insert(Interned(i));
2152                 i
2153             }
2154         }
2155     }
2156 }
2157
2158 macro_rules! direct_interners {
2159     ($lt_tcx:tt, $($name:ident: $method:ident($needs_infer:expr) -> $ty:ty),+) => {
2160         $(impl<$lt_tcx> PartialEq for Interned<$lt_tcx, $ty> {
2161             fn eq(&self, other: &Self) -> bool {
2162                 self.0 == other.0
2163             }
2164         }
2165
2166         impl<$lt_tcx> Eq for Interned<$lt_tcx, $ty> {}
2167
2168         impl<$lt_tcx> Hash for Interned<$lt_tcx, $ty> {
2169             fn hash<H: Hasher>(&self, s: &mut H) {
2170                 self.0.hash(s)
2171             }
2172         }
2173
2174         intern_method!($lt_tcx, $name: $method($ty, alloc, |x| x, |x| x, $needs_infer) -> $ty);)+
2175     }
2176 }
2177
2178 pub fn keep_local<'tcx, T: ty::TypeFoldable<'tcx>>(x: &T) -> bool {
2179     x.has_type_flags(ty::TypeFlags::KEEP_IN_LOCAL_TCX)
2180 }
2181
2182 direct_interners!('tcx,
2183     region: mk_region(|r| {
2184         match r {
2185             &ty::ReVar(_) | &ty::ReSkolemized(..) => true,
2186             _ => false
2187         }
2188     }) -> RegionKind,
2189     const_: mk_const(|c: &Const| keep_local(&c.ty) || keep_local(&c.val)) -> Const<'tcx>
2190 );
2191
2192 macro_rules! slice_interners {
2193     ($($field:ident: $method:ident($ty:ident)),+) => (
2194         $(intern_method!('tcx, $field: $method(&[$ty<'tcx>], alloc_slice, Deref::deref,
2195                                                |xs: &[$ty]| -> &Slice<$ty> {
2196             unsafe { mem::transmute(xs) }
2197         }, |xs: &[$ty]| xs.iter().any(keep_local)) -> Slice<$ty<'tcx>>);)+
2198     )
2199 }
2200
2201 slice_interners!(
2202     existential_predicates: _intern_existential_predicates(ExistentialPredicate),
2203     predicates: _intern_predicates(Predicate),
2204     type_list: _intern_type_list(Ty),
2205     substs: _intern_substs(Kind),
2206     clauses: _intern_clauses(Clause),
2207     goals: _intern_goals(Goal)
2208 );
2209
2210 // This isn't a perfect fit: CanonicalVarInfo slices are always
2211 // allocated in the global arena, so this `intern_method!` macro is
2212 // overly general.  But we just return false for the code that checks
2213 // whether they belong in the thread-local arena, so no harm done, and
2214 // seems better than open-coding the rest.
2215 intern_method! {
2216     'tcx,
2217     canonical_var_infos: _intern_canonical_var_infos(
2218         &[CanonicalVarInfo],
2219         alloc_slice,
2220         Deref::deref,
2221         |xs: &[CanonicalVarInfo]| -> &Slice<CanonicalVarInfo> { unsafe { mem::transmute(xs) } },
2222         |_xs: &[CanonicalVarInfo]| -> bool { false }
2223     ) -> Slice<CanonicalVarInfo>
2224 }
2225
2226 impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
2227     /// Given a `fn` type, returns an equivalent `unsafe fn` type;
2228     /// that is, a `fn` type that is equivalent in every way for being
2229     /// unsafe.
2230     pub fn safe_to_unsafe_fn_ty(self, sig: PolyFnSig<'tcx>) -> Ty<'tcx> {
2231         assert_eq!(sig.unsafety(), hir::Unsafety::Normal);
2232         self.mk_fn_ptr(sig.map_bound(|sig| ty::FnSig {
2233             unsafety: hir::Unsafety::Unsafe,
2234             ..sig
2235         }))
2236     }
2237
2238     /// Given a closure signature `sig`, returns an equivalent `fn`
2239     /// type with the same signature. Detuples and so forth -- so
2240     /// e.g. if we have a sig with `Fn<(u32, i32)>` then you would get
2241     /// a `fn(u32, i32)`.
2242     pub fn coerce_closure_fn_ty(self, sig: PolyFnSig<'tcx>) -> Ty<'tcx> {
2243         let converted_sig = sig.map_bound(|s| {
2244             let params_iter = match s.inputs()[0].sty {
2245                 ty::TyTuple(params) => {
2246                     params.into_iter().cloned()
2247                 }
2248                 _ => bug!(),
2249             };
2250             self.mk_fn_sig(
2251                 params_iter,
2252                 s.output(),
2253                 s.variadic,
2254                 hir::Unsafety::Normal,
2255                 abi::Abi::Rust,
2256             )
2257         });
2258
2259         self.mk_fn_ptr(converted_sig)
2260     }
2261
2262     // Interns a type/name combination, stores the resulting box in cx.interners,
2263     // and returns the box as cast to an unsafe ptr (see comments for Ty above).
2264     pub fn mk_ty(self, st: TypeVariants<'tcx>) -> Ty<'tcx> {
2265         let global_interners = if !self.is_global() {
2266             Some(&self.global_interners)
2267         } else {
2268             None
2269         };
2270         self.interners.intern_ty(st, global_interners)
2271     }
2272
2273     pub fn mk_mach_int(self, tm: ast::IntTy) -> Ty<'tcx> {
2274         match tm {
2275             ast::IntTy::Isize   => self.types.isize,
2276             ast::IntTy::I8   => self.types.i8,
2277             ast::IntTy::I16  => self.types.i16,
2278             ast::IntTy::I32  => self.types.i32,
2279             ast::IntTy::I64  => self.types.i64,
2280             ast::IntTy::I128  => self.types.i128,
2281         }
2282     }
2283
2284     pub fn mk_mach_uint(self, tm: ast::UintTy) -> Ty<'tcx> {
2285         match tm {
2286             ast::UintTy::Usize   => self.types.usize,
2287             ast::UintTy::U8   => self.types.u8,
2288             ast::UintTy::U16  => self.types.u16,
2289             ast::UintTy::U32  => self.types.u32,
2290             ast::UintTy::U64  => self.types.u64,
2291             ast::UintTy::U128  => self.types.u128,
2292         }
2293     }
2294
2295     pub fn mk_mach_float(self, tm: ast::FloatTy) -> Ty<'tcx> {
2296         match tm {
2297             ast::FloatTy::F32  => self.types.f32,
2298             ast::FloatTy::F64  => self.types.f64,
2299         }
2300     }
2301
2302     pub fn mk_str(self) -> Ty<'tcx> {
2303         self.mk_ty(TyStr)
2304     }
2305
2306     pub fn mk_static_str(self) -> Ty<'tcx> {
2307         self.mk_imm_ref(self.types.re_static, self.mk_str())
2308     }
2309
2310     pub fn mk_adt(self, def: &'tcx AdtDef, substs: &'tcx Substs<'tcx>) -> Ty<'tcx> {
2311         // take a copy of substs so that we own the vectors inside
2312         self.mk_ty(TyAdt(def, substs))
2313     }
2314
2315     pub fn mk_foreign(self, def_id: DefId) -> Ty<'tcx> {
2316         self.mk_ty(TyForeign(def_id))
2317     }
2318
2319     pub fn mk_box(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2320         let def_id = self.require_lang_item(lang_items::OwnedBoxLangItem);
2321         let adt_def = self.adt_def(def_id);
2322         let substs = self.mk_substs(iter::once(Kind::from(ty)));
2323         self.mk_ty(TyAdt(adt_def, substs))
2324     }
2325
2326     pub fn mk_ptr(self, tm: TypeAndMut<'tcx>) -> Ty<'tcx> {
2327         self.mk_ty(TyRawPtr(tm))
2328     }
2329
2330     pub fn mk_ref(self, r: Region<'tcx>, tm: TypeAndMut<'tcx>) -> Ty<'tcx> {
2331         self.mk_ty(TyRef(r, tm))
2332     }
2333
2334     pub fn mk_mut_ref(self, r: Region<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> {
2335         self.mk_ref(r, TypeAndMut {ty: ty, mutbl: hir::MutMutable})
2336     }
2337
2338     pub fn mk_imm_ref(self, r: Region<'tcx>, ty: Ty<'tcx>) -> Ty<'tcx> {
2339         self.mk_ref(r, TypeAndMut {ty: ty, mutbl: hir::MutImmutable})
2340     }
2341
2342     pub fn mk_mut_ptr(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2343         self.mk_ptr(TypeAndMut {ty: ty, mutbl: hir::MutMutable})
2344     }
2345
2346     pub fn mk_imm_ptr(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2347         self.mk_ptr(TypeAndMut {ty: ty, mutbl: hir::MutImmutable})
2348     }
2349
2350     pub fn mk_nil_ptr(self) -> Ty<'tcx> {
2351         self.mk_imm_ptr(self.mk_nil())
2352     }
2353
2354     pub fn mk_array(self, ty: Ty<'tcx>, n: u64) -> Ty<'tcx> {
2355         self.mk_ty(TyArray(ty, self.mk_const(ty::Const {
2356             val: ConstVal::Value(Value::ByVal(PrimVal::Bytes(n.into()))),
2357             ty: self.types.usize
2358         })))
2359     }
2360
2361     pub fn mk_slice(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2362         self.mk_ty(TySlice(ty))
2363     }
2364
2365     pub fn intern_tup(self, ts: &[Ty<'tcx>]) -> Ty<'tcx> {
2366         self.mk_ty(TyTuple(self.intern_type_list(ts)))
2367     }
2368
2369     pub fn mk_tup<I: InternAs<[Ty<'tcx>], Ty<'tcx>>>(self, iter: I) -> I::Output {
2370         iter.intern_with(|ts| self.mk_ty(TyTuple(self.intern_type_list(ts))))
2371     }
2372
2373     pub fn mk_nil(self) -> Ty<'tcx> {
2374         self.intern_tup(&[])
2375     }
2376
2377     pub fn mk_bool(self) -> Ty<'tcx> {
2378         self.mk_ty(TyBool)
2379     }
2380
2381     pub fn mk_fn_def(self, def_id: DefId,
2382                      substs: &'tcx Substs<'tcx>) -> Ty<'tcx> {
2383         self.mk_ty(TyFnDef(def_id, substs))
2384     }
2385
2386     pub fn mk_fn_ptr(self, fty: PolyFnSig<'tcx>) -> Ty<'tcx> {
2387         self.mk_ty(TyFnPtr(fty))
2388     }
2389
2390     pub fn mk_dynamic(
2391         self,
2392         obj: ty::Binder<&'tcx Slice<ExistentialPredicate<'tcx>>>,
2393         reg: ty::Region<'tcx>
2394     ) -> Ty<'tcx> {
2395         self.mk_ty(TyDynamic(obj, reg))
2396     }
2397
2398     pub fn mk_projection(self,
2399                          item_def_id: DefId,
2400                          substs: &'tcx Substs<'tcx>)
2401         -> Ty<'tcx> {
2402             self.mk_ty(TyProjection(ProjectionTy {
2403                 item_def_id,
2404                 substs,
2405             }))
2406         }
2407
2408     pub fn mk_closure(self,
2409                       closure_id: DefId,
2410                       substs: ClosureSubsts<'tcx>)
2411                       -> Ty<'tcx> {
2412         self.mk_closure_from_closure_substs(closure_id, substs)
2413     }
2414
2415     pub fn mk_closure_from_closure_substs(self,
2416                                           closure_id: DefId,
2417                                           closure_substs: ClosureSubsts<'tcx>)
2418                                           -> Ty<'tcx> {
2419         self.mk_ty(TyClosure(closure_id, closure_substs))
2420     }
2421
2422     pub fn mk_generator(self,
2423                         id: DefId,
2424                         closure_substs: ClosureSubsts<'tcx>,
2425                         interior: GeneratorInterior<'tcx>)
2426                         -> Ty<'tcx> {
2427         self.mk_ty(TyGenerator(id, closure_substs, interior))
2428     }
2429
2430     pub fn mk_generator_witness(self, types: ty::Binder<&'tcx Slice<Ty<'tcx>>>) -> Ty<'tcx> {
2431         self.mk_ty(TyGeneratorWitness(types))
2432     }
2433
2434     pub fn mk_var(self, v: TyVid) -> Ty<'tcx> {
2435         self.mk_infer(TyVar(v))
2436     }
2437
2438     pub fn mk_int_var(self, v: IntVid) -> Ty<'tcx> {
2439         self.mk_infer(IntVar(v))
2440     }
2441
2442     pub fn mk_float_var(self, v: FloatVid) -> Ty<'tcx> {
2443         self.mk_infer(FloatVar(v))
2444     }
2445
2446     pub fn mk_infer(self, it: InferTy) -> Ty<'tcx> {
2447         self.mk_ty(TyInfer(it))
2448     }
2449
2450     pub fn mk_param(self,
2451                     index: u32,
2452                     name: InternedString) -> Ty<'tcx> {
2453         self.mk_ty(TyParam(ParamTy { idx: index, name: name }))
2454     }
2455
2456     pub fn mk_self_type(self) -> Ty<'tcx> {
2457         self.mk_param(0, keywords::SelfType.name().as_str())
2458     }
2459
2460     pub fn mk_param_from_def(self, def: &ty::TypeParameterDef) -> Ty<'tcx> {
2461         self.mk_param(def.index, def.name)
2462     }
2463
2464     pub fn mk_anon(self, def_id: DefId, substs: &'tcx Substs<'tcx>) -> Ty<'tcx> {
2465         self.mk_ty(TyAnon(def_id, substs))
2466     }
2467
2468     pub fn intern_existential_predicates(self, eps: &[ExistentialPredicate<'tcx>])
2469         -> &'tcx Slice<ExistentialPredicate<'tcx>> {
2470         assert!(!eps.is_empty());
2471         assert!(eps.windows(2).all(|w| w[0].cmp(self, &w[1]) != Ordering::Greater));
2472         self._intern_existential_predicates(eps)
2473     }
2474
2475     pub fn intern_predicates(self, preds: &[Predicate<'tcx>])
2476         -> &'tcx Slice<Predicate<'tcx>> {
2477         // FIXME consider asking the input slice to be sorted to avoid
2478         // re-interning permutations, in which case that would be asserted
2479         // here.
2480         if preds.len() == 0 {
2481             // The macro-generated method below asserts we don't intern an empty slice.
2482             Slice::empty()
2483         } else {
2484             self._intern_predicates(preds)
2485         }
2486     }
2487
2488     pub fn intern_type_list(self, ts: &[Ty<'tcx>]) -> &'tcx Slice<Ty<'tcx>> {
2489         if ts.len() == 0 {
2490             Slice::empty()
2491         } else {
2492             self._intern_type_list(ts)
2493         }
2494     }
2495
2496     pub fn intern_substs(self, ts: &[Kind<'tcx>]) -> &'tcx Slice<Kind<'tcx>> {
2497         if ts.len() == 0 {
2498             Slice::empty()
2499         } else {
2500             self._intern_substs(ts)
2501         }
2502     }
2503
2504     pub fn intern_canonical_var_infos(self, ts: &[CanonicalVarInfo]) -> CanonicalVarInfos<'gcx> {
2505         if ts.len() == 0 {
2506             Slice::empty()
2507         } else {
2508             self.global_tcx()._intern_canonical_var_infos(ts)
2509         }
2510     }
2511
2512     pub fn intern_clauses(self, ts: &[Clause<'tcx>]) -> &'tcx Slice<Clause<'tcx>> {
2513         if ts.len() == 0 {
2514             Slice::empty()
2515         } else {
2516             self._intern_clauses(ts)
2517         }
2518     }
2519
2520     pub fn intern_goals(self, ts: &[Goal<'tcx>]) -> &'tcx Slice<Goal<'tcx>> {
2521         if ts.len() == 0 {
2522             Slice::empty()
2523         } else {
2524             self._intern_goals(ts)
2525         }
2526     }
2527
2528     pub fn mk_fn_sig<I>(self,
2529                         inputs: I,
2530                         output: I::Item,
2531                         variadic: bool,
2532                         unsafety: hir::Unsafety,
2533                         abi: abi::Abi)
2534         -> <I::Item as InternIteratorElement<Ty<'tcx>, ty::FnSig<'tcx>>>::Output
2535         where I: Iterator,
2536               I::Item: InternIteratorElement<Ty<'tcx>, ty::FnSig<'tcx>>
2537     {
2538         inputs.chain(iter::once(output)).intern_with(|xs| ty::FnSig {
2539             inputs_and_output: self.intern_type_list(xs),
2540             variadic, unsafety, abi
2541         })
2542     }
2543
2544     pub fn mk_existential_predicates<I: InternAs<[ExistentialPredicate<'tcx>],
2545                                      &'tcx Slice<ExistentialPredicate<'tcx>>>>(self, iter: I)
2546                                      -> I::Output {
2547         iter.intern_with(|xs| self.intern_existential_predicates(xs))
2548     }
2549
2550     pub fn mk_predicates<I: InternAs<[Predicate<'tcx>],
2551                                      &'tcx Slice<Predicate<'tcx>>>>(self, iter: I)
2552                                      -> I::Output {
2553         iter.intern_with(|xs| self.intern_predicates(xs))
2554     }
2555
2556     pub fn mk_type_list<I: InternAs<[Ty<'tcx>],
2557                         &'tcx Slice<Ty<'tcx>>>>(self, iter: I) -> I::Output {
2558         iter.intern_with(|xs| self.intern_type_list(xs))
2559     }
2560
2561     pub fn mk_substs<I: InternAs<[Kind<'tcx>],
2562                      &'tcx Slice<Kind<'tcx>>>>(self, iter: I) -> I::Output {
2563         iter.intern_with(|xs| self.intern_substs(xs))
2564     }
2565
2566     pub fn mk_substs_trait(self,
2567                      s: Ty<'tcx>,
2568                      t: &[Ty<'tcx>])
2569                     -> &'tcx Substs<'tcx>
2570     {
2571         self.mk_substs(iter::once(s).chain(t.into_iter().cloned()).map(Kind::from))
2572     }
2573
2574     pub fn mk_clauses<I: InternAs<[Clause<'tcx>],
2575         &'tcx Slice<Clause<'tcx>>>>(self, iter: I) -> I::Output {
2576         iter.intern_with(|xs| self.intern_clauses(xs))
2577     }
2578
2579     pub fn mk_goals<I: InternAs<[Goal<'tcx>],
2580         &'tcx Slice<Goal<'tcx>>>>(self, iter: I) -> I::Output {
2581         iter.intern_with(|xs| self.intern_goals(xs))
2582     }
2583
2584     pub fn mk_goal(self, goal: Goal<'tcx>) -> &'tcx Goal {
2585         &self.mk_goals(iter::once(goal))[0]
2586     }
2587
2588     pub fn lint_node<S: Into<MultiSpan>>(self,
2589                                          lint: &'static Lint,
2590                                          id: NodeId,
2591                                          span: S,
2592                                          msg: &str) {
2593         self.struct_span_lint_node(lint, id, span.into(), msg).emit()
2594     }
2595
2596     pub fn lint_node_note<S: Into<MultiSpan>>(self,
2597                                               lint: &'static Lint,
2598                                               id: NodeId,
2599                                               span: S,
2600                                               msg: &str,
2601                                               note: &str) {
2602         let mut err = self.struct_span_lint_node(lint, id, span.into(), msg);
2603         err.note(note);
2604         err.emit()
2605     }
2606
2607     pub fn lint_level_at_node(self, lint: &'static Lint, mut id: NodeId)
2608         -> (lint::Level, lint::LintSource)
2609     {
2610         // Right now we insert a `with_ignore` node in the dep graph here to
2611         // ignore the fact that `lint_levels` below depends on the entire crate.
2612         // For now this'll prevent false positives of recompiling too much when
2613         // anything changes.
2614         //
2615         // Once red/green incremental compilation lands we should be able to
2616         // remove this because while the crate changes often the lint level map
2617         // will change rarely.
2618         self.dep_graph.with_ignore(|| {
2619             let sets = self.lint_levels(LOCAL_CRATE);
2620             loop {
2621                 let hir_id = self.hir.definitions().node_to_hir_id(id);
2622                 if let Some(pair) = sets.level_and_source(lint, hir_id, self.sess) {
2623                     return pair
2624                 }
2625                 let next = self.hir.get_parent_node(id);
2626                 if next == id {
2627                     bug!("lint traversal reached the root of the crate");
2628                 }
2629                 id = next;
2630             }
2631         })
2632     }
2633
2634     pub fn struct_span_lint_node<S: Into<MultiSpan>>(self,
2635                                                      lint: &'static Lint,
2636                                                      id: NodeId,
2637                                                      span: S,
2638                                                      msg: &str)
2639         -> DiagnosticBuilder<'tcx>
2640     {
2641         let (level, src) = self.lint_level_at_node(lint, id);
2642         lint::struct_lint_level(self.sess, lint, level, src, Some(span.into()), msg)
2643     }
2644
2645     pub fn struct_lint_node(self, lint: &'static Lint, id: NodeId, msg: &str)
2646         -> DiagnosticBuilder<'tcx>
2647     {
2648         let (level, src) = self.lint_level_at_node(lint, id);
2649         lint::struct_lint_level(self.sess, lint, level, src, None, msg)
2650     }
2651
2652     pub fn in_scope_traits(self, id: HirId) -> Option<Lrc<StableVec<TraitCandidate>>> {
2653         self.in_scope_traits_map(id.owner)
2654             .and_then(|map| map.get(&id.local_id).cloned())
2655     }
2656
2657     pub fn named_region(self, id: HirId) -> Option<resolve_lifetime::Region> {
2658         self.named_region_map(id.owner)
2659             .and_then(|map| map.get(&id.local_id).cloned())
2660     }
2661
2662     pub fn is_late_bound(self, id: HirId) -> bool {
2663         self.is_late_bound_map(id.owner)
2664             .map(|set| set.contains(&id.local_id))
2665             .unwrap_or(false)
2666     }
2667
2668     pub fn object_lifetime_defaults(self, id: HirId)
2669         -> Option<Lrc<Vec<ObjectLifetimeDefault>>>
2670     {
2671         self.object_lifetime_defaults_map(id.owner)
2672             .and_then(|map| map.get(&id.local_id).cloned())
2673     }
2674 }
2675
2676 pub trait InternAs<T: ?Sized, R> {
2677     type Output;
2678     fn intern_with<F>(self, f: F) -> Self::Output
2679         where F: FnOnce(&T) -> R;
2680 }
2681
2682 impl<I, T, R, E> InternAs<[T], R> for I
2683     where E: InternIteratorElement<T, R>,
2684           I: Iterator<Item=E> {
2685     type Output = E::Output;
2686     fn intern_with<F>(self, f: F) -> Self::Output
2687         where F: FnOnce(&[T]) -> R {
2688         E::intern_with(self, f)
2689     }
2690 }
2691
2692 pub trait InternIteratorElement<T, R>: Sized {
2693     type Output;
2694     fn intern_with<I: Iterator<Item=Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output;
2695 }
2696
2697 impl<T, R> InternIteratorElement<T, R> for T {
2698     type Output = R;
2699     fn intern_with<I: Iterator<Item=Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output {
2700         f(&iter.collect::<AccumulateVec<[_; 8]>>())
2701     }
2702 }
2703
2704 impl<'a, T, R> InternIteratorElement<T, R> for &'a T
2705     where T: Clone + 'a
2706 {
2707     type Output = R;
2708     fn intern_with<I: Iterator<Item=Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output {
2709         f(&iter.cloned().collect::<AccumulateVec<[_; 8]>>())
2710     }
2711 }
2712
2713 impl<T, R, E> InternIteratorElement<T, R> for Result<T, E> {
2714     type Output = Result<R, E>;
2715     fn intern_with<I: Iterator<Item=Self>, F: FnOnce(&[T]) -> R>(iter: I, f: F) -> Self::Output {
2716         Ok(f(&iter.collect::<Result<AccumulateVec<[_; 8]>, _>>()?))
2717     }
2718 }
2719
2720 pub fn provide(providers: &mut ty::maps::Providers) {
2721     // FIXME(#44234) - almost all of these queries have no sub-queries and
2722     // therefore no actual inputs, they're just reading tables calculated in
2723     // resolve! Does this work? Unsure! That's what the issue is about
2724     providers.in_scope_traits_map = |tcx, id| tcx.gcx.trait_map.get(&id).cloned();
2725     providers.module_exports = |tcx, id| tcx.gcx.export_map.get(&id).cloned();
2726     providers.crate_name = |tcx, id| {
2727         assert_eq!(id, LOCAL_CRATE);
2728         tcx.crate_name
2729     };
2730     providers.get_lang_items = |tcx, id| {
2731         assert_eq!(id, LOCAL_CRATE);
2732         // FIXME(#42293) Right now we insert a `with_ignore` node in the dep
2733         // graph here to ignore the fact that `get_lang_items` below depends on
2734         // the entire crate.  For now this'll prevent false positives of
2735         // recompiling too much when anything changes.
2736         //
2737         // Once red/green incremental compilation lands we should be able to
2738         // remove this because while the crate changes often the lint level map
2739         // will change rarely.
2740         tcx.dep_graph.with_ignore(|| Lrc::new(middle::lang_items::collect(tcx)))
2741     };
2742     providers.freevars = |tcx, id| tcx.gcx.freevars.get(&id).cloned();
2743     providers.maybe_unused_trait_import = |tcx, id| {
2744         tcx.maybe_unused_trait_imports.contains(&id)
2745     };
2746     providers.maybe_unused_extern_crates = |tcx, cnum| {
2747         assert_eq!(cnum, LOCAL_CRATE);
2748         Lrc::new(tcx.maybe_unused_extern_crates.clone())
2749     };
2750
2751     providers.stability_index = |tcx, cnum| {
2752         assert_eq!(cnum, LOCAL_CRATE);
2753         Lrc::new(stability::Index::new(tcx))
2754     };
2755     providers.lookup_stability = |tcx, id| {
2756         assert_eq!(id.krate, LOCAL_CRATE);
2757         let id = tcx.hir.definitions().def_index_to_hir_id(id.index);
2758         tcx.stability().local_stability(id)
2759     };
2760     providers.lookup_deprecation_entry = |tcx, id| {
2761         assert_eq!(id.krate, LOCAL_CRATE);
2762         let id = tcx.hir.definitions().def_index_to_hir_id(id.index);
2763         tcx.stability().local_deprecation_entry(id)
2764     };
2765     providers.extern_mod_stmt_cnum = |tcx, id| {
2766         let id = tcx.hir.as_local_node_id(id).unwrap();
2767         tcx.cstore.extern_mod_stmt_cnum_untracked(id)
2768     };
2769     providers.all_crate_nums = |tcx, cnum| {
2770         assert_eq!(cnum, LOCAL_CRATE);
2771         Lrc::new(tcx.cstore.crates_untracked())
2772     };
2773     providers.postorder_cnums = |tcx, cnum| {
2774         assert_eq!(cnum, LOCAL_CRATE);
2775         Lrc::new(tcx.cstore.postorder_cnums_untracked())
2776     };
2777     providers.output_filenames = |tcx, cnum| {
2778         assert_eq!(cnum, LOCAL_CRATE);
2779         tcx.output_filenames.clone()
2780     };
2781     providers.features_query = |tcx, cnum| {
2782         assert_eq!(cnum, LOCAL_CRATE);
2783         Lrc::new(tcx.sess.features_untracked().clone())
2784     };
2785     providers.is_panic_runtime = |tcx, cnum| {
2786         assert_eq!(cnum, LOCAL_CRATE);
2787         attr::contains_name(tcx.hir.krate_attrs(), "panic_runtime")
2788     };
2789     providers.is_compiler_builtins = |tcx, cnum| {
2790         assert_eq!(cnum, LOCAL_CRATE);
2791         attr::contains_name(tcx.hir.krate_attrs(), "compiler_builtins")
2792     };
2793 }