diff --git a/src/liballoc/rc.rs b/src/liballoc/rc.rs index 416a6ad2d8b7..857814252d5a 100644 --- a/src/liballoc/rc.rs +++ b/src/liballoc/rc.rs @@ -232,6 +232,15 @@ impl Clone for Weak { } } +impl fmt::Show for Weak { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self.upgrade() { + Some(rc) => rc.fmt(f), + _ => "".fmt(f) + } + } +} + #[doc(hidden)] trait RcBoxPtr { fn inner<'a>(&'a self) -> &'a RcBox; @@ -399,4 +408,13 @@ mod tests { assert!(cow1_weak.upgrade().is_none()); } + #[test] + fn test_stale_weak_pointer() { + let strong = Rc::new(75u); + let weak = strong.downgrade(); + assert_eq!(format!("{}", weak), format!("75")); + drop(strong); + assert_eq!(format!("{}", weak), format!("")); + } + }