Skip to content

Commit

Permalink
Rollup merge of rust-lang#75648 - matklad:lazy-dropck, r=KodrAus
Browse files Browse the repository at this point in the history
Make OnceCell<T> transparent to dropck

See the failed build in

rust-lang#75555 (comment)

for an example where we need this in real life

r? @ghost
  • Loading branch information
tmandry committed Aug 19, 2020
2 parents 0e7e939 + 695d86f commit 4123237
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 4123237

Please sign in to comment.