diff options
Diffstat (limited to 'library/std/src/lazy.rs')
| -rw-r--r-- | library/std/src/lazy.rs | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/library/std/src/lazy.rs b/library/std/src/lazy.rs index 60eba96bcc0..c1d05213e11 100644 --- a/library/std/src/lazy.rs +++ b/library/std/src/lazy.rs @@ -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() }; } } @@ -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(); + } + } } |
