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")]

8176

pub struct LazyLock<T, F = fn() -> T> {

8277

once: Once,

8378

data: UnsafeCell<Data<T, F>>,

8479

}

85808681

impl<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")]

9098

pub const fn new(f: F) -> LazyLock<T, F> {

9199

LazyLock { 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")]

159164

pub 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")]

195200

impl<T, F> Drop for LazyLock<T, F> {

196201

fn drop(&mut self) {

197202

match 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")]

208213

impl<T, F: FnOnce() -> T> Deref for LazyLock<T, F> {

209214

type 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")]

223228

impl<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")]

232237

impl<T: fmt::Debug, F> fmt::Debug for LazyLock<T, F> {

233238

fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {

234239

let 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")]

246251

unsafe 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")]

250255

impl<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")]

252257

impl<T: UnwindSafe, F: UnwindSafe> UnwindSafe for LazyLock<T, F> {}

253258254259

#[cfg(test)]