diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2018-02-07 13:39:10 -0800 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2018-02-07 16:18:14 -0800 |
commit | 72761d1252d502b0429a39ebbb3ad45ce458fe7a (patch) | |
tree | d921aca15bda28c896832a363760b993a0aa3588 | |
parent | ea86482489ffdca96f915319b2dad8a09a43050a (diff) | |
download | rust-clone-shim-split.tar.gz |
Pass down the self def id instead of the typeclone-shim-split
-rw-r--r-- | src/librustc/ich/impls_ty.rs | 7 | ||||
-rw-r--r-- | src/librustc/ty/instance.rs | 21 | ||||
-rw-r--r-- | src/librustc/ty/mod.rs | 2 | ||||
-rw-r--r-- | src/librustc_mir/interpret/terminator/mod.rs | 2 | ||||
-rw-r--r-- | src/librustc_mir/monomorphize/collector.rs | 4 | ||||
-rw-r--r-- | src/librustc_mir/monomorphize/partitioning.rs | 6 | ||||
-rw-r--r-- | src/librustc_mir/shim.rs | 5 |
7 files changed, 30 insertions, 17 deletions
diff --git a/src/librustc/ich/impls_ty.rs b/src/librustc/ich/impls_ty.rs index 8f33dde4229..cb7f1221c7d 100644 --- a/src/librustc/ich/impls_ty.rs +++ b/src/librustc/ich/impls_ty.rs @@ -761,8 +761,11 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for ty::InstanceDef<'gcx> { ty::InstanceDef::CloneCopyShim(def_id) => { def_id.hash_stable(hcx, hasher); } - ty::InstanceDef::CloneStructuralShim(def_id, t) | - ty::InstanceDef::CloneNominalShim(def_id, t) => { + ty::InstanceDef::CloneNominalShim { clone, ty } => { + clone.hash_stable(hcx, hasher); + ty.hash_stable(hcx, hasher); + } + ty::InstanceDef::CloneStructuralShim(def_id, t) => { def_id.hash_stable(hcx, hasher); t.hash_stable(hcx, hasher); } diff --git a/src/librustc/ty/instance.rs b/src/librustc/ty/instance.rs index 3812ba16347..9727e54e229 100644 --- a/src/librustc/ty/instance.rs +++ b/src/librustc/ty/instance.rs @@ -47,7 +47,7 @@ pub enum InstanceDef<'tcx> { ///`<T as Clone>::clone` shim for arrays and tuples CloneStructuralShim(DefId, Ty<'tcx>), ///`<T as Clone>::clone` shim for closures - CloneNominalShim(DefId, Ty<'tcx>), + CloneNominalShim { clone: DefId, ty: DefId }, } impl<'a, 'tcx> Instance<'tcx> { @@ -72,7 +72,7 @@ impl<'tcx> InstanceDef<'tcx> { InstanceDef::DropGlue(def_id, _) | InstanceDef::CloneCopyShim(def_id) | InstanceDef::CloneStructuralShim(def_id, _) | - InstanceDef::CloneNominalShim(def_id, _) => def_id + InstanceDef::CloneNominalShim{ clone: def_id, ..} => def_id } } @@ -138,11 +138,11 @@ impl<'tcx> fmt::Display for Instance<'tcx> { InstanceDef::DropGlue(_, ty) => { write!(f, " - shim({:?})", ty) } - InstanceDef::CloneCopyShim(def) => { + InstanceDef::CloneCopyShim(def) | + InstanceDef::CloneNominalShim { ty: def, ..} => { write!(f, " - shim({:?})", def) } - InstanceDef::CloneStructuralShim(_, ty) | - InstanceDef::CloneNominalShim(_, ty) => { + InstanceDef::CloneStructuralShim(_, ty) => { write!(f, " - shim({:?})", ty) } } @@ -300,6 +300,7 @@ fn resolve_associated_item<'a, 'tcx>( } traits::VtableBuiltin(..) => { if let Some(_) = tcx.lang_items().clone_trait() { + let mut substs = rcvr_substs; let name = tcx.item_name(def_id); let def = if name == "clone" { let self_ty = trait_ref.self_ty(); @@ -309,7 +310,13 @@ fn resolve_associated_item<'a, 'tcx>( } ty::TyArray(..) => ty::InstanceDef::CloneStructuralShim(def_id, self_ty), ty::TyTuple(..) => ty::InstanceDef::CloneStructuralShim(def_id, self_ty), - ty::TyClosure(..) => ty::InstanceDef::CloneNominalShim(def_id, self_ty), + ty::TyClosure(ty_did, closure_substs) => { + substs = closure_substs.substs; + ty::InstanceDef::CloneNominalShim { + clone: def_id, + ty: ty_did + } + } _ => unreachable!("Type {:?} does not have clone shims", self_ty) } } else { @@ -317,7 +324,7 @@ fn resolve_associated_item<'a, 'tcx>( }; Some(Instance { def, - substs: rcvr_substs + substs }) } else { None diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 4037df26b55..e29fa4a4d8e 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -2353,7 +2353,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { ty::InstanceDef::DropGlue(..) | ty::InstanceDef::CloneCopyShim(..) | ty::InstanceDef::CloneStructuralShim(..) | - ty::InstanceDef::CloneNominalShim(..) => { + ty::InstanceDef::CloneNominalShim { .. } => { self.mir_shims(instance) } } diff --git a/src/librustc_mir/interpret/terminator/mod.rs b/src/librustc_mir/interpret/terminator/mod.rs index da664acc6f1..932e4c5e3a9 100644 --- a/src/librustc_mir/interpret/terminator/mod.rs +++ b/src/librustc_mir/interpret/terminator/mod.rs @@ -297,7 +297,7 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> { ty::InstanceDef::DropGlue(..) | ty::InstanceDef::CloneCopyShim(..) | ty::InstanceDef::CloneStructuralShim(..) | - ty::InstanceDef::CloneNominalShim(..) | + ty::InstanceDef::CloneNominalShim { .. } | ty::InstanceDef::Item(_) => { // Push the stack frame, and potentially be entirely done if the call got hooked if M::eval_fn_call(self, instance, destination, args, span, sig)? { diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 52739420dfb..37c407c1426 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -713,7 +713,7 @@ fn visit_instance_use<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, ty::InstanceDef::FnPtrShim(..) | ty::InstanceDef::CloneCopyShim(..) | ty::InstanceDef::CloneStructuralShim(..) | - ty::InstanceDef::CloneNominalShim(..) => { + ty::InstanceDef::CloneNominalShim { .. } => { output.push(create_fn_mono_item(instance)); } } @@ -733,7 +733,7 @@ fn should_monomorphize_locally<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, instance: ty::InstanceDef::Intrinsic(_) | ty::InstanceDef::CloneCopyShim(..) | ty::InstanceDef::CloneStructuralShim(..) | - ty::InstanceDef::CloneNominalShim(..) => return true + ty::InstanceDef::CloneNominalShim { .. } => return true }; match tcx.hir.get_if_local(def_id) { Some(hir_map::NodeForeignItem(..)) => { diff --git a/src/librustc_mir/monomorphize/partitioning.rs b/src/librustc_mir/monomorphize/partitioning.rs index a73ec0deeb8..a5332517290 100644 --- a/src/librustc_mir/monomorphize/partitioning.rs +++ b/src/librustc_mir/monomorphize/partitioning.rs @@ -177,7 +177,7 @@ pub trait CodegenUnitExt<'tcx> { InstanceDef::DropGlue(..) | InstanceDef::CloneCopyShim(..) | InstanceDef::CloneStructuralShim(..) | - InstanceDef::CloneNominalShim(..) => { + InstanceDef::CloneNominalShim { .. } => { None } } @@ -380,7 +380,7 @@ fn place_root_translation_items<'a, 'tcx, I>(tcx: TyCtxt<'a, 'tcx, 'tcx>, InstanceDef::DropGlue(..) | InstanceDef::CloneCopyShim(..) | InstanceDef::CloneStructuralShim(..) | - InstanceDef::CloneNominalShim(..) => { + InstanceDef::CloneNominalShim { .. } => { Visibility::Hidden } }; @@ -625,7 +625,7 @@ fn characteristic_def_id_of_trans_item<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, ty::InstanceDef::Virtual(..) | ty::InstanceDef::CloneCopyShim(..) | ty::InstanceDef::CloneStructuralShim(..) | - ty::InstanceDef::CloneNominalShim(..) => return None + ty::InstanceDef::CloneNominalShim { .. } => return None }; // If this is a method, we want to put it into the same module as diff --git a/src/librustc_mir/shim.rs b/src/librustc_mir/shim.rs index 98889c1047c..e77d9479f68 100644 --- a/src/librustc_mir/shim.rs +++ b/src/librustc_mir/shim.rs @@ -106,7 +106,10 @@ fn make_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, builder.copy_shim(); builder.into_mir() } - ty::InstanceDef::CloneNominalShim(def_id, ty) | + ty::InstanceDef::CloneNominalShim { clone, ty } => { + let ty = tcx.type_of(ty); + build_clone_shim(tcx, clone, ty) + } ty::InstanceDef::CloneStructuralShim(def_id, ty) => { build_clone_shim(tcx, def_id, ty) } |