Make OnceCell<T> transparent to dropck
See the failed build in
https://github.com/rust-lang/rust/pull/75555#issuecomment-
675016718
for an example where we need this in real life
r? @ghost
});
eprintln!("use after free: {:?}", dangling_ref.get().unwrap());
}
+
+#[test]
+fn dropck() {
+ let cell = OnceCell::new();
+ {
+ let s = String::new();
+ cell.set(&s).unwrap();
+ }
+}
}
}
-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() };
}
}
assert_eq!(msg, MSG);
}
}
+
+ #[test]
+ fn dropck() {
+ let cell = SyncOnceCell::new();
+ {
+ let s = String::new();
+ cell.set(&s).unwrap();
+ }
+ }
}