diff --git a/src/lib.rs b/src/lib.rs
index f76cb79008c278bb0ed7343ec0c9529e4042f349..16b985a6301bf86c10a856e9b7e98c5facc87e3c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -243,10 +243,9 @@ mod tests {
 
     use std::cell::RefCell;
     use std::fmt::Display;
+    use std::panic::{self, AssertUnwindSafe};
     use std::pin::pin;
-    use std::ptr;
     use std::rc::Rc;
-    use std::panic::{self, AssertUnwindSafe};
 
     fn iter_pinned_mut<T>(slice: Pin<&mut [T]>) -> impl Iterator<Item = Pin<&mut T>> {
         unsafe {
@@ -366,18 +365,16 @@ mod tests {
     #[test]
     #[should_panic = "projected from different roots"]
     fn project_multiple() {
-        let target = ProjectTarget::new(0);
-        // pretend we leak the target here without actually leaking
-        let target_leak = unsafe { &*ptr::from_ref(&target) };
+        let target = Rc::new(ProjectTarget::new(0));
 
         let root1 = pin!(Root::new());
-        let xrc1 = root1.unclaimed().claim(NoReclaim(()));
+        let xrc1 = root1.unclaimed().claim(NoReclaim(target.clone()));
 
         let root2 = pin!(Root::new());
-        let xrc2 = root2.unclaimed().claim(NoReclaim(()));
+        let xrc2 = root2.unclaimed().claim(NoReclaim(target));
 
-        let _ = Xrc::project(xrc1, |_| target_leak);
-        let _ = Xrc::project(xrc2, |_| target_leak);
+        let _ = Xrc::project(xrc1, |xrc| &*xrc.0);
+        let _ = Xrc::project(xrc2, |xrc| &*xrc.0);
     }
 
     #[test]