Skip to content

Commit 60374c4

Browse files
committed
Auto merge of rust-lang#141842 - jhpratt:rollup-r7ldrl2, r=jhpratt
Rollup of 6 pull requests Successful merges: - rust-lang#141072 (Stabilize feature `result_flattening`) - rust-lang#141215 (std: clarify Clone trait documentation about duplication semantics) - rust-lang#141277 (Miri CI: test aarch64-apple-darwin in PRs instead of the x86_64 target) - rust-lang#141521 (Add `const` support for float rounding methods) - rust-lang#141812 (Fix "consider borrowing" for else-if) - rust-lang#141832 (library: explain TOCTOU races in `fs::remove_dir_all`) r? `@ghost` `@rustbot` modify labels: rollup
2 parents d89e96d + e1a3925 commit 60374c4

File tree

13 files changed

+279
-70
lines changed

13 files changed

+279
-70
lines changed

core/src/clone.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,16 @@
3838

3939
mod uninit;
4040

41-
/// A common trait for the ability to explicitly duplicate an object.
41+
/// A common trait that allows explicit creation of a duplicate value.
42+
///
43+
/// Calling [`clone`] always produces a new value.
44+
/// However, for types that are references to other data (such as smart pointers or references),
45+
/// the new value may still point to the same underlying data, rather than duplicating it.
46+
/// See [`Clone::clone`] for more details.
47+
///
48+
/// This distinction is especially important when using `#[derive(Clone)]` on structs containing
49+
/// smart pointers like `Arc<Mutex<T>>` - the cloned struct will share mutable state with the
50+
/// original.
4251
///
4352
/// Differs from [`Copy`] in that [`Copy`] is implicit and an inexpensive bit-wise copy, while
4453
/// `Clone` is always explicit and may or may not be expensive. In order to enforce
@@ -147,7 +156,16 @@ mod uninit;
147156
#[rustc_diagnostic_item = "Clone"]
148157
#[rustc_trivial_field_reads]
149158
pub trait Clone: Sized {
150-
/// Returns a copy of the value.
159+
/// Returns a duplicate of the value.
160+
///
161+
/// Note that what "duplicate" means varies by type:
162+
/// - For most types, this creates a deep, independent copy
163+
/// - For reference types like `&T`, this creates another reference to the same value
164+
/// - For smart pointers like [`Arc`] or [`Rc`], this increments the reference count
165+
/// but still points to the same underlying data
166+
///
167+
/// [`Arc`]: ../../std/sync/struct.Arc.html
168+
/// [`Rc`]: ../../std/rc/struct.Rc.html
151169
///
152170
/// # Examples
153171
///
@@ -157,6 +175,23 @@ pub trait Clone: Sized {
157175
///
158176
/// assert_eq!("Hello", hello.clone());
159177
/// ```
178+
///
179+
/// Example with a reference-counted type:
180+
///
181+
/// ```
182+
/// use std::sync::{Arc, Mutex};
183+
///
184+
/// let data = Arc::new(Mutex::new(vec![1, 2, 3]));
185+
/// let data_clone = data.clone(); // Creates another Arc pointing to the same Mutex
186+
///
187+
/// {
188+
/// let mut lock = data.lock().unwrap();
189+
/// lock.push(4);
190+
/// }
191+
///
192+
/// // Changes are visible through the clone because they share the same underlying data
193+
/// assert_eq!(*data_clone.lock().unwrap(), vec![1, 2, 3, 4]);
194+
/// ```
160195
#[stable(feature = "rust1", since = "1.0.0")]
161196
#[must_use = "cloning is often expensive and is not expected to have side effects"]
162197
// Clone::clone is special because the compiler generates MIR to implement it for some types.

core/src/intrinsics/mod.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2240,86 +2240,86 @@ pub unsafe fn fmuladdf128(a: f128, b: f128, c: f128) -> f128;
22402240
/// [`f16::floor`](../../std/primitive.f16.html#method.floor)
22412241
#[rustc_intrinsic]
22422242
#[rustc_nounwind]
2243-
pub unsafe fn floorf16(x: f16) -> f16;
2243+
pub const unsafe fn floorf16(x: f16) -> f16;
22442244
/// Returns the largest integer less than or equal to an `f32`.
22452245
///
22462246
/// The stabilized version of this intrinsic is
22472247
/// [`f32::floor`](../../std/primitive.f32.html#method.floor)
22482248
#[rustc_intrinsic]
22492249
#[rustc_nounwind]
2250-
pub unsafe fn floorf32(x: f32) -> f32;
2250+
pub const unsafe fn floorf32(x: f32) -> f32;
22512251
/// Returns the largest integer less than or equal to an `f64`.
22522252
///
22532253
/// The stabilized version of this intrinsic is
22542254
/// [`f64::floor`](../../std/primitive.f64.html#method.floor)
22552255
#[rustc_intrinsic]
22562256
#[rustc_nounwind]
2257-
pub unsafe fn floorf64(x: f64) -> f64;
2257+
pub const unsafe fn floorf64(x: f64) -> f64;
22582258
/// Returns the largest integer less than or equal to an `f128`.
22592259
///
22602260
/// The stabilized version of this intrinsic is
22612261
/// [`f128::floor`](../../std/primitive.f128.html#method.floor)
22622262
#[rustc_intrinsic]
22632263
#[rustc_nounwind]
2264-
pub unsafe fn floorf128(x: f128) -> f128;
2264+
pub const unsafe fn floorf128(x: f128) -> f128;
22652265

22662266
/// Returns the smallest integer greater than or equal to an `f16`.
22672267
///
22682268
/// The stabilized version of this intrinsic is
22692269
/// [`f16::ceil`](../../std/primitive.f16.html#method.ceil)
22702270
#[rustc_intrinsic]
22712271
#[rustc_nounwind]
2272-
pub unsafe fn ceilf16(x: f16) -> f16;
2272+
pub const unsafe fn ceilf16(x: f16) -> f16;
22732273
/// Returns the smallest integer greater than or equal to an `f32`.
22742274
///
22752275
/// The stabilized version of this intrinsic is
22762276
/// [`f32::ceil`](../../std/primitive.f32.html#method.ceil)
22772277
#[rustc_intrinsic]
22782278
#[rustc_nounwind]
2279-
pub unsafe fn ceilf32(x: f32) -> f32;
2279+
pub const unsafe fn ceilf32(x: f32) -> f32;
22802280
/// Returns the smallest integer greater than or equal to an `f64`.
22812281
///
22822282
/// The stabilized version of this intrinsic is
22832283
/// [`f64::ceil`](../../std/primitive.f64.html#method.ceil)
22842284
#[rustc_intrinsic]
22852285
#[rustc_nounwind]
2286-
pub unsafe fn ceilf64(x: f64) -> f64;
2286+
pub const unsafe fn ceilf64(x: f64) -> f64;
22872287
/// Returns the smallest integer greater than or equal to an `f128`.
22882288
///
22892289
/// The stabilized version of this intrinsic is
22902290
/// [`f128::ceil`](../../std/primitive.f128.html#method.ceil)
22912291
#[rustc_intrinsic]
22922292
#[rustc_nounwind]
2293-
pub unsafe fn ceilf128(x: f128) -> f128;
2293+
pub const unsafe fn ceilf128(x: f128) -> f128;
22942294

22952295
/// Returns the integer part of an `f16`.
22962296
///
22972297
/// The stabilized version of this intrinsic is
22982298
/// [`f16::trunc`](../../std/primitive.f16.html#method.trunc)
22992299
#[rustc_intrinsic]
23002300
#[rustc_nounwind]
2301-
pub unsafe fn truncf16(x: f16) -> f16;
2301+
pub const unsafe fn truncf16(x: f16) -> f16;
23022302
/// Returns the integer part of an `f32`.
23032303
///
23042304
/// The stabilized version of this intrinsic is
23052305
/// [`f32::trunc`](../../std/primitive.f32.html#method.trunc)
23062306
#[rustc_intrinsic]
23072307
#[rustc_nounwind]
2308-
pub unsafe fn truncf32(x: f32) -> f32;
2308+
pub const unsafe fn truncf32(x: f32) -> f32;
23092309
/// Returns the integer part of an `f64`.
23102310
///
23112311
/// The stabilized version of this intrinsic is
23122312
/// [`f64::trunc`](../../std/primitive.f64.html#method.trunc)
23132313
#[rustc_intrinsic]
23142314
#[rustc_nounwind]
2315-
pub unsafe fn truncf64(x: f64) -> f64;
2315+
pub const unsafe fn truncf64(x: f64) -> f64;
23162316
/// Returns the integer part of an `f128`.
23172317
///
23182318
/// The stabilized version of this intrinsic is
23192319
/// [`f128::trunc`](../../std/primitive.f128.html#method.trunc)
23202320
#[rustc_intrinsic]
23212321
#[rustc_nounwind]
2322-
pub unsafe fn truncf128(x: f128) -> f128;
2322+
pub const unsafe fn truncf128(x: f128) -> f128;
23232323

23242324
/// Returns the nearest integer to an `f16`. Rounds half-way cases to the number with an even
23252325
/// least significant digit.
@@ -2328,7 +2328,7 @@ pub unsafe fn truncf128(x: f128) -> f128;
23282328
/// [`f16::round_ties_even`](../../std/primitive.f16.html#method.round_ties_even)
23292329
#[rustc_intrinsic]
23302330
#[rustc_nounwind]
2331-
pub fn round_ties_even_f16(x: f16) -> f16;
2331+
pub const fn round_ties_even_f16(x: f16) -> f16;
23322332

23332333
/// Returns the nearest integer to an `f32`. Rounds half-way cases to the number with an even
23342334
/// least significant digit.
@@ -2337,7 +2337,7 @@ pub fn round_ties_even_f16(x: f16) -> f16;
23372337
/// [`f32::round_ties_even`](../../std/primitive.f32.html#method.round_ties_even)
23382338
#[rustc_intrinsic]
23392339
#[rustc_nounwind]
2340-
pub fn round_ties_even_f32(x: f32) -> f32;
2340+
pub const fn round_ties_even_f32(x: f32) -> f32;
23412341

23422342
/// Returns the nearest integer to an `f64`. Rounds half-way cases to the number with an even
23432343
/// least significant digit.
@@ -2346,7 +2346,7 @@ pub fn round_ties_even_f32(x: f32) -> f32;
23462346
/// [`f64::round_ties_even`](../../std/primitive.f64.html#method.round_ties_even)
23472347
#[rustc_intrinsic]
23482348
#[rustc_nounwind]
2349-
pub fn round_ties_even_f64(x: f64) -> f64;
2349+
pub const fn round_ties_even_f64(x: f64) -> f64;
23502350

23512351
/// Returns the nearest integer to an `f128`. Rounds half-way cases to the number with an even
23522352
/// least significant digit.
@@ -2355,36 +2355,36 @@ pub fn round_ties_even_f64(x: f64) -> f64;
23552355
/// [`f128::round_ties_even`](../../std/primitive.f128.html#method.round_ties_even)
23562356
#[rustc_intrinsic]
23572357
#[rustc_nounwind]
2358-
pub fn round_ties_even_f128(x: f128) -> f128;
2358+
pub const fn round_ties_even_f128(x: f128) -> f128;
23592359

23602360
/// Returns the nearest integer to an `f16`. Rounds half-way cases away from zero.
23612361
///
23622362
/// The stabilized version of this intrinsic is
23632363
/// [`f16::round`](../../std/primitive.f16.html#method.round)
23642364
#[rustc_intrinsic]
23652365
#[rustc_nounwind]
2366-
pub unsafe fn roundf16(x: f16) -> f16;
2366+
pub const unsafe fn roundf16(x: f16) -> f16;
23672367
/// Returns the nearest integer to an `f32`. Rounds half-way cases away from zero.
23682368
///
23692369
/// The stabilized version of this intrinsic is
23702370
/// [`f32::round`](../../std/primitive.f32.html#method.round)
23712371
#[rustc_intrinsic]
23722372
#[rustc_nounwind]
2373-
pub unsafe fn roundf32(x: f32) -> f32;
2373+
pub const unsafe fn roundf32(x: f32) -> f32;
23742374
/// Returns the nearest integer to an `f64`. Rounds half-way cases away from zero.
23752375
///
23762376
/// The stabilized version of this intrinsic is
23772377
/// [`f64::round`](../../std/primitive.f64.html#method.round)
23782378
#[rustc_intrinsic]
23792379
#[rustc_nounwind]
2380-
pub unsafe fn roundf64(x: f64) -> f64;
2380+
pub const unsafe fn roundf64(x: f64) -> f64;
23812381
/// Returns the nearest integer to an `f128`. Rounds half-way cases away from zero.
23822382
///
23832383
/// The stabilized version of this intrinsic is
23842384
/// [`f128::round`](../../std/primitive.f128.html#method.round)
23852385
#[rustc_intrinsic]
23862386
#[rustc_nounwind]
2387-
pub unsafe fn roundf128(x: f128) -> f128;
2387+
pub const unsafe fn roundf128(x: f128) -> f128;
23882388

23892389
/// Float addition that allows optimizations based on algebraic rules.
23902390
/// May assume inputs are finite.

core/src/num/f128.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1447,8 +1447,10 @@ impl f128 {
14471447
#[inline]
14481448
#[rustc_allow_incoherent_impl]
14491449
#[unstable(feature = "f128", issue = "116909")]
1450+
#[rustc_const_unstable(feature = "f128", issue = "116909")]
1451+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
14501452
#[must_use = "method returns a new number and does not mutate the original value"]
1451-
pub fn floor(self) -> f128 {
1453+
pub const fn floor(self) -> f128 {
14521454
// SAFETY: intrinsic with no preconditions
14531455
unsafe { intrinsics::floorf128(self) }
14541456
}
@@ -1477,8 +1479,10 @@ impl f128 {
14771479
#[doc(alias = "ceiling")]
14781480
#[rustc_allow_incoherent_impl]
14791481
#[unstable(feature = "f128", issue = "116909")]
1482+
#[rustc_const_unstable(feature = "f128", issue = "116909")]
1483+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
14801484
#[must_use = "method returns a new number and does not mutate the original value"]
1481-
pub fn ceil(self) -> f128 {
1485+
pub const fn ceil(self) -> f128 {
14821486
// SAFETY: intrinsic with no preconditions
14831487
unsafe { intrinsics::ceilf128(self) }
14841488
}
@@ -1513,8 +1517,10 @@ impl f128 {
15131517
#[inline]
15141518
#[rustc_allow_incoherent_impl]
15151519
#[unstable(feature = "f128", issue = "116909")]
1520+
#[rustc_const_unstable(feature = "f128", issue = "116909")]
1521+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
15161522
#[must_use = "method returns a new number and does not mutate the original value"]
1517-
pub fn round(self) -> f128 {
1523+
pub const fn round(self) -> f128 {
15181524
// SAFETY: intrinsic with no preconditions
15191525
unsafe { intrinsics::roundf128(self) }
15201526
}
@@ -1547,8 +1553,10 @@ impl f128 {
15471553
#[inline]
15481554
#[rustc_allow_incoherent_impl]
15491555
#[unstable(feature = "f128", issue = "116909")]
1556+
#[rustc_const_unstable(feature = "f128", issue = "116909")]
1557+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
15501558
#[must_use = "method returns a new number and does not mutate the original value"]
1551-
pub fn round_ties_even(self) -> f128 {
1559+
pub const fn round_ties_even(self) -> f128 {
15521560
intrinsics::round_ties_even_f128(self)
15531561
}
15541562

@@ -1579,8 +1587,10 @@ impl f128 {
15791587
#[doc(alias = "truncate")]
15801588
#[rustc_allow_incoherent_impl]
15811589
#[unstable(feature = "f128", issue = "116909")]
1590+
#[rustc_const_unstable(feature = "f128", issue = "116909")]
1591+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
15821592
#[must_use = "method returns a new number and does not mutate the original value"]
1583-
pub fn trunc(self) -> f128 {
1593+
pub const fn trunc(self) -> f128 {
15841594
// SAFETY: intrinsic with no preconditions
15851595
unsafe { intrinsics::truncf128(self) }
15861596
}
@@ -1610,8 +1620,10 @@ impl f128 {
16101620
#[inline]
16111621
#[rustc_allow_incoherent_impl]
16121622
#[unstable(feature = "f128", issue = "116909")]
1623+
#[rustc_const_unstable(feature = "f128", issue = "116909")]
1624+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
16131625
#[must_use = "method returns a new number and does not mutate the original value"]
1614-
pub fn fract(self) -> f128 {
1626+
pub const fn fract(self) -> f128 {
16151627
self - self.trunc()
16161628
}
16171629

core/src/num/f16.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,8 +1423,10 @@ impl f16 {
14231423
#[inline]
14241424
#[rustc_allow_incoherent_impl]
14251425
#[unstable(feature = "f16", issue = "116909")]
1426+
#[rustc_const_unstable(feature = "f16", issue = "116909")]
1427+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
14261428
#[must_use = "method returns a new number and does not mutate the original value"]
1427-
pub fn floor(self) -> f16 {
1429+
pub const fn floor(self) -> f16 {
14281430
// SAFETY: intrinsic with no preconditions
14291431
unsafe { intrinsics::floorf16(self) }
14301432
}
@@ -1453,8 +1455,10 @@ impl f16 {
14531455
#[doc(alias = "ceiling")]
14541456
#[rustc_allow_incoherent_impl]
14551457
#[unstable(feature = "f16", issue = "116909")]
1458+
#[rustc_const_unstable(feature = "f16", issue = "116909")]
1459+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
14561460
#[must_use = "method returns a new number and does not mutate the original value"]
1457-
pub fn ceil(self) -> f16 {
1461+
pub const fn ceil(self) -> f16 {
14581462
// SAFETY: intrinsic with no preconditions
14591463
unsafe { intrinsics::ceilf16(self) }
14601464
}
@@ -1489,8 +1493,10 @@ impl f16 {
14891493
#[inline]
14901494
#[rustc_allow_incoherent_impl]
14911495
#[unstable(feature = "f16", issue = "116909")]
1496+
#[rustc_const_unstable(feature = "f16", issue = "116909")]
1497+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
14921498
#[must_use = "method returns a new number and does not mutate the original value"]
1493-
pub fn round(self) -> f16 {
1499+
pub const fn round(self) -> f16 {
14941500
// SAFETY: intrinsic with no preconditions
14951501
unsafe { intrinsics::roundf16(self) }
14961502
}
@@ -1523,8 +1529,10 @@ impl f16 {
15231529
#[inline]
15241530
#[rustc_allow_incoherent_impl]
15251531
#[unstable(feature = "f16", issue = "116909")]
1532+
#[rustc_const_unstable(feature = "f16", issue = "116909")]
1533+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
15261534
#[must_use = "method returns a new number and does not mutate the original value"]
1527-
pub fn round_ties_even(self) -> f16 {
1535+
pub const fn round_ties_even(self) -> f16 {
15281536
intrinsics::round_ties_even_f16(self)
15291537
}
15301538

@@ -1555,8 +1563,10 @@ impl f16 {
15551563
#[doc(alias = "truncate")]
15561564
#[rustc_allow_incoherent_impl]
15571565
#[unstable(feature = "f16", issue = "116909")]
1566+
#[rustc_const_unstable(feature = "f16", issue = "116909")]
1567+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
15581568
#[must_use = "method returns a new number and does not mutate the original value"]
1559-
pub fn trunc(self) -> f16 {
1569+
pub const fn trunc(self) -> f16 {
15601570
// SAFETY: intrinsic with no preconditions
15611571
unsafe { intrinsics::truncf16(self) }
15621572
}
@@ -1586,8 +1596,10 @@ impl f16 {
15861596
#[inline]
15871597
#[rustc_allow_incoherent_impl]
15881598
#[unstable(feature = "f16", issue = "116909")]
1599+
#[rustc_const_unstable(feature = "f16", issue = "116909")]
1600+
// #[rustc_const_unstable(feature = "const_float_round_methods", issue = "141555")]
15891601
#[must_use = "method returns a new number and does not mutate the original value"]
1590-
pub fn fract(self) -> f16 {
1602+
pub const fn fract(self) -> f16 {
15911603
self - self.trunc()
15921604
}
15931605

0 commit comments

Comments
 (0)