dropck can be bypassed via a trait object method · Issue #26656 · rust-lang/rust (original) (raw)
Navigation Menu
- Explore
- Pricing
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Description
STR
// Using this instead of Fn etc. to take HRTB out of the equation. trait Trigger { fn fire(&self, b: &mut B); } impl<B: Button> Trigger for () { fn fire(&self, b: &mut B) { b.push(); } }
// Still unsound Zook trait Button { fn push(&self); } struct Zook { button: B, trigger: Box<Trigger+'static> }
impl Drop for Zook { fn drop(&mut self) { self.trigger.fire(&mut self.button); } }
// AND struct Bomb { usable: bool } impl Drop for Bomb { fn drop(&mut self) { self.usable = false; } } impl Bomb { fn activate(&self) { assert!(self.usable) } }
enum B<'a> { HarmlessButton, BigRedButton(&'a Bomb) } impl<'a> Button for B<'a> { fn push(&self) { if let B::BigRedButton(borrowed) = *self { borrowed.activate(); } } }
fn main() { let (mut zook, ticking); zook = Zook { button: B::HarmlessButton, trigger: Box::new(()) }; ticking = Bomb { usable: true }; zook.button = B::BigRedButton(&ticking); }
This fails the assertion. cc @pnkfelix. I think the problem here is that Box<Trigger<B>+'static>
does not require that B: 'static
(cc @nikomatsakis).