Skip to content

Commit

Permalink
Auto merge of rust-lang#76370 - fusion-engineering-forks:synconcecell…
Browse files Browse the repository at this point in the history
…-soundness, r=nagisa

Fix dropck issue of SyncOnceCell.

Fixes rust-lang#76367.
  • Loading branch information
bors committed Sep 6, 2020
2 parents 6c6003a + e56ea68 commit 23e49dd
Showing 1 changed file with 26 additions and 1 deletion.
27 changes: 26 additions & 1 deletion library/std/src/lazy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ mod tests;
use crate::{
cell::{Cell, UnsafeCell},
fmt,
marker::PhantomData,
mem::{self, MaybeUninit},
ops::{Deref, Drop},
panic::{RefUnwindSafe, UnwindSafe},
Expand Down Expand Up @@ -46,6 +47,26 @@ pub struct SyncOnceCell<T> {
once: Once,
// Whether or not the value is initialized is tracked by `state_and_queue`.
value: UnsafeCell<MaybeUninit<T>>,
/// `PhantomData` to make sure dropck understands we're dropping T in our Drop impl.
///
/// ```compile_fail,E0597
/// #![feature(once_cell)]
///
/// use std::lazy::SyncOnceCell;
///
/// struct A<'a>(&'a str);
///
/// impl<'a> Drop for A<'a> {
/// fn drop(&mut self) {}
/// }
///
/// let cell = SyncOnceCell::new();
/// {
/// let s = String::new();
/// let _ = cell.set(A(&s));
/// }
/// ```
_marker: PhantomData<T>,
}

// Why do we need `T: Send`?
Expand Down Expand Up @@ -119,7 +140,11 @@ impl<T> SyncOnceCell<T> {
/// Creates a new empty cell.
#[unstable(feature = "once_cell", issue = "74465")]
pub const fn new() -> SyncOnceCell<T> {
SyncOnceCell { once: Once::new(), value: UnsafeCell::new(MaybeUninit::uninit()) }
SyncOnceCell {
once: Once::new(),
value: UnsafeCell::new(MaybeUninit::uninit()),
_marker: PhantomData,
}
}

/// Gets the reference to the underlying value.
Expand Down

0 comments on commit 23e49dd

Please sign in to comment.