about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-08-17 22:30:09 +0000
committerbors <bors@rust-lang.org>2021-08-17 22:30:09 +0000
commitadf168844791b213383b18d10515eaee88695f7d (patch)
tree05d78b84df039e87a54818eaf5b28609b4d1f32d
parent30a0a9b694cde95cbab863f7ef4d554f0f46b606 (diff)
parent6bd2ecba726f06587d7d60ffca5605841ac39091 (diff)
downloadrust-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.rs1
-rw-r--r--library/alloc/src/string.rs3
-rw-r--r--library/alloc/src/vec/mod.rs3
-rw-r--r--library/alloc/tests/const_fns.rs26
-rw-r--r--library/alloc/tests/lib.rs1
-rw-r--r--library/core/src/array/mod.rs3
-rw-r--r--library/core/src/default.rs3
-rw-r--r--library/core/src/hash/mod.rs3
-rw-r--r--library/core/src/iter/sources/empty.rs3
-rw-r--r--library/core/src/lib.rs1
-rw-r--r--library/core/src/marker.rs3
-rw-r--r--library/core/src/option.rs3
-rw-r--r--library/core/src/slice/mod.rs6
-rw-r--r--library/core/src/str/mod.rs3
-rw-r--r--library/core/src/sync/atomic.rs9
-rw-r--r--library/std/src/lazy.rs3
-rw-r--r--library/std/src/lib.rs1
-rw-r--r--src/test/ui/rfc-2632-const-trait-impl/std-impl-gate.rs21
-rw-r--r--src/test/ui/rfc-2632-const-trait-impl/std-impl-gate.stock.stderr9
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`.