diff options
| author | bors <bors@rust-lang.org> | 2021-08-17 22:30:09 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-08-17 22:30:09 +0000 |
| commit | adf168844791b213383b18d10515eaee88695f7d (patch) | |
| tree | 05d78b84df039e87a54818eaf5b28609b4d1f32d | |
| parent | 30a0a9b694cde95cbab863f7ef4d554f0f46b606 (diff) | |
| parent | 6bd2ecba726f06587d7d60ffca5605841ac39091 (diff) | |
| download | rust-adf168844791b213383b18d10515eaee88695f7d.tar.gz rust-adf168844791b213383b18d10515eaee88695f7d.zip | |
Auto merge of #86808 - fee1-dead:constify-1, r=oli-obk
constified implementations of `Default`
| -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 | ||||
| -rw-r--r-- | src/test/ui/rfc-2632-const-trait-impl/std-impl-gate.rs | 21 | ||||
| -rw-r--r-- | src/test/ui/rfc-2632-const-trait-impl/std-impl-gate.stock.stderr | 9 |
19 files changed, 77 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)] diff --git a/src/test/ui/rfc-2632-const-trait-impl/std-impl-gate.rs b/src/test/ui/rfc-2632-const-trait-impl/std-impl-gate.rs new file mode 100644 index 00000000000..c6975da7121 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/std-impl-gate.rs @@ -0,0 +1,21 @@ +// This tests feature gates for const impls in the standard library. + +// revisions: stock gated +//[gated] run-pass + +#![cfg_attr(gated, feature(const_trait_impl, const_default_impls))] + +fn non_const_context() -> Vec<usize> { + Default::default() +} + +const fn const_context() -> Vec<usize> { + Default::default() + //[stock]~^ ERROR calls in constant functions are limited +} + +fn main() { + const VAL: Vec<usize> = const_context(); + + assert_eq!(VAL, non_const_context()); +} diff --git a/src/test/ui/rfc-2632-const-trait-impl/std-impl-gate.stock.stderr b/src/test/ui/rfc-2632-const-trait-impl/std-impl-gate.stock.stderr new file mode 100644 index 00000000000..55a0daaaec7 --- /dev/null +++ b/src/test/ui/rfc-2632-const-trait-impl/std-impl-gate.stock.stderr @@ -0,0 +1,9 @@ +error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants + --> $DIR/std-impl-gate.rs:13:5 + | +LL | Default::default() + | ^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0015`. |
