| //@ 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<DroppableStruct> {} |
| impl MyTrait for Box<DroppableEnum> {} |
| |
| struct Whatever { w: Box<dyn MyTrait+'static> } |
| impl Whatever { |
| fn new(w: Box<dyn MyTrait+'static>) -> Whatever { |
| Whatever { w: w } |
| } |
| } |
| |
| fn main() { |
| { |
| let f: Box<_> = Box::new(DroppableStruct); |
| let _a = Whatever::new(Box::new(f) as Box<dyn MyTrait>); |
| } |
| assert!(unsafe { DROPPED }); |
| unsafe { DROPPED = false; } |
| { |
| let f: Box<_> = Box::new(DroppableEnum::DroppableVariant1); |
| let _a = Whatever::new(Box::new(f) as Box<dyn MyTrait>); |
| } |
| assert!(unsafe { DROPPED }); |
| } |