Skip to content

Commit

Permalink
Make OnceCell<T> transparent to dropck
Browse files Browse the repository at this point in the history
See the failed build in

rust-lang#75555 (comment)

for an example where we need this in real life
  • Loading branch information
matklad committed Aug 17, 2020
1 parent 33c96b4 commit 695d86f
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
9 changes: 9 additions & 0 deletions library/core/tests/lazy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,3 +122,12 @@ fn reentrant_init() {
});
eprintln!("use after free: {:?}", dangling_ref.get().unwrap());
}

#[test]
fn dropck() {
let cell = OnceCell::new();
{
let s = String::new();
cell.set(&s).unwrap();
}
}
14 changes: 12 additions & 2 deletions library/std/src/lazy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -386,9 +386,10 @@ impl<T> SyncOnceCell<T> {
}
}

impl<T> Drop for SyncOnceCell<T> {
unsafe impl<#[may_dangle] T> Drop for SyncOnceCell<T> {
fn drop(&mut self) {
// Safety: The cell is being dropped, so it can't be accessed again
// Safety: The cell is being dropped, so it can't be accessed again.
// We also don't touch the `T`, which validates our usage of #[may_dangle].
unsafe { self.take_inner() };
}
}
Expand Down Expand Up @@ -845,4 +846,13 @@ mod tests {
assert_eq!(msg, MSG);
}
}

#[test]
fn dropck() {
let cell = SyncOnceCell::new();
{
let s = String::new();
cell.set(&s).unwrap();
}
}
}

0 comments on commit 695d86f

Please sign in to comment.