-
Notifications
You must be signed in to change notification settings - Fork 12.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Make CloneToUninit
dyn-compatible
#133003
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
The discussion of *mut u8
vs *mut ()
vs *mut ConcreteType
makes me wonder whether there is design space for an untyped pointer primitive type in Rust, like what LLVM has recently adopted. https://llvm.org/docs/OpaquePointers.html
@bors r+ |
This comment has been minimized.
This comment has been minimized.
@bors r- delegate+ |
@bors r+ |
This comment was marked as outdated.
This comment was marked as outdated.
💡 This pull request was already approved, no need to approve it again.
|
…kingjubilee Rollup of 7 pull requests Successful merges: - rust-lang#131304 (float types: move copysign, abs, signum to libcore) - rust-lang#132907 (Change intrinsic declarations to new style) - rust-lang#132971 (Handle infer vars in anon consts on stable) - rust-lang#133003 (Make `CloneToUninit` dyn-compatible) - rust-lang#133004 (btree: simplify the backdoor between set and map) - rust-lang#133008 (update outdated comment about test-float-parse) - rust-lang#133012 (Add test cases for rust-lang#125918) r? `@ghost` `@rustbot` modify labels: rollup
Rollup merge of rust-lang#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 ()`](rust-lang#116113 (comment)) 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`](https://github.com/zachs18/rust/blob/e0c1c8bc5058cd3f8831b235c5963ab89840b33b/library/core/src/clone.rs#L286) to construct the `*mut [T]` to pass to `CopySpec::clone_slice` in `<[T]>::clone_to_uninit`.
…kingjubilee Rollup of 7 pull requests Successful merges: - rust-lang#131304 (float types: move copysign, abs, signum to libcore) - rust-lang#132907 (Change intrinsic declarations to new style) - rust-lang#132971 (Handle infer vars in anon consts on stable) - rust-lang#133003 (Make `CloneToUninit` dyn-compatible) - rust-lang#133004 (btree: simplify the backdoor between set and map) - rust-lang#133008 (update outdated comment about test-float-parse) - rust-lang#133012 (Add test cases for rust-lang#125918) r? `@ghost` `@rustbot` modify labels: rollup
* Clarify relationship to `dyn` after rust-lang#133003. * Add an example of using it with `dyn` as rust-lang#133003 enabled. * Add an example of implementing it. * Add links to Rust Reference for the mentioned concepts. * Various small corrections.
* Clarify relationship to `dyn` after rust-lang#133003. * Add an example of using it with `dyn` as rust-lang#133003 enabled. * Add an example of implementing it. * Add links to Rust Reference for the mentioned concepts. * Mention that its method should rarely be called. * Various small corrections.
78fc550584d Auto merge of rust-lang#133247 - GuillaumeGomez:reduce-integer-display-impl, r=workingjubilee db5c2c6a18f Rollup merge of rust-lang#132982 - suaviloquence:2-doc-changed-alloc-methods, r=Mark-Simulacrum 117ad4f17b0 Rollup merge of rust-lang#132533 - SUPERCILEX:patch-4, r=Mark-Simulacrum e2aa7c108dc fix `Allocator` method names in `alloc` free function docs 6b141ee1007 Rollup merge of rust-lang#133298 - n0toose:remove-dir-all-but-not-paths, r=Noratrieb e3691db3d70 Rollup merge of rust-lang#133260 - compiler-errors:deref, r=fee1-dead 895f290b058 Rollup merge of rust-lang#132730 - joboet:after_main_sync, r=Noratrieb 6ffa4556f46 Rollup merge of rust-lang#133389 - eduardosm:stabilize-const_float_methods, r=RalfJung f4139353bf6 Rollup merge of rust-lang#133301 - GuillaumeGomez:add-example-wrapping-neg, r=workingjubilee 6112cfd51ba Auto merge of rust-lang#132611 - compiler-errors:async-prelude, r=ibraheemdev 23a5a0e1f54 Auto merge of rust-lang#132597 - lukas-code:btree-plug-leak, r=jhpratt f0b0942f402 Constify Deref and DerefMut d05e8e8e9fb Auto merge of rust-lang#133379 - jieyouxu:rollup-00jxo71, r=jieyouxu 641c1ae3978 Stabilize `const_float_methods` 256c54db000 Auto merge of rust-lang#133377 - jieyouxu:rollup-n536hzq, r=jieyouxu dff533fc1d3 Improve code by using `unsigned_abs` a850f7c8760 Rollup merge of rust-lang#133237 - fee1-dead-contrib:constadd, r=compiler-errors 99741dd6dcb Rollup merge of rust-lang#133332 - bjoernager:const-array-as-mut-slice, r=jhpratt 9a152e2565f Rollup merge of rust-lang#131505 - madsmtm:darwin_user_temp_dir, r=dtolnay a12c8386f5b Auto merge of rust-lang#132994 - clubby789:cc-bisect, r=Kobzol 6548ad8c627 Auto merge of rust-lang#133360 - compiler-errors:rollup-a2o38tq, r=compiler-errors a4f797ed7de Rollup merge of rust-lang#133264 - lolbinarycat:os-string-truncate, r=joboet a9398015dc4 Auto merge of rust-lang#132329 - compiler-errors:fn-and-destruct, r=lcnr 30aa6db150e Add code example for `wrapping_neg` method for signed integers bc77567dc6b Deduplicate checking drop terminator 6f3ec5caf86 Gate const drop behind const_destruct feature, and fix const_precise_live_drops post-drop-elaboration check fb6f0c2e982 Auto merge of rust-lang#133339 - jieyouxu:rollup-gav0nvr, r=jieyouxu c792ef3e01a Rollup merge of rust-lang#133337 - ColinFinck:thread-scoped-fix-typo, r=joboet cfed1c696dd Rollup merge of rust-lang#133330 - RalfJung:close, r=the8472 e26edf01cab Rollup merge of rust-lang#133313 - thesummer:fix-arc4random, r=cuviper 90a85ef0042 Rollup merge of rust-lang#133288 - bjoernager:const-array-each-ref, r=jhpratt 4e6f154dba6 Rollup merge of rust-lang#133238 - heiher:loong-stdarch-rexport, r=Amanieu 23a1b31cfa4 Auto merge of rust-lang#130867 - michirakara:steps_between, r=dtolnay 9693572a6e3 Fix typo in `std::thread::Scope::spawn` documentation. b4a50679016 Mark '<[T; N]>::as_mut_slice' as 'const'; b6b40efcac5 library: update comment around close() 6ce7e79948e Don't try to use confstr in Miri 40d6e2ca941 Auto merge of rust-lang#129238 - umgefahren:stabilize-ipv6-unique-local, r=dtolnay 276c0fc3fd1 distinguish overflow and unimplemented in Step::steps_between 8be952bbbdf Use arc4random of libc for RTEMS target 4583ddef0cd Mention that std::fs::remove_dir_all fails on files 4f6ca37539a Mark and implement 'each_ref' and 'each_mut' in '[T; N]' as const; ec220b6b368 constify `Add` 3c558bf870d Rollup merge of rust-lang#131736 - hoodmane:emscripten-wasm-bigint, r=workingjubilee 38d4c11c3ff implement OsString::truncate 4fd2c8db81e Rollup merge of rust-lang#133226 - compiler-errors:opt-in-pointer-like, r=lcnr 3f03a0f3fcd Rollup merge of rust-lang#130800 - bjoernager:const-mut-cursor, r=joshtriplett eea7e230c2b Rollup merge of rust-lang#129838 - Ayush1325:uefi-process-args, r=joboet 8b4995aad87 Make PointerLike opt-in as a trait f74b38aa2b1 Reduce integer `Display` implementation size 2f179d1a7c9 Stabilize const_pin_2 b2dc297e863 re-export `is_loongarch_feature_detected` e26c298e75c Rollup merge of rust-lang#132732 - gavincrawford:as_ptr_attribute, r=Urgau d6ee9dbe8b0 Rollup merge of rust-lang#133183 - n0toose:improve-remove-dir-docs, r=joboet 40735d31322 Rollup merge of rust-lang#125405 - m-ou-se:thread-add-spawn-hook, r=WaffleLapkin 6c20348f356 Rollup merge of rust-lang#123947 - zopsicle:vec_deque-Iter-as_slices, r=Amanieu 2089cb3188c Update doc comments for spawn hook. c02090d6a3a Address review comments. 79bffa90cfe Fix tracking issue. 3eff64c78b0 Add tracking issue. 15bac4f115e Use Send + Sync for spawn hooks. a42af062212 Add thread Builder::no_hooks(). 49ac15b192b Update thread spawn hooks. 2cc4b2ef6d9 Use add_spawn_hook for libtest's output capturing. 24a0765dd03 Add std::thread::add_spawn_hook. 50ac72542be Correct comments concerning updated dangling pointer lint cdf54869ec6 Auto merge of rust-lang#133205 - matthiaskrgr:rollup-xhhhp5u, r=matthiaskrgr 543667a49e3 Rollup merge of rust-lang#133200 - RalfJung:miri-rwlock-test, r=tgross35 7430eb407e2 ignore an occasionally-failing test in Miri 607b493008b Rollup merge of rust-lang#133182 - RalfJung:const-panic-inline, r=tgross35 e6cd122d981 Rollup merge of rust-lang#132758 - nnethercote:improve-get_key_value-docs, r=cuviper a3c95972a3b Mention std::fs::remove_dir_all in std::fs::remove_dir bd5c1426568 Bump `stdarch` to the latest master e84f865601d const_panic: inline in bootstrap builds to avoid f16/f128 crashes 05fecb95df2 std: allow after-main use of synchronization primitives c1beb25002a Auto merge of rust-lang#133160 - jhpratt:rollup-wzj9q15, r=jhpratt ce80c9f20de Rollup merge of rust-lang#133145 - kornelski:static-mutex, r=traviscross f385ac21fee Auto merge of rust-lang#128219 - connortsui20:rwlock-downgrade, r=tgross35 86151abcc67 rename rustc_const_stable_intrinsic -> rustc_intrinsic_const_stable_indirect a33f889e959 Improve `{BTreeMap,HashMap}::get_key_value` docs. 15e6fc0a5db Document alternatives to `static mut` 1cd1dd7c56f Auto merge of rust-lang#120370 - x17jiri:likely_unlikely_fix, r=saethlin e475f40115f Likely unlikely fix ddcabfe85ff Rollup merge of rust-lang#133126 - ohno418:fix-String-doc, r=jhpratt e4eff6a5a78 Rollup merge of rust-lang#133116 - RalfJung:const-null-ptr, r=dtolnay 16e6d209ccb alloc: fix `String`'s doc e4fb96229e0 clean up const stability around UB checks ee78601c3ce stabilize const_ptr_is_null 1e4a9ee22cd Rollup merge of rust-lang#132449 - RalfJung:is_val_statically_known, r=compiler-errors 1dfe94c308a Rollup merge of rust-lang#131717 - tgross35:stabilize-const_atomic_from_ptr, r=RalfJung 70326e8f708 reduce threads in downgrade test d58e4f2d08c fix `DOWNGRADED` bit unpreserved 5d683160ada fix memory ordering bug + bad test 0604b8ffc1d add safety comments for queue implementation 00255e627b7 add `downgrade` to `queue` implementation 40256c63003 modify queue implementation documentation f8041644f07 add `downgrade` to `futex` implementation 572adedb6a0 add simple `downgrade` implementations 48bcf09d8d7 add `downgrade` method onto `RwLockWriteGuard` 5416aef6a86 add `RwLock` `downgrade` tests 40109807569 Rollup merge of rust-lang#133050 - tgross35:inline-f16-f128, r=saethlin 2ee4159af2a Rollup merge of rust-lang#133048 - cyrgani:ptr-doc-update, r=Amanieu e1448dee6d0 Rollup merge of rust-lang#133019 - sorairolake:add-missing-period-and-colon, r=tgross35 b1d31d297f2 Rollup merge of rust-lang#132984 - sunshowers:pipe2, r=tgross35 8cef1ef708e Rollup merge of rust-lang#132977 - cberner:fix_solaris, r=tgross35 daa9c433370 Rollup merge of rust-lang#132790 - aDotInTheVoid:ioslice-asslice-rides-again, r=cuviper cdb5ff5f6fe Pass `f16` and `f128` by value in `const_assert!` 60ef4797595 use `&raw` in `{read, write}_unaligned` documentation d2983fffb15 Auto merge of rust-lang#132709 - programmerjake:optimize-charto_digit, r=joshtriplett 918cc8d59c8 Rollup merge of rust-lang#133027 - no1wudi:master, r=jhpratt 25f55123bf2 Auto merge of rust-lang#133026 - workingjubilee:rollup-q8ig6ah, r=workingjubilee d8de2ccfc55 Fix a copy-paste issue in the NuttX raw type definition c06bb349936 Rollup merge of rust-lang#133008 - onur-ozkan:update-outdated-comment, r=jieyouxu 8eaea39049a Rollup merge of rust-lang#133004 - cuviper:unrecover-btree, r=ibraheemdev 81a191a826e Rollup merge of rust-lang#133003 - zachs18:clonetouninit-dyn-compat-u8, r=dtolnay e3e5e358c71 Rollup merge of rust-lang#132907 - BLANKatGITHUB:intrinsic, r=saethlin f57853bc421 Rollup merge of rust-lang#131304 - RalfJung:float-core, r=tgross35 7bc04367d32 Auto merge of rust-lang#122770 - iximeow:ixi/int-formatting-optimization, r=workingjubilee ce2e318c5d1 docs: Fix missing colon in methods for primitive types 1870e9269bf docs: Fix missing period in methods for integer types 64397743828 Auto merge of rust-lang#133006 - matthiaskrgr:rollup-dz6oiq5, r=matthiaskrgr 98dad0baf9a update outdated comment about test-float-parse 520d4fdff72 Rollup merge of rust-lang#126046 - davidzeng0:mixed_integer_ops_unsigned_sub, r=Amanieu e3c425b74bb Auto merge of rust-lang#132662 - RalfJung:const-panic-inlining, r=tgross35 c4b77cf11ef Update core CloneToUninit tests d4e21f55ec3 btree: simplify the backdoor between set and map 5d61cf9a7ea Bump `cc` 44f376ba0c7 Fix compilation error on Solaris due to flock usage 75609d6d329 Auto merge of rust-lang#132556 - clubby789:cargo-update, r=Mark-Simulacrum 5ba28a4d89a Run `cargo update` and update licenses 08200043034 const_panic: don't wrap it in a separate function d30e2c0963b [illumos] use pipe2 to create anonymous pipes 7e12686e222 Auto merge of rust-lang#132883 - LaihoE:vectorized_is_sorted, r=thomcc 02e32d70d61 Auto merge of rust-lang#132972 - matthiaskrgr:rollup-456osr7, r=matthiaskrgr 157eb1c94be Rollup merge of rust-lang#132970 - tyilo:nonzero-u-div-ceil-issue, r=tgross35 03e52a50ac8 Rollup merge of rust-lang#132966 - RalfJung:const_option_ext, r=jhpratt 2f615a1c410 Rollup merge of rust-lang#132948 - RalfJung:const_unicode_case_lookup, r=Noratrieb f00e0913f63 Rollup merge of rust-lang#132851 - chansuke:update-comment, r=thomcc 656009854a3 Auto merge of rust-lang#132870 - Noratrieb:inline-int-parsing, r=tgross35 a0c0c40eafd Add tracking issue number to unsigned_nonzero_div_ceil feature c2296662624 Make `CloneToUninit` dyn-compatible 6ab50dd1c97 stabilize const_option_ext 27fe6c7ca46 Rollup merge of rust-lang#132541 - RalfJung:const-stable-extern-crate, r=compiler-errors 7fafe990a8b stabilize const_unicode_case_lookup c5ed62506ae Stabilize `Ipv6Addr::is_unique_local` and `Ipv6Addr::is_unicast_link_local` e0452c9af5e adds new declaration to codegen 33fa8701b27 Auto merge of rust-lang#132943 - matthiaskrgr:rollup-164l3ej, r=matthiaskrgr 7f12f02c6ec Rollup merge of rust-lang#132914 - rcorre:cell-grammar, r=tgross35 300a2664117 Rollup merge of rust-lang#132895 - scottmcm:generalize-nonnull-from-raw-parts, r=ibraheemdev a461cf9310e remove no-longer-needed abs_private 170e993a781 allow rustc_private feature in force-unstable-if-unmarked crates 4a20245f4ad Rollup merge of rust-lang#132929 - cuviper:check-alloc_zeroed, r=tgross35 992bbf7c46c Rollup merge of rust-lang#132869 - lolbinarycat:library-fix-too_long_first_doc_paragraph, r=tgross35 e3925fa3b42 Rollup merge of rust-lang#132847 - RalfJung:addr-dont-expose, r=Mark-Simulacrum 327a0d7814e Auto merge of rust-lang#132919 - matthiaskrgr:rollup-ogghyvp, r=matthiaskrgr 67c3c9f8bb7 Check for null in the `alloc_zeroed` example 068537aeb72 new intrinsic declaration b689951272e new intrinsic declaration 16fa12ebd98 Rollup merge of rust-lang#132144 - adetaylor:receiver-trait-itself, r=wesleywiser 54f699d3ee9 Rollup merge of rust-lang#120077 - SUPERCILEX:set-entry, r=Amanieu e541a4f8204 Update dangling pointer tests 7707584415a Tag relevant functions with #[rustc_as_ptr] attribute b541c5aebc8 Auto merge of rust-lang#132902 - matthiaskrgr:rollup-43qgg3t, r=matthiaskrgr 2d676d49a6e Update grammar in std::cell docs. 7325f33701c Emscripten: link with -sWASM_BIGINT 1c482c93dbd Rollup merge of rust-lang#130999 - cberner:flock_pr, r=joboet 4dd22707d54 Auto merge of rust-lang#127589 - notriddle:notriddle/search-sem-3, r=GuillaumeGomez 0af64b63ced Generalize `NonNull::from_raw_parts` per ACP362 2fd9ac4a7ba vectorize slice::is_sorted 737521c21f5 `#[inline]` integer parsing functions b9be1ddefcb split up the first paragraph of doc comments for better summaries f9063ff15cf Update the doc comment of `ASCII_CASE_MASK` 57c7b80414a elem_offset / subslice_range: use addr() instead of 'as usize' d19aa692d4e Rollup merge of rust-lang#132136 - RalfJung:target-feature-abi-compat, r=Mark-Simulacrum 6b0bd5a6630 honor rustc_const_stable_indirect in non-staged_api crate with -Zforce-unstable-if-unmarked 070baf4fab5 Add as_slice/into_slice for IoSlice/IoSliceMut. 978a5535d35 Rollup merge of rust-lang#132778 - lolbinarycat:io-Error-into_inner-docs, r=cuviper 6d54bfe5925 update io::Error::into_inner to acknowlage io::Error::other 7c0a90c3ead Address review comments ac66068ca8b Update library/std/src/sys/pal/windows/fs.rs d90f8668e45 Auto merge of rust-lang#132717 - RalfJung:rustc_safe_intrinsic, r=compiler-errors f2bf9e65116 remove support for rustc_safe_intrinsic attribute; use rustc_intrinsic functions instead 2391b4b2a0d Rollup merge of rust-lang#132738 - cuviper:channel-heap-init, r=ibraheemdev 086cfefa97e mark is_val_statically_known intrinsic as stably const-callable dffc5e73119 Rollup merge of rust-lang#132696 - fortanix:raoul/rte-235-fix_fmodl_missing_symbol_issue, r=tgross35 f14fc562a82 Rollup merge of rust-lang#132639 - RalfJung:intrinsics, r=workingjubilee,Amanieu 6d63012a62e Initialize channel `Block`s directly on the heap 7ff251b9793 core: move intrinsics.rs into intrinsics folder 6244f4816fe Auto merge of rust-lang#132714 - mati865:update-memchr, r=tgross35 a2eaef75de6 Rollup merge of rust-lang#132715 - tabokie:fix-lazy-lock-doc, r=Noratrieb 6a77b2121f1 Rollup merge of rust-lang#132665 - tyilo:nonzero-u-div-ceil, r=joboet 79d2063e0b6 Separate f128 `%` operation to deal with missing `fmodl` symbol 8022523cc73 Auto merge of rust-lang#132705 - kornelski:inline-repeat, r=tgross35 df9f5db19d7 fix lazylock comment 7a82eb5b610 Auto merge of rust-lang#131888 - ChrisDenton:deopt, r=ibraheemdev 75b9ce3b0be unpin and update memchr 4d1c7d9526a optimize char::to_digit and assert radix is at least 2 95bff3e6b5c Inline str::repeat 52c2a459546 Rollup merge of rust-lang#132617 - uellenberg:fix-rendered-doc, r=cuviper 28f7e7bbbd9 Auto merge of rust-lang#131721 - okaneco:const_eq_ignore_ascii_case, r=m-ou-se 41b7e5f7705 Auto merge of rust-lang#132500 - RalfJung:char-is-whitespace-const, r=jhpratt 4ed08bd2262 Add new unstable feature `const_eq_ignore_ascii_case` f4e9fe4ec00 Auto merge of rust-lang#132664 - matthiaskrgr:rollup-i27nr7i, r=matthiaskrgr afc66fe29e2 Change some code blocks to quotes in rendered std doc 2e63cbdb695 Rollup merge of rust-lang#131261 - clarfonthey:unsafe-cell-from-mut, r=m-ou-se ab6f663ed6a Auto merge of rust-lang#132661 - matthiaskrgr:rollup-npytbl6, r=matthiaskrgr 8b165db1e5c Implement div_ceil for NonZero<unsigned> 6bc1b1b449e Rollup merge of rust-lang#132571 - RalfJung:const_eval_select_macro, r=oli-obk c12f4d12055 Rollup merge of rust-lang#132473 - ZhekaS:core_fmt_radix_no_panic, r=joboet bbb927540c8 Rollup merge of rust-lang#132153 - bjoernager:const-char-encode-utf16, r=dtolnay 919de701b02 add const_eval_select macro to reduce redundancy 538f5b4cd2b Rollup merge of rust-lang#132609 - NotWearingPants:patch-1, r=Amanieu 86c6f276b21 Rollup merge of rust-lang#132606 - eduardosm:char-slice-str-pattern-doc, r=tgross35 4660d7ebef9 most const intrinsics don't need an explicit rustc_const_unstable any more 8eb30fe4b09 add new rustc_const_stable_intrinsic attribute for const-stable intrinsics 792d1646c7c convert all const-callable intrinsics into the new form (without extern block) fad7d68d1c2 docs: fix grammar in doc comment at unix/process.rs 92bb77993bd Improve example of `impl Pattern for &[char]` 553bb181dad Add AsyncFn* to to the prelude in all editions 2ae24bf3e15 Fixed typo, rebased 47f60d7ad0d Updated SAFETY comment to address underflow 581aa8d587f Replace checked slice indexing by unchecked to support panic-free code c5a0f6c60aa Rollup merge of rust-lang#132579 - RalfJung:rustc-std-workspace-crates, r=Amanieu 9cdbf39ba56 btree: don't leak value if destructor of key panics 4caff135a74 Stabilise 'const_char_encode_utf16'; 84fae7ebfee Auto merge of rust-lang#132586 - workingjubilee:rollup-qrmn49a, r=workingjubilee 95b4127a6c8 update rustc-std-workspace crates 082b98d885c Rollup merge of rust-lang#132423 - RalfJung:const-eval-align-offset, r=dtolnay 3b40634d007 Auto merge of rust-lang#132434 - tgross35:f128-tests, r=workingjubilee 5dea8b2e41f Enable `f128` tests on all non-buggy platforms 🎉 2bb8ea389a4 Auto merge of rust-lang#132581 - workingjubilee:rollup-4wj318p, r=workingjubilee 83bd286345b Update `compiler_builtins` to 0.1.138 and pin it 699702f2a6c Rollup merge of rust-lang#132563 - frectonz:master, r=Amanieu 4390c35bcce Auto merge of rust-lang#123723 - madsmtm:apple-std-os, r=dtolnay 1e8ed9064ee Auto merge of rust-lang#132479 - compiler-errors:fx-feat-yeet, r=fee1-dead 9a3b7c0f20b Rename the FIXMEs, remove a few that dont matter anymore ed4f110b101 Auto merge of rust-lang#132542 - RalfJung:const_panic, r=tgross35 d8bca01fc2b remove const-support for align_offset 76b866c7156 Modify `NonZero` documentation to reference the underlying integer type 9e579641927 Rollup merge of rust-lang#132511 - RalfJung:const_arguments_as_str, r=dtolnay bfeeb7450fd Rollup merge of rust-lang#132503 - RalfJung:const-hash-map, r=Amanieu a42fc213104 Rollup merge of rust-lang#132499 - RalfJung:unicode_data.rs, r=tgross35 0278cab1fcc Rollup merge of rust-lang#132393 - zedddie16:issue-131865-fix, r=tgross35 714115abfb6 Rollup merge of rust-lang#131377 - rick-de-water:nonzero-exp, r=dtolnay 9789c548b8c Rollup merge of rust-lang#129329 - eduardosm:rc-from-mut-slice, r=dtolnay ff9178b1a6a add const_panic macro to make it easier to fall back to non-formatting panic in const 9ef483bbbb0 stabilize const_arguments_as_str 4c6593fe8f8 Auto merge of rust-lang#132458 - RalfJung:rustc-const-unstable, r=Amanieu 81b20e0a3dd Rustdoc: added brief colon explanation 73d9f4da9a9 Add Set entry API e883a6074c2 Add BorrowedBuf::into_filled{,_mut} methods to allow returning buffer with original lifetime 261c5b998ad remove const_hash feature leftovers d515da6678b const_with_hasher test: actually construct a usable HashMap 11dc6c388d9 make char::is_whitespace unstably const 1a481fd9e01 unicode_data.rs: show command for generating file 3a5b026c04a get rid of a whole bunch of unnecessary rustc_const_unstable attributes 2e24b7fba4b remove no-longer-needed attribute ffbcba08e7f add missing safety comments 768d0cd7fe4 adjust test gating for f16/f128 6335056119f float types: move copysign, abs, signum to libcore c353337b8d0 rustdoc-search: simplify rules for generics and type params 9d10ab71105 Implement `From<&mut {slice}>` for `Box/Rc/Arc<{slice}>` 34329c06529 Stabilize `const_atomic_from_ptr` a2e1edf18f6 Arbitrary self types v2: (unused) Receiver trait 2d26681057c ABI compatibility: remove section on target features f1c99041c25 Support lock() and lock_shared() on async IO Files 7f6af4dd882 Revert using `HEAP` static in Windows alloc 541bda102a0 Implement file_lock feature d7a7b0a361b uefi: process: Add args support 14aef3d76cf Use with_capacity(0) because we're reading the capacity later on 5b16abea8d5 Prefer `target_vendor = "apple"` on confstr bc6398107f8 use `confstr(_CS_DARWIN_USER_TEMP_DIR, ...)` as a `TMPDIR` fallback on darwin f8dc879fa96 Add LowerExp and UpperExp implementations 50afc521a17 Stabilize UnsafeCell::from_mut aa74e934264 Mark 'get_mut' and 'set_position' in 'std::io::Cursor' as const; c370665e88b Make `std::os::darwin` public 797c2498600 Implement `mixed_integer_ops_unsigned_sub` ff1212e6a22 Add vec_deque::Iter::as_slices and friends e938deaf0f1 try adding a test that LowerHex and friends don't panic, but it doesn't work c6d2bb7445c improve codegen of fmt_num to delete unreachable panic git-subtree-dir: library git-subtree-split: 78fc550584dcdf3f917cc399f8ae1f1001887f09
Make
CloneToUninit
dyn-compatible, by makingclone_to_uninit
'sdst
parameter*mut u8
instead of*mut Self
, so the method does not referenceSelf
except in theself
parameter and is thus dispatchable from a trait object.This allows, among other things, adding
CloneToUninit
as a supertrait bound fortrait Foo
to allow cloningdyn Foo
in some containers. Currently, this means thatRc::make_mut
andArc::make_mut
can work withdyn Foo
wheretrait Foo: CloneToUninit
.Example
Eventually,
Box::<T>::clone
is planned to be converted to useT::clone_to_uninit
, which when combined with this change, will allow cloningBox<dyn Foo>
wheretrait Foo: CloneToUninit
without any additionalunsafe
code for the author oftrait Foo
.1This PR should have no stable side-effects, as
CloneToUninit
is unstable so cannot be mentioned on stable, andCloneToUninit
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-lengthdst
is library UB and was previously detected2; sincedst
does not have a length anymore, this now cannot be detected3).r? libs-api
I chose to make the parameter
*mut u8
instead of*mut ()
because that might make it simpler to pass the result ofalloc
toclone_to_uninit
, but*mut ()
would also make sense, and any*mut ConcreteType
would work. The original motivation for using specifically*mut ()
appears to bestd::ptr::from_raw_parts_mut
, but that now takes*mut impl Thin
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 anunsafe
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
Footnotes
Note that
impl<T: CloneToUninit + ?Sized> Clone for Box
must be added before or at the same time as whenCloneToUninit
becomes stable, due toBox
being#[fundamental]
, as if there is any stable gap between the stabilization ofCloneToUninit
andimpl<T: CloneToUninit + ?Sized> Clone for Box
, then users could implement bothCloneToUninit for dyn LocalTrait
and separatelyClone for Box<dyn LocalTrait>
during that gap, and be broken by the introduction ofimpl<T: CloneToUninit + ?Sized> Clone for Box
. ↩Using a
debug_assert_eq
incore::clone::uninit::CopySpec::clone_slice
. ↩This PR just uses the metadata (length) from
self
to construct the*mut [T]
to pass toCopySpec::clone_slice
in<[T]>::clone_to_uninit
. ↩