diff options
| author | Deadbeef <ent3rm4n@gmail.com> | 2021-08-14 16:35:12 +0000 |
|---|---|---|
| committer | Deadbeef <ent3rm4n@gmail.com> | 2021-08-17 07:15:54 +0000 |
| commit | b5afa6807b868bc8bb2e6f972629769b150ffd41 (patch) | |
| tree | 4abfdf049ab0964aa14b4137fe4446d019169939 | |
| parent | 3b5df014390dcef66cc35f968fe51e9558e6ca13 (diff) | |
| download | rust-b5afa6807b868bc8bb2e6f972629769b150ffd41.tar.gz rust-b5afa6807b868bc8bb2e6f972629769b150ffd41.zip | |
Constified `Default` implementations
The libs-api team agrees to allow const_trait_impl to appear in the standard library as long as stable code cannot be broken (they are properly gated) this means if the compiler teams thinks it's okay, then it's okay. My priority on constifying would be: 1. Non-generic impls (e.g. Default) or generic impls with no bounds 2. Generic functions with bounds (that use const impls) 3. Generic impls with bounds 4. Impls for traits with associated types For people opening constification PRs: please cc me and/or oli-obk.
| -rw-r--r-- | library/alloc/src/lib.rs | 1 | ||||
| -rw-r--r-- | library/alloc/src/string.rs | 3 | ||||
| -rw-r--r-- | library/alloc/src/vec/mod.rs | 3 | ||||
| -rw-r--r-- | library/alloc/tests/const_fns.rs | 26 | ||||
| -rw-r--r-- | library/alloc/tests/lib.rs | 1 | ||||
| -rw-r--r-- | library/core/src/array/mod.rs | 3 | ||||
| -rw-r--r-- | library/core/src/default.rs | 3 | ||||
| -rw-r--r-- | library/core/src/hash/mod.rs | 3 | ||||
| -rw-r--r-- | library/core/src/iter/sources/empty.rs | 3 | ||||
| -rw-r--r-- | library/core/src/lib.rs | 1 | ||||
| -rw-r--r-- | library/core/src/marker.rs | 3 | ||||
| -rw-r--r-- | library/core/src/option.rs | 3 | ||||
| -rw-r--r-- | library/core/src/slice/mod.rs | 6 | ||||
| -rw-r--r-- | library/core/src/str/mod.rs | 3 | ||||
| -rw-r--r-- | library/core/src/sync/atomic.rs | 9 | ||||
| -rw-r--r-- | library/std/src/lazy.rs | 3 | ||||
| -rw-r--r-- | library/std/src/lib.rs | 1 |
17 files changed, 47 insertions, 28 deletions
diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index d2ececaa975..1a387f291cc 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -95,6 +95,7 @@ #![feature(const_fn_trait_bound)] #![feature(cow_is_borrowed)] #![feature(const_cow_is_borrowed)] +#![feature(const_trait_impl)] #![feature(destructuring_assignment)] #![feature(dispatch_from_dyn)] #![feature(core_intrinsics)] diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs index 9aefd882af4..6568d9f9907 100644 --- a/library/alloc/src/string.rs +++ b/library/alloc/src/string.rs @@ -2105,7 +2105,8 @@ impl_eq! { Cow<'a, str>, &'b str } impl_eq! { Cow<'a, str>, String } #[stable(feature = "rust1", since = "1.0.0")] -impl Default for String { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl const Default for String { /// Creates an empty `String`. #[inline] fn default() -> String { diff --git a/library/alloc/src/vec/mod.rs b/library/alloc/src/vec/mod.rs index 933361d812c..87a0d371815 100644 --- a/library/alloc/src/vec/mod.rs +++ b/library/alloc/src/vec/mod.rs @@ -2758,7 +2758,8 @@ unsafe impl<#[may_dangle] T, A: Allocator> Drop for Vec<T, A> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<T> Default for Vec<T> { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl<T> const Default for Vec<T> { /// Creates an empty `Vec<T>`. fn default() -> Vec<T> { Vec::new() diff --git a/library/alloc/tests/const_fns.rs b/library/alloc/tests/const_fns.rs index b6ef3eee291..da58ae92e11 100644 --- a/library/alloc/tests/const_fns.rs +++ b/library/alloc/tests/const_fns.rs @@ -1,16 +1,8 @@ -// Test several functions can be used for constants -// 1. Vec::new() -// 2. String::new() -// 3. BTreeMap::new() -// 4. BTreeSet::new() +// Test const functions in the library -#[allow(dead_code)] -pub const MY_VEC: Vec<usize> = Vec::new(); - -#[allow(dead_code)] -pub const MY_STRING: String = String::new(); +use core::cmp::Ordering; -// FIXME(fee1-dead) remove this struct once we put `K: ?const Ord` on BTreeMap::new. +// FIXME remove this struct once we put `K: ?const Ord` on BTreeMap::new. #[derive(PartialEq, Eq, PartialOrd)] pub struct MyType; @@ -32,7 +24,12 @@ impl const Ord for MyType { } } -use core::cmp::Ordering; +pub const MY_VEC: Vec<usize> = Vec::new(); +pub const MY_VEC2: Vec<usize> = Default::default(); + +pub const MY_STRING: String = String::new(); +pub const MY_STRING2: String = Default::default(); + use std::collections::{BTreeMap, BTreeSet}; pub const MY_BTREEMAP: BTreeMap<MyType, MyType> = BTreeMap::new(); @@ -47,7 +44,10 @@ pub const SET_IS_EMPTY: bool = SET.is_empty(); #[test] fn test_const() { + assert_eq!(MY_VEC, MY_VEC2); + assert_eq!(MY_STRING, MY_STRING2); + assert_eq!(MAP_LEN, 0); assert_eq!(SET_LEN, 0); - assert!(MAP_IS_EMPTY && SET_IS_EMPTY) + assert!(MAP_IS_EMPTY && SET_IS_EMPTY); } diff --git a/library/alloc/tests/lib.rs b/library/alloc/tests/lib.rs index 7284c05d5ff..5767108d423 100644 --- a/library/alloc/tests/lib.rs +++ b/library/alloc/tests/lib.rs @@ -24,6 +24,7 @@ #![feature(vec_spare_capacity)] #![feature(string_remove_matches)] #![feature(const_btree_new)] +#![feature(const_default_impls)] #![feature(const_trait_impl)] use std::collections::hash_map::DefaultHasher; diff --git a/library/core/src/array/mod.rs b/library/core/src/array/mod.rs index 3bc9f71375c..3c638e655dc 100644 --- a/library/core/src/array/mod.rs +++ b/library/core/src/array/mod.rs @@ -280,7 +280,8 @@ macro_rules! array_impl_default { }; {$n:expr,} => { #[stable(since = "1.4.0", feature = "array_default")] - impl<T> Default for [T; $n] { + #[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] + impl<T> const Default for [T; $n] { fn default() -> [T; $n] { [] } } }; diff --git a/library/core/src/default.rs b/library/core/src/default.rs index 6400a9b8595..0ee8cd59ba4 100644 --- a/library/core/src/default.rs +++ b/library/core/src/default.rs @@ -171,7 +171,8 @@ pub macro Default($item:item) { macro_rules! default_impl { ($t:ty, $v:expr, $doc:tt) => { #[stable(feature = "rust1", since = "1.0.0")] - impl Default for $t { + #[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] + impl const Default for $t { #[inline] #[doc = $doc] fn default() -> $t { diff --git a/library/core/src/hash/mod.rs b/library/core/src/hash/mod.rs index 9dbefe0822e..510e233b431 100644 --- a/library/core/src/hash/mod.rs +++ b/library/core/src/hash/mod.rs @@ -599,7 +599,8 @@ impl<H> Clone for BuildHasherDefault<H> { } #[stable(since = "1.7.0", feature = "build_hasher")] -impl<H> Default for BuildHasherDefault<H> { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl<H> const Default for BuildHasherDefault<H> { fn default() -> BuildHasherDefault<H> { BuildHasherDefault(marker::PhantomData) } diff --git a/library/core/src/iter/sources/empty.rs b/library/core/src/iter/sources/empty.rs index 919c564f287..a7d4646f5c5 100644 --- a/library/core/src/iter/sources/empty.rs +++ b/library/core/src/iter/sources/empty.rs @@ -85,7 +85,8 @@ impl<T> Clone for Empty<T> { // not #[derive] because that adds a Default bound on T, // which isn't necessary. #[stable(feature = "iter_empty", since = "1.2.0")] -impl<T> Default for Empty<T> { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl<T> const Default for Empty<T> { fn default() -> Empty<T> { Empty(marker::PhantomData) } diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index 37c3f8d4c16..4ab7cc24a0d 100644 --- a/library/core/src/lib.rs +++ b/library/core/src/lib.rs @@ -103,6 +103,7 @@ #![feature(const_type_id)] #![feature(const_type_name)] #![feature(const_unreachable_unchecked)] +#![feature(const_default_impls)] #![feature(duration_consts_2)] #![feature(ptr_metadata)] #![feature(slice_ptr_get)] diff --git a/library/core/src/marker.rs b/library/core/src/marker.rs index fb957348beb..333f81ce4cf 100644 --- a/library/core/src/marker.rs +++ b/library/core/src/marker.rs @@ -528,7 +528,8 @@ macro_rules! impls { } #[stable(feature = "rust1", since = "1.0.0")] - impl<T: ?Sized> Default for $t<T> { + #[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] + impl<T: ?Sized> const Default for $t<T> { fn default() -> Self { Self } diff --git a/library/core/src/option.rs b/library/core/src/option.rs index 3f9f04606b3..78f5954532f 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -1642,7 +1642,8 @@ impl<T: Clone> Clone for Option<T> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<T> Default for Option<T> { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl<T> const Default for Option<T> { /// Returns [`None`][Option::None]. /// /// # Examples diff --git a/library/core/src/slice/mod.rs b/library/core/src/slice/mod.rs index 51227d54115..361a9b03aeb 100644 --- a/library/core/src/slice/mod.rs +++ b/library/core/src/slice/mod.rs @@ -3501,7 +3501,8 @@ where } #[stable(feature = "rust1", since = "1.0.0")] -impl<T> Default for &[T] { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl<T> const Default for &[T] { /// Creates an empty slice. fn default() -> Self { &[] @@ -3509,7 +3510,8 @@ impl<T> Default for &[T] { } #[stable(feature = "mut_slice_default", since = "1.5.0")] -impl<T> Default for &mut [T] { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl<T> const Default for &mut [T] { /// Creates a mutable empty slice. fn default() -> Self { &mut [] diff --git a/library/core/src/str/mod.rs b/library/core/src/str/mod.rs index d4e30e65ef8..947afbdc68d 100644 --- a/library/core/src/str/mod.rs +++ b/library/core/src/str/mod.rs @@ -2442,7 +2442,8 @@ impl AsRef<[u8]> for str { } #[stable(feature = "rust1", since = "1.0.0")] -impl Default for &str { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl const Default for &str { /// Creates an empty str #[inline] fn default() -> Self { diff --git a/library/core/src/sync/atomic.rs b/library/core/src/sync/atomic.rs index d908b6ecda3..d9de37e9c51 100644 --- a/library/core/src/sync/atomic.rs +++ b/library/core/src/sync/atomic.rs @@ -138,7 +138,8 @@ pub struct AtomicBool { #[cfg(target_has_atomic_load_store = "8")] #[stable(feature = "rust1", since = "1.0.0")] -impl Default for AtomicBool { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl const Default for AtomicBool { /// Creates an `AtomicBool` initialized to `false`. #[inline] fn default() -> Self { @@ -168,7 +169,8 @@ pub struct AtomicPtr<T> { #[cfg(target_has_atomic_load_store = "ptr")] #[stable(feature = "rust1", since = "1.0.0")] -impl<T> Default for AtomicPtr<T> { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl<T> const Default for AtomicPtr<T> { /// Creates a null `AtomicPtr<T>`. fn default() -> AtomicPtr<T> { AtomicPtr::new(crate::ptr::null_mut()) @@ -1351,7 +1353,8 @@ macro_rules! atomic_int { pub const $atomic_init: $atomic_type = $atomic_type::new(0); #[$stable] - impl Default for $atomic_type { + #[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] + impl const Default for $atomic_type { #[inline] fn default() -> Self { Self::new(Default::default()) diff --git a/library/std/src/lazy.rs b/library/std/src/lazy.rs index 132733a0525..5afdb799f0c 100644 --- a/library/std/src/lazy.rs +++ b/library/std/src/lazy.rs @@ -86,7 +86,8 @@ impl<T: RefUnwindSafe + UnwindSafe> RefUnwindSafe for SyncOnceCell<T> {} impl<T: UnwindSafe> UnwindSafe for SyncOnceCell<T> {} #[unstable(feature = "once_cell", issue = "74465")] -impl<T> Default for SyncOnceCell<T> { +#[rustc_const_unstable(feature = "const_default_impls", issue = "87864")] +impl<T> const Default for SyncOnceCell<T> { /// Creates a new empty cell. /// /// # Example diff --git a/library/std/src/lib.rs b/library/std/src/lib.rs index 43db3f91022..5e91a0cdbd6 100644 --- a/library/std/src/lib.rs +++ b/library/std/src/lib.rs @@ -255,6 +255,7 @@ #![feature(const_ipv6)] #![feature(const_raw_ptr_deref)] #![feature(const_socketaddr)] +#![feature(const_trait_impl)] #![feature(container_error_extra)] #![feature(core_intrinsics)] #![feature(custom_test_frameworks)] |
