From 8bf4651e2cbe04511c7e92279073e46e33d3b0fc Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Wed, 1 Jul 2015 15:51:17 -0400 Subject: [PATCH 1/3] Implement CoerceUnsized for rc::Weak Fixes #26704 --- src/liballoc/rc.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/liballoc/rc.rs b/src/liballoc/rc.rs index 3dfafd0a378b..d461eeea0b7e 100644 --- a/src/liballoc/rc.rs +++ b/src/liballoc/rc.rs @@ -734,6 +734,8 @@ pub struct Weak { impl !marker::Send for Weak {} impl !marker::Sync for Weak {} +impl, U: ?Sized> CoerceUnsized> for Weak {} + #[unstable(feature = "rc_weak", reason = "Weak pointers may not belong in this module.")] impl Weak { From 50421827ae6bff8085e499eae1427e6c037d76d1 Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Wed, 1 Jul 2015 17:54:54 -0400 Subject: [PATCH 2/3] Add test to dst-coerce-rc.rs --- src/test/run-pass/dst-coerce-rc.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/run-pass/dst-coerce-rc.rs b/src/test/run-pass/dst-coerce-rc.rs index 67dd4021cb5c..f147a2dca634 100644 --- a/src/test/run-pass/dst-coerce-rc.rs +++ b/src/test/run-pass/dst-coerce-rc.rs @@ -10,10 +10,10 @@ // Test a very simple custom DST coercion. -#![feature(core)] +#![feature(core, rc_weak)] use std::cell::RefCell; -use std::rc::Rc; +use std::rc::{Rc, Weak}; trait Baz { fn get(&self) -> i32; @@ -36,9 +36,13 @@ fn main() { let b: Rc = a.clone(); assert_eq!(b.get(), 42); + let c: Weak = a.downgrade(); + let d: Weak = c.clone(); + let _c = b.clone(); let a: Rc> = Rc::new(RefCell::new(42)); let b: Rc> = a.clone(); assert_eq!(b.borrow().get(), 42); + let c: Weak> = a.downgrade(); } From 3278e793b2d0332c6659b732178892aab11654ee Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Wed, 1 Jul 2015 17:58:05 -0400 Subject: [PATCH 3/3] Implement CoerceUnsized for arc::Weak --- src/liballoc/arc.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/liballoc/arc.rs b/src/liballoc/arc.rs index dd9c1d1fd188..c84649f92e7f 100644 --- a/src/liballoc/arc.rs +++ b/src/liballoc/arc.rs @@ -145,6 +145,8 @@ pub struct Weak { unsafe impl Send for Weak { } unsafe impl Sync for Weak { } +impl, U: ?Sized> CoerceUnsized> for Weak {} + #[stable(feature = "rust1", since = "1.0.0")] impl fmt::Debug for Weak { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {