rust/library/std/src
Jubilee 17dcadd587
Rollup merge of #133003 - zachs18:clonetouninit-dyn-compat-u8, r=dtolnay
Make `CloneToUninit` dyn-compatible

Make `CloneToUninit` dyn-compatible, by making `clone_to_uninit`'s `dst` parameter `*mut u8` instead of `*mut Self`, so the method does not reference `Self` except in the `self` parameter and is thus dispatchable from a trait object.

This allows, among other things, adding `CloneToUninit` as a supertrait bound for `trait Foo` to allow cloning `dyn Foo` in some containers. Currently, this means that `Rc::make_mut` and `Arc::make_mut` can work with `dyn Foo` where `trait Foo: CloneToUninit`.

<details><summary>Example</summary>

```rs
#![feature(clone_to_uninit)]
use std::clone::CloneToUninit;
use std::rc::Rc;
use std::fmt::Debug;
use std::borrow::BorrowMut;

trait Foo: BorrowMut<u32> + CloneToUninit + Debug {}

impl<T: BorrowMut<u32> + CloneToUninit + Debug> Foo for T {}

fn main() {
    let foo: Rc<dyn Foo> = Rc::new(42_u32);
    let mut bar = foo.clone();
    *Rc::make_mut(&mut bar).borrow_mut() = 37;
    dbg!(foo, bar); // 42, 37
}
```

</details>

Eventually, `Box::<T>::clone` is planned to be converted to use `T::clone_to_uninit`, which when combined with this change, will allow cloning `Box<dyn Foo>` where `trait Foo: CloneToUninit` without any additional `unsafe` code for the author of `trait Foo`.[^1]

This PR should have no stable side-effects, as `CloneToUninit` is unstable so cannot be mentioned on stable, and `CloneToUninit` is not used as a supertrait anywhere in the stdlib.

This change removes some length checks that could only fail if library UB was already hit (e.g. calling `<[T]>::clone_to_uninit` with a too-small-length `dst` is library UB and was previously detected[^2]; since `dst` does not have a length anymore, this now cannot be detected[^3]).

r? libs-api

-----

