Skip to content

Commit d9a7546

Browse files
committed
Make Default const and add some const Default impls
Full list of `impl const Default` types: - () - bool - char - std::ascii::Char - usize - u8 - u16 - u32 - u64 - u128 - i8 - i16 - i32 - i64 - i128 - f16 - f32 - f64 - f128 - std::marker::PhantomData<T> - Option<T> - std::iter::Empty<T> - std::ptr::Alignment - &[T] - &mut [T] - &str - &mut str - String - Vec<T>
1 parent 06a24e9 commit d9a7546

File tree

12 files changed

+72
-11
lines changed

12 files changed

+72
-11
lines changed

library/alloc/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
#![feature(coerce_unsized)]
110110
#![feature(const_eval_select)]
111111
#![feature(const_heap)]
112+
#![feature(const_trait_impl)]
112113
#![feature(core_intrinsics)]
113114
#![feature(deprecated_suggestion)]
114115
#![feature(deref_pure_trait)]

library/alloc/src/string.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2538,7 +2538,8 @@ impl_eq! { Cow<'a, str>, &'b str }
25382538
impl_eq! { Cow<'a, str>, String }
25392539

25402540
#[stable(feature = "rust1", since = "1.0.0")]
2541-
impl Default for String {
2541+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
2542+
impl const Default for String {
25422543
/// Creates an empty `String`.
25432544
#[inline]
25442545
fn default() -> String {

library/alloc/src/vec/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3790,7 +3790,8 @@ unsafe impl<#[may_dangle] T, A: Allocator> Drop for Vec<T, A> {
37903790
}
37913791

37923792
#[stable(feature = "rust1", since = "1.0.0")]
3793-
impl<T> Default for Vec<T> {
3793+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
3794+
impl<T> const Default for Vec<T> {
37943795
/// Creates an empty `Vec<T>`.
37953796
///
37963797
/// The vector will not allocate until elements are pushed onto it.

library/core/src/default.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ use crate::ascii::Char as AsciiChar;
103103
/// ```
104104
#[cfg_attr(not(test), rustc_diagnostic_item = "Default")]
105105
#[stable(feature = "rust1", since = "1.0.0")]
106+
#[const_trait]
106107
#[rustc_trivial_field_reads]
107108
pub trait Default: Sized {
108109
/// Returns the "default value" for a type.
@@ -150,7 +151,8 @@ pub macro Default($item:item) {
150151
macro_rules! default_impl {
151152
($t:ty, $v:expr, $doc:tt) => {
152153
#[stable(feature = "rust1", since = "1.0.0")]
153-
impl Default for $t {
154+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
155+
impl const Default for $t {
154156
#[inline(always)]
155157
#[doc = $doc]
156158
fn default() -> $t {

library/core/src/iter/sources/empty.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ impl<T> Clone for Empty<T> {
8181
// not #[derive] because that adds a Default bound on T,
8282
// which isn't necessary.
8383
#[stable(feature = "iter_empty", since = "1.2.0")]
84-
impl<T> Default for Empty<T> {
84+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
85+
impl<T> const Default for Empty<T> {
8586
fn default() -> Empty<T> {
8687
Empty(marker::PhantomData)
8788
}

library/core/src/marker.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -797,7 +797,8 @@ impl<T: ?Sized> Clone for PhantomData<T> {
797797
}
798798

799799
#[stable(feature = "rust1", since = "1.0.0")]
800-
impl<T: ?Sized> Default for PhantomData<T> {
800+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
801+
impl<T: ?Sized> const Default for PhantomData<T> {
801802
fn default() -> Self {
802803
Self
803804
}

library/core/src/option.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2051,7 +2051,8 @@ where
20512051
}
20522052

20532053
#[stable(feature = "rust1", since = "1.0.0")]
2054-
impl<T> Default for Option<T> {
2054+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
2055+
impl<T> const Default for Option<T> {
20552056
/// Returns [`None`][Option::None].
20562057
///
20572058
/// # Examples

library/core/src/ptr/alignment.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,8 @@ impl hash::Hash for Alignment {
229229

230230
/// Returns [`Alignment::MIN`], which is valid for any type.
231231
#[unstable(feature = "ptr_alignment_type", issue = "102070")]
232-
impl Default for Alignment {
232+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
233+
impl const Default for Alignment {
233234
fn default() -> Alignment {
234235
Alignment::MIN
235236
}

library/core/src/slice/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4942,15 +4942,17 @@ where
49424942
}
49434943

49444944
#[stable(feature = "rust1", since = "1.0.0")]
4945-
impl<T> Default for &[T] {
4945+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
4946+
impl<T> const Default for &[T] {
49464947
/// Creates an empty slice.
49474948
fn default() -> Self {
49484949
&[]
49494950
}
49504951
}
49514952

49524953
#[stable(feature = "mut_slice_default", since = "1.5.0")]
4953-
impl<T> Default for &mut [T] {
4954+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
4955+
impl<T> const Default for &mut [T] {
49544956
/// Creates a mutable empty slice.
49554957
fn default() -> Self {
49564958
&mut []

library/core/src/str/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2971,7 +2971,8 @@ impl AsRef<[u8]> for str {
29712971
}
29722972

29732973
#[stable(feature = "rust1", since = "1.0.0")]
2974-
impl Default for &str {
2974+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
2975+
impl const Default for &str {
29752976
/// Creates an empty str
29762977
#[inline]
29772978
fn default() -> Self {
@@ -2980,7 +2981,8 @@ impl Default for &str {
29802981
}
29812982

29822983
#[stable(feature = "default_mut_str", since = "1.28.0")]
2983-
impl Default for &mut str {
2984+
#[rustc_const_unstable(feature = "const_default", issue = "none")]
2985+
impl const Default for &mut str {
29842986
/// Creates an empty mutable str
29852987
#[inline]
29862988
fn default() -> Self {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//@ run-pass
2+
#![feature(const_trait_impl)]
3+
#![allow(dead_code)]
4+
// alloc::string
5+
const STRING: String = Default::default();
6+
// alloc::vec
7+
const VEC: Vec<()> = Default::default();
8+
9+
fn main() {}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//@ run-pass
2+
#![feature(const_trait_impl, ptr_alignment_type, ascii_char, f16, f128)]
3+
#![allow(dead_code)]
4+
// core::default
5+
const UNIT: () = Default::default();
6+
const BOOL: bool = Default::default();
7+
const CHAR: char = Default::default();
8+
const ASCII_CHAR: std::ascii::Char = Default::default();
9+
const USIZE: usize = Default::default();
10+
const U8: u8 = Default::default();
11+
const U16: u16 = Default::default();
12+
const U32: u32 = Default::default();
13+
const U64: u64 = Default::default();
14+
const U128: u128 = Default::default();
15+
const I8: i8 = Default::default();
16+
const I16: i16 = Default::default();
17+
const I32: i32 = Default::default();
18+
const I64: i64 = Default::default();
19+
const I128: i128 = Default::default();
20+
const F16: f16 = Default::default();
21+
const F32: f32 = Default::default();
22+
const F64: f64 = Default::default();
23+
const F128: f128 = Default::default();
24+
// core::marker
25+
const PHANTOM: std::marker::PhantomData<()> = Default::default();
26+
// core::option
27+
const OPT: Option<i32> = Default::default();
28+
// core::iter::sources::empty
29+
const EMPTY: std::iter::Empty<()> = Default::default();
30+
// core::ptr::alignment
31+
const ALIGNMENT: std::ptr::Alignment = Default::default();
32+
// core::slice
33+
const SLICE: &[()] = Default::default();
34+
const MUT_SLICE: &mut [()] = Default::default();
35+
//core::str
36+
const STR: &str = Default::default();
37+
const MUT_STR: &mut str = Default::default();
38+
39+
fn main() {}

0 commit comments

Comments
 (0)