Skip to content

Commit

Permalink
Add raw pointer variant of rust-lang#90752 with incorrect behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
ecstatic-morse committed Nov 13, 2021
1 parent d846fe0 commit ece0e6a
Showing 1 changed file with 41 additions and 0 deletions.
41 changes: 41 additions & 0 deletions src/test/ui/drop/issue-90752-raw-ptr-shenanigans.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// run-pass

use std::cell::RefCell;

struct S<'a>(i32, &'a RefCell<Vec<i32>>);

impl<'a> Drop for S<'a> {
fn drop(&mut self) {
self.1.borrow_mut().push(self.0);
}
}

fn test(drops: &RefCell<Vec<i32>>) {
let mut foo = None;
let pfoo: *mut _ = &mut foo;

match foo {
None => (),
_ => return,
}

// Both S(0) and S(1) should be dropped, but aren't.
unsafe { *pfoo = Some((S(0, drops), S(1, drops))); }

match foo {
Some((_x, _)) => {}
_ => {}
}
}

fn main() {
let drops = RefCell::new(Vec::new());
test(&drops);

// Ideally, we want this...
//assert_eq!(*drops.borrow(), &[0, 1]);

// But the delayed access through the raw pointer confuses drop elaboration,
// causing S(1) to be leaked.
assert_eq!(*drops.borrow(), &[0]);
}

0 comments on commit ece0e6a

Please sign in to comment.