summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2018-02-07 13:39:10 -0800
committerManish Goregaokar <manishsmail@gmail.com>2018-02-07 16:18:14 -0800
commit72761d1252d502b0429a39ebbb3ad45ce458fe7a (patch)
treed921aca15bda28c896832a363760b993a0aa3588
parentea86482489ffdca96f915319b2dad8a09a43050a (diff)
downloadrust-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.rs7
-rw-r--r--src/librustc/ty/instance.rs21
-rw-r--r--src/librustc/ty/mod.rs2
-rw-r--r--src/librustc_mir/interpret/terminator/mod.rs2
-rw-r--r--src/librustc_mir/monomorphize/collector.rs4
-rw-r--r--src/librustc_mir/monomorphize/partitioning.rs6
-rw-r--r--src/librustc_mir/shim.rs5
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)
}