]> git.lizzy.rs Git - rust.git/commitdiff
Add mk_param_from_def
authorvarkor <github@varkor.com>
Tue, 15 May 2018 12:35:53 +0000 (13:35 +0100)
committervarkor <github@varkor.com>
Tue, 15 May 2018 13:22:25 +0000 (14:22 +0100)
src/librustc/traits/mod.rs
src/librustc/ty/context.rs
src/librustc/ty/subst.rs
src/librustc_mir/monomorphize/collector.rs
src/librustc_traits/dropck_outlives.rs
src/librustc_typeck/astconv.rs
src/librustc_typeck/check/wfcheck.rs
src/librustc_typeck/collect.rs

index 36fedab9e7993958b2d7490b4229b992a6741334..154c6815bb666174d3d7e67dcda7c939c3b5bf35 100644 (file)
@@ -845,7 +845,7 @@ fn vtable_methods<'a, 'tcx>(
                         match param.kind {
                             GenericParamDefKind::Lifetime => tcx.types.re_erased.into(),
                             GenericParamDefKind::Type(_) => {
-                                trait_ref.substs.type_for_def(param).into()
+                                trait_ref.substs[param.index as usize]
                             }
                         }
                     })
index 592f04ca9136a6c44bbce36ed1563a8174ad4ba2..3c345fcd9ee61f15cb01f60abf90ee23cef87cf2 100644 (file)
@@ -2472,8 +2472,13 @@ pub fn mk_self_type(self) -> Ty<'tcx> {
         self.mk_ty_param(0, keywords::SelfType.name().as_interned_str())
     }
 
-    pub fn mk_ty_param_from_def(self, def: &ty::GenericParamDef) -> Ty<'tcx> {
-        self.mk_ty_param(def.index, def.name)
+    pub fn mk_param_from_def(self, param: &ty::GenericParamDef) -> Kind<'tcx> {
+        match param.kind {
+            GenericParamDefKind::Lifetime => {
+                self.mk_region(ty::ReEarlyBound(param.to_early_bound_region_data())).into()
+            }
+            GenericParamDefKind::Type(_) => self.mk_ty_param(param.index, param.name).into(),
+        }
     }
 
     pub fn mk_anon(self, def_id: DefId, substs: &'tcx Substs<'tcx>) -> Ty<'tcx> {
index 3c016b38aff41f02684d8b16474d04033ab1463c..b94b3e17f862fb29f2edcc4aad42c4e7ddbe4c19 100644 (file)
@@ -11,7 +11,7 @@
 // Type substitutions.
 
 use hir::def_id::DefId;
-use ty::{self, Lift, Slice, Region, Ty, TyCtxt, GenericParamDefKind};
+use ty::{self, Lift, Slice, Region, Ty, TyCtxt};
 use ty::fold::{TypeFoldable, TypeFolder, TypeVisitor};
 
 use serialize::{self, Encodable, Encoder, Decodable, Decoder};
@@ -182,12 +182,7 @@ impl<'a, 'gcx, 'tcx> Substs<'tcx> {
     pub fn identity_for_item(tcx: TyCtxt<'a, 'gcx, 'tcx>, def_id: DefId)
                              -> &'tcx Substs<'tcx> {
         Substs::for_item(tcx, def_id, |param, _| {
-            match param.kind {
-                GenericParamDefKind::Lifetime => {
-                    tcx.mk_region(ty::ReEarlyBound(param.to_early_bound_region_data())).into()
-                }
-                GenericParamDefKind::Type(_) => tcx.mk_ty_param_from_def(param).into(),
-            }
+            tcx.mk_param_from_def(param)
         })
     }
 
@@ -293,13 +288,8 @@ pub fn region_at(&self, i: usize) -> ty::Region<'tcx> {
     }
 
     #[inline]
-    pub fn type_for_def(&self, ty_param_def: &ty::GenericParamDef) -> Ty<'tcx> {
-        self.type_at(ty_param_def.index as usize)
-    }
-
-    #[inline]
-    pub fn region_for_def(&self, def: &ty::GenericParamDef) -> ty::Region<'tcx> {
-        self.region_at(def.index as usize)
+    pub fn type_for_def(&self, def: &ty::GenericParamDef) -> Kind<'tcx> {
+        self.type_at(def.index as usize).into()
     }
 
     /// Transform from substitutions for a child of `source_ancestor`