I chose to make the parameter `*mut u8` instead of `*mut ()` because that might make it simpler to pass the result of `alloc` to `clone_to_uninit`, but `*mut ()` would also make sense, and any `*mut ConcreteType` would *work*. The original motivation for [using specifically `*mut ()`](https://github.com/rust-lang/rust/pull/116113#discussion_r1335303908) appears to be `std::ptr::from_raw_parts_mut`, but that now [takes `*mut impl Thin`](https://doc.rust-lang.org/nightly/std/ptr/fn.from_raw_parts.html) instead of `*mut ()`. I have another branch where the parameter is `*mut ()`, if that is preferred.

It *could* also take something like `&mut [MaybeUninit<u8>]` to be dyn-compatible but still allow size-checking and in some cases safe writing, but this is already an `unsafe` API where misuse is UB, so I'm not sure how many guardrails it's worth adding here, and `&mut [MaybeUninit<u8>]` might be overly cumbersome to construct for callers compared to `*mut u8`

[^1]:  Note that  `impl<T: CloneToUninit + ?Sized> Clone for Box` must be added before or at the same time as when `CloneToUninit` becomes stable, due to `Box` being `#[fundamental]`, as if there is any stable gap between the stabilization of `CloneToUninit` and `impl<T: CloneToUninit + ?Sized> Clone for Box`, then users could implement both `CloneToUninit for dyn LocalTrait` and separately `Clone for Box<dyn LocalTrait>` during that gap, and be broken by the introduction of  `impl<T: CloneToUninit + ?Sized> Clone for Box`.

[^2]: Using a `debug_assert_eq` in [`core::clone::uninit::CopySpec::clone_slice`](https://doc.rust-lang.org/nightly/src/core/clone/uninit.rs.html#28).

[^3]: This PR just uses [the metadata (length) from `self`](e0c1c8bc50/library/core/src/clone.rs (L286)) to construct the `*mut [T]` to pass to `CopySpec::clone_slice` in `<[T]>::clone_to_uninit`.
2024-11-13 22:43:37 -08:00
..
backtrace remove redundant imports 2023-12-10 10:56:22 +08:00
collections Rollup merge of #120077 - SUPERCILEX:set-entry, r=Amanieu 2024-11-11 21:58:28 +01:00
env Fix std tests for wasm32-wasip2 target 2024-09-29 04:48:13 +02:00
error Reformat use declarations. 2024-07-29 08:26:52 +10:00
f16 std float tests: special-case Miri in feature detection 2024-08-08 12:17:50 +02:00
f32 these tests seem to work fine on i586 these days 2024-09-10 15:57:40 -07:00
f64 these tests seem to work fine on i586 these days 2024-09-10 15:57:40 -07:00
f128 Separate f128 % operation to deal with missing fmodl symbol 2024-11-07 11:33:10 +01:00
ffi Make CloneToUninit dyn-compatible 2024-11-12 15:08:41 -06:00
fs Support lock() and lock_shared() on async IO Files 2024-10-19 13:50:19 -07:00
hash remove const_hash feature leftovers 2024-11-02 11:27:14 +01:00
io update io::Error::into_inner to acknowlage io::Error::other 2024-11-08 10:43:34 -06:00
net Rollup merge of #129638 - nickrum:wasip2-net, r=alexcrichton 2024-09-30 19:18:49 -04:00
num removed nonfunctioning benchmark 2024-01-11 11:30:12 -05:00
os docs: fix grammar in doc comment at unix/process.rs 2024-11-04 20:42:21 +02:00
panic review: fix nits and move panic safety tests to the correct place 2020-09-25 23:10:24 +02:00
path Make CloneToUninit dyn-compatible 2024-11-12 15:08:41 -06:00
pipe Cleanup sys module to match house style 2024-07-30 19:22:54 +00:00
prelude Avoid comments that describe multiple use items. 2024-07-17 08:02:46 +10:00
process [musl] use posix_spawn if a directory change was requested 2024-10-23 22:11:55 -07:00
sync Rollup merge of #132869 - lolbinarycat:library-fix-too_long_first_doc_paragraph, r=tgross35 2024-11-12 06:27:19 +01:00
sys Make CloneToUninit dyn-compatible 2024-11-12 15:08:41 -06:00
sys_common Make CloneToUninit dyn-compatible 2024-11-12 15:08:41 -06:00
thread Auto merge of #131349 - RalfJung:const-stability-checks, r=compiler-errors 2024-10-25 23:29:40 +00:00
time Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
alloc.rs Reformat use declarations. 2024-07-29 08:26:52 +10:00
ascii.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
backtrace.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
env.rs library: consistently use American spelling for 'behavior' 2024-10-25 12:02:47 +02:00
error.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
f16.rs float types: move copysign, abs, signum to libcore 2024-11-01 16:47:18 +01:00
f32.rs float types: move copysign, abs, signum to libcore 2024-11-01 16:47:18 +01:00
f64.rs float types: move copysign, abs, signum to libcore 2024-11-01 16:47:18 +01:00
f128.rs float types: move copysign, abs, signum to libcore 2024-11-01 16:47:18 +01:00
fs.rs Rollup merge of #130999 - cberner:flock_pr, r=joboet 2024-11-11 15:23:33 +01:00
keyword_docs.rs Update use keyword docs to describe precise capturing 2024-10-18 21:17:08 +00:00
lib.miri.rs add 'x.py miri', and make it work for 'library/{core,alloc,std}' 2024-04-03 20:27:20 +02:00
lib.rs Change some code blocks to quotes in rendered std doc 2024-11-05 16:11:47 -08:00
macros.rs Add math functions for f16 and f128 2024-08-01 15:38:51 -04:00
num.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
panic.rs Auto merge of #128321 - BatmanAoD:catch-unwind-doc-update, r=Mark-Simulacrum 2024-09-29 05:54:47 +00:00
panicking.rs Rollup merge of #130846 - ChrisDenton:revert-break, r=Noratrieb 2024-09-26 22:20:54 -07:00
pat.rs Add pattern types to parser 2024-04-08 11:57:17 +00:00
path.rs Make CloneToUninit dyn-compatible 2024-11-12 15:08:41 -06:00
pipe.rs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
process.rs library: consistently use American spelling for 'behavior' 2024-10-25 12:02:47 +02:00
random.rs AIX use /dev/urandom for impl 2024-10-22 20:18:11 -04:00
rt.rs Remove the Arc rt::init allocation for thread info 2024-10-19 14:39:20 +01:00
time.rs library: consistently use American spelling for 'behavior' 2024-10-25 12:02:47 +02:00