rm const traits in libcore

This commit is contained in:
Deadbeef 2023-04-16 06:49:27 +00:00
parent 2a71115261
commit 76dbe29104
58 changed files with 475 additions and 868 deletions

View file

@ -1234,8 +1234,7 @@ impl<T: Default> Default for Box<T> {
#[cfg(not(no_global_oom_handling))] #[cfg(not(no_global_oom_handling))]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T> Default for Box<[T]> {
impl<T> const Default for Box<[T]> {
#[inline] #[inline]
fn default() -> Self { fn default() -> Self {
let ptr: Unique<[T]> = Unique::<[T; 0]>::dangling(); let ptr: Unique<[T]> = Unique::<[T; 0]>::dangling();
@ -1245,8 +1244,7 @@ impl<T> const Default for Box<[T]> {
#[cfg(not(no_global_oom_handling))] #[cfg(not(no_global_oom_handling))]
#[stable(feature = "default_box_extra", since = "1.17.0")] #[stable(feature = "default_box_extra", since = "1.17.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl Default for Box<str> {
impl const Default for Box<str> {
#[inline] #[inline]
fn default() -> Self { fn default() -> Self {
// SAFETY: This is the same as `Unique::cast<U>` but with an unsized `U = str`. // SAFETY: This is the same as `Unique::cast<U>` but with an unsized `U = str`.
@ -1443,8 +1441,7 @@ impl<T> From<T> for Box<T> {
} }
#[stable(feature = "pin", since = "1.33.0")] #[stable(feature = "pin", since = "1.33.0")]
#[rustc_const_unstable(feature = "const_box", issue = "92521")] impl<T: ?Sized, A: Allocator> From<Box<T, A>> for Pin<Box<T, A>>
impl<T: ?Sized, A: Allocator> const From<Box<T, A>> for Pin<Box<T, A>>
where where
A: 'static, A: 'static,
{ {
@ -1880,8 +1877,7 @@ impl<T: ?Sized, A: Allocator> fmt::Pointer for Box<T, A> {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_box", issue = "92521")] impl<T: ?Sized, A: Allocator> Deref for Box<T, A> {
impl<T: ?Sized, A: Allocator> const Deref for Box<T, A> {
type Target = T; type Target = T;
fn deref(&self) -> &T { fn deref(&self) -> &T {
@ -1890,8 +1886,7 @@ impl<T: ?Sized, A: Allocator> const Deref for Box<T, A> {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_box", issue = "92521")] impl<T: ?Sized, A: Allocator> DerefMut for Box<T, A> {
impl<T: ?Sized, A: Allocator> const DerefMut for Box<T, A> {
fn deref_mut(&mut self) -> &mut T { fn deref_mut(&mut self) -> &mut T {
&mut **self &mut **self
} }

View file

@ -2247,8 +2247,7 @@ impl_eq! { Cow<'a, str>, &'b str }
impl_eq! { Cow<'a, str>, String } impl_eq! { Cow<'a, str>, String }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl Default for String {
impl const Default for String {
/// Creates an empty `String`. /// Creates an empty `String`.
#[inline] #[inline]
fn default() -> String { fn default() -> String {

View file

@ -3022,8 +3022,7 @@ unsafe impl<#[may_dangle] T, A: Allocator> Drop for Vec<T, A> {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T> Default for Vec<T> {
impl<T> const Default for Vec<T> {
/// Creates an empty `Vec<T>`. /// Creates an empty `Vec<T>`.
/// ///
/// The vector will not allocate until elements are pushed onto it. /// The vector will not allocate until elements are pushed onto it.

View file

@ -61,7 +61,7 @@ fn box_deref_lval() {
pub struct ConstAllocator; pub struct ConstAllocator;
unsafe impl const Allocator for ConstAllocator { unsafe impl Allocator for ConstAllocator {
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> { fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
match layout.size() { match layout.size() {
0 => Ok(NonNull::slice_from_raw_parts(layout.dangling(), 0)), 0 => Ok(NonNull::slice_from_raw_parts(layout.dangling(), 0)),

View file

@ -105,7 +105,6 @@ impl fmt::Display for AllocError {
/// ///
/// [*currently allocated*]: #currently-allocated-memory /// [*currently allocated*]: #currently-allocated-memory
#[unstable(feature = "allocator_api", issue = "32838")] #[unstable(feature = "allocator_api", issue = "32838")]
#[const_trait]
pub unsafe trait Allocator { pub unsafe trait Allocator {
/// Attempts to allocate a block of memory. /// Attempts to allocate a block of memory.
/// ///

View file

@ -662,8 +662,7 @@ impl dyn Any + Send + Sync {
/// While `TypeId` implements `Hash`, `PartialOrd`, and `Ord`, it is worth /// While `TypeId` implements `Hash`, `PartialOrd`, and `Ord`, it is worth
/// noting that the hashes and ordering will vary between Rust releases. Beware /// noting that the hashes and ordering will vary between Rust releases. Beware
/// of relying on them inside of your code! /// of relying on them inside of your code!
#[derive(Clone, Copy, Debug, Hash, Eq)] #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[derive_const(PartialEq, PartialOrd, Ord)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub struct TypeId { pub struct TypeId {
t: u64, t: u64,

View file

@ -148,8 +148,7 @@ impl Error for TryFromSliceError {
} }
#[stable(feature = "try_from_slice_error", since = "1.36.0")] #[stable(feature = "try_from_slice_error", since = "1.36.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl From<Infallible> for TryFromSliceError {
impl const From<Infallible> for TryFromSliceError {
fn from(x: Infallible) -> TryFromSliceError { fn from(x: Infallible) -> TryFromSliceError {
match x {} match x {}
} }
@ -172,16 +171,14 @@ impl<T, const N: usize> AsMut<[T]> for [T; N] {
} }
#[stable(feature = "array_borrow", since = "1.4.0")] #[stable(feature = "array_borrow", since = "1.4.0")]
#[rustc_const_unstable(feature = "const_borrow", issue = "91522")] impl<T, const N: usize> Borrow<[T]> for [T; N] {
impl<T, const N: usize> const Borrow<[T]> for [T; N] {
fn borrow(&self) -> &[T] { fn borrow(&self) -> &[T] {
self self
} }
} }
#[stable(feature = "array_borrow", since = "1.4.0")] #[stable(feature = "array_borrow", since = "1.4.0")]
#[rustc_const_unstable(feature = "const_borrow", issue = "91522")] impl<T, const N: usize> BorrowMut<[T]> for [T; N] {
impl<T, const N: usize> const BorrowMut<[T]> for [T; N] {
fn borrow_mut(&mut self) -> &mut [T] { fn borrow_mut(&mut self) -> &mut [T] {
self self
} }
@ -336,10 +333,9 @@ impl<'a, T, const N: usize> IntoIterator for &'a mut [T; N] {
} }
#[stable(feature = "index_trait_on_arrays", since = "1.50.0")] #[stable(feature = "index_trait_on_arrays", since = "1.50.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] impl<T, I, const N: usize> Index<I> for [T; N]
impl<T, I, const N: usize> const Index<I> for [T; N]
where where
[T]: ~const Index<I>, [T]: Index<I>,
{ {
type Output = <[T] as Index<I>>::Output; type Output = <[T] as Index<I>>::Output;
@ -350,10 +346,9 @@ where
} }
#[stable(feature = "index_trait_on_arrays", since = "1.50.0")] #[stable(feature = "index_trait_on_arrays", since = "1.50.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] impl<T, I, const N: usize> IndexMut<I> for [T; N]
impl<T, I, const N: usize> const IndexMut<I> for [T; N]
where where
[T]: ~const IndexMut<I>, [T]: IndexMut<I>,
{ {
#[inline] #[inline]
fn index_mut(&mut self, index: I) -> &mut Self::Output { fn index_mut(&mut self, index: I) -> &mut Self::Output {
@ -435,8 +430,7 @@ impl<T: Copy> SpecArrayClone for T {
macro_rules! array_impl_default { macro_rules! array_impl_default {
{$n:expr, $t:ident $($ts:ident)*} => { {$n:expr, $t:ident $($ts:ident)*} => {
#[stable(since = "1.4.0", feature = "array_default")] #[stable(since = "1.4.0", feature = "array_default")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T> Default for [T; $n] where T: Default {
impl<T> const Default for [T; $n] where T: ~const Default {
fn default() -> [T; $n] { fn default() -> [T; $n] {
[$t::default(), $($ts::default()),*] [$t::default(), $($ts::default()),*]
} }
@ -445,8 +439,7 @@ macro_rules! array_impl_default {
}; };
{$n:expr,} => { {$n:expr,} => {
#[stable(since = "1.4.0", feature = "array_default")] #[stable(since = "1.4.0", feature = "array_default")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T> Default for [T; $n] {
impl<T> const Default for [T; $n] {
fn default() -> [T; $n] { [] } fn default() -> [T; $n] { [] }
} }
}; };

View file

@ -1,7 +1,5 @@
//! impl bool {} //! impl bool {}
use crate::marker::Destruct;
impl bool { impl bool {
/// Returns `Some(t)` if the `bool` is [`true`](../std/keyword.true.html), /// Returns `Some(t)` if the `bool` is [`true`](../std/keyword.true.html),
/// or `None` otherwise. /// or `None` otherwise.
@ -31,11 +29,8 @@ impl bool {
/// assert_eq!(a, 2); /// assert_eq!(a, 2);
/// ``` /// ```
#[stable(feature = "bool_to_option", since = "1.62.0")] #[stable(feature = "bool_to_option", since = "1.62.0")]
#[rustc_const_unstable(feature = "const_bool_to_option", issue = "91917")]
#[inline] #[inline]
pub const fn then_some<T>(self, t: T) -> Option<T> pub fn then_some<T>(self, t: T) -> Option<T>
where
T: ~const Destruct,
{ {
if self { Some(t) } else { None } if self { Some(t) } else { None }
} }
@ -61,12 +56,8 @@ impl bool {
/// assert_eq!(a, 1); /// assert_eq!(a, 1);
/// ``` /// ```
#[stable(feature = "lazy_bool_to_option", since = "1.50.0")] #[stable(feature = "lazy_bool_to_option", since = "1.50.0")]
#[rustc_const_unstable(feature = "const_bool_to_option", issue = "91917")]
#[inline] #[inline]
pub const fn then<T, F>(self, f: F) -> Option<T> pub fn then<T, F: FnOnce() -> T>(self, f: F) -> Option<T>
where
F: ~const FnOnce() -> T,
F: ~const Destruct,
{ {
if self { Some(f()) } else { None } if self { Some(f()) } else { None }
} }

View file

@ -154,7 +154,6 @@
/// [`String`]: ../../std/string/struct.String.html /// [`String`]: ../../std/string/struct.String.html
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_diagnostic_item = "Borrow"] #[rustc_diagnostic_item = "Borrow"]
#[const_trait]
pub trait Borrow<Borrowed: ?Sized> { pub trait Borrow<Borrowed: ?Sized> {
/// Immutably borrows from an owned value. /// Immutably borrows from an owned value.
/// ///
@ -185,7 +184,6 @@ pub trait Borrow<Borrowed: ?Sized> {
/// an underlying type by providing a mutable reference. See [`Borrow<T>`] /// an underlying type by providing a mutable reference. See [`Borrow<T>`]
/// for more information on borrowing as another type. /// for more information on borrowing as another type.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[const_trait]
pub trait BorrowMut<Borrowed: ?Sized>: Borrow<Borrowed> { pub trait BorrowMut<Borrowed: ?Sized>: Borrow<Borrowed> {
/// Mutably borrows from an owned value. /// Mutably borrows from an owned value.
/// ///
@ -207,8 +205,7 @@ pub trait BorrowMut<Borrowed: ?Sized>: Borrow<Borrowed> {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_borrow", issue = "91522")] impl<T: ?Sized> Borrow<T> for T {
impl<T: ?Sized> const Borrow<T> for T {
#[rustc_diagnostic_item = "noop_method_borrow"] #[rustc_diagnostic_item = "noop_method_borrow"]
fn borrow(&self) -> &T { fn borrow(&self) -> &T {
self self
@ -216,32 +213,28 @@ impl<T: ?Sized> const Borrow<T> for T {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_borrow", issue = "91522")] impl<T: ?Sized> BorrowMut<T> for T {
impl<T: ?Sized> const BorrowMut<T> for T {
fn borrow_mut(&mut self) -> &mut T { fn borrow_mut(&mut self) -> &mut T {
self self
} }
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_borrow", issue = "91522")] impl<T: ?Sized> Borrow<T> for &T {
impl<T: ?Sized> const Borrow<T> for &T {
fn borrow(&self) -> &T { fn borrow(&self) -> &T {
&**self &**self
} }
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_borrow", issue = "91522")] impl<T: ?Sized> Borrow<T> for &mut T {
impl<T: ?Sized> const Borrow<T> for &mut T {
fn borrow(&self) -> &T { fn borrow(&self) -> &T {
&**self &**self
} }
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_borrow", issue = "91522")] impl<T: ?Sized> BorrowMut<T> for &mut T {
impl<T: ?Sized> const BorrowMut<T> for &mut T {
fn borrow_mut(&mut self) -> &mut T { fn borrow_mut(&mut self) -> &mut T {
&mut **self &mut **self
} }

View file

@ -370,8 +370,7 @@ impl<T: Ord + Copy> Ord for Cell<T> {
} }
#[stable(feature = "cell_from", since = "1.12.0")] #[stable(feature = "cell_from", since = "1.12.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> From<T> for Cell<T> {
impl<T> const From<T> for Cell<T> {
/// Creates a new `Cell<T>` containing the given value. /// Creates a new `Cell<T>` containing the given value.
fn from(t: T) -> Cell<T> { fn from(t: T) -> Cell<T> {
Cell::new(t) Cell::new(t)
@ -1318,8 +1317,7 @@ impl<T: ?Sized + Ord> Ord for RefCell<T> {
} }
#[stable(feature = "cell_from", since = "1.12.0")] #[stable(feature = "cell_from", since = "1.12.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> From<T> for RefCell<T> {
impl<T> const From<T> for RefCell<T> {
/// Creates a new `RefCell<T>` containing the given value. /// Creates a new `RefCell<T>` containing the given value.
fn from(t: T) -> RefCell<T> { fn from(t: T) -> RefCell<T> {
RefCell::new(t) RefCell::new(t)
@ -2126,8 +2124,7 @@ impl<T: Default> Default for UnsafeCell<T> {
} }
#[stable(feature = "cell_from", since = "1.12.0")] #[stable(feature = "cell_from", since = "1.12.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> From<T> for UnsafeCell<T> {
impl<T> const From<T> for UnsafeCell<T> {
/// Creates a new `UnsafeCell<T>` containing the given value. /// Creates a new `UnsafeCell<T>` containing the given value.
fn from(t: T) -> UnsafeCell<T> { fn from(t: T) -> UnsafeCell<T> {
UnsafeCell::new(t) UnsafeCell::new(t)
@ -2226,8 +2223,7 @@ impl<T: Default> Default for SyncUnsafeCell<T> {
} }
#[unstable(feature = "sync_unsafe_cell", issue = "95439")] #[unstable(feature = "sync_unsafe_cell", issue = "95439")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> From<T> for SyncUnsafeCell<T> {
impl<T> const From<T> for SyncUnsafeCell<T> {
/// Creates a new `SyncUnsafeCell<T>` containing the given value. /// Creates a new `SyncUnsafeCell<T>` containing the given value.
fn from(t: T) -> SyncUnsafeCell<T> { fn from(t: T) -> SyncUnsafeCell<T> {
SyncUnsafeCell::new(t) SyncUnsafeCell::new(t)

View file

@ -284,8 +284,7 @@ impl<T: PartialEq> PartialEq for OnceCell<T> {
impl<T: Eq> Eq for OnceCell<T> {} impl<T: Eq> Eq for OnceCell<T> {}
#[stable(feature = "once_cell", since = "CURRENT_RUSTC_VERSION")] #[stable(feature = "once_cell", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> From<T> for OnceCell<T> {
impl<T> const From<T> for OnceCell<T> {
/// Creates a new `OnceCell<T>` which already contains the given `value`. /// Creates a new `OnceCell<T>` which already contains the given `value`.
#[inline] #[inline]
fn from(value: T) -> Self { fn from(value: T) -> Self {

View file

@ -27,8 +27,7 @@ pub(super) const unsafe fn from_u32_unchecked(i: u32) -> char {
} }
#[stable(feature = "char_convert", since = "1.13.0")] #[stable(feature = "char_convert", since = "1.13.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl From<char> for u32 {
impl const From<char> for u32 {
/// Converts a [`char`] into a [`u32`]. /// Converts a [`char`] into a [`u32`].
/// ///
/// # Examples /// # Examples
@ -47,8 +46,7 @@ impl const From<char> for u32 {
} }
#[stable(feature = "more_char_conversions", since = "1.51.0")] #[stable(feature = "more_char_conversions", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl From<char> for u64 {
impl const From<char> for u64 {
/// Converts a [`char`] into a [`u64`]. /// Converts a [`char`] into a [`u64`].
/// ///
/// # Examples /// # Examples
@ -69,8 +67,7 @@ impl const From<char> for u64 {
} }
#[stable(feature = "more_char_conversions", since = "1.51.0")] #[stable(feature = "more_char_conversions", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl From<char> for u128 {
impl const From<char> for u128 {
/// Converts a [`char`] into a [`u128`]. /// Converts a [`char`] into a [`u128`].
/// ///
/// # Examples /// # Examples
@ -123,8 +120,7 @@ impl TryFrom<char> for u8 {
/// for a superset of Windows-1252 that fills the remaining blanks with corresponding /// for a superset of Windows-1252 that fills the remaining blanks with corresponding
/// C0 and C1 control codes. /// C0 and C1 control codes.
#[stable(feature = "char_convert", since = "1.13.0")] #[stable(feature = "char_convert", since = "1.13.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl From<u8> for char {
impl const From<u8> for char {
/// Converts a [`u8`] into a [`char`]. /// Converts a [`u8`] into a [`char`].
/// ///
/// # Examples /// # Examples

View file

@ -36,8 +36,6 @@
#![stable(feature = "rust1", since = "1.0.0")] #![stable(feature = "rust1", since = "1.0.0")]
use crate::marker::Destruct;
/// A common trait for the ability to explicitly duplicate an object. /// A common trait for the ability to explicitly duplicate an object.
/// ///
/// Differs from [`Copy`] in that [`Copy`] is implicit and an inexpensive bit-wise copy, while /// Differs from [`Copy`] in that [`Copy`] is implicit and an inexpensive bit-wise copy, while
@ -106,7 +104,6 @@ use crate::marker::Destruct;
#[lang = "clone"] #[lang = "clone"]
#[rustc_diagnostic_item = "Clone"] #[rustc_diagnostic_item = "Clone"]
#[rustc_trivial_field_reads] #[rustc_trivial_field_reads]
#[const_trait]
pub trait Clone: Sized { pub trait Clone: Sized {
/// Returns a copy of the value. /// Returns a copy of the value.
/// ///
@ -130,8 +127,6 @@ pub trait Clone: Sized {
#[inline] #[inline]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
fn clone_from(&mut self, source: &Self) fn clone_from(&mut self, source: &Self)
where
Self: ~const Destruct,
{ {
*self = source.clone() *self = source.clone()
} }
@ -182,8 +177,7 @@ mod impls {
($($t:ty)*) => { ($($t:ty)*) => {
$( $(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_clone", issue = "91805")] impl Clone for $t {
impl const Clone for $t {
#[inline(always)] #[inline(always)]
fn clone(&self) -> Self { fn clone(&self) -> Self {
*self *self
@ -201,8 +195,7 @@ mod impls {
} }
#[unstable(feature = "never_type", issue = "35121")] #[unstable(feature = "never_type", issue = "35121")]
#[rustc_const_unstable(feature = "const_clone", issue = "91805")] impl Clone for ! {
impl const Clone for ! {
#[inline] #[inline]
fn clone(&self) -> Self { fn clone(&self) -> Self {
*self *self
@ -210,8 +203,7 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_clone", issue = "91805")] impl<T: ?Sized> Clone for *const T {
impl<T: ?Sized> const Clone for *const T {
#[inline(always)] #[inline(always)]
fn clone(&self) -> Self { fn clone(&self) -> Self {
*self *self
@ -219,8 +211,7 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_clone", issue = "91805")] impl<T: ?Sized> Clone for *mut T {
impl<T: ?Sized> const Clone for *mut T {
#[inline(always)] #[inline(always)]
fn clone(&self) -> Self { fn clone(&self) -> Self {
*self *self
@ -229,8 +220,7 @@ 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")]
#[rustc_const_unstable(feature = "const_clone", issue = "91805")] impl<T: ?Sized> Clone for &T {
impl<T: ?Sized> const Clone for &T {
#[inline(always)] #[inline(always)]
#[rustc_diagnostic_item = "noop_method_clone"] #[rustc_diagnostic_item = "noop_method_clone"]
fn clone(&self) -> Self { fn clone(&self) -> Self {

View file

@ -212,7 +212,6 @@ use self::Ordering::*;
label = "no implementation for `{Self} == {Rhs}`", label = "no implementation for `{Self} == {Rhs}`",
append_const_msg append_const_msg
)] )]
#[const_trait]
#[rustc_diagnostic_item = "PartialEq"] #[rustc_diagnostic_item = "PartialEq"]
pub trait PartialEq<Rhs: ?Sized = Self> { pub trait PartialEq<Rhs: ?Sized = Self> {
/// This method tests for `self` and `other` values to be equal, and is used /// This method tests for `self` and `other` values to be equal, and is used
@ -333,8 +332,7 @@ pub struct AssertParamIsEq<T: Eq + ?Sized> {
/// let result = 2.cmp(&1); /// let result = 2.cmp(&1);
/// assert_eq!(Ordering::Greater, result); /// assert_eq!(Ordering::Greater, result);
/// ``` /// ```
#[derive(Clone, Copy, Eq, Debug, Hash)] #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
#[derive_const(PartialOrd, Ord, PartialEq)]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[repr(i8)] #[repr(i8)]
pub enum Ordering { pub enum Ordering {
@ -604,8 +602,7 @@ impl Ordering {
pub struct Reverse<T>(#[stable(feature = "reverse_cmp_key", since = "1.19.0")] pub T); pub struct Reverse<T>(#[stable(feature = "reverse_cmp_key", since = "1.19.0")] pub T);
#[stable(feature = "reverse_cmp_key", since = "1.19.0")] #[stable(feature = "reverse_cmp_key", since = "1.19.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl<T: PartialOrd> PartialOrd for Reverse<T> {
impl<T: ~const PartialOrd> const PartialOrd for Reverse<T> {
#[inline] #[inline]
fn partial_cmp(&self, other: &Reverse<T>) -> Option<Ordering> { fn partial_cmp(&self, other: &Reverse<T>) -> Option<Ordering> {
other.0.partial_cmp(&self.0) other.0.partial_cmp(&self.0)
@ -763,7 +760,6 @@ impl<T: Clone> Clone for Reverse<T> {
#[doc(alias = ">=")] #[doc(alias = ">=")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_diagnostic_item = "Ord"] #[rustc_diagnostic_item = "Ord"]
#[const_trait]
pub trait Ord: Eq + PartialOrd<Self> { pub trait Ord: Eq + PartialOrd<Self> {
/// This method returns an [`Ordering`] between `self` and `other`. /// This method returns an [`Ordering`] between `self` and `other`.
/// ///
@ -799,7 +795,6 @@ pub trait Ord: Eq + PartialOrd<Self> {
fn max(self, other: Self) -> Self fn max(self, other: Self) -> Self
where where
Self: Sized, Self: Sized,
Self: ~const Destruct,
{ {
max_by(self, other, Ord::cmp) max_by(self, other, Ord::cmp)
} }
@ -820,7 +815,6 @@ pub trait Ord: Eq + PartialOrd<Self> {
fn min(self, other: Self) -> Self fn min(self, other: Self) -> Self
where where
Self: Sized, Self: Sized,
Self: ~const Destruct,
{ {
min_by(self, other, Ord::cmp) min_by(self, other, Ord::cmp)
} }
@ -846,8 +840,7 @@ pub trait Ord: Eq + PartialOrd<Self> {
fn clamp(self, min: Self, max: Self) -> Self fn clamp(self, min: Self, max: Self) -> Self
where where
Self: Sized, Self: Sized,
Self: ~const Destruct, Self: PartialOrd,
Self: ~const PartialOrd,
{ {
assert!(min <= max); assert!(min <= max);
if self < min { if self < min {
@ -1035,7 +1028,6 @@ pub macro Ord($item:item) {
label = "no implementation for `{Self} < {Rhs}` and `{Self} > {Rhs}`", label = "no implementation for `{Self} < {Rhs}` and `{Self} > {Rhs}`",
append_const_msg append_const_msg
)] )]
#[const_trait]
#[rustc_diagnostic_item = "PartialOrd"] #[rustc_diagnostic_item = "PartialOrd"]
pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> { pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
/// This method returns an ordering between `self` and `other` values if one exists. /// This method returns an ordering between `self` and `other` values if one exists.
@ -1168,7 +1160,7 @@ pub macro PartialOrd($item:item) {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] #[rustc_const_unstable(feature = "const_cmp", issue = "92391")]
#[cfg_attr(not(test), rustc_diagnostic_item = "cmp_min")] #[cfg_attr(not(test), rustc_diagnostic_item = "cmp_min")]
pub const fn min<T: ~const Ord + ~const Destruct>(v1: T, v2: T) -> T { pub const fn min<T: Ord>(v1: T, v2: T) -> T {
v1.min(v2) v1.min(v2)
} }
@ -1187,11 +1179,7 @@ pub const fn min<T: ~const Ord + ~const Destruct>(v1: T, v2: T) -> T {
#[inline] #[inline]
#[must_use] #[must_use]
#[stable(feature = "cmp_min_max_by", since = "1.53.0")] #[stable(feature = "cmp_min_max_by", since = "1.53.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] pub fn min_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T
pub const fn min_by<T, F: ~const FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T
where
T: ~const Destruct,
F: ~const Destruct,
{ {
match compare(&v1, &v2) { match compare(&v1, &v2) {
Ordering::Less | Ordering::Equal => v1, Ordering::Less | Ordering::Equal => v1,
@ -1214,14 +1202,9 @@ where
#[inline] #[inline]
#[must_use] #[must_use]
#[stable(feature = "cmp_min_max_by", since = "1.53.0")] #[stable(feature = "cmp_min_max_by", since = "1.53.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] pub fn min_by_key<T, F:FnMut(&T) -> K, K: Ord>(v1: T, v2: T, mut f: F) -> T
pub const fn min_by_key<T, F: ~const FnMut(&T) -> K, K: ~const Ord>(v1: T, v2: T, mut f: F) -> T
where
T: ~const Destruct,
F: ~const Destruct,
K: ~const Destruct,
{ {
min_by(v1, v2, const |v1, v2| f(v1).cmp(&f(v2))) min_by(v1, v2, |v1, v2| f(v1).cmp(&f(v2)))
} }
/// Compares and returns the maximum of two values. /// Compares and returns the maximum of two values.
@ -1241,9 +1224,8 @@ where
#[inline] #[inline]
#[must_use] #[must_use]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")]
#[cfg_attr(not(test), rustc_diagnostic_item = "cmp_max")] #[cfg_attr(not(test), rustc_diagnostic_item = "cmp_max")]
pub const fn max<T: ~const Ord + ~const Destruct>(v1: T, v2: T) -> T { pub fn max<T: Ord>(v1: T, v2: T) -> T {
v1.max(v2) v1.max(v2)
} }
@ -1262,11 +1244,7 @@ pub const fn max<T: ~const Ord + ~const Destruct>(v1: T, v2: T) -> T {
#[inline] #[inline]
#[must_use] #[must_use]
#[stable(feature = "cmp_min_max_by", since = "1.53.0")] #[stable(feature = "cmp_min_max_by", since = "1.53.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] pub fn max_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T
pub const fn max_by<T, F: ~const FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T
where
T: ~const Destruct,
F: ~const Destruct,
{ {
match compare(&v1, &v2) { match compare(&v1, &v2) {
Ordering::Less | Ordering::Equal => v2, Ordering::Less | Ordering::Equal => v2,
@ -1290,11 +1268,11 @@ where
#[must_use] #[must_use]
#[stable(feature = "cmp_min_max_by", since = "1.53.0")] #[stable(feature = "cmp_min_max_by", since = "1.53.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] #[rustc_const_unstable(feature = "const_cmp", issue = "92391")]
pub const fn max_by_key<T, F: ~const FnMut(&T) -> K, K: ~const Ord>(v1: T, v2: T, mut f: F) -> T pub const fn max_by_key<T, F: FnMut(&T) -> K, K: Ord>(v1: T, v2: T, mut f: F) -> T
where where
T: ~const Destruct, T: Destruct,
F: ~const Destruct, F: Destruct,
K: ~const Destruct, K: Destruct,
{ {
max_by(v1, v2, const |v1, v2| f(v1).cmp(&f(v2))) max_by(v1, v2, const |v1, v2| f(v1).cmp(&f(v2)))
} }
@ -1307,8 +1285,7 @@ mod impls {
macro_rules! partial_eq_impl { macro_rules! partial_eq_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl PartialEq for $t {
impl const PartialEq for $t {
#[inline] #[inline]
fn eq(&self, other: &$t) -> bool { (*self) == (*other) } fn eq(&self, other: &$t) -> bool { (*self) == (*other) }
#[inline] #[inline]
@ -1318,8 +1295,7 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl PartialEq for () {
impl const PartialEq for () {
#[inline] #[inline]
fn eq(&self, _other: &()) -> bool { fn eq(&self, _other: &()) -> bool {
true true
@ -1346,8 +1322,7 @@ mod impls {
macro_rules! partial_ord_impl { macro_rules! partial_ord_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl PartialOrd for $t {
impl const PartialOrd for $t {
#[inline] #[inline]
fn partial_cmp(&self, other: &$t) -> Option<Ordering> { fn partial_cmp(&self, other: &$t) -> Option<Ordering> {
match (*self <= *other, *self >= *other) { match (*self <= *other, *self >= *other) {
@ -1370,8 +1345,7 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl PartialOrd for () {
impl const PartialOrd for () {
#[inline] #[inline]
fn partial_cmp(&self, _: &()) -> Option<Ordering> { fn partial_cmp(&self, _: &()) -> Option<Ordering> {
Some(Equal) Some(Equal)
@ -1379,8 +1353,7 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl PartialOrd for bool {
impl const PartialOrd for bool {
#[inline] #[inline]
fn partial_cmp(&self, other: &bool) -> Option<Ordering> { fn partial_cmp(&self, other: &bool) -> Option<Ordering> {
Some(self.cmp(other)) Some(self.cmp(other))
@ -1392,8 +1365,7 @@ mod impls {
macro_rules! ord_impl { macro_rules! ord_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl PartialOrd for $t {
impl const PartialOrd for $t {
#[inline] #[inline]
fn partial_cmp(&self, other: &$t) -> Option<Ordering> { fn partial_cmp(&self, other: &$t) -> Option<Ordering> {
Some(self.cmp(other)) Some(self.cmp(other))
@ -1409,8 +1381,7 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl Ord for $t {
impl const Ord for $t {
#[inline] #[inline]
fn cmp(&self, other: &$t) -> Ordering { fn cmp(&self, other: &$t) -> Ordering {
// The order here is important to generate more optimal assembly. // The order here is important to generate more optimal assembly.
@ -1424,8 +1395,7 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl Ord for () {
impl const Ord for () {
#[inline] #[inline]
fn cmp(&self, _other: &()) -> Ordering { fn cmp(&self, _other: &()) -> Ordering {
Equal Equal
@ -1433,8 +1403,7 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl Ord for bool {
impl const Ord for bool {
#[inline] #[inline]
fn cmp(&self, other: &bool) -> Ordering { fn cmp(&self, other: &bool) -> Ordering {
// Casting to i8's and converting the difference to an Ordering generates // Casting to i8's and converting the difference to an Ordering generates
@ -1453,8 +1422,7 @@ mod impls {
ord_impl! { char usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 } ord_impl! { char usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
#[unstable(feature = "never_type", issue = "35121")] #[unstable(feature = "never_type", issue = "35121")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl PartialEq for ! {
impl const PartialEq for ! {
fn eq(&self, _: &!) -> bool { fn eq(&self, _: &!) -> bool {
*self *self
} }
@ -1464,16 +1432,14 @@ mod impls {
impl Eq for ! {} impl Eq for ! {}
#[unstable(feature = "never_type", issue = "35121")] #[unstable(feature = "never_type", issue = "35121")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl PartialOrd for ! {
impl const PartialOrd for ! {
fn partial_cmp(&self, _: &!) -> Option<Ordering> { fn partial_cmp(&self, _: &!) -> Option<Ordering> {
*self *self
} }
} }
#[unstable(feature = "never_type", issue = "35121")] #[unstable(feature = "never_type", issue = "35121")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl Ord for ! {
impl const Ord for ! {
fn cmp(&self, _: &!) -> Ordering { fn cmp(&self, _: &!) -> Ordering {
*self *self
} }
@ -1482,10 +1448,9 @@ mod impls {
// & pointers // & pointers
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl<A: ?Sized, B: ?Sized> PartialEq<&B> for &A
impl<A: ?Sized, B: ?Sized> const PartialEq<&B> for &A
where where
A: ~const PartialEq<B>, A: PartialEq<B>,
{ {
#[inline] #[inline]
fn eq(&self, other: &&B) -> bool { fn eq(&self, other: &&B) -> bool {
@ -1497,10 +1462,9 @@ mod impls {
} }
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl<A: ?Sized, B: ?Sized> PartialOrd<&B> for &A
impl<A: ?Sized, B: ?Sized> const PartialOrd<&B> for &A
where where
A: ~const PartialOrd<B>, A: PartialOrd<B>,
{ {
#[inline] #[inline]
fn partial_cmp(&self, other: &&B) -> Option<Ordering> { fn partial_cmp(&self, other: &&B) -> Option<Ordering> {

View file

@ -214,7 +214,6 @@ pub const fn identity<T>(x: T) -> T {
/// ``` /// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "AsRef")] #[cfg_attr(not(test), rustc_diagnostic_item = "AsRef")]
#[const_trait]
pub trait AsRef<T: ?Sized> { pub trait AsRef<T: ?Sized> {
/// Converts this type into a shared reference of the (usually inferred) input type. /// Converts this type into a shared reference of the (usually inferred) input type.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -366,7 +365,6 @@ pub trait AsRef<T: ?Sized> {
/// `&mut Vec<u8>`, for example, is the better choice (callers need to pass the correct type then). /// `&mut Vec<u8>`, for example, is the better choice (callers need to pass the correct type then).
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "AsMut")] #[cfg_attr(not(test), rustc_diagnostic_item = "AsMut")]
#[const_trait]
pub trait AsMut<T: ?Sized> { pub trait AsMut<T: ?Sized> {
/// Converts this type into a mutable reference of the (usually inferred) input type. /// Converts this type into a mutable reference of the (usually inferred) input type.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -443,7 +441,6 @@ pub trait AsMut<T: ?Sized> {
/// [`Vec`]: ../../std/vec/struct.Vec.html /// [`Vec`]: ../../std/vec/struct.Vec.html
#[rustc_diagnostic_item = "Into"] #[rustc_diagnostic_item = "Into"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[const_trait]
pub trait Into<T>: Sized { pub trait Into<T>: Sized {
/// Converts this type into the (usually inferred) input type. /// Converts this type into the (usually inferred) input type.
#[must_use] #[must_use]
@ -539,7 +536,6 @@ pub trait Into<T>: Sized {
all(_Self = "&str", T = "std::string::String"), all(_Self = "&str", T = "std::string::String"),
note = "to coerce a `{T}` into a `{Self}`, use `&*` as a prefix", note = "to coerce a `{T}` into a `{Self}`, use `&*` as a prefix",
))] ))]
#[const_trait]
pub trait From<T>: Sized { pub trait From<T>: Sized {
/// Converts to this type from the input type. /// Converts to this type from the input type.
#[rustc_diagnostic_item = "from_fn"] #[rustc_diagnostic_item = "from_fn"]
@ -564,7 +560,6 @@ pub trait From<T>: Sized {
/// [`Into`], see there for details. /// [`Into`], see there for details.
#[rustc_diagnostic_item = "TryInto"] #[rustc_diagnostic_item = "TryInto"]
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
#[const_trait]
pub trait TryInto<T>: Sized { pub trait TryInto<T>: Sized {
/// The type returned in the event of a conversion error. /// The type returned in the event of a conversion error.
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
@ -641,7 +636,6 @@ pub trait TryInto<T>: Sized {
/// [`try_from`]: TryFrom::try_from /// [`try_from`]: TryFrom::try_from
#[rustc_diagnostic_item = "TryFrom"] #[rustc_diagnostic_item = "TryFrom"]
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
#[const_trait]
pub trait TryFrom<T>: Sized { pub trait TryFrom<T>: Sized {
/// The type returned in the event of a conversion error. /// The type returned in the event of a conversion error.
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
@ -658,10 +652,9 @@ pub trait TryFrom<T>: Sized {
// As lifts over & // As lifts over &
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T: ?Sized, U: ?Sized> AsRef<U> for &T
impl<T: ?Sized, U: ?Sized> const AsRef<U> for &T
where where
T: ~const AsRef<U>, T: AsRef<U>,
{ {
#[inline] #[inline]
fn as_ref(&self) -> &U { fn as_ref(&self) -> &U {
@ -671,10 +664,9 @@ where
// As lifts over &mut // As lifts over &mut
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T: ?Sized, U: ?Sized> AsRef<U> for &mut T
impl<T: ?Sized, U: ?Sized> const AsRef<U> for &mut T
where where
T: ~const AsRef<U>, T: AsRef<U>,
{ {
#[inline] #[inline]
fn as_ref(&self) -> &U { fn as_ref(&self) -> &U {
@ -692,10 +684,9 @@ where
// AsMut lifts over &mut // AsMut lifts over &mut
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T: ?Sized, U: ?Sized> AsMut<U> for &mut T
impl<T: ?Sized, U: ?Sized> const AsMut<U> for &mut T
where where
T: ~const AsMut<U>, T: AsMut<U>,
{ {
#[inline] #[inline]
fn as_mut(&mut self) -> &mut U { fn as_mut(&mut self) -> &mut U {
@ -713,10 +704,9 @@ where
// From implies Into // From implies Into
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T, U> Into<U> for T
impl<T, U> const Into<U> for T
where where
U: ~const From<T>, U: From<T>,
{ {
/// Calls `U::from(self)`. /// Calls `U::from(self)`.
/// ///
@ -730,8 +720,7 @@ where
// From (and thus Into) is reflexive // From (and thus Into) is reflexive
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> From<T> for T {
impl<T> const From<T> for T {
/// Returns the argument unchanged. /// Returns the argument unchanged.
#[inline(always)] #[inline(always)]
fn from(t: T) -> T { fn from(t: T) -> T {
@ -748,8 +737,7 @@ impl<T> const From<T> for T {
#[allow(unused_attributes)] // FIXME(#58633): do a principled fix instead. #[allow(unused_attributes)] // FIXME(#58633): do a principled fix instead.
#[rustc_reservation_impl = "permitting this impl would forbid us from adding \ #[rustc_reservation_impl = "permitting this impl would forbid us from adding \
`impl<T> From<!> for T` later; see rust-lang/rust#64715 for details"] `impl<T> From<!> for T` later; see rust-lang/rust#64715 for details"]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> From<!> for T {
impl<T> const From<!> for T {
fn from(t: !) -> T { fn from(t: !) -> T {
t t
} }
@ -757,10 +745,9 @@ impl<T> const From<!> for T {
// TryFrom implies TryInto // TryFrom implies TryInto
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T, U> TryInto<U> for T
impl<T, U> const TryInto<U> for T
where where
U: ~const TryFrom<T>, U: TryFrom<T>,
{ {
type Error = U::Error; type Error = U::Error;
@ -773,10 +760,9 @@ where
// Infallible conversions are semantically equivalent to fallible conversions // Infallible conversions are semantically equivalent to fallible conversions
// with an uninhabited error type. // with an uninhabited error type.
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T, U> TryFrom<U> for T
impl<T, U> const TryFrom<U> for T
where where
U: ~const Into<T>, U: Into<T>,
{ {
type Error = Infallible; type Error = Infallible;
@ -876,8 +862,7 @@ 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")]
#[rustc_const_unstable(feature = "const_clone", issue = "91805")] impl Clone for Infallible {
impl const Clone for Infallible {
fn clone(&self) -> Infallible { fn clone(&self) -> Infallible {
match *self {} match *self {}
} }
@ -929,8 +914,7 @@ impl Ord for Infallible {
} }
#[stable(feature = "convert_infallible", since = "1.34.0")] #[stable(feature = "convert_infallible", since = "1.34.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl From<!> for Infallible {
impl const From<!> for Infallible {
fn from(x: !) -> Self { fn from(x: !) -> Self {
x x
} }

View file

@ -44,8 +44,7 @@ impl_float_to_int!(f64 => u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize);
macro_rules! impl_from { macro_rules! impl_from {
($Small: ty, $Large: ty, #[$attr:meta], $doc: expr) => { ($Small: ty, $Large: ty, #[$attr:meta], $doc: expr) => {
#[$attr] #[$attr]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl From<$Small> for $Large {
impl const From<$Small> for $Large {
// Rustdocs on the impl block show a "[+] show undocumented items" toggle. // Rustdocs on the impl block show a "[+] show undocumented items" toggle.
// Rustdocs on functions do not. // Rustdocs on functions do not.
#[doc = $doc] #[doc = $doc]
@ -170,8 +169,7 @@ impl_from! { f32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0"
// bool -> Float // bool -> Float
#[stable(feature = "float_from_bool", since = "1.68.0")] #[stable(feature = "float_from_bool", since = "1.68.0")]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl From<bool> for f32 {
impl const From<bool> for f32 {
/// Converts `bool` to `f32` losslessly. The resulting value is positive /// Converts `bool` to `f32` losslessly. The resulting value is positive
/// `0.0` for `false` and `1.0` for `true` values. /// `0.0` for `false` and `1.0` for `true` values.
/// ///
@ -190,8 +188,7 @@ impl const From<bool> for f32 {
} }
} }
#[stable(feature = "float_from_bool", since = "1.68.0")] #[stable(feature = "float_from_bool", since = "1.68.0")]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl From<bool> for f64 {
impl const From<bool> for f64 {
/// Converts `bool` to `f64` losslessly. The resulting value is positive /// Converts `bool` to `f64` losslessly. The resulting value is positive
/// `0.0` for `false` and `1.0` for `true` values. /// `0.0` for `false` and `1.0` for `true` values.
/// ///
@ -214,8 +211,7 @@ impl const From<bool> for f64 {
macro_rules! try_from_unbounded { macro_rules! try_from_unbounded {
($source:ty, $($target:ty),*) => {$( ($source:ty, $($target:ty),*) => {$(
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl TryFrom<$source> for $target {
impl const TryFrom<$source> for $target {
type Error = TryFromIntError; type Error = TryFromIntError;
/// Try to create the target number type from a source /// Try to create the target number type from a source
@ -233,8 +229,7 @@ macro_rules! try_from_unbounded {
macro_rules! try_from_lower_bounded { macro_rules! try_from_lower_bounded {
($source:ty, $($target:ty),*) => {$( ($source:ty, $($target:ty),*) => {$(
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl TryFrom<$source> for $target {
impl const TryFrom<$source> for $target {
type Error = TryFromIntError; type Error = TryFromIntError;
/// Try to create the target number type from a source /// Try to create the target number type from a source
@ -256,8 +251,7 @@ macro_rules! try_from_lower_bounded {
macro_rules! try_from_upper_bounded { macro_rules! try_from_upper_bounded {
($source:ty, $($target:ty),*) => {$( ($source:ty, $($target:ty),*) => {$(
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl TryFrom<$source> for $target {
impl const TryFrom<$source> for $target {
type Error = TryFromIntError; type Error = TryFromIntError;
/// Try to create the target number type from a source /// Try to create the target number type from a source
@ -279,8 +273,7 @@ macro_rules! try_from_upper_bounded {
macro_rules! try_from_both_bounded { macro_rules! try_from_both_bounded {
($source:ty, $($target:ty),*) => {$( ($source:ty, $($target:ty),*) => {$(
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl TryFrom<$source> for $target {
impl const TryFrom<$source> for $target {
type Error = TryFromIntError; type Error = TryFromIntError;
/// Try to create the target number type from a source /// Try to create the target number type from a source
@ -431,8 +424,7 @@ use crate::num::NonZeroUsize;
macro_rules! nzint_impl_from { macro_rules! nzint_impl_from {
($Small: ty, $Large: ty, #[$attr:meta], $doc: expr) => { ($Small: ty, $Large: ty, #[$attr:meta], $doc: expr) => {
#[$attr] #[$attr]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl From<$Small> for $Large {
impl const From<$Small> for $Large {
// Rustdocs on the impl block show a "[+] show undocumented items" toggle. // Rustdocs on the impl block show a "[+] show undocumented items" toggle.
// Rustdocs on functions do not. // Rustdocs on functions do not.
#[doc = $doc] #[doc = $doc]

View file

@ -99,7 +99,6 @@
/// ``` /// ```
#[cfg_attr(not(test), rustc_diagnostic_item = "Default")] #[cfg_attr(not(test), rustc_diagnostic_item = "Default")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[const_trait]
pub trait Default: Sized { pub trait Default: Sized {
/// Returns the "default value" for a type. /// Returns the "default value" for a type.
/// ///
@ -190,8 +189,7 @@ pub macro Default($item:item) {
macro_rules! default_impl { macro_rules! default_impl {
($t:ty, $v:expr, $doc:tt) => { ($t:ty, $v:expr, $doc:tt) => {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl Default for $t {
impl const Default for $t {
#[inline] #[inline]
#[doc = $doc] #[doc = $doc]
fn default() -> $t { fn default() -> $t {

View file

@ -87,7 +87,7 @@
use crate::fmt; use crate::fmt;
use crate::intrinsics::const_eval_select; use crate::intrinsics::const_eval_select;
use crate::marker::{self, Destruct}; use crate::marker;
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[allow(deprecated)] #[allow(deprecated)]
@ -184,7 +184,6 @@ mod sip;
/// [impl]: ../../std/primitive.str.html#impl-Hash-for-str /// [impl]: ../../std/primitive.str.html#impl-Hash-for-str
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_diagnostic_item = "Hash"] #[rustc_diagnostic_item = "Hash"]
#[const_trait]
pub trait Hash { pub trait Hash {
/// Feeds this value into the given [`Hasher`]. /// Feeds this value into the given [`Hasher`].
/// ///
@ -199,7 +198,7 @@ pub trait Hash {
/// println!("Hash is {:x}!", hasher.finish()); /// println!("Hash is {:x}!", hasher.finish());
/// ``` /// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
fn hash<H: ~const Hasher>(&self, state: &mut H); fn hash<H: Hasher>(&self, state: &mut H);
/// Feeds a slice of this type into the given [`Hasher`]. /// Feeds a slice of this type into the given [`Hasher`].
/// ///
@ -236,7 +235,7 @@ pub trait Hash {
/// [`hash`]: Hash::hash /// [`hash`]: Hash::hash
/// [`hash_slice`]: Hash::hash_slice /// [`hash_slice`]: Hash::hash_slice
#[stable(feature = "hash_slice", since = "1.3.0")] #[stable(feature = "hash_slice", since = "1.3.0")]
fn hash_slice<H: ~const Hasher>(data: &[Self], state: &mut H) fn hash_slice<H: Hasher>(data: &[Self], state: &mut H)
where where
Self: Sized, Self: Sized,
{ {
@ -246,7 +245,7 @@ pub trait Hash {
piece.hash(state) piece.hash(state)
} }
} }
const fn ct<T: ~const Hash, H: ~const Hasher>(data: &[T], state: &mut H) { const fn ct<T: Hash, H: Hasher>(data: &[T], state: &mut H) {
let mut i = 0; let mut i = 0;
while i < data.len() { while i < data.len() {
data[i].hash(state); data[i].hash(state);
@ -327,7 +326,6 @@ pub use macros::Hash;
/// [`write_u8`]: Hasher::write_u8 /// [`write_u8`]: Hasher::write_u8
/// [`write_u32`]: Hasher::write_u32 /// [`write_u32`]: Hasher::write_u32
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[const_trait]
pub trait Hasher { pub trait Hasher {
/// Returns the hash value for the values written so far. /// Returns the hash value for the values written so far.
/// ///
@ -573,8 +571,7 @@ pub trait Hasher {
} }
#[stable(feature = "indirect_hasher_impl", since = "1.22.0")] #[stable(feature = "indirect_hasher_impl", since = "1.22.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl<H: Hasher + ?Sized> Hasher for &mut H {
impl<H: ~const Hasher + ?Sized> const Hasher for &mut H {
fn finish(&self) -> u64 { fn finish(&self) -> u64 {
(**self).finish() (**self).finish()
} }
@ -654,7 +651,6 @@ impl<H: ~const Hasher + ?Sized> const Hasher for &mut H {
/// [`build_hasher`]: BuildHasher::build_hasher /// [`build_hasher`]: BuildHasher::build_hasher
/// [`HashMap`]: ../../std/collections/struct.HashMap.html /// [`HashMap`]: ../../std/collections/struct.HashMap.html
#[stable(since = "1.7.0", feature = "build_hasher")] #[stable(since = "1.7.0", feature = "build_hasher")]
#[const_trait]
pub trait BuildHasher { pub trait BuildHasher {
/// Type of the hasher that will be created. /// Type of the hasher that will be created.
#[stable(since = "1.7.0", feature = "build_hasher")] #[stable(since = "1.7.0", feature = "build_hasher")]
@ -715,10 +711,10 @@ pub trait BuildHasher {
/// ); /// );
/// ``` /// ```
#[unstable(feature = "build_hasher_simple_hash_one", issue = "86161")] #[unstable(feature = "build_hasher_simple_hash_one", issue = "86161")]
fn hash_one<T: ~const Hash + ~const Destruct>(&self, x: T) -> u64 fn hash_one<T: Hash>(&self, x: T) -> u64
where where
Self: Sized, Self: Sized,
Self::Hasher: ~const Hasher + ~const Destruct, Self::Hasher: Hasher,
{ {
let mut hasher = self.build_hasher(); let mut hasher = self.build_hasher();
x.hash(&mut hasher); x.hash(&mut hasher);
@ -782,8 +778,7 @@ impl<H> fmt::Debug for BuildHasherDefault<H> {
} }
#[stable(since = "1.7.0", feature = "build_hasher")] #[stable(since = "1.7.0", feature = "build_hasher")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl<H: Default + Hasher> BuildHasher for BuildHasherDefault<H> {
impl<H: ~const Default + Hasher> const BuildHasher for BuildHasherDefault<H> {
type Hasher = H; type Hasher = H;
fn build_hasher(&self) -> H { fn build_hasher(&self) -> H {
@ -799,8 +794,7 @@ impl<H> Clone for BuildHasherDefault<H> {
} }
#[stable(since = "1.7.0", feature = "build_hasher")] #[stable(since = "1.7.0", feature = "build_hasher")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<H> Default for BuildHasherDefault<H> {
impl<H> const Default for BuildHasherDefault<H> {
fn default() -> BuildHasherDefault<H> { fn default() -> BuildHasherDefault<H> {
BuildHasherDefault(marker::PhantomData) BuildHasherDefault(marker::PhantomData)
} }
@ -825,15 +819,14 @@ mod impls {
macro_rules! impl_write { macro_rules! impl_write {
($(($ty:ident, $meth:ident),)*) => {$( ($(($ty:ident, $meth:ident),)*) => {$(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl Hash for $ty {
impl const Hash for $ty {
#[inline] #[inline]
fn hash<H: ~const Hasher>(&self, state: &mut H) { fn hash<H: Hasher>(&self, state: &mut H) {
state.$meth(*self) state.$meth(*self)
} }
#[inline] #[inline]
fn hash_slice<H: ~const Hasher>(data: &[$ty], state: &mut H) { fn hash_slice<H: Hasher>(data: &[$ty], state: &mut H) {
let newlen = mem::size_of_val(data); let newlen = mem::size_of_val(data);
let ptr = data.as_ptr() as *const u8; let ptr = data.as_ptr() as *const u8;
// SAFETY: `ptr` is valid and aligned, as this macro is only used // SAFETY: `ptr` is valid and aligned, as this macro is only used
@ -862,37 +855,33 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl Hash for bool {
impl const Hash for bool {
#[inline] #[inline]
fn hash<H: ~const Hasher>(&self, state: &mut H) { fn hash<H: Hasher>(&self, state: &mut H) {
state.write_u8(*self as u8) state.write_u8(*self as u8)
} }
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl Hash for char {
impl const Hash for char {
#[inline] #[inline]
fn hash<H: ~const Hasher>(&self, state: &mut H) { fn hash<H: Hasher>(&self, state: &mut H) {
state.write_u32(*self as u32) state.write_u32(*self as u32)
} }
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl Hash for str {
impl const Hash for str {
#[inline] #[inline]
fn hash<H: ~const Hasher>(&self, state: &mut H) { fn hash<H: Hasher>(&self, state: &mut H) {
state.write_str(self); state.write_str(self);
} }
} }
#[stable(feature = "never_hash", since = "1.29.0")] #[stable(feature = "never_hash", since = "1.29.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl Hash for ! {
impl const Hash for ! {
#[inline] #[inline]
fn hash<H: ~const Hasher>(&self, _: &mut H) { fn hash<H: Hasher>(&self, _: &mut H) {
*self *self
} }
} }
@ -900,10 +889,9 @@ mod impls {
macro_rules! impl_hash_tuple { macro_rules! impl_hash_tuple {
() => ( () => (
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl Hash for () {
impl const Hash for () {
#[inline] #[inline]
fn hash<H: ~const Hasher>(&self, _state: &mut H) {} fn hash<H: Hasher>(&self, _state: &mut H) {}
} }
); );
@ -911,11 +899,10 @@ mod impls {
maybe_tuple_doc! { maybe_tuple_doc! {
$($name)+ @ $($name)+ @
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl<$($name: Hash),+> Hash for ($($name,)+) where last_type!($($name,)+): ?Sized {
impl<$($name: ~const Hash),+> const Hash for ($($name,)+) where last_type!($($name,)+): ?Sized {
#[allow(non_snake_case)] #[allow(non_snake_case)]
#[inline] #[inline]
fn hash<S: ~const Hasher>(&self, state: &mut S) { fn hash<S: Hasher>(&self, state: &mut S) {
let ($(ref $name,)+) = *self; let ($(ref $name,)+) = *self;
$($name.hash(state);)+ $($name.hash(state);)+
} }
@ -958,29 +945,26 @@ mod impls {
impl_hash_tuple! { T B C D E F G H I J K L } impl_hash_tuple! { T B C D E F G H I J K L }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl<T: Hash> Hash for [T] {
impl<T: ~const Hash> const Hash for [T] {
#[inline] #[inline]
fn hash<H: ~const Hasher>(&self, state: &mut H) { fn hash<H: Hasher>(&self, state: &mut H) {
state.write_length_prefix(self.len()); state.write_length_prefix(self.len());
Hash::hash_slice(self, state) Hash::hash_slice(self, state)
} }
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl<T: ?Sized + Hash> Hash for &T {
impl<T: ?Sized + ~const Hash> const Hash for &T {
#[inline] #[inline]
fn hash<H: ~const Hasher>(&self, state: &mut H) { fn hash<H: Hasher>(&self, state: &mut H) {
(**self).hash(state); (**self).hash(state);
} }
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl<T: ?Sized + Hash> Hash for &mut T {
impl<T: ?Sized + ~const Hash> const Hash for &mut T {
#[inline] #[inline]
fn hash<H: ~const Hasher>(&self, state: &mut H) { fn hash<H: Hasher>(&self, state: &mut H) {
(**self).hash(state); (**self).hash(state);
} }
} }

View file

@ -225,8 +225,7 @@ impl<S: Sip> Hasher<S> {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl super::Hasher for SipHasher {
impl const super::Hasher for SipHasher {
#[inline] #[inline]
fn write(&mut self, msg: &[u8]) { fn write(&mut self, msg: &[u8]) {
self.0.hasher.write(msg) self.0.hasher.write(msg)
@ -244,8 +243,7 @@ impl const super::Hasher for SipHasher {
} }
#[unstable(feature = "hashmap_internals", issue = "none")] #[unstable(feature = "hashmap_internals", issue = "none")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl super::Hasher for SipHasher13 {
impl const super::Hasher for SipHasher13 {
#[inline] #[inline]
fn write(&mut self, msg: &[u8]) { fn write(&mut self, msg: &[u8]) {
self.hasher.write(msg) self.hasher.write(msg)
@ -262,7 +260,7 @@ impl const super::Hasher for SipHasher13 {
} }
} }
impl<S: ~const Sip> const super::Hasher for Hasher<S> { impl<S: Sip> super::Hasher for Hasher<S> {
// Note: no integer hashing methods (`write_u*`, `write_i*`) are defined // Note: no integer hashing methods (`write_u*`, `write_i*`) are defined
// for this type. We could add them, copy the `short_write` implementation // for this type. We could add them, copy the `short_write` implementation
// in librustc_data_structures/sip128.rs, and add `write_u*`/`write_i*` // in librustc_data_structures/sip128.rs, and add `write_u*`/`write_i*`
@ -342,7 +340,7 @@ impl<S: ~const Sip> const super::Hasher for Hasher<S> {
} }
} }
impl<S: Sip> const Clone for Hasher<S> { impl<S: Sip> Clone for Hasher<S> {
#[inline] #[inline]
fn clone(&self) -> Hasher<S> { fn clone(&self) -> Hasher<S> {
Hasher { Hasher {
@ -366,7 +364,6 @@ impl<S: Sip> Default for Hasher<S> {
} }
#[doc(hidden)] #[doc(hidden)]
#[const_trait]
trait Sip { trait Sip {
fn c_rounds(_: &mut State); fn c_rounds(_: &mut State);
fn d_rounds(_: &mut State); fn d_rounds(_: &mut State);
@ -375,7 +372,7 @@ trait Sip {
#[derive(Debug, Clone, Default)] #[derive(Debug, Clone, Default)]
struct Sip13Rounds; struct Sip13Rounds;
impl const Sip for Sip13Rounds { impl Sip for Sip13Rounds {
#[inline] #[inline]
fn c_rounds(state: &mut State) { fn c_rounds(state: &mut State) {
compress!(state); compress!(state);
@ -392,7 +389,7 @@ impl const Sip for Sip13Rounds {
#[derive(Debug, Clone, Default)] #[derive(Debug, Clone, Default)]
struct Sip24Rounds; struct Sip24Rounds;
impl const Sip for Sip24Rounds { impl Sip for Sip24Rounds {
#[inline] #[inline]
fn c_rounds(state: &mut State) { fn c_rounds(state: &mut State) {
compress!(state); compress!(state);

View file

@ -1,23 +1,10 @@
// implements the unary operator "op &T" // implements the unary operator "op &T"
// based on "op T" where T is expected to be `Copy`able // based on "op T" where T is expected to be `Copy`able
macro_rules! forward_ref_unop { macro_rules! forward_ref_unop {
(impl const $imp:ident, $method:ident for $t:ty) => { (impl $imp:ident, $method:ident for $t:ty) => {
forward_ref_unop!(impl const $imp, $method for $t, forward_ref_unop!(impl $imp, $method for $t,
#[stable(feature = "rust1", since = "1.0.0")]); #[stable(feature = "rust1", since = "1.0.0")]);
}; };
// Equivalent to the non-const version, with the addition of `rustc_const_unstable`
(impl const $imp:ident, $method:ident for $t:ty, #[$attr:meta]) => {
#[$attr]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")]
impl const $imp for &$t {
type Output = <$t as $imp>::Output;
#[inline]
fn $method(self) -> <$t as $imp>::Output {
$imp::$method(*self)
}
}
};
(impl $imp:ident, $method:ident for $t:ty, #[$attr:meta]) => { (impl $imp:ident, $method:ident for $t:ty, #[$attr:meta]) => {
#[$attr] #[$attr]
impl $imp for &$t { impl $imp for &$t {
@ -34,45 +21,10 @@ macro_rules! forward_ref_unop {
// implements binary operators "&T op U", "T op &U", "&T op &U" // implements binary operators "&T op U", "T op &U", "&T op &U"
// based on "T op U" where T and U are expected to be `Copy`able // based on "T op U" where T and U are expected to be `Copy`able
macro_rules! forward_ref_binop { macro_rules! forward_ref_binop {
(impl const $imp:ident, $method:ident for $t:ty, $u:ty) => { (impl $imp:ident, $method:ident for $t:ty, $u:ty) => {
forward_ref_binop!(impl const $imp, $method for $t, $u, forward_ref_binop!(impl $imp, $method for $t, $u,
#[stable(feature = "rust1", since = "1.0.0")]); #[stable(feature = "rust1", since = "1.0.0")]);
}; };
// Equivalent to the non-const version, with the addition of `rustc_const_unstable`
(impl const $imp:ident, $method:ident for $t:ty, $u:ty, #[$attr:meta]) => {
#[$attr]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")]
impl<'a> const $imp<$u> for &'a $t {
type Output = <$t as $imp<$u>>::Output;
#[inline]
fn $method(self, other: $u) -> <$t as $imp<$u>>::Output {
$imp::$method(*self, other)
}
}
#[$attr]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")]
impl const $imp<&$u> for $t {
type Output = <$t as $imp<$u>>::Output;
#[inline]
fn $method(self, other: &$u) -> <$t as $imp<$u>>::Output {
$imp::$method(self, *other)
}
}
#[$attr]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")]
impl const $imp<&$u> for &$t {
type Output = <$t as $imp<$u>>::Output;
#[inline]
fn $method(self, other: &$u) -> <$t as $imp<$u>>::Output {
$imp::$method(*self, *other)
}
}
};
(impl $imp:ident, $method:ident for $t:ty, $u:ty, #[$attr:meta]) => { (impl $imp:ident, $method:ident for $t:ty, $u:ty, #[$attr:meta]) => {
#[$attr] #[$attr]
impl<'a> $imp<$u> for &'a $t { impl<'a> $imp<$u> for &'a $t {
@ -113,21 +65,6 @@ macro_rules! forward_ref_op_assign {
forward_ref_op_assign!(impl $imp, $method for $t, $u, forward_ref_op_assign!(impl $imp, $method for $t, $u,
#[stable(feature = "op_assign_builtins_by_ref", since = "1.22.0")]); #[stable(feature = "op_assign_builtins_by_ref", since = "1.22.0")]);
}; };
(impl const $imp:ident, $method:ident for $t:ty, $u:ty) => {
forward_ref_op_assign!(impl const $imp, $method for $t, $u,
#[stable(feature = "op_assign_builtins_by_ref", since = "1.22.0")]);
};
// Equivalent to the non-const version, with the addition of `rustc_const_unstable`
(impl const $imp:ident, $method:ident for $t:ty, $u:ty, #[$attr:meta]) => {
#[$attr]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")]
impl const $imp<&$u> for $t {
#[inline]
fn $method(&mut self, other: &$u) {
$imp::$method(self, *other);
}
}
};
(impl $imp:ident, $method:ident for $t:ty, $u:ty, #[$attr:meta]) => { (impl $imp:ident, $method:ident for $t:ty, $u:ty, #[$attr:meta]) => {
#[$attr] #[$attr]
impl $imp<&$u> for $t { impl $imp<&$u> for $t {

View file

@ -81,8 +81,7 @@ impl<T> Clone for Empty<T> {
// not #[derive] because that adds a Default bound on T, // not #[derive] because that adds a Default bound on T,
// which isn't necessary. // which isn't necessary.
#[stable(feature = "iter_empty", since = "1.2.0")] #[stable(feature = "iter_empty", since = "1.2.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T> Default for Empty<T> {
impl<T> const Default for Empty<T> {
fn default() -> Empty<T> { fn default() -> Empty<T> {
Empty(marker::PhantomData) Empty(marker::PhantomData)
} }

View file

@ -228,7 +228,6 @@ pub trait FromIterator<A>: Sized {
#[rustc_diagnostic_item = "IntoIterator"] #[rustc_diagnostic_item = "IntoIterator"]
#[rustc_skip_array_during_method_dispatch] #[rustc_skip_array_during_method_dispatch]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[const_trait]
pub trait IntoIterator { pub trait IntoIterator {
/// The type of the elements being iterated over. /// The type of the elements being iterated over.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -264,7 +263,7 @@ pub trait IntoIterator {
#[rustc_const_unstable(feature = "const_intoiterator_identity", issue = "90603")] #[rustc_const_unstable(feature = "const_intoiterator_identity", issue = "90603")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl<I: Iterator> const IntoIterator for I { impl<I: Iterator> IntoIterator for I {
type Item = I::Item; type Item = I::Item;
type IntoIter = I; type IntoIter = I;

View file

@ -70,7 +70,6 @@ fn _assert_is_object_safe(_: &dyn Iterator<Item = ()>) {}
#[doc(notable_trait)] #[doc(notable_trait)]
#[rustc_diagnostic_item = "Iterator"] #[rustc_diagnostic_item = "Iterator"]
#[must_use = "iterators are lazy and do nothing unless consumed"] #[must_use = "iterators are lazy and do nothing unless consumed"]
#[const_trait]
pub trait Iterator { pub trait Iterator {
/// The type of the elements being iterated over. /// The type of the elements being iterated over.
#[rustc_diagnostic_item = "IteratorItem"] #[rustc_diagnostic_item = "IteratorItem"]

View file

@ -112,11 +112,8 @@
#![feature(const_caller_location)] #![feature(const_caller_location)]
#![feature(const_cell_into_inner)] #![feature(const_cell_into_inner)]
#![feature(const_char_from_u32_unchecked)] #![feature(const_char_from_u32_unchecked)]
#![feature(const_clone)]
#![feature(const_cmp)] #![feature(const_cmp)]
#![feature(const_convert)]
#![feature(const_cstr_methods)] #![feature(const_cstr_methods)]
#![feature(const_default_impls)]
#![feature(const_discriminant)] #![feature(const_discriminant)]
#![feature(const_eval_select)] #![feature(const_eval_select)]
#![feature(const_exact_div)] #![feature(const_exact_div)]
@ -137,8 +134,6 @@
#![feature(const_maybe_uninit_assume_init)] #![feature(const_maybe_uninit_assume_init)]
#![feature(const_maybe_uninit_uninit_array)] #![feature(const_maybe_uninit_uninit_array)]
#![feature(const_nonnull_new)] #![feature(const_nonnull_new)]
#![feature(const_num_from_num)]
#![feature(const_ops)]
#![feature(const_option)] #![feature(const_option)]
#![feature(const_option_ext)] #![feature(const_option_ext)]
#![feature(const_pin)] #![feature(const_pin)]
@ -161,7 +156,6 @@
#![feature(const_slice_split_at_mut)] #![feature(const_slice_split_at_mut)]
#![feature(const_str_from_utf8_unchecked_mut)] #![feature(const_str_from_utf8_unchecked_mut)]
#![feature(const_swap)] #![feature(const_swap)]
#![feature(const_trait_impl)]
#![feature(const_transmute_copy)] #![feature(const_transmute_copy)]
#![feature(const_try)] #![feature(const_try)]
#![feature(const_type_id)] #![feature(const_type_id)]
@ -209,7 +203,6 @@
#![feature(const_refs_to_cell)] #![feature(const_refs_to_cell)]
#![feature(decl_macro)] #![feature(decl_macro)]
#![feature(deprecated_suggestion)] #![feature(deprecated_suggestion)]
#![feature(derive_const)]
#![feature(doc_cfg)] #![feature(doc_cfg)]
#![feature(doc_cfg_hide)] #![feature(doc_cfg_hide)]
#![feature(doc_notable_trait)] #![feature(doc_notable_trait)]

View file

@ -732,8 +732,7 @@ impl<T: ?Sized> Clone for PhantomData<T> {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T: ?Sized> Default for PhantomData<T> {
impl<T: ?Sized> const Default for PhantomData<T> {
fn default() -> Self { fn default() -> Self {
Self Self
} }
@ -858,7 +857,6 @@ impl<T: ?Sized> Unpin for *mut T {}
#[unstable(feature = "const_trait_impl", issue = "67792")] #[unstable(feature = "const_trait_impl", issue = "67792")]
#[lang = "destruct"] #[lang = "destruct"]
#[rustc_on_unimplemented(message = "can't drop `{Self}`", append_const_msg)] #[rustc_on_unimplemented(message = "can't drop `{Self}`", append_const_msg)]
#[const_trait]
#[rustc_deny_explicit_impl] #[rustc_deny_explicit_impl]
pub trait Destruct {} pub trait Destruct {}

View file

@ -146,8 +146,7 @@ impl<T: ?Sized> ManuallyDrop<T> {
} }
#[stable(feature = "manually_drop", since = "1.20.0")] #[stable(feature = "manually_drop", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_deref", issue = "88955")] impl<T: ?Sized> Deref for ManuallyDrop<T> {
impl<T: ?Sized> const Deref for ManuallyDrop<T> {
type Target = T; type Target = T;
#[inline(always)] #[inline(always)]
fn deref(&self) -> &T { fn deref(&self) -> &T {
@ -156,8 +155,7 @@ impl<T: ?Sized> const Deref for ManuallyDrop<T> {
} }
#[stable(feature = "manually_drop", since = "1.20.0")] #[stable(feature = "manually_drop", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_deref", issue = "88955")] impl<T: ?Sized> DerefMut for ManuallyDrop<T> {
impl<T: ?Sized> const DerefMut for ManuallyDrop<T> {
#[inline(always)] #[inline(always)]
fn deref_mut(&mut self) -> &mut T { fn deref_mut(&mut self) -> &mut T {
&mut self.value &mut self.value

View file

@ -81,8 +81,7 @@ impl Assume {
// FIXME(jswrenn): This const op is not actually usable. Why? // FIXME(jswrenn): This const op is not actually usable. Why?
// https://github.com/rust-lang/rust/pull/100726#issuecomment-1219928926 // https://github.com/rust-lang/rust/pull/100726#issuecomment-1219928926
#[unstable(feature = "transmutability", issue = "99571")] #[unstable(feature = "transmutability", issue = "99571")]
#[rustc_const_unstable(feature = "transmutability", issue = "99571")] impl core::ops::Add for Assume {
impl const core::ops::Add for Assume {
type Output = Assume; type Output = Assume;
fn add(self, other_assumptions: Assume) -> Assume { fn add(self, other_assumptions: Assume) -> Assume {
@ -93,8 +92,7 @@ impl const core::ops::Add for Assume {
// FIXME(jswrenn): This const op is not actually usable. Why? // FIXME(jswrenn): This const op is not actually usable. Why?
// https://github.com/rust-lang/rust/pull/100726#issuecomment-1219928926 // https://github.com/rust-lang/rust/pull/100726#issuecomment-1219928926
#[unstable(feature = "transmutability", issue = "99571")] #[unstable(feature = "transmutability", issue = "99571")]
#[rustc_const_unstable(feature = "transmutability", issue = "99571")] impl core::ops::Sub for Assume {
impl const core::ops::Sub for Assume {
type Output = Assume; type Output = Assume;
fn sub(self, other_assumptions: Assume) -> Assume { fn sub(self, other_assumptions: Assume) -> Assume {

View file

@ -26,15 +26,14 @@ impl Error for TryFromIntError {
} }
#[stable(feature = "try_from", since = "1.34.0")] #[stable(feature = "try_from", since = "1.34.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl From<Infallible> for TryFromIntError {
impl const From<Infallible> for TryFromIntError {
fn from(x: Infallible) -> TryFromIntError { fn from(x: Infallible) -> TryFromIntError {
match x {} match x {}
} }
} }
#[unstable(feature = "never_type", issue = "35121")] #[unstable(feature = "never_type", issue = "35121")]
impl const From<!> for TryFromIntError { impl From<!> for TryFromIntError {
fn from(never: !) -> TryFromIntError { fn from(never: !) -> TryFromIntError {
// Match rather than coerce to make sure that code like // Match rather than coerce to make sure that code like
// `From<Infallible> for TryFromIntError` above will keep working // `From<Infallible> for TryFromIntError` above will keep working

View file

@ -96,8 +96,7 @@ macro_rules! nonzero_integers {
} }
#[stable(feature = "from_nonzero", since = "1.31.0")] #[stable(feature = "from_nonzero", since = "1.31.0")]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl From<$Ty> for $Int {
impl const From<$Ty> for $Int {
#[doc = concat!("Converts a `", stringify!($Ty), "` into an `", stringify!($Int), "`")] #[doc = concat!("Converts a `", stringify!($Ty), "` into an `", stringify!($Int), "`")]
#[inline] #[inline]
fn from(nonzero: $Ty) -> Self { fn from(nonzero: $Ty) -> Self {
@ -106,8 +105,7 @@ macro_rules! nonzero_integers {
} }
#[stable(feature = "nonzero_bitor", since = "1.45.0")] #[stable(feature = "nonzero_bitor", since = "1.45.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitOr for $Ty {
impl const BitOr for $Ty {
type Output = Self; type Output = Self;
#[inline] #[inline]
fn bitor(self, rhs: Self) -> Self::Output { fn bitor(self, rhs: Self) -> Self::Output {
@ -118,8 +116,7 @@ macro_rules! nonzero_integers {
} }
#[stable(feature = "nonzero_bitor", since = "1.45.0")] #[stable(feature = "nonzero_bitor", since = "1.45.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitOr<$Int> for $Ty {
impl const BitOr<$Int> for $Ty {
type Output = Self; type Output = Self;
#[inline] #[inline]
fn bitor(self, rhs: $Int) -> Self::Output { fn bitor(self, rhs: $Int) -> Self::Output {
@ -131,8 +128,7 @@ macro_rules! nonzero_integers {
} }
#[stable(feature = "nonzero_bitor", since = "1.45.0")] #[stable(feature = "nonzero_bitor", since = "1.45.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitOr<$Ty> for $Int {
impl const BitOr<$Ty> for $Int {
type Output = $Ty; type Output = $Ty;
#[inline] #[inline]
fn bitor(self, rhs: $Ty) -> Self::Output { fn bitor(self, rhs: $Ty) -> Self::Output {
@ -144,8 +140,7 @@ macro_rules! nonzero_integers {
} }
#[stable(feature = "nonzero_bitor", since = "1.45.0")] #[stable(feature = "nonzero_bitor", since = "1.45.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitOrAssign for $Ty {
impl const BitOrAssign for $Ty {
#[inline] #[inline]
fn bitor_assign(&mut self, rhs: Self) { fn bitor_assign(&mut self, rhs: Self) {
*self = *self | rhs; *self = *self | rhs;
@ -153,8 +148,7 @@ macro_rules! nonzero_integers {
} }
#[stable(feature = "nonzero_bitor", since = "1.45.0")] #[stable(feature = "nonzero_bitor", since = "1.45.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitOrAssign<$Int> for $Ty {
impl const BitOrAssign<$Int> for $Ty {
#[inline] #[inline]
fn bitor_assign(&mut self, rhs: $Int) { fn bitor_assign(&mut self, rhs: $Int) {
*self = *self | rhs; *self = *self | rhs;
@ -276,8 +270,7 @@ macro_rules! nonzero_integers_div {
( $( $Ty: ident($Int: ty); )+ ) => { ( $( $Ty: ident($Int: ty); )+ ) => {
$( $(
#[stable(feature = "nonzero_div", since = "1.51.0")] #[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Div<$Ty> for $Int {
impl const Div<$Ty> for $Int {
type Output = $Int; type Output = $Int;
/// This operation rounds towards zero, /// This operation rounds towards zero,
/// truncating any fractional part of the exact result, and cannot panic. /// truncating any fractional part of the exact result, and cannot panic.
@ -290,8 +283,7 @@ macro_rules! nonzero_integers_div {
} }
#[stable(feature = "nonzero_div", since = "1.51.0")] #[stable(feature = "nonzero_div", since = "1.51.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Rem<$Ty> for $Int {
impl const Rem<$Ty> for $Int {
type Output = $Int; type Output = $Int;
/// This operation satisfies `n % d == n - (n / d) * d`, and cannot panic. /// This operation satisfies `n % d == n - (n / d) * d`, and cannot panic.
#[inline] #[inline]

View file

@ -87,8 +87,7 @@ impl<T: fmt::UpperHex> fmt::UpperHex for Wrapping<T> {
macro_rules! sh_impl_signed { macro_rules! sh_impl_signed {
($t:ident, $f:ident) => { ($t:ident, $f:ident) => {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Shl<$f> for Wrapping<$t> {
impl const Shl<$f> for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -100,22 +99,20 @@ macro_rules! sh_impl_signed {
} }
} }
} }
forward_ref_binop! { impl const Shl, shl for Wrapping<$t>, $f, forward_ref_binop! { impl Shl, shl for Wrapping<$t>, $f,
#[stable(feature = "wrapping_ref_ops", since = "1.39.0")] } #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl ShlAssign<$f> for Wrapping<$t> {
impl const ShlAssign<$f> for Wrapping<$t> {
#[inline] #[inline]
fn shl_assign(&mut self, other: $f) { fn shl_assign(&mut self, other: $f) {
*self = *self << other; *self = *self << other;
} }
} }
forward_ref_op_assign! { impl const ShlAssign, shl_assign for Wrapping<$t>, $f } forward_ref_op_assign! { impl ShlAssign, shl_assign for Wrapping<$t>, $f }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Shr<$f> for Wrapping<$t> {
impl const Shr<$f> for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -127,26 +124,24 @@ macro_rules! sh_impl_signed {
} }
} }
} }
forward_ref_binop! { impl const Shr, shr for Wrapping<$t>, $f, forward_ref_binop! { impl Shr, shr for Wrapping<$t>, $f,
#[stable(feature = "wrapping_ref_ops", since = "1.39.0")] } #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl ShrAssign<$f> for Wrapping<$t> {
impl const ShrAssign<$f> for Wrapping<$t> {
#[inline] #[inline]
fn shr_assign(&mut self, other: $f) { fn shr_assign(&mut self, other: $f) {
*self = *self >> other; *self = *self >> other;
} }
} }
forward_ref_op_assign! { impl const ShrAssign, shr_assign for Wrapping<$t>, $f } forward_ref_op_assign! { impl ShrAssign, shr_assign for Wrapping<$t>, $f }
}; };
} }
macro_rules! sh_impl_unsigned { macro_rules! sh_impl_unsigned {
($t:ident, $f:ident) => { ($t:ident, $f:ident) => {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Shl<$f> for Wrapping<$t> {
impl const Shl<$f> for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -154,22 +149,20 @@ macro_rules! sh_impl_unsigned {
Wrapping(self.0.wrapping_shl((other & self::shift_max::$t as $f) as u32)) Wrapping(self.0.wrapping_shl((other & self::shift_max::$t as $f) as u32))
} }
} }
forward_ref_binop! { impl const Shl, shl for Wrapping<$t>, $f, forward_ref_binop! { impl Shl, shl for Wrapping<$t>, $f,
#[stable(feature = "wrapping_ref_ops", since = "1.39.0")] } #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl ShlAssign<$f> for Wrapping<$t> {
impl const ShlAssign<$f> for Wrapping<$t> {
#[inline] #[inline]
fn shl_assign(&mut self, other: $f) { fn shl_assign(&mut self, other: $f) {
*self = *self << other; *self = *self << other;
} }
} }
forward_ref_op_assign! { impl const ShlAssign, shl_assign for Wrapping<$t>, $f } forward_ref_op_assign! { impl ShlAssign, shl_assign for Wrapping<$t>, $f }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Shr<$f> for Wrapping<$t> {
impl const Shr<$f> for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -177,18 +170,17 @@ macro_rules! sh_impl_unsigned {
Wrapping(self.0.wrapping_shr((other & self::shift_max::$t as $f) as u32)) Wrapping(self.0.wrapping_shr((other & self::shift_max::$t as $f) as u32))
} }
} }
forward_ref_binop! { impl const Shr, shr for Wrapping<$t>, $f, forward_ref_binop! { impl Shr, shr for Wrapping<$t>, $f,
#[stable(feature = "wrapping_ref_ops", since = "1.39.0")] } #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl ShrAssign<$f> for Wrapping<$t> {
impl const ShrAssign<$f> for Wrapping<$t> {
#[inline] #[inline]
fn shr_assign(&mut self, other: $f) { fn shr_assign(&mut self, other: $f) {
*self = *self >> other; *self = *self >> other;
} }
} }
forward_ref_op_assign! { impl const ShrAssign, shr_assign for Wrapping<$t>, $f } forward_ref_op_assign! { impl ShrAssign, shr_assign for Wrapping<$t>, $f }
}; };
} }
@ -217,8 +209,7 @@ sh_impl_all! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize }
macro_rules! wrapping_impl { macro_rules! wrapping_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Add for Wrapping<$t> {
impl const Add for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -226,32 +217,29 @@ macro_rules! wrapping_impl {
Wrapping(self.0.wrapping_add(other.0)) Wrapping(self.0.wrapping_add(other.0))
} }
} }
forward_ref_binop! { impl const Add, add for Wrapping<$t>, Wrapping<$t>, forward_ref_binop! { impl Add, add for Wrapping<$t>, Wrapping<$t>,
#[stable(feature = "wrapping_ref", since = "1.14.0")] } #[stable(feature = "wrapping_ref", since = "1.14.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl AddAssign for Wrapping<$t> {
impl const AddAssign for Wrapping<$t> {
#[inline] #[inline]
fn add_assign(&mut self, other: Wrapping<$t>) { fn add_assign(&mut self, other: Wrapping<$t>) {
*self = *self + other; *self = *self + other;
} }
} }
forward_ref_op_assign! { impl const AddAssign, add_assign for Wrapping<$t>, Wrapping<$t> } forward_ref_op_assign! { impl AddAssign, add_assign for Wrapping<$t>, Wrapping<$t> }
#[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")] #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl AddAssign<$t> for Wrapping<$t> {
impl const AddAssign<$t> for Wrapping<$t> {
#[inline] #[inline]
fn add_assign(&mut self, other: $t) { fn add_assign(&mut self, other: $t) {
*self = *self + Wrapping(other); *self = *self + Wrapping(other);
} }
} }
forward_ref_op_assign! { impl const AddAssign, add_assign for Wrapping<$t>, $t } forward_ref_op_assign! { impl AddAssign, add_assign for Wrapping<$t>, $t }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Sub for Wrapping<$t> {
impl const Sub for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -259,32 +247,29 @@ macro_rules! wrapping_impl {
Wrapping(self.0.wrapping_sub(other.0)) Wrapping(self.0.wrapping_sub(other.0))
} }
} }
forward_ref_binop! { impl const Sub, sub for Wrapping<$t>, Wrapping<$t>, forward_ref_binop! { impl Sub, sub for Wrapping<$t>, Wrapping<$t>,
#[stable(feature = "wrapping_ref", since = "1.14.0")] } #[stable(feature = "wrapping_ref", since = "1.14.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl SubAssign for Wrapping<$t> {
impl const SubAssign for Wrapping<$t> {
#[inline] #[inline]
fn sub_assign(&mut self, other: Wrapping<$t>) { fn sub_assign(&mut self, other: Wrapping<$t>) {
*self = *self - other; *self = *self - other;
} }
} }
forward_ref_op_assign! { impl const SubAssign, sub_assign for Wrapping<$t>, Wrapping<$t> } forward_ref_op_assign! { impl SubAssign, sub_assign for Wrapping<$t>, Wrapping<$t> }
#[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")] #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl SubAssign<$t> for Wrapping<$t> {
impl const SubAssign<$t> for Wrapping<$t> {
#[inline] #[inline]
fn sub_assign(&mut self, other: $t) { fn sub_assign(&mut self, other: $t) {
*self = *self - Wrapping(other); *self = *self - Wrapping(other);
} }
} }
forward_ref_op_assign! { impl const SubAssign, sub_assign for Wrapping<$t>, $t } forward_ref_op_assign! { impl SubAssign, sub_assign for Wrapping<$t>, $t }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Mul for Wrapping<$t> {
impl const Mul for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -296,28 +281,25 @@ macro_rules! wrapping_impl {
#[stable(feature = "wrapping_ref", since = "1.14.0")] } #[stable(feature = "wrapping_ref", since = "1.14.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl MulAssign for Wrapping<$t> {
impl const MulAssign for Wrapping<$t> {
#[inline] #[inline]
fn mul_assign(&mut self, other: Wrapping<$t>) { fn mul_assign(&mut self, other: Wrapping<$t>) {
*self = *self * other; *self = *self * other;
} }
} }
forward_ref_op_assign! { impl const MulAssign, mul_assign for Wrapping<$t>, Wrapping<$t> } forward_ref_op_assign! { impl MulAssign, mul_assign for Wrapping<$t>, Wrapping<$t> }
#[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")] #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl MulAssign<$t> for Wrapping<$t> {
impl const MulAssign<$t> for Wrapping<$t> {
#[inline] #[inline]
fn mul_assign(&mut self, other: $t) { fn mul_assign(&mut self, other: $t) {
*self = *self * Wrapping(other); *self = *self * Wrapping(other);
} }
} }
forward_ref_op_assign! { impl const MulAssign, mul_assign for Wrapping<$t>, $t } forward_ref_op_assign! { impl MulAssign, mul_assign for Wrapping<$t>, $t }
#[stable(feature = "wrapping_div", since = "1.3.0")] #[stable(feature = "wrapping_div", since = "1.3.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Div for Wrapping<$t> {
impl const Div for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -325,32 +307,29 @@ macro_rules! wrapping_impl {
Wrapping(self.0.wrapping_div(other.0)) Wrapping(self.0.wrapping_div(other.0))
} }
} }
forward_ref_binop! { impl const Div, div for Wrapping<$t>, Wrapping<$t>, forward_ref_binop! { impl Div, div for Wrapping<$t>, Wrapping<$t>,
#[stable(feature = "wrapping_ref", since = "1.14.0")] } #[stable(feature = "wrapping_ref", since = "1.14.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl DivAssign for Wrapping<$t> {
impl const DivAssign for Wrapping<$t> {
#[inline] #[inline]
fn div_assign(&mut self, other: Wrapping<$t>) { fn div_assign(&mut self, other: Wrapping<$t>) {
*self = *self / other; *self = *self / other;
} }
} }
forward_ref_op_assign! { impl const DivAssign, div_assign for Wrapping<$t>, Wrapping<$t> } forward_ref_op_assign! { impl DivAssign, div_assign for Wrapping<$t>, Wrapping<$t> }
#[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")] #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl DivAssign<$t> for Wrapping<$t> {
impl const DivAssign<$t> for Wrapping<$t> {
#[inline] #[inline]
fn div_assign(&mut self, other: $t) { fn div_assign(&mut self, other: $t) {
*self = *self / Wrapping(other); *self = *self / Wrapping(other);
} }
} }
forward_ref_op_assign! { impl const DivAssign, div_assign for Wrapping<$t>, $t } forward_ref_op_assign! { impl DivAssign, div_assign for Wrapping<$t>, $t }
#[stable(feature = "wrapping_impls", since = "1.7.0")] #[stable(feature = "wrapping_impls", since = "1.7.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Rem for Wrapping<$t> {
impl const Rem for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -358,32 +337,29 @@ macro_rules! wrapping_impl {
Wrapping(self.0.wrapping_rem(other.0)) Wrapping(self.0.wrapping_rem(other.0))
} }
} }
forward_ref_binop! { impl const Rem, rem for Wrapping<$t>, Wrapping<$t>, forward_ref_binop! { impl Rem, rem for Wrapping<$t>, Wrapping<$t>,
#[stable(feature = "wrapping_ref", since = "1.14.0")] } #[stable(feature = "wrapping_ref", since = "1.14.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl RemAssign for Wrapping<$t> {
impl const RemAssign for Wrapping<$t> {
#[inline] #[inline]
fn rem_assign(&mut self, other: Wrapping<$t>) { fn rem_assign(&mut self, other: Wrapping<$t>) {
*self = *self % other; *self = *self % other;
} }
} }
forward_ref_op_assign! { impl const RemAssign, rem_assign for Wrapping<$t>, Wrapping<$t> } forward_ref_op_assign! { impl RemAssign, rem_assign for Wrapping<$t>, Wrapping<$t> }
#[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")] #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl RemAssign<$t> for Wrapping<$t> {
impl const RemAssign<$t> for Wrapping<$t> {
#[inline] #[inline]
fn rem_assign(&mut self, other: $t) { fn rem_assign(&mut self, other: $t) {
*self = *self % Wrapping(other); *self = *self % Wrapping(other);
} }
} }
forward_ref_op_assign! { impl const RemAssign, rem_assign for Wrapping<$t>, $t } forward_ref_op_assign! { impl RemAssign, rem_assign for Wrapping<$t>, $t }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Not for Wrapping<$t> {
impl const Not for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -391,12 +367,11 @@ macro_rules! wrapping_impl {
Wrapping(!self.0) Wrapping(!self.0)
} }
} }
forward_ref_unop! { impl const Not, not for Wrapping<$t>, forward_ref_unop! { impl Not, not for Wrapping<$t>,
#[stable(feature = "wrapping_ref", since = "1.14.0")] } #[stable(feature = "wrapping_ref", since = "1.14.0")] }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitXor for Wrapping<$t> {
impl const BitXor for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -404,32 +379,29 @@ macro_rules! wrapping_impl {
Wrapping(self.0 ^ other.0) Wrapping(self.0 ^ other.0)
} }
} }
forward_ref_binop! { impl const BitXor, bitxor for Wrapping<$t>, Wrapping<$t>, forward_ref_binop! { impl BitXor, bitxor for Wrapping<$t>, Wrapping<$t>,
#[stable(feature = "wrapping_ref", since = "1.14.0")] } #[stable(feature = "wrapping_ref", since = "1.14.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitXorAssign for Wrapping<$t> {
impl const BitXorAssign for Wrapping<$t> {
#[inline] #[inline]
fn bitxor_assign(&mut self, other: Wrapping<$t>) { fn bitxor_assign(&mut self, other: Wrapping<$t>) {
*self = *self ^ other; *self = *self ^ other;
} }
} }
forward_ref_op_assign! { impl const BitXorAssign, bitxor_assign for Wrapping<$t>, Wrapping<$t> } forward_ref_op_assign! { impl BitXorAssign, bitxor_assign for Wrapping<$t>, Wrapping<$t> }
#[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")] #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitXorAssign<$t> for Wrapping<$t> {
impl const BitXorAssign<$t> for Wrapping<$t> {
#[inline] #[inline]
fn bitxor_assign(&mut self, other: $t) { fn bitxor_assign(&mut self, other: $t) {
*self = *self ^ Wrapping(other); *self = *self ^ Wrapping(other);
} }
} }
forward_ref_op_assign! { impl const BitXorAssign, bitxor_assign for Wrapping<$t>, $t } forward_ref_op_assign! { impl BitXorAssign, bitxor_assign for Wrapping<$t>, $t }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitOr for Wrapping<$t> {
impl const BitOr for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -437,32 +409,29 @@ macro_rules! wrapping_impl {
Wrapping(self.0 | other.0) Wrapping(self.0 | other.0)
} }
} }
forward_ref_binop! { impl const BitOr, bitor for Wrapping<$t>, Wrapping<$t>, forward_ref_binop! { impl BitOr, bitor for Wrapping<$t>, Wrapping<$t>,
#[stable(feature = "wrapping_ref", since = "1.14.0")] } #[stable(feature = "wrapping_ref", since = "1.14.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitOrAssign for Wrapping<$t> {
impl const BitOrAssign for Wrapping<$t> {
#[inline] #[inline]
fn bitor_assign(&mut self, other: Wrapping<$t>) { fn bitor_assign(&mut self, other: Wrapping<$t>) {
*self = *self | other; *self = *self | other;
} }
} }
forward_ref_op_assign! { impl const BitOrAssign, bitor_assign for Wrapping<$t>, Wrapping<$t> } forward_ref_op_assign! { impl BitOrAssign, bitor_assign for Wrapping<$t>, Wrapping<$t> }
#[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")] #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitOrAssign<$t> for Wrapping<$t> {
impl const BitOrAssign<$t> for Wrapping<$t> {
#[inline] #[inline]
fn bitor_assign(&mut self, other: $t) { fn bitor_assign(&mut self, other: $t) {
*self = *self | Wrapping(other); *self = *self | Wrapping(other);
} }
} }
forward_ref_op_assign! { impl const BitOrAssign, bitor_assign for Wrapping<$t>, $t } forward_ref_op_assign! { impl BitOrAssign, bitor_assign for Wrapping<$t>, $t }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitAnd for Wrapping<$t> {
impl const BitAnd for Wrapping<$t> {
type Output = Wrapping<$t>; type Output = Wrapping<$t>;
#[inline] #[inline]
@ -470,39 +439,36 @@ macro_rules! wrapping_impl {
Wrapping(self.0 & other.0) Wrapping(self.0 & other.0)
} }
} }
forward_ref_binop! { impl const BitAnd, bitand for Wrapping<$t>, Wrapping<$t>, forward_ref_binop! { impl BitAnd, bitand for Wrapping<$t>, Wrapping<$t>,
#[stable(feature = "wrapping_ref", since = "1.14.0")] } #[stable(feature = "wrapping_ref", since = "1.14.0")] }
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitAndAssign for Wrapping<$t> {
impl const BitAndAssign for Wrapping<$t> {
#[inline] #[inline]
fn bitand_assign(&mut self, other: Wrapping<$t>) { fn bitand_assign(&mut self, other: Wrapping<$t>) {
*self = *self & other; *self = *self & other;
} }
} }
forward_ref_op_assign! { impl const BitAndAssign, bitand_assign for Wrapping<$t>, Wrapping<$t> } forward_ref_op_assign! { impl BitAndAssign, bitand_assign for Wrapping<$t>, Wrapping<$t> }
#[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")] #[stable(feature = "wrapping_int_assign_impl", since = "1.60.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitAndAssign<$t> for Wrapping<$t> {
impl const BitAndAssign<$t> for Wrapping<$t> {
#[inline] #[inline]
fn bitand_assign(&mut self, other: $t) { fn bitand_assign(&mut self, other: $t) {
*self = *self & Wrapping(other); *self = *self & Wrapping(other);
} }
} }
forward_ref_op_assign! { impl const BitAndAssign, bitand_assign for Wrapping<$t>, $t } forward_ref_op_assign! { impl BitAndAssign, bitand_assign for Wrapping<$t>, $t }
#[stable(feature = "wrapping_neg", since = "1.10.0")] #[stable(feature = "wrapping_neg", since = "1.10.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Neg for Wrapping<$t> {
impl const Neg for Wrapping<$t> {
type Output = Self; type Output = Self;
#[inline] #[inline]
fn neg(self) -> Self { fn neg(self) -> Self {
Wrapping(0) - self Wrapping(0) - self
} }
} }
forward_ref_unop! { impl const Neg, neg for Wrapping<$t>, forward_ref_unop! { impl Neg, neg for Wrapping<$t>,
#[stable(feature = "wrapping_ref", since = "1.14.0")] } #[stable(feature = "wrapping_ref", since = "1.14.0")] }
)*) )*)

View file

@ -73,7 +73,6 @@
append_const_msg append_const_msg
)] )]
#[doc(alias = "+")] #[doc(alias = "+")]
#[const_trait]
pub trait Add<Rhs = Self> { pub trait Add<Rhs = Self> {
/// The resulting type after applying the `+` operator. /// The resulting type after applying the `+` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -95,8 +94,7 @@ pub trait Add<Rhs = Self> {
macro_rules! add_impl { macro_rules! add_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Add for $t {
impl const Add for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
@ -104,7 +102,7 @@ macro_rules! add_impl {
fn add(self, other: $t) -> $t { self + other } fn add(self, other: $t) -> $t { self + other }
} }
forward_ref_binop! { impl const Add, add for $t, $t } forward_ref_binop! { impl Add, add for $t, $t }
)*) )*)
} }
@ -183,7 +181,6 @@ add_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 }
append_const_msg append_const_msg
)] )]
#[doc(alias = "-")] #[doc(alias = "-")]
#[const_trait]
pub trait Sub<Rhs = Self> { pub trait Sub<Rhs = Self> {
/// The resulting type after applying the `-` operator. /// The resulting type after applying the `-` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -205,8 +202,7 @@ pub trait Sub<Rhs = Self> {
macro_rules! sub_impl { macro_rules! sub_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Sub for $t {
impl const Sub for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
@ -214,7 +210,7 @@ macro_rules! sub_impl {
fn sub(self, other: $t) -> $t { self - other } fn sub(self, other: $t) -> $t { self - other }
} }
forward_ref_binop! { impl const Sub, sub for $t, $t } forward_ref_binop! { impl Sub, sub for $t, $t }
)*) )*)
} }
@ -314,7 +310,6 @@ sub_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 }
label = "no implementation for `{Self} * {Rhs}`" label = "no implementation for `{Self} * {Rhs}`"
)] )]
#[doc(alias = "*")] #[doc(alias = "*")]
#[const_trait]
pub trait Mul<Rhs = Self> { pub trait Mul<Rhs = Self> {
/// The resulting type after applying the `*` operator. /// The resulting type after applying the `*` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -336,8 +331,7 @@ pub trait Mul<Rhs = Self> {
macro_rules! mul_impl { macro_rules! mul_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Mul for $t {
impl const Mul for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
@ -345,7 +339,7 @@ macro_rules! mul_impl {
fn mul(self, other: $t) -> $t { self * other } fn mul(self, other: $t) -> $t { self * other }
} }
forward_ref_binop! { impl const Mul, mul for $t, $t } forward_ref_binop! { impl Mul, mul for $t, $t }
)*) )*)
} }
@ -449,7 +443,6 @@ mul_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 }
label = "no implementation for `{Self} / {Rhs}`" label = "no implementation for `{Self} / {Rhs}`"
)] )]
#[doc(alias = "/")] #[doc(alias = "/")]
#[const_trait]
pub trait Div<Rhs = Self> { pub trait Div<Rhs = Self> {
/// The resulting type after applying the `/` operator. /// The resulting type after applying the `/` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -477,15 +470,14 @@ macro_rules! div_impl_integer {
/// ///
#[doc = $panic] #[doc = $panic]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Div for $t {
impl const Div for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
fn div(self, other: $t) -> $t { self / other } fn div(self, other: $t) -> $t { self / other }
} }
forward_ref_binop! { impl const Div, div for $t, $t } forward_ref_binop! { impl Div, div for $t, $t }
)*)*) )*)*)
} }
@ -497,15 +489,14 @@ div_impl_integer! {
macro_rules! div_impl_float { macro_rules! div_impl_float {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Div for $t {
impl const Div for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
fn div(self, other: $t) -> $t { self / other } fn div(self, other: $t) -> $t { self / other }
} }
forward_ref_binop! { impl const Div, div for $t, $t } forward_ref_binop! { impl Div, div for $t, $t }
)*) )*)
} }
@ -553,7 +544,6 @@ div_impl_float! { f32 f64 }
label = "no implementation for `{Self} % {Rhs}`" label = "no implementation for `{Self} % {Rhs}`"
)] )]
#[doc(alias = "%")] #[doc(alias = "%")]
#[const_trait]
pub trait Rem<Rhs = Self> { pub trait Rem<Rhs = Self> {
/// The resulting type after applying the `%` operator. /// The resulting type after applying the `%` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -581,15 +571,14 @@ macro_rules! rem_impl_integer {
/// ///
#[doc = $panic] #[doc = $panic]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Rem for $t {
impl const Rem for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
fn rem(self, other: $t) -> $t { self % other } fn rem(self, other: $t) -> $t { self % other }
} }
forward_ref_binop! { impl const Rem, rem for $t, $t } forward_ref_binop! { impl Rem, rem for $t, $t }
)*)*) )*)*)
} }
@ -616,15 +605,14 @@ macro_rules! rem_impl_float {
/// assert_eq!(x % y, remainder); /// assert_eq!(x % y, remainder);
/// ``` /// ```
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Rem for $t {
impl const Rem for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
fn rem(self, other: $t) -> $t { self % other } fn rem(self, other: $t) -> $t { self % other }
} }
forward_ref_binop! { impl const Rem, rem for $t, $t } forward_ref_binop! { impl Rem, rem for $t, $t }
)*) )*)
} }
@ -669,7 +657,6 @@ rem_impl_float! { f32 f64 }
#[lang = "neg"] #[lang = "neg"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[doc(alias = "-")] #[doc(alias = "-")]
#[const_trait]
pub trait Neg { pub trait Neg {
/// The resulting type after applying the `-` operator. /// The resulting type after applying the `-` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -692,8 +679,7 @@ pub trait Neg {
macro_rules! neg_impl { macro_rules! neg_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Neg for $t {
impl const Neg for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
@ -701,7 +687,7 @@ macro_rules! neg_impl {
fn neg(self) -> $t { -self } fn neg(self) -> $t { -self }
} }
forward_ref_unop! { impl const Neg, neg for $t } forward_ref_unop! { impl Neg, neg for $t }
)*) )*)
} }
@ -744,7 +730,6 @@ neg_impl! { isize i8 i16 i32 i64 i128 f32 f64 }
)] )]
#[doc(alias = "+")] #[doc(alias = "+")]
#[doc(alias = "+=")] #[doc(alias = "+=")]
#[const_trait]
pub trait AddAssign<Rhs = Self> { pub trait AddAssign<Rhs = Self> {
/// Performs the `+=` operation. /// Performs the `+=` operation.
/// ///
@ -762,14 +747,13 @@ pub trait AddAssign<Rhs = Self> {
macro_rules! add_assign_impl { macro_rules! add_assign_impl {
($($t:ty)+) => ($( ($($t:ty)+) => ($(
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl AddAssign for $t {
impl const AddAssign for $t {
#[inline] #[inline]
#[rustc_inherit_overflow_checks] #[rustc_inherit_overflow_checks]
fn add_assign(&mut self, other: $t) { *self += other } fn add_assign(&mut self, other: $t) { *self += other }
} }
forward_ref_op_assign! { impl const AddAssign, add_assign for $t, $t } forward_ref_op_assign! { impl AddAssign, add_assign for $t, $t }
)+) )+)
} }
@ -812,7 +796,6 @@ add_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 }
)] )]
#[doc(alias = "-")] #[doc(alias = "-")]
#[doc(alias = "-=")] #[doc(alias = "-=")]
#[const_trait]
pub trait SubAssign<Rhs = Self> { pub trait SubAssign<Rhs = Self> {
/// Performs the `-=` operation. /// Performs the `-=` operation.
/// ///
@ -830,14 +813,13 @@ pub trait SubAssign<Rhs = Self> {
macro_rules! sub_assign_impl { macro_rules! sub_assign_impl {
($($t:ty)+) => ($( ($($t:ty)+) => ($(
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl SubAssign for $t {
impl const SubAssign for $t {
#[inline] #[inline]
#[rustc_inherit_overflow_checks] #[rustc_inherit_overflow_checks]
fn sub_assign(&mut self, other: $t) { *self -= other } fn sub_assign(&mut self, other: $t) { *self -= other }
} }
forward_ref_op_assign! { impl const SubAssign, sub_assign for $t, $t } forward_ref_op_assign! { impl SubAssign, sub_assign for $t, $t }
)+) )+)
} }
@ -871,7 +853,6 @@ sub_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 }
)] )]
#[doc(alias = "*")] #[doc(alias = "*")]
#[doc(alias = "*=")] #[doc(alias = "*=")]
#[const_trait]
pub trait MulAssign<Rhs = Self> { pub trait MulAssign<Rhs = Self> {
/// Performs the `*=` operation. /// Performs the `*=` operation.
/// ///
@ -889,14 +870,13 @@ pub trait MulAssign<Rhs = Self> {
macro_rules! mul_assign_impl { macro_rules! mul_assign_impl {
($($t:ty)+) => ($( ($($t:ty)+) => ($(
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl MulAssign for $t {
impl const MulAssign for $t {
#[inline] #[inline]
#[rustc_inherit_overflow_checks] #[rustc_inherit_overflow_checks]
fn mul_assign(&mut self, other: $t) { *self *= other } fn mul_assign(&mut self, other: $t) { *self *= other }
} }
forward_ref_op_assign! { impl const MulAssign, mul_assign for $t, $t } forward_ref_op_assign! { impl MulAssign, mul_assign for $t, $t }
)+) )+)
} }
@ -930,7 +910,6 @@ mul_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 }
)] )]
#[doc(alias = "/")] #[doc(alias = "/")]
#[doc(alias = "/=")] #[doc(alias = "/=")]
#[const_trait]
pub trait DivAssign<Rhs = Self> { pub trait DivAssign<Rhs = Self> {
/// Performs the `/=` operation. /// Performs the `/=` operation.
/// ///
@ -948,13 +927,12 @@ pub trait DivAssign<Rhs = Self> {
macro_rules! div_assign_impl { macro_rules! div_assign_impl {
($($t:ty)+) => ($( ($($t:ty)+) => ($(
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl DivAssign for $t {
impl const DivAssign for $t {
#[inline] #[inline]
fn div_assign(&mut self, other: $t) { *self /= other } fn div_assign(&mut self, other: $t) { *self /= other }
} }
forward_ref_op_assign! { impl const DivAssign, div_assign for $t, $t } forward_ref_op_assign! { impl DivAssign, div_assign for $t, $t }
)+) )+)
} }
@ -992,7 +970,6 @@ div_assign_impl! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f32 f64 }
)] )]
#[doc(alias = "%")] #[doc(alias = "%")]
#[doc(alias = "%=")] #[doc(alias = "%=")]
#[const_trait]
pub trait RemAssign<Rhs = Self> { pub trait RemAssign<Rhs = Self> {
/// Performs the `%=` operation. /// Performs the `%=` operation.
/// ///
@ -1010,13 +987,12 @@ pub trait RemAssign<Rhs = Self> {
macro_rules! rem_assign_impl { macro_rules! rem_assign_impl {
($($t:ty)+) => ($( ($($t:ty)+) => ($(
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl RemAssign for $t {
impl const RemAssign for $t {
#[inline] #[inline]
fn rem_assign(&mut self, other: $t) { *self %= other } fn rem_assign(&mut self, other: $t) { *self %= other }
} }
forward_ref_op_assign! { impl const RemAssign, rem_assign for $t, $t } forward_ref_op_assign! { impl RemAssign, rem_assign for $t, $t }
)+) )+)
} }

View file

@ -31,7 +31,6 @@
#[lang = "not"] #[lang = "not"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[doc(alias = "!")] #[doc(alias = "!")]
#[const_trait]
pub trait Not { pub trait Not {
/// The resulting type after applying the `!` operator. /// The resulting type after applying the `!` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -55,23 +54,21 @@ pub trait Not {
macro_rules! not_impl { macro_rules! not_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Not for $t {
impl const Not for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
fn not(self) -> $t { !self } fn not(self) -> $t { !self }
} }
forward_ref_unop! { impl const Not, not for $t } forward_ref_unop! { impl Not, not for $t }
)*) )*)
} }
not_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 } not_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
#[stable(feature = "not_never", since = "1.60.0")] #[stable(feature = "not_never", since = "1.60.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Not for ! {
impl const Not for ! {
type Output = !; type Output = !;
#[inline] #[inline]
@ -144,7 +141,6 @@ impl const Not for ! {
message = "no implementation for `{Self} & {Rhs}`", message = "no implementation for `{Self} & {Rhs}`",
label = "no implementation for `{Self} & {Rhs}`" label = "no implementation for `{Self} & {Rhs}`"
)] )]
#[const_trait]
pub trait BitAnd<Rhs = Self> { pub trait BitAnd<Rhs = Self> {
/// The resulting type after applying the `&` operator. /// The resulting type after applying the `&` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -168,15 +164,14 @@ pub trait BitAnd<Rhs = Self> {
macro_rules! bitand_impl { macro_rules! bitand_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitAnd for $t {
impl const BitAnd for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
fn bitand(self, rhs: $t) -> $t { self & rhs } fn bitand(self, rhs: $t) -> $t { self & rhs }
} }
forward_ref_binop! { impl const BitAnd, bitand for $t, $t } forward_ref_binop! { impl BitAnd, bitand for $t, $t }
)*) )*)
} }
@ -246,7 +241,6 @@ bitand_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
message = "no implementation for `{Self} | {Rhs}`", message = "no implementation for `{Self} | {Rhs}`",
label = "no implementation for `{Self} | {Rhs}`" label = "no implementation for `{Self} | {Rhs}`"
)] )]
#[const_trait]
pub trait BitOr<Rhs = Self> { pub trait BitOr<Rhs = Self> {
/// The resulting type after applying the `|` operator. /// The resulting type after applying the `|` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -270,15 +264,14 @@ pub trait BitOr<Rhs = Self> {
macro_rules! bitor_impl { macro_rules! bitor_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitOr for $t {
impl const BitOr for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
fn bitor(self, rhs: $t) -> $t { self | rhs } fn bitor(self, rhs: $t) -> $t { self | rhs }
} }
forward_ref_binop! { impl const BitOr, bitor for $t, $t } forward_ref_binop! { impl BitOr, bitor for $t, $t }
)*) )*)
} }
@ -348,7 +341,6 @@ bitor_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
message = "no implementation for `{Self} ^ {Rhs}`", message = "no implementation for `{Self} ^ {Rhs}`",
label = "no implementation for `{Self} ^ {Rhs}`" label = "no implementation for `{Self} ^ {Rhs}`"
)] )]
#[const_trait]
pub trait BitXor<Rhs = Self> { pub trait BitXor<Rhs = Self> {
/// The resulting type after applying the `^` operator. /// The resulting type after applying the `^` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -372,15 +364,14 @@ pub trait BitXor<Rhs = Self> {
macro_rules! bitxor_impl { macro_rules! bitxor_impl {
($($t:ty)*) => ($( ($($t:ty)*) => ($(
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitXor for $t {
impl const BitXor for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
fn bitxor(self, other: $t) -> $t { self ^ other } fn bitxor(self, other: $t) -> $t { self ^ other }
} }
forward_ref_binop! { impl const BitXor, bitxor for $t, $t } forward_ref_binop! { impl BitXor, bitxor for $t, $t }
)*) )*)
} }
@ -449,7 +440,6 @@ bitxor_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
message = "no implementation for `{Self} << {Rhs}`", message = "no implementation for `{Self} << {Rhs}`",
label = "no implementation for `{Self} << {Rhs}`" label = "no implementation for `{Self} << {Rhs}`"
)] )]
#[const_trait]
pub trait Shl<Rhs = Self> { pub trait Shl<Rhs = Self> {
/// The resulting type after applying the `<<` operator. /// The resulting type after applying the `<<` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -471,8 +461,7 @@ pub trait Shl<Rhs = Self> {
macro_rules! shl_impl { macro_rules! shl_impl {
($t:ty, $f:ty) => { ($t:ty, $f:ty) => {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Shl<$f> for $t {
impl const Shl<$f> for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
@ -482,7 +471,7 @@ macro_rules! shl_impl {
} }
} }
forward_ref_binop! { impl const Shl, shl for $t, $f } forward_ref_binop! { impl Shl, shl for $t, $f }
}; };
} }
@ -569,7 +558,6 @@ shl_impl_all! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 isize i128 }
message = "no implementation for `{Self} >> {Rhs}`", message = "no implementation for `{Self} >> {Rhs}`",
label = "no implementation for `{Self} >> {Rhs}`" label = "no implementation for `{Self} >> {Rhs}`"
)] )]
#[const_trait]
pub trait Shr<Rhs = Self> { pub trait Shr<Rhs = Self> {
/// The resulting type after applying the `>>` operator. /// The resulting type after applying the `>>` operator.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -591,8 +579,7 @@ pub trait Shr<Rhs = Self> {
macro_rules! shr_impl { macro_rules! shr_impl {
($t:ty, $f:ty) => { ($t:ty, $f:ty) => {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl Shr<$f> for $t {
impl const Shr<$f> for $t {
type Output = $t; type Output = $t;
#[inline] #[inline]
@ -602,7 +589,7 @@ macro_rules! shr_impl {
} }
} }
forward_ref_binop! { impl const Shr, shr for $t, $f } forward_ref_binop! { impl Shr, shr for $t, $f }
}; };
} }
@ -698,7 +685,6 @@ shr_impl_all! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize }
message = "no implementation for `{Self} &= {Rhs}`", message = "no implementation for `{Self} &= {Rhs}`",
label = "no implementation for `{Self} &= {Rhs}`" label = "no implementation for `{Self} &= {Rhs}`"
)] )]
#[const_trait]
pub trait BitAndAssign<Rhs = Self> { pub trait BitAndAssign<Rhs = Self> {
/// Performs the `&=` operation. /// Performs the `&=` operation.
/// ///
@ -728,13 +714,12 @@ pub trait BitAndAssign<Rhs = Self> {
macro_rules! bitand_assign_impl { macro_rules! bitand_assign_impl {
($($t:ty)+) => ($( ($($t:ty)+) => ($(
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitAndAssign for $t {
impl const BitAndAssign for $t {
#[inline] #[inline]
fn bitand_assign(&mut self, other: $t) { *self &= other } fn bitand_assign(&mut self, other: $t) { *self &= other }
} }
forward_ref_op_assign! { impl const BitAndAssign, bitand_assign for $t, $t } forward_ref_op_assign! { impl BitAndAssign, bitand_assign for $t, $t }
)+) )+)
} }
@ -771,7 +756,6 @@ bitand_assign_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
message = "no implementation for `{Self} |= {Rhs}`", message = "no implementation for `{Self} |= {Rhs}`",
label = "no implementation for `{Self} |= {Rhs}`" label = "no implementation for `{Self} |= {Rhs}`"
)] )]
#[const_trait]
pub trait BitOrAssign<Rhs = Self> { pub trait BitOrAssign<Rhs = Self> {
/// Performs the `|=` operation. /// Performs the `|=` operation.
/// ///
@ -801,13 +785,12 @@ pub trait BitOrAssign<Rhs = Self> {
macro_rules! bitor_assign_impl { macro_rules! bitor_assign_impl {
($($t:ty)+) => ($( ($($t:ty)+) => ($(
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitOrAssign for $t {
impl const BitOrAssign for $t {
#[inline] #[inline]
fn bitor_assign(&mut self, other: $t) { *self |= other } fn bitor_assign(&mut self, other: $t) { *self |= other }
} }
forward_ref_op_assign! { impl const BitOrAssign, bitor_assign for $t, $t } forward_ref_op_assign! { impl BitOrAssign, bitor_assign for $t, $t }
)+) )+)
} }
@ -844,7 +827,6 @@ bitor_assign_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
message = "no implementation for `{Self} ^= {Rhs}`", message = "no implementation for `{Self} ^= {Rhs}`",
label = "no implementation for `{Self} ^= {Rhs}`" label = "no implementation for `{Self} ^= {Rhs}`"
)] )]
#[const_trait]
pub trait BitXorAssign<Rhs = Self> { pub trait BitXorAssign<Rhs = Self> {
/// Performs the `^=` operation. /// Performs the `^=` operation.
/// ///
@ -874,13 +856,12 @@ pub trait BitXorAssign<Rhs = Self> {
macro_rules! bitxor_assign_impl { macro_rules! bitxor_assign_impl {
($($t:ty)+) => ($( ($($t:ty)+) => ($(
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl BitXorAssign for $t {
impl const BitXorAssign for $t {
#[inline] #[inline]
fn bitxor_assign(&mut self, other: $t) { *self ^= other } fn bitxor_assign(&mut self, other: $t) { *self ^= other }
} }
forward_ref_op_assign! { impl const BitXorAssign, bitxor_assign for $t, $t } forward_ref_op_assign! { impl BitXorAssign, bitxor_assign for $t, $t }
)+) )+)
} }
@ -915,7 +896,6 @@ bitxor_assign_impl! { bool usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
message = "no implementation for `{Self} <<= {Rhs}`", message = "no implementation for `{Self} <<= {Rhs}`",
label = "no implementation for `{Self} <<= {Rhs}`" label = "no implementation for `{Self} <<= {Rhs}`"
)] )]
#[const_trait]
pub trait ShlAssign<Rhs = Self> { pub trait ShlAssign<Rhs = Self> {
/// Performs the `<<=` operation. /// Performs the `<<=` operation.
/// ///
@ -937,8 +917,7 @@ pub trait ShlAssign<Rhs = Self> {
macro_rules! shl_assign_impl { macro_rules! shl_assign_impl {
($t:ty, $f:ty) => { ($t:ty, $f:ty) => {
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl ShlAssign<$f> for $t {
impl const ShlAssign<$f> for $t {
#[inline] #[inline]
#[rustc_inherit_overflow_checks] #[rustc_inherit_overflow_checks]
fn shl_assign(&mut self, other: $f) { fn shl_assign(&mut self, other: $f) {
@ -946,7 +925,7 @@ macro_rules! shl_assign_impl {
} }
} }
forward_ref_op_assign! { impl const ShlAssign, shl_assign for $t, $f } forward_ref_op_assign! { impl ShlAssign, shl_assign for $t, $f }
}; };
} }
@ -999,7 +978,6 @@ shl_assign_impl_all! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize }
message = "no implementation for `{Self} >>= {Rhs}`", message = "no implementation for `{Self} >>= {Rhs}`",
label = "no implementation for `{Self} >>= {Rhs}`" label = "no implementation for `{Self} >>= {Rhs}`"
)] )]
#[const_trait]
pub trait ShrAssign<Rhs = Self> { pub trait ShrAssign<Rhs = Self> {
/// Performs the `>>=` operation. /// Performs the `>>=` operation.
/// ///
@ -1021,8 +999,7 @@ pub trait ShrAssign<Rhs = Self> {
macro_rules! shr_assign_impl { macro_rules! shr_assign_impl {
($t:ty, $f:ty) => { ($t:ty, $f:ty) => {
#[stable(feature = "op_assign_traits", since = "1.8.0")] #[stable(feature = "op_assign_traits", since = "1.8.0")]
#[rustc_const_unstable(feature = "const_ops", issue = "90080")] impl ShrAssign<$f> for $t {
impl const ShrAssign<$f> for $t {
#[inline] #[inline]
#[rustc_inherit_overflow_checks] #[rustc_inherit_overflow_checks]
fn shr_assign(&mut self, other: $f) { fn shr_assign(&mut self, other: $f) {
@ -1030,7 +1007,7 @@ macro_rules! shr_assign_impl {
} }
} }
forward_ref_op_assign! { impl const ShrAssign, shr_assign for $t, $f } forward_ref_op_assign! { impl ShrAssign, shr_assign for $t, $f }
}; };
} }

View file

@ -97,8 +97,7 @@ pub enum ControlFlow<B, C = ()> {
} }
#[unstable(feature = "try_trait_v2", issue = "84277")] #[unstable(feature = "try_trait_v2", issue = "84277")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<B, C> ops::Try for ControlFlow<B, C> {
impl<B, C> const ops::Try for ControlFlow<B, C> {
type Output = C; type Output = C;
type Residual = ControlFlow<B, convert::Infallible>; type Residual = ControlFlow<B, convert::Infallible>;
@ -117,8 +116,7 @@ impl<B, C> const ops::Try for ControlFlow<B, C> {
} }
#[unstable(feature = "try_trait_v2", issue = "84277")] #[unstable(feature = "try_trait_v2", issue = "84277")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<B, C> ops::FromResidual for ControlFlow<B, C> {
impl<B, C> const ops::FromResidual for ControlFlow<B, C> {
#[inline] #[inline]
fn from_residual(residual: ControlFlow<B, convert::Infallible>) -> Self { fn from_residual(residual: ControlFlow<B, convert::Infallible>) -> Self {
match residual { match residual {
@ -128,8 +126,7 @@ impl<B, C> const ops::FromResidual for ControlFlow<B, C> {
} }
#[unstable(feature = "try_trait_v2_residual", issue = "91285")] #[unstable(feature = "try_trait_v2_residual", issue = "91285")]
#[rustc_const_unstable(feature = "const_try", issue = "74935")] impl<B, C> ops::Residual<C> for ControlFlow<B, convert::Infallible> {
impl<B, C> const ops::Residual<C> for ControlFlow<B, convert::Infallible> {
type TryType = ControlFlow<B, C>; type TryType = ControlFlow<B, C>;
} }

View file

@ -61,7 +61,6 @@
#[doc(alias = "&*")] #[doc(alias = "&*")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_diagnostic_item = "Deref"] #[rustc_diagnostic_item = "Deref"]
#[const_trait]
pub trait Deref { pub trait Deref {
/// The resulting type after dereferencing. /// The resulting type after dereferencing.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -77,8 +76,7 @@ pub trait Deref {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_deref", issue = "88955")] impl<T: ?Sized> Deref for &T {
impl<T: ?Sized> const Deref for &T {
type Target = T; type Target = T;
#[rustc_diagnostic_item = "noop_method_deref"] #[rustc_diagnostic_item = "noop_method_deref"]
@ -91,8 +89,7 @@ impl<T: ?Sized> const Deref for &T {
impl<T: ?Sized> !DerefMut for &T {} impl<T: ?Sized> !DerefMut for &T {}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_deref", issue = "88955")] impl<T: ?Sized> Deref for &mut T {
impl<T: ?Sized> const Deref for &mut T {
type Target = T; type Target = T;
fn deref(&self) -> &T { fn deref(&self) -> &T {
@ -170,7 +167,6 @@ impl<T: ?Sized> const Deref for &mut T {
#[lang = "deref_mut"] #[lang = "deref_mut"]
#[doc(alias = "*")] #[doc(alias = "*")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[const_trait]
pub trait DerefMut: Deref { pub trait DerefMut: Deref {
/// Mutably dereferences the value. /// Mutably dereferences the value.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]

View file

@ -134,7 +134,6 @@
/// these types cannot have destructors. /// these types cannot have destructors.
#[lang = "drop"] #[lang = "drop"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[const_trait]
pub trait Drop { pub trait Drop {
/// Executes the destructor for this type. /// Executes the destructor for this type.
/// ///

View file

@ -72,7 +72,6 @@ use crate::marker::Tuple;
)] )]
#[fundamental] // so that regex can rely that `&str: !FnMut` #[fundamental] // so that regex can rely that `&str: !FnMut`
#[must_use = "closures are lazy and do nothing unless called"] #[must_use = "closures are lazy and do nothing unless called"]
#[const_trait]
pub trait Fn<Args: Tuple>: FnMut<Args> { pub trait Fn<Args: Tuple>: FnMut<Args> {
/// Performs the call operation. /// Performs the call operation.
#[unstable(feature = "fn_traits", issue = "29625")] #[unstable(feature = "fn_traits", issue = "29625")]
@ -159,7 +158,6 @@ pub trait Fn<Args: Tuple>: FnMut<Args> {
)] )]
#[fundamental] // so that regex can rely that `&str: !FnMut` #[fundamental] // so that regex can rely that `&str: !FnMut`
#[must_use = "closures are lazy and do nothing unless called"] #[must_use = "closures are lazy and do nothing unless called"]
#[const_trait]
pub trait FnMut<Args: Tuple>: FnOnce<Args> { pub trait FnMut<Args: Tuple>: FnOnce<Args> {
/// Performs the call operation. /// Performs the call operation.
#[unstable(feature = "fn_traits", issue = "29625")] #[unstable(feature = "fn_traits", issue = "29625")]
@ -238,7 +236,6 @@ pub trait FnMut<Args: Tuple>: FnOnce<Args> {
)] )]
#[fundamental] // so that regex can rely that `&str: !FnMut` #[fundamental] // so that regex can rely that `&str: !FnMut`
#[must_use = "closures are lazy and do nothing unless called"] #[must_use = "closures are lazy and do nothing unless called"]
#[const_trait]
pub trait FnOnce<Args: Tuple> { pub trait FnOnce<Args: Tuple> {
/// The returned type after the call operator is used. /// The returned type after the call operator is used.
#[lang = "fn_once_output"] #[lang = "fn_once_output"]
@ -254,10 +251,9 @@ mod impls {
use crate::marker::Tuple; use crate::marker::Tuple;
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")] impl<A: Tuple, F: ?Sized> Fn<A> for &F
impl<A: Tuple, F: ?Sized> const Fn<A> for &F
where where
F: ~const Fn<A>, F: Fn<A>,
{ {
extern "rust-call" fn call(&self, args: A) -> F::Output { extern "rust-call" fn call(&self, args: A) -> F::Output {
(**self).call(args) (**self).call(args)
@ -265,10 +261,9 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")] impl<A: Tuple, F: ?Sized> FnMut<A> for &F
impl<A: Tuple, F: ?Sized> const FnMut<A> for &F
where where
F: ~const Fn<A>, F: Fn<A>,
{ {
extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output { extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output {
(**self).call(args) (**self).call(args)
@ -276,10 +271,9 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")] impl<A: Tuple, F: ?Sized> FnOnce<A> for &F
impl<A: Tuple, F: ?Sized> const FnOnce<A> for &F
where where
F: ~const Fn<A>, F: Fn<A>,
{ {
type Output = F::Output; type Output = F::Output;
@ -289,10 +283,9 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")] impl<A: Tuple, F: ?Sized> FnMut<A> for &mut F
impl<A: Tuple, F: ?Sized> const FnMut<A> for &mut F
where where
F: ~const FnMut<A>, F: FnMut<A>,
{ {
extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output { extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output {
(*self).call_mut(args) (*self).call_mut(args)
@ -300,10 +293,9 @@ mod impls {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")] impl<A: Tuple, F: ?Sized> FnOnce<A> for &mut F
impl<A: Tuple, F: ?Sized> const FnOnce<A> for &mut F
where where
F: ~const FnMut<A>, F: FnMut<A>,
{ {
type Output = F::Output; type Output = F::Output;
extern "rust-call" fn call_once(self, args: A) -> F::Output { extern "rust-call" fn call_once(self, args: A) -> F::Output {

View file

@ -55,7 +55,6 @@
#[doc(alias = "]")] #[doc(alias = "]")]
#[doc(alias = "[")] #[doc(alias = "[")]
#[doc(alias = "[]")] #[doc(alias = "[]")]
#[const_trait]
pub trait Index<Idx: ?Sized> { pub trait Index<Idx: ?Sized> {
/// The returned type after indexing. /// The returned type after indexing.
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -164,8 +163,7 @@ see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#ind
#[doc(alias = "[")] #[doc(alias = "[")]
#[doc(alias = "]")] #[doc(alias = "]")]
#[doc(alias = "[]")] #[doc(alias = "[]")]
#[const_trait] pub trait IndexMut<Idx: ?Sized>: Index<Idx> {
pub trait IndexMut<Idx: ?Sized>: ~const Index<Idx> {
/// Performs the mutable indexing (`container[index]`) operation. /// Performs the mutable indexing (`container[index]`) operation.
/// ///
/// # Panics /// # Panics

View file

@ -96,7 +96,7 @@ impl<Idx: fmt::Debug> fmt::Debug for Range<Idx> {
} }
} }
impl<Idx: ~const PartialOrd<Idx>> Range<Idx> { impl<Idx: PartialOrd<Idx>> Range<Idx> {
/// Returns `true` if `item` is contained in the range. /// Returns `true` if `item` is contained in the range.
/// ///
/// # Examples /// # Examples
@ -119,8 +119,8 @@ impl<Idx: ~const PartialOrd<Idx>> Range<Idx> {
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] #[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")]
pub const fn contains<U>(&self, item: &U) -> bool pub const fn contains<U>(&self, item: &U) -> bool
where where
Idx: ~const PartialOrd<U>, Idx: PartialOrd<U>,
U: ?Sized + ~const PartialOrd<Idx>, U: ?Sized + PartialOrd<Idx>,
{ {
<Self as RangeBounds<Idx>>::contains(self, item) <Self as RangeBounds<Idx>>::contains(self, item)
} }
@ -201,7 +201,7 @@ impl<Idx: fmt::Debug> fmt::Debug for RangeFrom<Idx> {
} }
} }
impl<Idx: ~const PartialOrd<Idx>> RangeFrom<Idx> { impl<Idx: PartialOrd<Idx>> RangeFrom<Idx> {
/// Returns `true` if `item` is contained in the range. /// Returns `true` if `item` is contained in the range.
/// ///
/// # Examples /// # Examples
@ -216,11 +216,10 @@ impl<Idx: ~const PartialOrd<Idx>> RangeFrom<Idx> {
/// assert!(!(f32::NAN..).contains(&0.5)); /// assert!(!(f32::NAN..).contains(&0.5));
/// ``` /// ```
#[stable(feature = "range_contains", since = "1.35.0")] #[stable(feature = "range_contains", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] pub fn contains<U>(&self, item: &U) -> bool
pub const fn contains<U>(&self, item: &U) -> bool
where where
Idx: ~const PartialOrd<U>, Idx: PartialOrd<U>,
U: ?Sized + ~const PartialOrd<Idx>, U: ?Sized + PartialOrd<Idx>,
{ {
<Self as RangeBounds<Idx>>::contains(self, item) <Self as RangeBounds<Idx>>::contains(self, item)
} }
@ -283,7 +282,7 @@ impl<Idx: fmt::Debug> fmt::Debug for RangeTo<Idx> {
} }
} }
impl<Idx: ~const PartialOrd<Idx>> RangeTo<Idx> { impl<Idx: PartialOrd<Idx>> RangeTo<Idx> {
/// Returns `true` if `item` is contained in the range. /// Returns `true` if `item` is contained in the range.
/// ///
/// # Examples /// # Examples
@ -298,11 +297,10 @@ impl<Idx: ~const PartialOrd<Idx>> RangeTo<Idx> {
/// assert!(!(..f32::NAN).contains(&0.5)); /// assert!(!(..f32::NAN).contains(&0.5));
/// ``` /// ```
#[stable(feature = "range_contains", since = "1.35.0")] #[stable(feature = "range_contains", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] pub fn contains<U>(&self, item: &U) -> bool
pub const fn contains<U>(&self, item: &U) -> bool
where where
Idx: ~const PartialOrd<U>, Idx: PartialOrd<U>,
U: ?Sized + ~const PartialOrd<Idx>, U: ?Sized + PartialOrd<Idx>,
{ {
<Self as RangeBounds<Idx>>::contains(self, item) <Self as RangeBounds<Idx>>::contains(self, item)
} }
@ -474,7 +472,7 @@ impl<Idx: fmt::Debug> fmt::Debug for RangeInclusive<Idx> {
} }
} }
impl<Idx: ~const PartialOrd<Idx>> RangeInclusive<Idx> { impl<Idx: PartialOrd<Idx>> RangeInclusive<Idx> {
/// Returns `true` if `item` is contained in the range. /// Returns `true` if `item` is contained in the range.
/// ///
/// # Examples /// # Examples
@ -505,11 +503,10 @@ impl<Idx: ~const PartialOrd<Idx>> RangeInclusive<Idx> {
/// assert!(!r.contains(&3) && !r.contains(&5)); /// assert!(!r.contains(&3) && !r.contains(&5));
/// ``` /// ```
#[stable(feature = "range_contains", since = "1.35.0")] #[stable(feature = "range_contains", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] pub fn contains<U>(&self, item: &U) -> bool
pub const fn contains<U>(&self, item: &U) -> bool
where where
Idx: ~const PartialOrd<U>, Idx: PartialOrd<U>,
U: ?Sized + ~const PartialOrd<Idx>, U: ?Sized + PartialOrd<Idx>,
{ {
<Self as RangeBounds<Idx>>::contains(self, item) <Self as RangeBounds<Idx>>::contains(self, item)
} }
@ -605,7 +602,7 @@ impl<Idx: fmt::Debug> fmt::Debug for RangeToInclusive<Idx> {
} }
} }
impl<Idx: ~const PartialOrd<Idx>> RangeToInclusive<Idx> { impl<Idx: PartialOrd<Idx>> RangeToInclusive<Idx> {
/// Returns `true` if `item` is contained in the range. /// Returns `true` if `item` is contained in the range.
/// ///
/// # Examples /// # Examples
@ -620,11 +617,10 @@ impl<Idx: ~const PartialOrd<Idx>> RangeToInclusive<Idx> {
/// assert!(!(..=f32::NAN).contains(&0.5)); /// assert!(!(..=f32::NAN).contains(&0.5));
/// ``` /// ```
#[stable(feature = "range_contains", since = "1.35.0")] #[stable(feature = "range_contains", since = "1.35.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] pub fn contains<U>(&self, item: &U) -> bool
pub const fn contains<U>(&self, item: &U) -> bool
where where
Idx: ~const PartialOrd<U>, Idx: PartialOrd<U>,
U: ?Sized + ~const PartialOrd<Idx>, U: ?Sized + PartialOrd<Idx>,
{ {
<Self as RangeBounds<Idx>>::contains(self, item) <Self as RangeBounds<Idx>>::contains(self, item)
} }
@ -765,7 +761,6 @@ impl<T: Clone> Bound<&T> {
/// `RangeBounds` is implemented by Rust's built-in range types, produced /// `RangeBounds` is implemented by Rust's built-in range types, produced
/// by range syntax like `..`, `a..`, `..b`, `..=c`, `d..e`, or `f..=g`. /// by range syntax like `..`, `a..`, `..b`, `..=c`, `d..e`, or `f..=g`.
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[const_trait]
pub trait RangeBounds<T: ?Sized> { pub trait RangeBounds<T: ?Sized> {
/// Start index bound. /// Start index bound.
/// ///
@ -818,8 +813,8 @@ pub trait RangeBounds<T: ?Sized> {
#[stable(feature = "range_contains", since = "1.35.0")] #[stable(feature = "range_contains", since = "1.35.0")]
fn contains<U>(&self, item: &U) -> bool fn contains<U>(&self, item: &U) -> bool
where where
T: ~const PartialOrd<U>, T: PartialOrd<U>,
U: ?Sized + ~const PartialOrd<T>, U: ?Sized + PartialOrd<T>,
{ {
(match self.start_bound() { (match self.start_bound() {
Included(start) => start <= item, Included(start) => start <= item,
@ -836,8 +831,7 @@ pub trait RangeBounds<T: ?Sized> {
use self::Bound::{Excluded, Included, Unbounded}; use self::Bound::{Excluded, Included, Unbounded};
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T: ?Sized> RangeBounds<T> for RangeFull {
impl<T: ?Sized> const RangeBounds<T> for RangeFull {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Unbounded Unbounded
} }
@ -847,8 +841,7 @@ impl<T: ?Sized> const RangeBounds<T> for RangeFull {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for RangeFrom<T> {
impl<T> const RangeBounds<T> for RangeFrom<T> {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Included(&self.start) Included(&self.start)
} }
@ -858,8 +851,7 @@ impl<T> const RangeBounds<T> for RangeFrom<T> {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for RangeTo<T> {
impl<T> const RangeBounds<T> for RangeTo<T> {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Unbounded Unbounded
} }
@ -869,8 +861,7 @@ impl<T> const RangeBounds<T> for RangeTo<T> {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for Range<T> {
impl<T> const RangeBounds<T> for Range<T> {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Included(&self.start) Included(&self.start)
} }
@ -880,8 +871,7 @@ impl<T> const RangeBounds<T> for Range<T> {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for RangeInclusive<T> {
impl<T> const RangeBounds<T> for RangeInclusive<T> {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Included(&self.start) Included(&self.start)
} }
@ -897,8 +887,7 @@ impl<T> const RangeBounds<T> for RangeInclusive<T> {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for RangeToInclusive<T> {
impl<T> const RangeBounds<T> for RangeToInclusive<T> {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Unbounded Unbounded
} }
@ -908,8 +897,7 @@ impl<T> const RangeBounds<T> for RangeToInclusive<T> {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for (Bound<T>, Bound<T>) {
impl<T> const RangeBounds<T> for (Bound<T>, Bound<T>) {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
match *self { match *self {
(Included(ref start), _) => Included(start), (Included(ref start), _) => Included(start),
@ -928,8 +916,7 @@ impl<T> const RangeBounds<T> for (Bound<T>, Bound<T>) {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<'a, T: ?Sized + 'a> RangeBounds<T> for (Bound<&'a T>, Bound<&'a T>) {
impl<'a, T: ?Sized + 'a> const RangeBounds<T> for (Bound<&'a T>, Bound<&'a T>) {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
self.0 self.0
} }
@ -940,8 +927,7 @@ impl<'a, T: ?Sized + 'a> const RangeBounds<T> for (Bound<&'a T>, Bound<&'a T>) {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for RangeFrom<&T> {
impl<T> const RangeBounds<T> for RangeFrom<&T> {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Included(self.start) Included(self.start)
} }
@ -951,8 +937,7 @@ impl<T> const RangeBounds<T> for RangeFrom<&T> {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for RangeTo<&T> {
impl<T> const RangeBounds<T> for RangeTo<&T> {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Unbounded Unbounded
} }
@ -962,8 +947,7 @@ impl<T> const RangeBounds<T> for RangeTo<&T> {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for Range<&T> {
impl<T> const RangeBounds<T> for Range<&T> {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Included(self.start) Included(self.start)
} }
@ -973,8 +957,7 @@ impl<T> const RangeBounds<T> for Range<&T> {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for RangeInclusive<&T> {
impl<T> const RangeBounds<T> for RangeInclusive<&T> {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Included(self.start) Included(self.start)
} }
@ -984,8 +967,7 @@ impl<T> const RangeBounds<T> for RangeInclusive<&T> {
} }
#[stable(feature = "collections_range", since = "1.28.0")] #[stable(feature = "collections_range", since = "1.28.0")]
#[rustc_const_unstable(feature = "const_range_bounds", issue = "108082")] impl<T> RangeBounds<T> for RangeToInclusive<&T> {
impl<T> const RangeBounds<T> for RangeToInclusive<&T> {
fn start_bound(&self) -> Bound<&T> { fn start_bound(&self) -> Bound<&T> {
Unbounded Unbounded
} }

View file

@ -128,8 +128,7 @@ use crate::ops::ControlFlow;
)] )]
#[doc(alias = "?")] #[doc(alias = "?")]
#[lang = "Try"] #[lang = "Try"]
#[const_trait] pub trait Try: FromResidual {
pub trait Try: ~const FromResidual {
/// The type of the value produced by `?` when *not* short-circuiting. /// The type of the value produced by `?` when *not* short-circuiting.
#[unstable(feature = "try_trait_v2", issue = "84277")] #[unstable(feature = "try_trait_v2", issue = "84277")]
type Output; type Output;
@ -305,7 +304,6 @@ pub trait Try: ~const FromResidual {
)] )]
#[rustc_diagnostic_item = "FromResidual"] #[rustc_diagnostic_item = "FromResidual"]
#[unstable(feature = "try_trait_v2", issue = "84277")] #[unstable(feature = "try_trait_v2", issue = "84277")]
#[const_trait]
pub trait FromResidual<R = <Self as Try>::Residual> { pub trait FromResidual<R = <Self as Try>::Residual> {
/// Constructs the type from a compatible `Residual` type. /// Constructs the type from a compatible `Residual` type.
/// ///
@ -358,11 +356,10 @@ where
/// and in the other direction, /// and in the other direction,
/// `<Result<Infallible, E> as Residual<T>>::TryType = Result<T, E>`. /// `<Result<Infallible, E> as Residual<T>>::TryType = Result<T, E>`.
#[unstable(feature = "try_trait_v2_residual", issue = "91285")] #[unstable(feature = "try_trait_v2_residual", issue = "91285")]
#[const_trait]
pub trait Residual<O> { pub trait Residual<O> {
/// The "return" type of this meta-function. /// The "return" type of this meta-function.
#[unstable(feature = "try_trait_v2_residual", issue = "91285")] #[unstable(feature = "try_trait_v2_residual", issue = "91285")]
type TryType: ~const Try<Output = O, Residual = Self>; type TryType: Try<Output = O, Residual = Self>;
} }
#[unstable(feature = "pub_crate_should_not_need_unstable_attr", issue = "none")] #[unstable(feature = "pub_crate_should_not_need_unstable_attr", issue = "none")]
@ -390,15 +387,15 @@ impl<T> NeverShortCircuit<T> {
#[inline] #[inline]
pub fn wrap_mut_2<A, B>( pub fn wrap_mut_2<A, B>(
mut f: impl ~const FnMut(A, B) -> T, mut f: impl FnMut(A, B) -> T,
) -> impl ~const FnMut(A, B) -> Self { ) -> impl FnMut(A, B) -> Self {
const move |a, b| NeverShortCircuit(f(a, b)) move |a, b| NeverShortCircuit(f(a, b))
} }
} }
pub(crate) enum NeverShortCircuitResidual {} pub(crate) enum NeverShortCircuitResidual {}
impl<T> const Try for NeverShortCircuit<T> { impl<T> Try for NeverShortCircuit<T> {
type Output = T; type Output = T;
type Residual = NeverShortCircuitResidual; type Residual = NeverShortCircuitResidual;
@ -413,14 +410,14 @@ impl<T> const Try for NeverShortCircuit<T> {
} }
} }
impl<T> const FromResidual for NeverShortCircuit<T> { impl<T> FromResidual for NeverShortCircuit<T> {
#[inline] #[inline]
fn from_residual(never: NeverShortCircuitResidual) -> Self { fn from_residual(never: NeverShortCircuitResidual) -> Self {
match never {} match never {}
} }
} }
impl<T> const Residual<T> for NeverShortCircuitResidual { impl<T> Residual<T> for NeverShortCircuitResidual {
type TryType = NeverShortCircuit<T>; type TryType = NeverShortCircuit<T>;
} }

View file

@ -970,7 +970,7 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn unwrap_or(self, default: T) -> T pub const fn unwrap_or(self, default: T) -> T
where where
T: ~const Destruct, T: Destruct,
{ {
match self { match self {
Some(x) => x, Some(x) => x,
@ -992,8 +992,8 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn unwrap_or_else<F>(self, f: F) -> T pub const fn unwrap_or_else<F>(self, f: F) -> T
where where
F: ~const FnOnce() -> T, F: FnOnce() -> T,
F: ~const Destruct, F: Destruct,
{ {
match self { match self {
Some(x) => x, Some(x) => x,
@ -1025,7 +1025,7 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn unwrap_or_default(self) -> T pub const fn unwrap_or_default(self) -> T
where where
T: ~const Default, T: Default,
{ {
match self { match self {
Some(x) => x, Some(x) => x,
@ -1092,8 +1092,8 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn map<U, F>(self, f: F) -> Option<U> pub const fn map<U, F>(self, f: F) -> Option<U>
where where
F: ~const FnOnce(T) -> U, F: FnOnce(T) -> U,
F: ~const Destruct, F: Destruct,
{ {
match self { match self {
Some(x) => Some(f(x)), Some(x) => Some(f(x)),
@ -1121,8 +1121,8 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn inspect<F>(self, f: F) -> Self pub const fn inspect<F>(self, f: F) -> Self
where where
F: ~const FnOnce(&T), F: FnOnce(&T),
F: ~const Destruct, F: Destruct,
{ {
if let Some(ref x) = self { if let Some(ref x) = self {
f(x); f(x);
@ -1154,9 +1154,9 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn map_or<U, F>(self, default: U, f: F) -> U pub const fn map_or<U, F>(self, default: U, f: F) -> U
where where
F: ~const FnOnce(T) -> U, F: FnOnce(T) -> U,
F: ~const Destruct, F: Destruct,
U: ~const Destruct, U: Destruct,
{ {
match self { match self {
Some(t) => f(t), Some(t) => f(t),
@ -1183,10 +1183,10 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn map_or_else<U, D, F>(self, default: D, f: F) -> U pub const fn map_or_else<U, D, F>(self, default: D, f: F) -> U
where where
D: ~const FnOnce() -> U, D: FnOnce() -> U,
D: ~const Destruct, D: Destruct,
F: ~const FnOnce(T) -> U, F: FnOnce(T) -> U,
F: ~const Destruct, F: Destruct,
{ {
match self { match self {
Some(t) => f(t), Some(t) => f(t),
@ -1220,7 +1220,7 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn ok_or<E>(self, err: E) -> Result<T, E> pub const fn ok_or<E>(self, err: E) -> Result<T, E>
where where
E: ~const Destruct, E: Destruct,
{ {
match self { match self {
Some(v) => Ok(v), Some(v) => Ok(v),
@ -1249,8 +1249,8 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn ok_or_else<E, F>(self, err: F) -> Result<T, E> pub const fn ok_or_else<E, F>(self, err: F) -> Result<T, E>
where where
F: ~const FnOnce() -> E, F: FnOnce() -> E,
F: ~const Destruct, F: Destruct,
{ {
match self { match self {
Some(v) => Ok(v), Some(v) => Ok(v),
@ -1277,7 +1277,7 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn as_deref(&self) -> Option<&T::Target> pub const fn as_deref(&self) -> Option<&T::Target>
where where
T: ~const Deref, T: Deref,
{ {
match self.as_ref() { match self.as_ref() {
Some(t) => Some(t.deref()), Some(t) => Some(t.deref()),
@ -1304,7 +1304,7 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn as_deref_mut(&mut self) -> Option<&mut T::Target> pub const fn as_deref_mut(&mut self) -> Option<&mut T::Target>
where where
T: ~const DerefMut, T: DerefMut,
{ {
match self.as_mut() { match self.as_mut() {
Some(t) => Some(t.deref_mut()), Some(t) => Some(t.deref_mut()),
@ -1391,8 +1391,8 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn and<U>(self, optb: Option<U>) -> Option<U> pub const fn and<U>(self, optb: Option<U>) -> Option<U>
where where
T: ~const Destruct, T: Destruct,
U: ~const Destruct, U: Destruct,
{ {
match self { match self {
Some(_) => optb, Some(_) => optb,
@ -1433,8 +1433,8 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn and_then<U, F>(self, f: F) -> Option<U> pub const fn and_then<U, F>(self, f: F) -> Option<U>
where where
F: ~const FnOnce(T) -> Option<U>, F: FnOnce(T) -> Option<U>,
F: ~const Destruct, F: Destruct,
{ {
match self { match self {
Some(x) => f(x), Some(x) => f(x),
@ -1471,9 +1471,9 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn filter<P>(self, predicate: P) -> Self pub const fn filter<P>(self, predicate: P) -> Self
where where
T: ~const Destruct, T: Destruct,
P: ~const FnOnce(&T) -> bool, P: FnOnce(&T) -> bool,
P: ~const Destruct, P: Destruct,
{ {
if let Some(x) = self { if let Some(x) = self {
if predicate(&x) { if predicate(&x) {
@ -1515,7 +1515,7 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn or(self, optb: Option<T>) -> Option<T> pub const fn or(self, optb: Option<T>) -> Option<T>
where where
T: ~const Destruct, T: Destruct,
{ {
match self { match self {
Some(x) => Some(x), Some(x) => Some(x),
@ -1541,8 +1541,8 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn or_else<F>(self, f: F) -> Option<T> pub const fn or_else<F>(self, f: F) -> Option<T>
where where
F: ~const FnOnce() -> Option<T>, F: FnOnce() -> Option<T>,
F: ~const Destruct, F: Destruct,
{ {
match self { match self {
Some(x) => Some(x), Some(x) => Some(x),
@ -1576,7 +1576,7 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn xor(self, optb: Option<T>) -> Option<T> pub const fn xor(self, optb: Option<T>) -> Option<T>
where where
T: ~const Destruct, T: Destruct,
{ {
match (self, optb) { match (self, optb) {
(Some(a), None) => Some(a), (Some(a), None) => Some(a),
@ -1614,7 +1614,7 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn insert(&mut self, value: T) -> &mut T pub const fn insert(&mut self, value: T) -> &mut T
where where
T: ~const Destruct, T: Destruct,
{ {
*self = Some(value); *self = Some(value);
@ -1647,7 +1647,7 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn get_or_insert(&mut self, value: T) -> &mut T pub const fn get_or_insert(&mut self, value: T) -> &mut T
where where
T: ~const Destruct, T: Destruct,
{ {
if let None = *self { if let None = *self {
*self = Some(value); *self = Some(value);
@ -1682,9 +1682,9 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn get_or_insert_default(&mut self) -> &mut T pub const fn get_or_insert_default(&mut self) -> &mut T
where where
T: ~const Default, T: Default,
{ {
const fn default<T: ~const Default>() -> T { const fn default<T: Default>() -> T {
T::default() T::default()
} }
@ -1713,8 +1713,8 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn get_or_insert_with<F>(&mut self, f: F) -> &mut T pub const fn get_or_insert_with<F>(&mut self, f: F) -> &mut T
where where
F: ~const FnOnce() -> T, F: FnOnce() -> T,
F: ~const Destruct, F: Destruct,
{ {
if let None = *self { if let None = *self {
// the compiler isn't smart enough to know that we are not dropping a `T` // the compiler isn't smart enough to know that we are not dropping a `T`
@ -1797,8 +1797,8 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn zip<U>(self, other: Option<U>) -> Option<(T, U)> pub const fn zip<U>(self, other: Option<U>) -> Option<(T, U)>
where where
T: ~const Destruct, T: Destruct,
U: ~const Destruct, U: Destruct,
{ {
match (self, other) { match (self, other) {
(Some(a), Some(b)) => Some((a, b)), (Some(a), Some(b)) => Some((a, b)),
@ -1838,10 +1838,10 @@ impl<T> Option<T> {
#[rustc_const_unstable(feature = "const_option_ext", issue = "91930")] #[rustc_const_unstable(feature = "const_option_ext", issue = "91930")]
pub const fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R> pub const fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R>
where where
F: ~const FnOnce(T, U) -> R, F: FnOnce(T, U) -> R,
F: ~const Destruct, F: Destruct,
T: ~const Destruct, T: Destruct,
U: ~const Destruct, U: Destruct,
{ {
match (self, other) { match (self, other) {
(Some(a), Some(b)) => Some(f(a, b)), (Some(a), Some(b)) => Some(f(a, b)),
@ -1870,8 +1870,8 @@ impl<T, U> Option<(T, U)> {
#[rustc_const_unstable(feature = "const_option", issue = "67441")] #[rustc_const_unstable(feature = "const_option", issue = "67441")]
pub const fn unzip(self) -> (Option<T>, Option<U>) pub const fn unzip(self) -> (Option<T>, Option<U>)
where where
T: ~const Destruct, T: Destruct,
U: ~const Destruct, U: Destruct,
{ {
match self { match self {
Some((a, b)) => (Some(a), Some(b)), Some((a, b)) => (Some(a), Some(b)),
@ -1925,7 +1925,7 @@ impl<T> Option<&T> {
#[rustc_const_unstable(feature = "const_option_cloned", issue = "91582")] #[rustc_const_unstable(feature = "const_option_cloned", issue = "91582")]
pub const fn cloned(self) -> Option<T> pub const fn cloned(self) -> Option<T>
where where
T: ~const Clone, T: Clone,
{ {
match self { match self {
Some(t) => Some(t.clone()), Some(t) => Some(t.clone()),
@ -1977,7 +1977,7 @@ impl<T> Option<&mut T> {
#[rustc_const_unstable(feature = "const_option_cloned", issue = "91582")] #[rustc_const_unstable(feature = "const_option_cloned", issue = "91582")]
pub const fn cloned(self) -> Option<T> pub const fn cloned(self) -> Option<T>
where where
T: ~const Clone, T: Clone,
{ {
match self { match self {
Some(t) => Some(t.clone()), Some(t) => Some(t.clone()),
@ -2030,10 +2030,9 @@ const fn expect_failed(msg: &str) -> ! {
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_clone", issue = "91805")] impl<T> Clone for Option<T>
impl<T> const Clone for Option<T>
where where
T: ~const Clone + ~const Destruct, T: Clone,
{ {
#[inline] #[inline]
fn clone(&self) -> Self { fn clone(&self) -> Self {
@ -2053,8 +2052,7 @@ where
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T> Default for Option<T> {
impl<T> const Default for Option<T> {
/// Returns [`None`][Option::None]. /// Returns [`None`][Option::None].
/// ///
/// # Examples /// # Examples
@ -2114,8 +2112,7 @@ impl<'a, T> IntoIterator for &'a mut Option<T> {
} }
#[stable(since = "1.12.0", feature = "option_from")] #[stable(since = "1.12.0", feature = "option_from")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> From<T> for Option<T> {
impl<T> const From<T> for Option<T> {
/// Moves `val` into a new [`Some`]. /// Moves `val` into a new [`Some`].
/// ///
/// # Examples /// # Examples
@ -2131,8 +2128,7 @@ impl<T> const From<T> for Option<T> {
} }
#[stable(feature = "option_ref_from_ref_option", since = "1.30.0")] #[stable(feature = "option_ref_from_ref_option", since = "1.30.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<'a, T> From<&'a Option<T>> for Option<&'a T> {
impl<'a, T> const From<&'a Option<T>> for Option<&'a T> {
/// Converts from `&Option<T>` to `Option<&T>`. /// Converts from `&Option<T>` to `Option<&T>`.
/// ///
/// # Examples /// # Examples
@ -2159,8 +2155,7 @@ impl<'a, T> const From<&'a Option<T>> for Option<&'a T> {
} }
#[stable(feature = "option_ref_from_ref_option", since = "1.30.0")] #[stable(feature = "option_ref_from_ref_option", since = "1.30.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<'a, T> From<&'a mut Option<T>> for Option<&'a mut T> {
impl<'a, T> const From<&'a mut Option<T>> for Option<&'a mut T> {
/// Converts from `&mut Option<T>` to `Option<&mut T>` /// Converts from `&mut Option<T>` to `Option<&mut T>`
/// ///
/// # Examples /// # Examples
@ -2507,8 +2502,7 @@ impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {
} }
#[unstable(feature = "try_trait_v2", issue = "84277")] #[unstable(feature = "try_trait_v2", issue = "84277")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> ops::Try for Option<T> {
impl<T> const ops::Try for Option<T> {
type Output = T; type Output = T;
type Residual = Option<convert::Infallible>; type Residual = Option<convert::Infallible>;
@ -2527,8 +2521,7 @@ impl<T> const ops::Try for Option<T> {
} }
#[unstable(feature = "try_trait_v2", issue = "84277")] #[unstable(feature = "try_trait_v2", issue = "84277")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> ops::FromResidual for Option<T> {
impl<T> const ops::FromResidual for Option<T> {
#[inline] #[inline]
fn from_residual(residual: Option<convert::Infallible>) -> Self { fn from_residual(residual: Option<convert::Infallible>) -> Self {
match residual { match residual {
@ -2546,8 +2539,7 @@ impl<T> ops::FromResidual<ops::Yeet<()>> for Option<T> {
} }
#[unstable(feature = "try_trait_v2_residual", issue = "91285")] #[unstable(feature = "try_trait_v2_residual", issue = "91285")]
#[rustc_const_unstable(feature = "const_try", issue = "74935")] impl<T> ops::Residual<T> for Option<convert::Infallible> {
impl<T> const ops::Residual<T> for Option<convert::Infallible> {
type TryType = Option<T>; type TryType = Option<T>;
} }

View file

@ -9,8 +9,7 @@ use crate::{cmp, fmt, hash, mem, num};
/// Note that particularly large alignments, while representable in this type, /// Note that particularly large alignments, while representable in this type,
/// are likely not to be supported by actual allocators and linkers. /// are likely not to be supported by actual allocators and linkers.
#[unstable(feature = "ptr_alignment_type", issue = "102070")] #[unstable(feature = "ptr_alignment_type", issue = "102070")]
#[derive(Copy, Clone, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]
#[derive_const(PartialEq)]
#[repr(transparent)] #[repr(transparent)]
pub struct Alignment(AlignmentEnum); pub struct Alignment(AlignmentEnum);
@ -170,7 +169,7 @@ impl From<Alignment> for usize {
#[rustc_const_unstable(feature = "const_alloc_layout", issue = "67521")] #[rustc_const_unstable(feature = "const_alloc_layout", issue = "67521")]
#[unstable(feature = "ptr_alignment_type", issue = "102070")] #[unstable(feature = "ptr_alignment_type", issue = "102070")]
impl const cmp::Ord for Alignment { impl cmp::Ord for Alignment {
#[inline] #[inline]
fn cmp(&self, other: &Self) -> cmp::Ordering { fn cmp(&self, other: &Self) -> cmp::Ordering {
self.as_nonzero().get().cmp(&other.as_nonzero().get()) self.as_nonzero().get().cmp(&other.as_nonzero().get())
@ -179,7 +178,7 @@ impl const cmp::Ord for Alignment {
#[rustc_const_unstable(feature = "const_alloc_layout", issue = "67521")] #[rustc_const_unstable(feature = "const_alloc_layout", issue = "67521")]
#[unstable(feature = "ptr_alignment_type", issue = "102070")] #[unstable(feature = "ptr_alignment_type", issue = "102070")]
impl const cmp::PartialOrd for Alignment { impl cmp::PartialOrd for Alignment {
#[inline] #[inline]
fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> { fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
Some(self.cmp(other)) Some(self.cmp(other))
@ -201,8 +200,7 @@ type AlignmentEnum = AlignmentEnum32;
#[cfg(target_pointer_width = "64")] #[cfg(target_pointer_width = "64")]
type AlignmentEnum = AlignmentEnum64; type AlignmentEnum = AlignmentEnum64;
#[derive(Copy, Clone, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]
#[derive_const(PartialEq)]
#[repr(u16)] #[repr(u16)]
enum AlignmentEnum16 { enum AlignmentEnum16 {
_Align1Shl0 = 1 << 0, _Align1Shl0 = 1 << 0,
@ -223,8 +221,7 @@ enum AlignmentEnum16 {
_Align1Shl15 = 1 << 15, _Align1Shl15 = 1 << 15,
} }
#[derive(Copy, Clone, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]
#[derive_const(PartialEq)]
#[repr(u32)] #[repr(u32)]
enum AlignmentEnum32 { enum AlignmentEnum32 {
_Align1Shl0 = 1 << 0, _Align1Shl0 = 1 << 0,
@ -261,8 +258,7 @@ enum AlignmentEnum32 {
_Align1Shl31 = 1 << 31, _Align1Shl31 = 1 << 31,
} }
#[derive(Copy, Clone, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]
#[derive_const(PartialEq)]
#[repr(u64)] #[repr(u64)]
enum AlignmentEnum64 { enum AlignmentEnum64 {
_Align1Shl0 = 1 << 0, _Align1Shl0 = 1 << 0,

View file

@ -1654,7 +1654,7 @@ impl<T> *const [T] {
#[inline] #[inline]
pub const unsafe fn get_unchecked<I>(self, index: I) -> *const I::Output pub const unsafe fn get_unchecked<I>(self, index: I) -> *const I::Output
where where
I: ~const SliceIndex<[T]>, I: SliceIndex<[T]>,
{ {
// SAFETY: the caller ensures that `self` is dereferenceable and `index` in-bounds. // SAFETY: the caller ensures that `self` is dereferenceable and `index` in-bounds.
unsafe { index.get_unchecked(self) } unsafe { index.get_unchecked(self) }

View file

@ -2040,7 +2040,7 @@ impl<T> *mut [T] {
#[inline(always)] #[inline(always)]
pub const unsafe fn get_unchecked_mut<I>(self, index: I) -> *mut I::Output pub const unsafe fn get_unchecked_mut<I>(self, index: I) -> *mut I::Output
where where
I: ~const SliceIndex<[T]>, I: SliceIndex<[T]>,
{ {
// SAFETY: the caller ensures that `self` is dereferenceable and `index` in-bounds. // SAFETY: the caller ensures that `self` is dereferenceable and `index` in-bounds.
unsafe { index.get_unchecked_mut(self) } unsafe { index.get_unchecked_mut(self) }

View file

@ -680,7 +680,7 @@ impl<T> NonNull<[T]> {
#[inline] #[inline]
pub const unsafe fn get_unchecked_mut<I>(self, index: I) -> NonNull<I::Output> pub const unsafe fn get_unchecked_mut<I>(self, index: I) -> NonNull<I::Output>
where where
I: ~const SliceIndex<[T]>, I: SliceIndex<[T]>,
{ {
// SAFETY: the caller ensures that `self` is dereferenceable and `index` in-bounds. // SAFETY: the caller ensures that `self` is dereferenceable and `index` in-bounds.
// As a consequence, the resulting pointer cannot be null. // As a consequence, the resulting pointer cannot be null.
@ -689,8 +689,7 @@ impl<T> NonNull<[T]> {
} }
#[stable(feature = "nonnull", since = "1.25.0")] #[stable(feature = "nonnull", since = "1.25.0")]
#[rustc_const_unstable(feature = "const_clone", issue = "91805")] impl<T: ?Sized> Clone for NonNull<T> {
impl<T: ?Sized> const Clone for NonNull<T> {
#[inline(always)] #[inline(always)]
fn clone(&self) -> Self { fn clone(&self) -> Self {
*self *self
@ -756,8 +755,7 @@ impl<T: ?Sized> hash::Hash for NonNull<T> {
} }
#[unstable(feature = "ptr_internals", issue = "none")] #[unstable(feature = "ptr_internals", issue = "none")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T: ?Sized> From<Unique<T>> for NonNull<T> {
impl<T: ?Sized> const From<Unique<T>> for NonNull<T> {
#[inline] #[inline]
fn from(unique: Unique<T>) -> Self { fn from(unique: Unique<T>) -> Self {
// SAFETY: A Unique pointer cannot be null, so the conditions for // SAFETY: A Unique pointer cannot be null, so the conditions for
@ -767,8 +765,7 @@ impl<T: ?Sized> const From<Unique<T>> for NonNull<T> {
} }
#[stable(feature = "nonnull", since = "1.25.0")] #[stable(feature = "nonnull", since = "1.25.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T: ?Sized> From<&mut T> for NonNull<T> {
impl<T: ?Sized> const From<&mut T> for NonNull<T> {
/// Converts a `&mut T` to a `NonNull<T>`. /// Converts a `&mut T` to a `NonNull<T>`.
/// ///
/// This conversion is safe and infallible since references cannot be null. /// This conversion is safe and infallible since references cannot be null.
@ -780,8 +777,7 @@ impl<T: ?Sized> const From<&mut T> for NonNull<T> {
} }
#[stable(feature = "nonnull", since = "1.25.0")] #[stable(feature = "nonnull", since = "1.25.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T: ?Sized> From<&T> for NonNull<T> {
impl<T: ?Sized> const From<&T> for NonNull<T> {
/// Converts a `&T` to a `NonNull<T>`. /// Converts a `&T` to a `NonNull<T>`.
/// ///
/// This conversion is safe and infallible since references cannot be null. /// This conversion is safe and infallible since references cannot be null.

View file

@ -139,8 +139,7 @@ impl<T: ?Sized> Unique<T> {
} }
#[unstable(feature = "ptr_internals", issue = "none")] #[unstable(feature = "ptr_internals", issue = "none")]
#[rustc_const_unstable(feature = "const_clone", issue = "91805")] impl<T: ?Sized> Clone for Unique<T> {
impl<T: ?Sized> const Clone for Unique<T> {
#[inline] #[inline]
fn clone(&self) -> Self { fn clone(&self) -> Self {
*self *self
@ -171,7 +170,7 @@ impl<T: ?Sized> fmt::Pointer for Unique<T> {
} }
#[unstable(feature = "ptr_internals", issue = "none")] #[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized> const From<&mut T> for Unique<T> { impl<T: ?Sized> From<&mut T> for Unique<T> {
/// Converts a `&mut T` to a `Unique<T>`. /// Converts a `&mut T` to a `Unique<T>`.
/// ///
/// This conversion is infallible since references cannot be null. /// This conversion is infallible since references cannot be null.
@ -182,7 +181,7 @@ impl<T: ?Sized> const From<&mut T> for Unique<T> {
} }
#[unstable(feature = "ptr_internals", issue = "none")] #[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized> const From<NonNull<T>> for Unique<T> { impl<T: ?Sized> From<NonNull<T>> for Unique<T> {
/// Converts a `NonNull<T>` to a `Unique<T>`. /// Converts a `NonNull<T>` to a `Unique<T>`.
/// ///
/// This conversion is infallible since `NonNull` cannot be null. /// This conversion is infallible since `NonNull` cannot be null.

View file

@ -632,13 +632,11 @@ impl<T, E> Result<T, E> {
#[rustc_const_unstable(feature = "const_result_drop", issue = "92384")] #[rustc_const_unstable(feature = "const_result_drop", issue = "92384")]
pub const fn ok(self) -> Option<T> pub const fn ok(self) -> Option<T>
where where
E: ~const Destruct, E: Destruct,
{ {
match self { match self {
Ok(x) => Some(x), Ok(x) => Some(x),
// FIXME: ~const Drop doesn't quite work right yet Err(_) => None,
#[allow(unused_variables)]
Err(x) => None,
} }
} }
@ -661,12 +659,10 @@ impl<T, E> Result<T, E> {
#[rustc_const_unstable(feature = "const_result_drop", issue = "92384")] #[rustc_const_unstable(feature = "const_result_drop", issue = "92384")]
pub const fn err(self) -> Option<E> pub const fn err(self) -> Option<E>
where where
T: ~const Destruct, T: Destruct,
{ {
match self { match self {
// FIXME: ~const Drop doesn't quite work right yet Ok(_) => None,
#[allow(unused_variables)]
Ok(x) => None,
Err(x) => Some(x), Err(x) => Some(x),
} }
} }
@ -1291,14 +1287,12 @@ impl<T, E> Result<T, E> {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub const fn and<U>(self, res: Result<U, E>) -> Result<U, E> pub const fn and<U>(self, res: Result<U, E>) -> Result<U, E>
where where
T: ~const Destruct, T: Destruct,
U: ~const Destruct, U: Destruct,
E: ~const Destruct, E: Destruct,
{ {
match self { match self {
// FIXME: ~const Drop doesn't quite work right yet Ok(_) => res,
#[allow(unused_variables)]
Ok(x) => res,
Err(e) => Err(e), Err(e) => Err(e),
} }
} }
@ -1374,15 +1368,13 @@ impl<T, E> Result<T, E> {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub const fn or<F>(self, res: Result<T, F>) -> Result<T, F> pub const fn or<F>(self, res: Result<T, F>) -> Result<T, F>
where where
T: ~const Destruct, T: Destruct,
E: ~const Destruct, E: Destruct,
F: ~const Destruct, F: Destruct,
{ {
match self { match self {
Ok(v) => Ok(v), Ok(v) => Ok(v),
// FIXME: ~const Drop doesn't quite work right yet Err(_) => res,
#[allow(unused_variables)]
Err(e) => res,
} }
} }
@ -1434,14 +1426,12 @@ impl<T, E> Result<T, E> {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub const fn unwrap_or(self, default: T) -> T pub const fn unwrap_or(self, default: T) -> T
where where
T: ~const Destruct, T: Destruct,
E: ~const Destruct, E: Destruct,
{ {
match self { match self {
Ok(t) => t, Ok(t) => t,
// FIXME: ~const Drop doesn't quite work right yet Err(_) => default,
#[allow(unused_variables)]
Err(e) => default,
} }
} }
@ -1704,11 +1694,10 @@ fn unwrap_failed<T>(_msg: &str, _error: &T) -> ! {
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_clone", issue = "91805")] impl<T, E> Clone for Result<T, E>
impl<T, E> const Clone for Result<T, E>
where where
T: ~const Clone + ~const Destruct, T: Clone,
E: ~const Clone + ~const Destruct, E: Clone,
{ {
#[inline] #[inline]
fn clone(&self) -> Self { fn clone(&self) -> Self {
@ -1971,8 +1960,7 @@ impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> {
} }
#[unstable(feature = "try_trait_v2", issue = "84277")] #[unstable(feature = "try_trait_v2", issue = "84277")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T, E> ops::Try for Result<T, E> {
impl<T, E> const ops::Try for Result<T, E> {
type Output = T; type Output = T;
type Residual = Result<convert::Infallible, E>; type Residual = Result<convert::Infallible, E>;
@ -1991,8 +1979,7 @@ impl<T, E> const ops::Try for Result<T, E> {
} }
#[unstable(feature = "try_trait_v2", issue = "84277")] #[unstable(feature = "try_trait_v2", issue = "84277")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T, E, F: From<E>> ops::FromResidual<Result<convert::Infallible, E>>
impl<T, E, F: ~const From<E>> const ops::FromResidual<Result<convert::Infallible, E>>
for Result<T, F> for Result<T, F>
{ {
#[inline] #[inline]
@ -2013,7 +2000,6 @@ impl<T, E, F: From<E>> ops::FromResidual<ops::Yeet<E>> for Result<T, F> {
} }
#[unstable(feature = "try_trait_v2_residual", issue = "91285")] #[unstable(feature = "try_trait_v2_residual", issue = "91285")]
#[rustc_const_unstable(feature = "const_try", issue = "74935")] impl<T, E> ops::Residual<T> for Result<convert::Infallible, E> {
impl<T, E> const ops::Residual<T> for Result<convert::Infallible, E> {
type TryType = Result<T, E>; type TryType = Result<T, E>;
} }

View file

@ -7,10 +7,9 @@ use crate::ops;
use crate::ptr; use crate::ptr;
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] impl<T, I> ops::Index<I> for [T]
impl<T, I> const ops::Index<I> for [T]
where where
I: ~const SliceIndex<[T]>, I: SliceIndex<[T]>,
{ {
type Output = I::Output; type Output = I::Output;
@ -21,10 +20,9 @@ where
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] impl<T, I> ops::IndexMut<I> for [T]
impl<T, I> const ops::IndexMut<I> for [T]
where where
I: ~const SliceIndex<[T]>, I: SliceIndex<[T]>,
{ {
#[inline] #[inline]
fn index_mut(&mut self, index: I) -> &mut I::Output { fn index_mut(&mut self, index: I) -> &mut I::Output {
@ -162,7 +160,6 @@ mod private_slice_index {
message = "the type `{T}` cannot be indexed by `{Self}`", message = "the type `{T}` cannot be indexed by `{Self}`",
label = "slice indices are of type `usize` or ranges of `usize`" label = "slice indices are of type `usize` or ranges of `usize`"
)] )]
#[const_trait]
pub unsafe trait SliceIndex<T: ?Sized>: private_slice_index::Sealed { pub unsafe trait SliceIndex<T: ?Sized>: private_slice_index::Sealed {
/// The output type returned by methods. /// The output type returned by methods.
#[stable(feature = "slice_get_slice", since = "1.28.0")] #[stable(feature = "slice_get_slice", since = "1.28.0")]
@ -211,7 +208,7 @@ pub unsafe trait SliceIndex<T: ?Sized>: private_slice_index::Sealed {
#[stable(feature = "slice_get_slice_impls", since = "1.15.0")] #[stable(feature = "slice_get_slice_impls", since = "1.15.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl<T> const SliceIndex<[T]> for usize { unsafe impl<T> SliceIndex<[T]> for usize {
type Output = T; type Output = T;
#[inline] #[inline]
@ -271,7 +268,7 @@ unsafe impl<T> const SliceIndex<[T]> for usize {
/// Because `IndexRange` guarantees `start <= end`, fewer checks are needed here /// Because `IndexRange` guarantees `start <= end`, fewer checks are needed here
/// than there are for a general `Range<usize>` (which might be `100..3`). /// than there are for a general `Range<usize>` (which might be `100..3`).
#[rustc_const_unstable(feature = "const_index_range_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_index_range_slice_index", issue = "none")]
unsafe impl<T> const SliceIndex<[T]> for ops::IndexRange { unsafe impl<T> SliceIndex<[T]> for ops::IndexRange {
type Output = [T]; type Output = [T];
#[inline] #[inline]
@ -347,7 +344,7 @@ unsafe impl<T> const SliceIndex<[T]> for ops::IndexRange {
#[stable(feature = "slice_get_slice_impls", since = "1.15.0")] #[stable(feature = "slice_get_slice_impls", since = "1.15.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl<T> const SliceIndex<[T]> for ops::Range<usize> { unsafe impl<T> SliceIndex<[T]> for ops::Range<usize> {
type Output = [T]; type Output = [T];
#[inline] #[inline]
@ -428,7 +425,7 @@ unsafe impl<T> const SliceIndex<[T]> for ops::Range<usize> {
#[stable(feature = "slice_get_slice_impls", since = "1.15.0")] #[stable(feature = "slice_get_slice_impls", since = "1.15.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl<T> const SliceIndex<[T]> for ops::RangeTo<usize> { unsafe impl<T> SliceIndex<[T]> for ops::RangeTo<usize> {
type Output = [T]; type Output = [T];
#[inline] #[inline]
@ -466,7 +463,7 @@ unsafe impl<T> const SliceIndex<[T]> for ops::RangeTo<usize> {
#[stable(feature = "slice_get_slice_impls", since = "1.15.0")] #[stable(feature = "slice_get_slice_impls", since = "1.15.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl<T> const SliceIndex<[T]> for ops::RangeFrom<usize> { unsafe impl<T> SliceIndex<[T]> for ops::RangeFrom<usize> {
type Output = [T]; type Output = [T];
#[inline] #[inline]
@ -512,7 +509,7 @@ unsafe impl<T> const SliceIndex<[T]> for ops::RangeFrom<usize> {
#[stable(feature = "slice_get_slice_impls", since = "1.15.0")] #[stable(feature = "slice_get_slice_impls", since = "1.15.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl<T> const SliceIndex<[T]> for ops::RangeFull { unsafe impl<T> SliceIndex<[T]> for ops::RangeFull {
type Output = [T]; type Output = [T];
#[inline] #[inline]
@ -548,7 +545,7 @@ unsafe impl<T> const SliceIndex<[T]> for ops::RangeFull {
#[stable(feature = "inclusive_range", since = "1.26.0")] #[stable(feature = "inclusive_range", since = "1.26.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl<T> const SliceIndex<[T]> for ops::RangeInclusive<usize> { unsafe impl<T> SliceIndex<[T]> for ops::RangeInclusive<usize> {
type Output = [T]; type Output = [T];
#[inline] #[inline]
@ -592,7 +589,7 @@ unsafe impl<T> const SliceIndex<[T]> for ops::RangeInclusive<usize> {
#[stable(feature = "inclusive_range", since = "1.26.0")] #[stable(feature = "inclusive_range", since = "1.26.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl<T> const SliceIndex<[T]> for ops::RangeToInclusive<usize> { unsafe impl<T> SliceIndex<[T]> for ops::RangeToInclusive<usize> {
type Output = [T]; type Output = [T];
#[inline] #[inline]

View file

@ -338,7 +338,7 @@ impl<T> [T] {
#[must_use] #[must_use]
pub const fn get<I>(&self, index: I) -> Option<&I::Output> pub const fn get<I>(&self, index: I) -> Option<&I::Output>
where where
I: ~const SliceIndex<Self>, I: SliceIndex<Self>,
{ {
index.get(self) index.get(self)
} }
@ -364,7 +364,7 @@ impl<T> [T] {
#[must_use] #[must_use]
pub const fn get_mut<I>(&mut self, index: I) -> Option<&mut I::Output> pub const fn get_mut<I>(&mut self, index: I) -> Option<&mut I::Output>
where where
I: ~const SliceIndex<Self>, I: SliceIndex<Self>,
{ {
index.get_mut(self) index.get_mut(self)
} }
@ -397,7 +397,7 @@ impl<T> [T] {
#[must_use] #[must_use]
pub const unsafe fn get_unchecked<I>(&self, index: I) -> &I::Output pub const unsafe fn get_unchecked<I>(&self, index: I) -> &I::Output
where where
I: ~const SliceIndex<Self>, I: SliceIndex<Self>,
{ {
// SAFETY: the caller must uphold most of the safety requirements for `get_unchecked`; // SAFETY: the caller must uphold most of the safety requirements for `get_unchecked`;
// the slice is dereferenceable because `self` is a safe reference. // the slice is dereferenceable because `self` is a safe reference.
@ -435,7 +435,7 @@ impl<T> [T] {
#[must_use] #[must_use]
pub const unsafe fn get_unchecked_mut<I>(&mut self, index: I) -> &mut I::Output pub const unsafe fn get_unchecked_mut<I>(&mut self, index: I) -> &mut I::Output
where where
I: ~const SliceIndex<Self>, I: SliceIndex<Self>,
{ {
// SAFETY: the caller must uphold the safety requirements for `get_unchecked_mut`; // SAFETY: the caller must uphold the safety requirements for `get_unchecked_mut`;
// the slice is dereferenceable because `self` is a safe reference. // the slice is dereferenceable because `self` is a safe reference.
@ -4404,8 +4404,7 @@ where
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T> Default for &[T] {
impl<T> const Default for &[T] {
/// Creates an empty slice. /// Creates an empty slice.
fn default() -> Self { fn default() -> Self {
&[] &[]
@ -4413,8 +4412,7 @@ impl<T> const Default for &[T] {
} }
#[stable(feature = "mut_slice_default", since = "1.5.0")] #[stable(feature = "mut_slice_default", since = "1.5.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T> Default for &mut [T] {
impl<T> const Default for &mut [T] {
/// Creates a mutable empty slice. /// Creates a mutable empty slice.
fn default() -> Self { fn default() -> Self {
&mut [] &mut []

View file

@ -438,7 +438,7 @@ impl str {
#[stable(feature = "str_checked_slicing", since = "1.20.0")] #[stable(feature = "str_checked_slicing", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
#[inline] #[inline]
pub const fn get<I: ~const SliceIndex<str>>(&self, i: I) -> Option<&I::Output> { pub const fn get<I: SliceIndex<str>>(&self, i: I) -> Option<&I::Output> {
i.get(self) i.get(self)
} }
@ -471,7 +471,7 @@ impl str {
#[stable(feature = "str_checked_slicing", since = "1.20.0")] #[stable(feature = "str_checked_slicing", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
#[inline] #[inline]
pub const fn get_mut<I: ~const SliceIndex<str>>(&mut self, i: I) -> Option<&mut I::Output> { pub const fn get_mut<I: SliceIndex<str>>(&mut self, i: I) -> Option<&mut I::Output> {
i.get_mut(self) i.get_mut(self)
} }
@ -504,7 +504,7 @@ impl str {
#[stable(feature = "str_checked_slicing", since = "1.20.0")] #[stable(feature = "str_checked_slicing", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
#[inline] #[inline]
pub const unsafe fn get_unchecked<I: ~const SliceIndex<str>>(&self, i: I) -> &I::Output { pub const unsafe fn get_unchecked<I: SliceIndex<str>>(&self, i: I) -> &I::Output {
// SAFETY: the caller must uphold the safety contract for `get_unchecked`; // SAFETY: the caller must uphold the safety contract for `get_unchecked`;
// the slice is dereferenceable because `self` is a safe reference. // the slice is dereferenceable because `self` is a safe reference.
// The returned pointer is safe because impls of `SliceIndex` have to guarantee that it is. // The returned pointer is safe because impls of `SliceIndex` have to guarantee that it is.
@ -540,7 +540,7 @@ impl str {
#[stable(feature = "str_checked_slicing", since = "1.20.0")] #[stable(feature = "str_checked_slicing", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
#[inline] #[inline]
pub const unsafe fn get_unchecked_mut<I: ~const SliceIndex<str>>( pub const unsafe fn get_unchecked_mut<I: SliceIndex<str>>(
&mut self, &mut self,
i: I, i: I,
) -> &mut I::Output { ) -> &mut I::Output {
@ -2582,8 +2582,7 @@ impl AsRef<[u8]> for str {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl Default for &str {
impl const Default for &str {
/// Creates an empty str /// Creates an empty str
#[inline] #[inline]
fn default() -> Self { fn default() -> Self {

View file

@ -50,10 +50,9 @@ impl PartialOrd for str {
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] impl<I> ops::Index<I> for str
impl<I> const ops::Index<I> for str
where where
I: ~const SliceIndex<str>, I: SliceIndex<str>,
{ {
type Output = I::Output; type Output = I::Output;
@ -64,10 +63,9 @@ where
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] impl<I> ops::IndexMut<I> for str
impl<I> const ops::IndexMut<I> for str
where where
I: ~const SliceIndex<str>, I: SliceIndex<str>,
{ {
#[inline] #[inline]
fn index_mut(&mut self, index: I) -> &mut I::Output { fn index_mut(&mut self, index: I) -> &mut I::Output {
@ -96,7 +94,7 @@ const fn str_index_overflow_fail() -> ! {
/// Equivalent to `&self[0 .. len]` or `&mut self[0 .. len]`. /// Equivalent to `&self[0 .. len]` or `&mut self[0 .. len]`.
#[stable(feature = "str_checked_slicing", since = "1.20.0")] #[stable(feature = "str_checked_slicing", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl const SliceIndex<str> for ops::RangeFull { unsafe impl SliceIndex<str> for ops::RangeFull {
type Output = str; type Output = str;
#[inline] #[inline]
fn get(self, slice: &str) -> Option<&Self::Output> { fn get(self, slice: &str) -> Option<&Self::Output> {
@ -161,7 +159,7 @@ unsafe impl const SliceIndex<str> for ops::RangeFull {
/// ``` /// ```
#[stable(feature = "str_checked_slicing", since = "1.20.0")] #[stable(feature = "str_checked_slicing", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl const SliceIndex<str> for ops::Range<usize> { unsafe impl SliceIndex<str> for ops::Range<usize> {
type Output = str; type Output = str;
#[inline] #[inline]
fn get(self, slice: &str) -> Option<&Self::Output> { fn get(self, slice: &str) -> Option<&Self::Output> {
@ -271,7 +269,7 @@ unsafe impl const SliceIndex<str> for ops::Range<usize> {
/// character (as defined by `is_char_boundary`), or if `end > len`. /// character (as defined by `is_char_boundary`), or if `end > len`.
#[stable(feature = "str_checked_slicing", since = "1.20.0")] #[stable(feature = "str_checked_slicing", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl const SliceIndex<str> for ops::RangeTo<usize> { unsafe impl SliceIndex<str> for ops::RangeTo<usize> {
type Output = str; type Output = str;
#[inline] #[inline]
fn get(self, slice: &str) -> Option<&Self::Output> { fn get(self, slice: &str) -> Option<&Self::Output> {
@ -340,7 +338,7 @@ unsafe impl const SliceIndex<str> for ops::RangeTo<usize> {
/// a character (as defined by `is_char_boundary`), or if `begin > len`. /// a character (as defined by `is_char_boundary`), or if `begin > len`.
#[stable(feature = "str_checked_slicing", since = "1.20.0")] #[stable(feature = "str_checked_slicing", since = "1.20.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl const SliceIndex<str> for ops::RangeFrom<usize> { unsafe impl SliceIndex<str> for ops::RangeFrom<usize> {
type Output = str; type Output = str;
#[inline] #[inline]
fn get(self, slice: &str) -> Option<&Self::Output> { fn get(self, slice: &str) -> Option<&Self::Output> {
@ -412,7 +410,7 @@ unsafe impl const SliceIndex<str> for ops::RangeFrom<usize> {
/// byte offset or equal to `len`), if `begin > end`, or if `end >= len`. /// byte offset or equal to `len`), if `begin > end`, or if `end >= len`.
#[stable(feature = "inclusive_range", since = "1.26.0")] #[stable(feature = "inclusive_range", since = "1.26.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl const SliceIndex<str> for ops::RangeInclusive<usize> { unsafe impl SliceIndex<str> for ops::RangeInclusive<usize> {
type Output = str; type Output = str;
#[inline] #[inline]
fn get(self, slice: &str) -> Option<&Self::Output> { fn get(self, slice: &str) -> Option<&Self::Output> {
@ -464,7 +462,7 @@ unsafe impl const SliceIndex<str> for ops::RangeInclusive<usize> {
/// `is_char_boundary`, or equal to `len`), or if `end >= len`. /// `is_char_boundary`, or equal to `len`), or if `end >= len`.
#[stable(feature = "inclusive_range", since = "1.26.0")] #[stable(feature = "inclusive_range", since = "1.26.0")]
#[rustc_const_unstable(feature = "const_slice_index", issue = "none")] #[rustc_const_unstable(feature = "const_slice_index", issue = "none")]
unsafe impl const SliceIndex<str> for ops::RangeToInclusive<usize> { unsafe impl SliceIndex<str> for ops::RangeToInclusive<usize> {
type Output = str; type Output = str;
#[inline] #[inline]
fn get(self, slice: &str) -> Option<&Self::Output> { fn get(self, slice: &str) -> Option<&Self::Output> {

View file

@ -147,8 +147,7 @@ pub struct AtomicBool {
#[cfg(target_has_atomic_load_store = "8")] #[cfg(target_has_atomic_load_store = "8")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl Default for AtomicBool {
impl const Default for AtomicBool {
/// Creates an `AtomicBool` initialized to `false`. /// Creates an `AtomicBool` initialized to `false`.
#[inline] #[inline]
fn default() -> Self { fn default() -> Self {
@ -179,8 +178,7 @@ pub struct AtomicPtr<T> {
#[cfg(target_has_atomic_load_store = "ptr")] #[cfg(target_has_atomic_load_store = "ptr")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T> Default for AtomicPtr<T> {
impl<T> const Default for AtomicPtr<T> {
/// Creates a null `AtomicPtr<T>`. /// Creates a null `AtomicPtr<T>`.
fn default() -> AtomicPtr<T> { fn default() -> AtomicPtr<T> {
AtomicPtr::new(crate::ptr::null_mut()) AtomicPtr::new(crate::ptr::null_mut())
@ -1916,8 +1914,7 @@ impl<T> AtomicPtr<T> {
#[cfg(target_has_atomic_load_store = "8")] #[cfg(target_has_atomic_load_store = "8")]
#[stable(feature = "atomic_bool_from", since = "1.24.0")] #[stable(feature = "atomic_bool_from", since = "1.24.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl From<bool> for AtomicBool {
impl const From<bool> for AtomicBool {
/// Converts a `bool` into an `AtomicBool`. /// Converts a `bool` into an `AtomicBool`.
/// ///
/// # Examples /// # Examples
@ -1935,8 +1932,7 @@ impl const From<bool> for AtomicBool {
#[cfg(target_has_atomic_load_store = "ptr")] #[cfg(target_has_atomic_load_store = "ptr")]
#[stable(feature = "atomic_from", since = "1.23.0")] #[stable(feature = "atomic_from", since = "1.23.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> From<*mut T> for AtomicPtr<T> {
impl<T> const From<*mut T> for AtomicPtr<T> {
/// Converts a `*mut T` into an `AtomicPtr<T>`. /// Converts a `*mut T` into an `AtomicPtr<T>`.
#[inline] #[inline]
fn from(p: *mut T) -> Self { fn from(p: *mut T) -> Self {
@ -2002,8 +1998,7 @@ macro_rules! atomic_int {
pub const $atomic_init: $atomic_type = $atomic_type::new(0); pub const $atomic_init: $atomic_type = $atomic_type::new(0);
#[$stable] #[$stable]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl Default for $atomic_type {
impl const Default for $atomic_type {
#[inline] #[inline]
fn default() -> Self { fn default() -> Self {
Self::new(Default::default()) Self::new(Default::default())
@ -2011,8 +2006,7 @@ macro_rules! atomic_int {
} }
#[$stable_from] #[$stable_from]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] impl From<$int_type> for $atomic_type {
impl const From<$int_type> for $atomic_type {
#[doc = concat!("Converts an `", stringify!($int_type), "` into an `", stringify!($atomic_type), "`.")] #[doc = concat!("Converts an `", stringify!($int_type), "` into an `", stringify!($atomic_type), "`.")]
#[inline] #[inline]
fn from(v: $int_type) -> Self { Self::new(v) } fn from(v: $int_type) -> Self { Self::new(v) }

View file

@ -247,8 +247,7 @@ impl<T, E> Poll<Option<Result<T, E>>> {
} }
#[stable(feature = "futures_api", since = "1.36.0")] #[stable(feature = "futures_api", since = "1.36.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")] impl<T> From<T> for Poll<T> {
impl<T> const From<T> for Poll<T> {
/// Moves the value into a [`Poll::Ready`] to make a `Poll<T>`. /// Moves the value into a [`Poll::Ready`] to make a `Poll<T>`.
/// ///
/// # Example /// # Example

View file

@ -22,8 +22,7 @@ macro_rules! tuple_impls {
maybe_tuple_doc! { maybe_tuple_doc! {
$($T)+ @ $($T)+ @
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl<$($T: PartialEq),+> PartialEq for ($($T,)+)
impl<$($T: ~const PartialEq),+> const PartialEq for ($($T,)+)
where where
last_type!($($T,)+): ?Sized last_type!($($T,)+): ?Sized
{ {
@ -50,8 +49,7 @@ macro_rules! tuple_impls {
maybe_tuple_doc! { maybe_tuple_doc! {
$($T)+ @ $($T)+ @
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl<$($T: PartialOrd),+> PartialOrd for ($($T,)+)
impl<$($T: ~const PartialOrd + ~const PartialEq),+> const PartialOrd for ($($T,)+)
where where
last_type!($($T,)+): ?Sized last_type!($($T,)+): ?Sized
{ {
@ -81,8 +79,7 @@ macro_rules! tuple_impls {
maybe_tuple_doc! { maybe_tuple_doc! {
$($T)+ @ $($T)+ @
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_cmp", issue = "92391")] impl<$($T: Ord),+> Ord for ($($T,)+)
impl<$($T: ~const Ord),+> const Ord for ($($T,)+)
where where
last_type!($($T,)+): ?Sized last_type!($($T,)+): ?Sized
{ {
@ -96,8 +93,7 @@ macro_rules! tuple_impls {
maybe_tuple_doc! { maybe_tuple_doc! {
$($T)+ @ $($T)+ @
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<$($T: Default),+> Default for ($($T,)+) {
impl<$($T: ~const Default),+> const Default for ($($T,)+) {
#[inline] #[inline]
fn default() -> ($($T,)+) { fn default() -> ($($T,)+) {
($({ let x: $T = Default::default(); x},)+) ($({ let x: $T = Default::default(); x},)+)

View file

@ -222,13 +222,13 @@ mod const_cmp {
struct S(i32); struct S(i32);
impl const PartialEq for S { impl PartialEq for S {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
self.0 == other.0 self.0 == other.0
} }
} }
impl const PartialOrd for S { impl PartialOrd for S {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> { fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
let ret = match (self.0, other.0) { let ret = match (self.0, other.0) {
(a, b) if a > b => Ordering::Greater, (a, b) if a > b => Ordering::Greater,

View file

@ -9,13 +9,13 @@ struct MyHasher {
hash: u64, hash: u64,
} }
impl const Default for MyHasher { impl Default for MyHasher {
fn default() -> MyHasher { fn default() -> MyHasher {
MyHasher { hash: 0 } MyHasher { hash: 0 }
} }
} }
impl const Hasher for MyHasher { impl Hasher for MyHasher {
fn write(&mut self, buf: &[u8]) { fn write(&mut self, buf: &[u8]) {
// FIXME(const_trait_impl): change to for loop // FIXME(const_trait_impl): change to for loop
let mut i = 0; let mut i = 0;
@ -35,7 +35,7 @@ impl const Hasher for MyHasher {
#[test] #[test]
fn test_writer_hasher() { fn test_writer_hasher() {
const fn hash<T: ~const Hash>(t: &T) -> u64 { const fn hash<T: Hash>(t: &T) -> u64 {
let mut s = MyHasher { hash: 0 }; let mut s = MyHasher { hash: 0 };
t.hash(&mut s); t.hash(&mut s);
s.finish() s.finish()
@ -113,7 +113,7 @@ struct CustomHasher {
output: u64, output: u64,
} }
impl const Hasher for CustomHasher { impl Hasher for CustomHasher {
fn finish(&self) -> u64 { fn finish(&self) -> u64 {
self.output self.output
} }
@ -125,21 +125,21 @@ impl const Hasher for CustomHasher {
} }
} }
impl const Default for CustomHasher { impl Default for CustomHasher {
fn default() -> CustomHasher { fn default() -> CustomHasher {
CustomHasher { output: 0 } CustomHasher { output: 0 }
} }
} }
impl const Hash for Custom { impl Hash for Custom {
fn hash<H: ~const Hasher>(&self, state: &mut H) { fn hash<H: Hasher>(&self, state: &mut H) {
state.write_u64(self.hash); state.write_u64(self.hash);
} }
} }
#[test] #[test]
fn test_custom_state() { fn test_custom_state() {
const fn hash<T: ~const Hash>(t: &T) -> u64 { const fn hash<T: Hash>(t: &T) -> u64 {
let mut c = CustomHasher { output: 0 }; let mut c = CustomHasher { output: 0 };
t.hash(&mut c); t.hash(&mut c);
c.finish() c.finish()

View file

@ -28,7 +28,7 @@ const fn test_const_sip() {
let val1 = 0x45; let val1 = 0x45;
let val2 = 0xfeed; let val2 = 0xfeed;
const fn const_hash<T: ~const Hash>(x: &T) -> u64 { const fn const_hash<T: Hash>(x: &T) -> u64 {
let mut st = SipHasher::new(); let mut st = SipHasher::new();
x.hash(&mut st); x.hash(&mut st);
st.finish() st.finish()

View file

@ -3168,8 +3168,7 @@ impl DefaultHasher {
} }
#[stable(feature = "hashmap_default_hasher", since = "1.13.0")] #[stable(feature = "hashmap_default_hasher", since = "1.13.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl Default for DefaultHasher {
impl const Default for DefaultHasher {
/// Creates a new `DefaultHasher` using [`new`]. /// Creates a new `DefaultHasher` using [`new`].
/// See its documentation for more. /// See its documentation for more.
/// ///
@ -3181,8 +3180,7 @@ impl const Default for DefaultHasher {
} }
#[stable(feature = "hashmap_default_hasher", since = "1.13.0")] #[stable(feature = "hashmap_default_hasher", since = "1.13.0")]
#[rustc_const_unstable(feature = "const_hash", issue = "104061")] impl Hasher for DefaultHasher {
impl const Hasher for DefaultHasher {
// The underlying `SipHasher13` doesn't override the other // The underlying `SipHasher13` doesn't override the other
// `write_*` methods, so it's ok not to forward them here. // `write_*` methods, so it's ok not to forward them here.

View file

@ -344,8 +344,7 @@ impl<T: RefUnwindSafe + UnwindSafe> RefUnwindSafe for OnceLock<T> {}
impl<T: UnwindSafe> UnwindSafe for OnceLock<T> {} impl<T: UnwindSafe> UnwindSafe for OnceLock<T> {}
#[stable(feature = "once_cell", since = "CURRENT_RUSTC_VERSION")] #[stable(feature = "once_cell", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] impl<T> Default for OnceLock<T> {
impl<T> const Default for OnceLock<T> {
/// Creates a new empty cell. /// Creates a new empty cell.
/// ///
/// # Example /// # Example