Stabilize `LazyCell` and `LazyLock` (`lazy_cell`) · model-checking/verify-rust-std@511fe47
@@ -31,8 +31,6 @@ union Data<T, F> {
3131/// Initialize static variables with `LazyLock`.
3232///
3333/// ```
34-/// #![feature(lazy_cell)]
35-///
3634/// use std::collections::HashMap;
3735///
3836/// use std::sync::LazyLock;
@@ -61,8 +59,6 @@ union Data<T, F> {
6159/// ```
6260/// Initialize fields with `LazyLock`.
6361/// ```
64-/// #![feature(lazy_cell)]
65-///
6662/// use std::sync::LazyLock;
6763///
6864/// #[derive(Debug)]
@@ -76,17 +72,29 @@ union Data<T, F> {
7672/// println!("{}", *data.number);
7773/// }
7874/// ```
79-80-#[unstable(feature = "lazy_cell", issue = "109736")]
75+#[stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
8176pub struct LazyLock<T, F = fn() -> T> {
8277once: Once,
8378data: UnsafeCell<Data<T, F>>,
8479}
85808681impl<T, F: FnOnce() -> T> LazyLock<T, F> {
8782/// Creates a new lazy value with the given initializing function.
83+ ///
84+ /// # Examples
85+ ///
86+ /// ```
87+ /// use std::sync::LazyLock;
88+ ///
89+ /// let hello = "Hello, World!".to_string();
90+ ///
91+ /// let lazy = LazyLock::new(|| hello.to_uppercase());
92+ ///
93+ /// assert_eq!(&*lazy, "HELLO, WORLD!");
94+ /// ```
8895 #[inline]
89-#[unstable(feature = "lazy_cell", issue = "109736")]
96+#[stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
97+#[rustc_const_stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
9098pub const fn new(f: F) -> LazyLock<T, F> {
9199LazyLock { once: Once::new(), data: UnsafeCell::new(Data { f: ManuallyDrop::new(f) }) }
92100}
@@ -107,7 +115,6 @@ impl<T, F: FnOnce() -> T> LazyLock<T, F> {
107115 /// # Examples
108116 ///
109117 /// ```
110- /// #![feature(lazy_cell)]
111118 /// #![feature(lazy_cell_consume)]
112119 ///
113120 /// use std::sync::LazyLock;
@@ -145,8 +152,6 @@ impl<T, F: FnOnce() -> T> LazyLock<T, F> {
145152 /// # Examples
146153 ///
147154 /// ```
148- /// #![feature(lazy_cell)]
149- ///
150155 /// use std::sync::LazyLock;
151156 ///
152157 /// let lazy = LazyLock::new(|| 92);
@@ -155,7 +160,7 @@ impl<T, F: FnOnce() -> T> LazyLock<T, F> {
155160 /// assert_eq!(&*lazy, &92);
156161 /// ```
157162 #[inline]
158-#[unstable(feature = "lazy_cell", issue = "109736")]
163+#[stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
159164pub fn force(this: &LazyLock<T, F>) -> &T {
160165 this.once.call_once(|| {
161166// SAFETY: `call_once` only runs this closure once, ever.
@@ -191,7 +196,7 @@ impl<T, F> LazyLock<T, F> {
191196}
192197}
193198194-#[unstable(feature = "lazy_cell", issue = "109736")]
199+#[stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
195200impl<T, F> Drop for LazyLock<T, F> {
196201fn drop(&mut self) {
197202match self.once.state() {
@@ -204,7 +209,7 @@ impl<T, F> Drop for LazyLock<T, F> {
204209}
205210}
206211207-#[unstable(feature = "lazy_cell", issue = "109736")]
212+#[stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
208213impl<T, F: FnOnce() -> T> Deref for LazyLock<T, F> {
209214type Target = T;
210215@@ -219,7 +224,7 @@ impl<T, F: FnOnce() -> T> Deref for LazyLock<T, F> {
219224}
220225}
221226222-#[unstable(feature = "lazy_cell", issue = "109736")]
227+#[stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
223228impl<T: Default> Default for LazyLock<T> {
224229/// Creates a new lazy value using `Default` as the initializing function.
225230 #[inline]
@@ -228,7 +233,7 @@ impl<T: Default> Default for LazyLock<T> {
228233}
229234}
230235231-#[unstable(feature = "lazy_cell", issue = "109736")]
236+#[stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
232237impl<T: fmt::Debug, F> fmt::Debug for LazyLock<T, F> {
233238fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
234239let mut d = f.debug_tuple("LazyLock");
@@ -242,13 +247,13 @@ impl<T: fmt::Debug, F> fmt::Debug for LazyLock<T, F> {
242247243248// We never create a `&F` from a `&LazyLock<T, F>` so it is fine
244249// to not impl `Sync` for `F`.
245-#[unstable(feature = "lazy_cell", issue = "109736")]
250+#[stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
246251unsafe impl<T: Sync + Send, F: Send> Sync for LazyLock<T, F> {}
247252// auto-derived `Send` impl is OK.
248253249-#[unstable(feature = "lazy_cell", issue = "109736")]
254+#[stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
250255impl<T: RefUnwindSafe + UnwindSafe, F: UnwindSafe> RefUnwindSafe for LazyLock<T, F> {}
251-#[unstable(feature = "lazy_cell", issue = "109736")]
256+#[stable(feature = "lazy_cell", since = "CURRENT_RUSTC_VERSION")]
252257impl<T: UnwindSafe, F: UnwindSafe> UnwindSafe for LazyLock<T, F> {}
253258254259#[cfg(test)]