//@ run-pass #![allow(dead_code)] struct DroppableStruct; enum DroppableEnum { DroppableVariant1, DroppableVariant2 } static mut DROPPED: bool = false; impl Drop for DroppableStruct { fn drop(&mut self) { unsafe { DROPPED = true; } } } impl Drop for DroppableEnum { fn drop(&mut self) { unsafe { DROPPED = true; } } } trait MyTrait { fn dummy(&self) { } } impl MyTrait for Box {} impl MyTrait for Box {} struct Whatever { w: Box } impl Whatever { fn new(w: Box) -> Whatever { Whatever { w: w } } } fn main() { { let f: Box<_> = Box::new(DroppableStruct); let _a = Whatever::new(Box::new(f) as Box); } assert!(unsafe { DROPPED }); unsafe { DROPPED = false; } { let f: Box<_> = Box::new(DroppableEnum::DroppableVariant1); let _a = Whatever::new(Box::new(f) as Box); } assert!(unsafe { DROPPED }); }