Commit graph

64 commits

Author SHA1 Message Date
cyrgani
d41191958a rename the derive_{eq, clone_copy} features to *_internals 2026-01-08 12:35:30 +00:00
George Bateman
82499bac52 Correct terminology in Clone 2025-12-23 10:06:23 +00:00
joboet
16d2b5534e
prevent TrivialClone implementations from appearing in rustdoc output 2025-11-09 22:26:15 +01:00
joboet
7c430e7646
automatically implement TrivialClone for closures and tuples
If each of the component types is `TrivialClone`, the closure/tuple itself can be trivially cloned.
2025-11-09 17:31:19 +01:00
joboet
7b72cc6156
make TrivialClone a #[marker]-trait to keep it from appearing in error messages 2025-11-09 17:31:19 +01:00
joboet
e4e765b1f6
add a TrivialClone implementation when deriving both Clone and Copy 2025-11-09 17:31:17 +01:00
joboet
5fb5861765
(almost) get rid of the unsound #[rustc_unsafe_specialization_marker] on Copy, introduce TrivialClone 2025-11-09 15:51:25 +01:00
Nathaniel McCallum
04c2724866 constify basic Clone impls 2025-10-06 08:39:41 -04:00
Nathaniel McCallum
00fcb14e4e
clean up some old const trait impl syntax 2025-09-06 04:35:52 +02:00
Stuart Cook
2c314f93d3
Rollup merge of #144330 - gewitternacht:document-clone-eq, r=Amanieu
document assumptions about `Clone` and `Eq` traits

Most standard library collections break if `Clone` has a non-standard implementation which violates `x.clone() == x`. [Here](https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=b7fc6dfa8410cbb673eb8d38393d81de) the resulting broken behaviour of different collections is shown. I originally created an issue at https://github.com/rust-lang/hashbrown/issues/629, but the conclusion there was that `x.clone()` resulting in an object that compares equal to the original one is probably a very universal assumption. However, this assumption is (to my knowledge) not documented anywhere.

