Rollup merge of #91804 - woppopo:const_clone, r=oli-obk
Make some `Clone` impls `const` Tracking issue: #91805 `Clone::clone_from` and some impls (Option, Result) bounded on `~const Drop`. ```rust // core::clone impl const Clone for INTEGER impl const Clone for FLOAT impl const Clone for bool impl const Clone for char impl const Clone for ! impl<T: ?Sized> const Clone for *const T impl<T: ?Sized> const Clone for *mut T impl<T: ?Sized> const Clone for &T // core::option impl<T> const Clone for Option<T> where T: ~const Clone + ~const Drop // core::result impl<T, E> const Clone for Result<T, E> where T: ~const Clone + ~const Drop, E: ~const Clone + ~const Drop, // core::convert impl const Clone for Infallible // core::ptr impl<T: ?Sized> const Clone for NonNull<T> impl<T: ?Sized> const Clone for Unique<T> ```
This commit is contained in:
@@ -127,7 +127,11 @@ pub trait Clone: Sized {
|
|||||||
/// allocations.
|
/// allocations.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn clone_from(&mut self, source: &Self) {
|
#[default_method_body_is_const]
|
||||||
|
fn clone_from(&mut self, source: &Self)
|
||||||
|
where
|
||||||
|
Self: ~const Drop,
|
||||||
|
{
|
||||||
*self = source.clone()
|
*self = source.clone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -178,7 +182,8 @@ mod impls {
|
|||||||
($($t:ty)*) => {
|
($($t:ty)*) => {
|
||||||
$(
|
$(
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl Clone for $t {
|
#[rustc_const_unstable(feature = "const_clone", issue = "91805")]
|
||||||
|
impl const Clone for $t {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
*self
|
*self
|
||||||
@@ -196,7 +201,8 @@ mod impls {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[unstable(feature = "never_type", issue = "35121")]
|
#[unstable(feature = "never_type", issue = "35121")]
|
||||||
impl Clone for ! {
|
#[rustc_const_unstable(feature = "const_clone", issue = "91805")]
|
||||||
|
impl const Clone for ! {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
*self
|
*self
|
||||||
@@ -204,7 +210,8 @@ mod impls {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: ?Sized> Clone for *const T {
|
#[rustc_const_unstable(feature = "const_clone", issue = "91805")]
|
||||||
|
impl<T: ?Sized> const Clone for *const T {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
*self
|
*self
|
||||||
@@ -212,7 +219,8 @@ mod impls {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: ?Sized> Clone for *mut T {
|
#[rustc_const_unstable(feature = "const_clone", issue = "91805")]
|
||||||
|
impl<T: ?Sized> const Clone for *mut T {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
*self
|
*self
|
||||||
@@ -221,7 +229,8 @@ mod impls {
|
|||||||
|
|
||||||
/// Shared references can be cloned, but mutable references *cannot*!
|
/// Shared references can be cloned, but mutable references *cannot*!
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: ?Sized> Clone for &T {
|
#[rustc_const_unstable(feature = "const_clone", issue = "91805")]
|
||||||
|
impl<T: ?Sized> const Clone for &T {
|
||||||
#[inline]
|
#[inline]
|
||||||
#[rustc_diagnostic_item = "noop_method_clone"]
|
#[rustc_diagnostic_item = "noop_method_clone"]
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
|
|||||||
@@ -690,7 +690,8 @@ impl AsMut<str> for str {
|
|||||||
pub enum Infallible {}
|
pub enum Infallible {}
|
||||||
|
|
||||||
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
#[stable(feature = "convert_infallible", since = "1.34.0")]
|
||||||
impl Clone for Infallible {
|
#[rustc_const_unstable(feature = "const_clone", issue = "91805")]
|
||||||
|
impl const Clone for Infallible {
|
||||||
fn clone(&self) -> Infallible {
|
fn clone(&self) -> Infallible {
|
||||||
match *self {}
|
match *self {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,6 +104,7 @@
|
|||||||
#![feature(const_caller_location)]
|
#![feature(const_caller_location)]
|
||||||
#![feature(const_cell_into_inner)]
|
#![feature(const_cell_into_inner)]
|
||||||
#![feature(const_char_convert)]
|
#![feature(const_char_convert)]
|
||||||
|
#![feature(const_clone)]
|
||||||
#![feature(const_discriminant)]
|
#![feature(const_discriminant)]
|
||||||
#![feature(const_eval_select)]
|
#![feature(const_eval_select)]
|
||||||
#![feature(const_float_bits_conv)]
|
#![feature(const_float_bits_conv)]
|
||||||
|
|||||||
@@ -1857,7 +1857,11 @@ const fn expect_failed(msg: &str) -> ! {
|
|||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: Clone> Clone for Option<T> {
|
#[rustc_const_unstable(feature = "const_clone", issue = "91805")]
|
||||||
|
impl<T> const Clone for Option<T>
|
||||||
|
where
|
||||||
|
T: ~const Clone + ~const Drop,
|
||||||
|
{
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
match self {
|
match self {
|
||||||
|
|||||||
@@ -642,7 +642,8 @@ impl<T> NonNull<[T]> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "nonnull", since = "1.25.0")]
|
#[stable(feature = "nonnull", since = "1.25.0")]
|
||||||
impl<T: ?Sized> Clone for NonNull<T> {
|
#[rustc_const_unstable(feature = "const_clone", issue = "91805")]
|
||||||
|
impl<T: ?Sized> const Clone for NonNull<T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
*self
|
*self
|
||||||
|
|||||||
@@ -146,7 +146,8 @@ impl<T: ?Sized> Unique<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[unstable(feature = "ptr_internals", issue = "none")]
|
#[unstable(feature = "ptr_internals", issue = "none")]
|
||||||
impl<T: ?Sized> Clone for Unique<T> {
|
#[rustc_const_unstable(feature = "const_clone", issue = "91805")]
|
||||||
|
impl<T: ?Sized> const Clone for Unique<T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
*self
|
*self
|
||||||
|
|||||||
@@ -1801,7 +1801,12 @@ fn unwrap_failed<T>(_msg: &str, _error: &T) -> ! {
|
|||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: Clone, E: Clone> Clone for Result<T, E> {
|
#[rustc_const_unstable(feature = "const_clone", issue = "91805")]
|
||||||
|
impl<T, E> const Clone for Result<T, E>
|
||||||
|
where
|
||||||
|
T: ~const Clone + ~const Drop,
|
||||||
|
E: ~const Clone + ~const Drop,
|
||||||
|
{
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
match self {
|
match self {
|
||||||
|
|||||||
Reference in New Issue
Block a user