index bff8f2246ab3f31a8395fd997c7e29cdad164b0e..dc2009a02600309b79e35db58b221611e97411de 100644 (file)
@@ -1116,7 +1116,7 @@ fn create_mono_items_for_default_impls<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                         match param.kind {
                             GenericParamDefKind::Lifetime => tcx.types.re_erased.into(),
                             GenericParamDefKind::Type(_) => {
-                                trait_ref.substs.type_for_def(param).into()
+                                trait_ref.substs[param.index as usize]
                             }
                         }
                     });
index 6c2128de272174a85f73b16658bea4f310a42541..7a39b46f799d28b14ad45433d960a696647959e3 100644 (file)
@@ -14,7 +14,7 @@
 use rustc::traits::query::{CanonicalTyGoal, NoSolution};
 use rustc::traits::query::dropck_outlives::{DtorckConstraint, DropckOutlivesResult};
 use rustc::ty::{self, ParamEnvAnd, Ty, TyCtxt};
-use rustc::ty::subst::Subst;
+use rustc::ty::subst::{UnpackedKind, Subst};
 use rustc::util::nodemap::FxHashSet;
 use rustc_data_structures::sync::Lrc;
 use syntax::codemap::{Span, DUMMY_SP};
@@ -278,11 +278,16 @@ fn dtorck_constraint_for_ty<'a, 'gcx, 'tcx>(
     debug!("dtorck_constraint: {:?}", def);
 
     if def.is_phantom_data() {
-        // The first generic parameter here is guaranteed to be a type because it's `PhantomData`.
+        // The first generic parameter here is guaranteed to be a type because it's
+        // `PhantomData`.
         let param = &tcx.generics_of(def_id).params[0];
+        let ty = match tcx.mk_param_from_def(param).unpack() {
+            UnpackedKind::Type(ty) => ty,
+            _ => unreachable!(),
+        };
         let result = DtorckConstraint {
             outlives: vec![],
-            dtorck_types: vec![tcx.mk_ty_param_from_def(param)],
+            dtorck_types: vec![ty],
             overflows: vec![],
         };
         debug!("dtorck_constraint: {:?} => {:?}", def, result);
index dc7c8849f914e5e8f96636151c34a5ad8e660ec3..c1868467503f823d0d17fed9d202de43c73d0873 100644 (file)
@@ -1158,13 +1158,7 @@ pub fn impl_trait_ty_to_ty(&self, def_id: DefId, lifetimes: &[hir::Lifetime]) ->
         if let Some(parent_id) = generics.parent {
             let parent_generics = tcx.generics_of(parent_id);
             Substs::fill_item(&mut substs, tcx, parent_generics, &mut |param, _| {
-                match param.kind {
-                    GenericParamDefKind::Lifetime => {
-                        tcx.mk_region(
-                            ty::ReEarlyBound(param.to_early_bound_region_data())).into()
-                    }
-                    GenericParamDefKind::Type(_) => tcx.mk_ty_param_from_def(param).into(),
-                }
+                tcx.mk_param_from_def(param)
             });
 
             // Replace all lifetimes with 'static
index 34978c4e31bef7307142ebd7f0c0afa06f6c208c..6b873c093c02f616b11e9c58b247ba4b78f668a2 100644 (file)
@@ -409,7 +409,7 @@ fn check_where_clauses<'a, 'gcx, 'fcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'gcx>,
         match param.kind {
             GenericParamDefKind::Lifetime => {
                 // All regions are identity.
-                fcx.tcx.mk_region(ty::ReEarlyBound(param.to_early_bound_region_data())).into()
+                fcx.tcx.mk_param_from_def(param)
             }
             GenericParamDefKind::Type(_) => {
                 // If the param has a default,
index 8eb050783595464532dd5a0a9163cda925b6712a..d659dae2503377d27619d05a38710b798dd1e70f 100644 (file)
@@ -31,7 +31,6 @@
 use middle::resolve_lifetime as rl;
 use rustc::mir::mono::Linkage;
 use rustc::ty::subst::Substs;
-use rustc::ty::GenericParamDefKind;
 use rustc::ty::{ToPredicate, ReprOptions};
 use rustc::ty::{self, AdtKind, ToPolyTraitRef, Ty, TyCtxt};
 use rustc::ty::maps::Providers;
@@ -1098,13 +1097,7 @@ fn type_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
 
             let substs = ty::ClosureSubsts {
                 substs: Substs::for_item(tcx, def_id, |param, _| {
-                    match param.kind {
-                        GenericParamDefKind::Lifetime => {
-                            let region = param.to_early_bound_region_data();
-                            tcx.mk_region(ty::ReEarlyBound(region)).into()
-                        }
-                        GenericParamDefKind::Type(_) => tcx.mk_ty_param_from_def(param).into(),
-                    }
+                    tcx.mk_param_from_def(param)
                 })
             };