I propose to make this assumption explicit in the `Clone` trait documentation. The property that seems the most reasonable to me is the following: When implementing both `Clone` and `PartialEq`, then
```text
x == x -> x.clone() == x
```
is expected to hold. This way, when also implementing `Eq`, it automatically follows that `x.clone() == x` has to hold, which should be enough for the collections to not break. At the same time, the property also works for the "normal" elements of a type with `PartialEq`. For the wording, I tried to follow the [`Hash` and `Eq`](https://doc.rust-lang.org/std/hash/trait.Hash.html#hash-and-eq) documentation.

As I am fairly new to Rust, it might well be that this property cannot be generally expected – it seems reasonable to me, but any counter-examples or critique, both content- and wording-wise, would be very welcome. If the property turns out to be too general, I would suggest to at least document the assumption of `x.clone() == x` for the collections somehow.

An additional thought of mine:
If it is indeed generally expected that `x == x -> x.clone() == x`, then, for the sake of completeness, one could also define that `x != x -> y != y for y = x.clone()` should hold, i.e., that an object that did not compare equal to itself before cloning, should also not compare equal to itself afterwards.
2025-08-11 12:21:07 +10:00
gewitternacht
fadc961d99
mention Hash and Ord; refine description of derive 2025-08-11 00:05:47 +02:00
Boxy
7bc34622f0 tidy 2025-08-06 16:55:50 +01:00
gewitternacht
c72bb70ffd
clearer wording for unsafe code 2025-07-29 08:39:28 +02:00
gewitternacht
623317eb5e
add links to collections 2025-07-23 01:44:18 +02:00
gewitternacht
cdbcd72f34
remove trailing whitespace 2025-07-23 00:41:48 +02:00
gewitternacht
30033b45bb
document assumptions about Clone and Eq traits 2025-07-22 23:16:49 +02:00
Marijn Schouten
b315e9a2ce clippy fix: rely on autoderef 2025-07-04 11:35:00 +00:00
Daniel Bloom
91851432c8 Make Clone a const_trait 2025-06-19 16:36:33 -07:00
David Wood
884d0e031a
library/compiler: add PointeeSized bounds
As core uses an extern type (`ptr::VTable`), the default `?Sized` to
`MetaSized` migration isn't sufficient, and some code that previously
accepted `VTable` needs relaxed to continue to accept extern types.

Similarly, the compiler uses many extern types in `rustc_codegen_llvm`
and in the `rustc_middle::ty::List` implementation (`OpaqueListContents`)
some bounds must be relaxed to continue to accept these types.

Unfortunately, due to the current inability to relax `Deref::Target`,
some of the bounds in the standard library are forced to be stricter than
they ideally would be.
2025-06-16 23:04:33 +00:00
xizheyin
cea87ecad6
std: clarify Clone trait documentation about duplication semantics
This commit improves the Clone trait documentation to address confusion
around what "duplication" means for different types, especially for smart
pointers like Arc<Mutex<T>>.

Signed-off-by: xizheyin <xizheyin@smail.nju.edu.cn>
2025-05-31 12:01:57 +08:00
bors
6813f955a6 Auto merge of #139279 - BoxyUwU:bump-boostrap, r=jieyouxu
Bump boostrap compiler to new beta

try-job: `*msvc*`
2025-04-10 00:43:25 +00:00
Boxy
c93005ee65 update cfgs 2025-04-09 12:29:59 +01:00
timesince
069fd02588
Remove redundant words 2025-04-09 18:46:50 +08:00
Kevin Reid
96814ae55f Rewrite example to not deal with Copy at all.
It also now demonstrates how to avoid memory leaks.
2025-03-10 15:03:36 -07:00
Kevin Reid
2cc999d0d4 Rewrite comments about dropping and leaking. 2025-03-10 13:54:07 -07:00
Kevin Reid
769425a4ea Expand CloneToUninit documentation.
* Clarify relationship to `dyn` after #133003.
* Add an example of using it with `dyn` as #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.
* Replace parameter name `dst` with `dest` to avoids confusion between
  “DeSTination” and “Dynamically-Sized Type”.
* Various small corrections.
2025-03-07 19:46:23 -08:00
Matthias Krüger
f5a143f796
Rollup merge of #134797 - spastorino:ergonomic-ref-counting-1, r=nikomatsakis
Ergonomic ref counting

This is an experimental first version of ergonomic ref counting.

This first version implements most of the RFC but doesn't implement any of the optimizations. This was left for following iterations.

RFC: https://github.com/rust-lang/rfcs/pull/3680
Tracking issue: https://github.com/rust-lang/rust/issues/132290
Project goal: https://github.com/rust-lang/rust-project-goals/issues/107

r? ```@nikomatsakis```
2025-03-07 19:15:33 +01:00
Thalia Archibald
988eb19970 library: Use size_of from the prelude instead of imported
Use `std::mem::{size_of, size_of_val, align_of, align_of_val}` from the
prelude instead of importing or qualifying them.

These functions were added to all preludes in Rust 1.80.
2025-03-06 20:20:38 -08:00
Santiago Pastorino
a68db7e3a8
Add examples in stdlib demonstrating the use syntax 2025-03-06 17:58:34 -03:00
Santiago Pastorino
dcdfd551f0
Add UseCloned trait related code 2025-03-06 17:58:32 -03:00
Josh Triplett
865471f99b Implement CloneToUninit for ByteStr 2025-01-22 17:53:39 +02:00
Zachary S
e0c1c8bc50 Make CloneToUninit dyn-compatible 2024-11-12 15:08:41 -06:00
Boxy
0091b8ab2a update cfgs 2024-09-05 17:24:01 +01:00
Pavel Grigorenko
110c273f4f CloneToUninit: use a private specialization trait
and move implementation details into a submodule
2024-07-29 20:44:43 +03:00
Pavel Grigorenko
dbc13fb309 Sparkle some attributes over CloneToUninit stuff 2024-07-29 20:44:42 +03:00
Pavel Grigorenko
ec921db289 impl CloneToUninit for str and CStr 2024-07-29 20:33:11 +03:00
Ben Kimock
f4f57bfccb Make Clone::clone a lang item 2024-07-25 18:46:07 -04:00
hattizai
ada9fda7c3 chore: remove duplicate words 2024-07-02 11:25:31 +08:00
Kevin Reid
ec201b8650 Add core::clone::CloneToUninit.
This trait allows cloning DSTs, but is unsafe to implement and use
because it writes to possibly-uninitialized memory which must be of the
correct size, and must initialize that memory.

It is only implemented for `T: Clone` and `[T] where T: Clone`, but
additional implementations could be provided for specific `dyn Trait`
or custom-DST types.
2024-06-22 08:08:00 -07:00
Trevor Gross
88bcc79f31 Revert "Put basic impls for f16 and f128 behind cfg(not(bootstrap))"
This reverts commit 049a917535.

The resolution to <https://github.com/rust-lang/rust/issues/123282> is
that the `f16`/`f128` regression in the beta compiler was fixable
without a revert, so the commit adding `#[cfg(not(bootstrap))]` is no
longer useful (added in
<https://github.com/rust-lang/rust/pull/123390>).

Revert this commit because not having these basic impls bootstrap-gated
simplifies everything else that uses them.
2024-04-10 13:50:27 -04:00
Trevor Gross
049a917535 Put basic impls for f16 and f128 behind cfg(not(bootstrap))
We will lose `f16` and `f128` in the beta compiler after the revert for
<https://github.com/rust-lang/rust/issues/123282> lands. Change what was
added in <https://github.com/rust-lang/rust/pull/123085> to be behind
`#[cfg(not(bootstrap))]` to account for this.
2024-04-02 16:19:55 -04:00
Trevor Gross
d7d5fc9734 Add basic trait impls for f16 and f128
Split off part of <https://github.com/rust-lang/rust/pull/122470> so the
compiler doesn't ICE because it expects primitives to have some minimal
traits.

Fixes <https://github.com/rust-lang/rust/issues/123074>
2024-03-28 15:02:51 -04:00
surechen
40ae34194c remove redundant imports
detects redundant imports that can be eliminated.

for #117772 :

In order to facilitate review and modification, split the checking code and
removing redundant imports code into two PR.
2023-12-10 10:56:22 +08:00
Martin Nordholts
c6566a8037 Explain more clearly why fn() -> T can't be #[derive(Clone)] 2023-07-30 18:04:38 +02:00
Deadbeef
63e0ddbf1d core is now compilable 2023-04-16 07:20:26 +00:00
Deadbeef
76dbe29104 rm const traits in libcore 2023-04-16 06:49:27 +00:00
Eduardo Sánchez Muñoz
00e7b54d46 Make some trivial functions #[inline(always)] 2022-12-07 17:11:17 +01:00
Pietro Albini
6b2d3d5f3c
update cfg(bootstrap)s 2022-07-01 15:48:23 +02:00
Michael Howell
7a93567005 docs: show Clone and Copy on () doc pages 2022-06-07 12:12:49 -07:00
Deadbeef
257f06587c Remove #[default..] and add #[const_trait] 2022-05-30 08:52:24 +00:00