From c04c49ebe1ef13e9efa25aa186032a2f9889fdc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Sat, 21 Dec 2024 20:25:43 +0000 Subject: [PATCH 01/11] 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 - Option - std::iter::Empty - std::ptr::Alignment - &[T] - &mut [T] - &str - &mut str - String - Vec --- library/alloc/src/lib.rs | 2 + library/alloc/src/string.rs | 3 +- library/alloc/src/vec/mod.rs | 3 +- library/core/src/default.rs | 6 +- library/core/src/iter/sources/empty.rs | 3 +- library/core/src/marker.rs | 3 +- library/core/src/option.rs | 3 +- library/core/src/ptr/alignment.rs | 3 +- library/core/src/slice/mod.rs | 6 +- library/core/src/str/mod.rs | 6 +- .../std/const-generics-alloc.rs | 9 +++ .../const-generics/std/const-generics-core.rs | 39 ++++++++++++ tests/ui/consts/rustc-impl-const-stability.rs | 8 +-- .../consts/rustc-impl-const-stability.stderr | 6 +- tests/ui/deriving/deriving-default-enum.rs | 3 +- .../dead-code/unused-struct-derive-default.rs | 9 +-- .../unused-struct-derive-default.stderr | 13 ++-- tests/ui/specialization/const_trait_impl.rs | 8 ++- .../ui/specialization/const_trait_impl.stderr | 60 +++++++++---------- .../const_derives/derive-const-gate.rs | 5 +- .../const_derives/derive-const-gate.stderr | 21 +++++-- .../derive-const-non-const-type.stderr | 11 ++-- .../const_derives/derive-const-use.rs | 2 +- .../const_derives/derive-const-use.stderr | 57 +----------------- .../const-traits/std-impl-gate.gated.stderr | 18 ------ tests/ui/traits/const-traits/std-impl-gate.rs | 7 ++- .../const-traits/std-impl-gate.stock.stderr | 20 ++++++- 27 files changed, 180 insertions(+), 154 deletions(-) create mode 100644 tests/ui/const-generics/std/const-generics-alloc.rs create mode 100644 tests/ui/const-generics/std/const-generics-core.rs delete mode 100644 tests/ui/traits/const-traits/std-impl-gate.gated.stderr diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index f416732a8d63b..141360c0d30f7 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -107,8 +107,10 @@ #![feature(char_max_len)] #![feature(clone_to_uninit)] #![feature(coerce_unsized)] +#![feature(const_default)] #![feature(const_eval_select)] #![feature(const_heap)] +#![feature(const_trait_impl)] #![feature(core_intrinsics)] #![feature(deprecated_suggestion)] #![feature(deref_pure_trait)] diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs index 5f69f699867a9..7109d3ae50353 100644 --- a/library/alloc/src/string.rs +++ b/library/alloc/src/string.rs @@ -2611,7 +2611,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", issue = "none")] +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 5bd82560da7ed..7250c0943b76e 100644 --- a/library/alloc/src/vec/mod.rs +++ b/library/alloc/src/vec/mod.rs @@ -3840,7 +3840,8 @@ unsafe impl<#[may_dangle] T, A: Allocator> Drop for Vec { } #[stable(feature = "rust1", since = "1.0.0")] -impl Default for Vec { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for Vec { /// Creates an empty `Vec`. /// /// The vector will not allocate until elements are pushed onto it. diff --git a/library/core/src/default.rs b/library/core/src/default.rs index 0a15cedfb552d..f4b480e486025 100644 --- a/library/core/src/default.rs +++ b/library/core/src/default.rs @@ -103,6 +103,9 @@ use crate::ascii::Char as AsciiChar; /// ``` #[rustc_diagnostic_item = "Default"] #[stable(feature = "rust1", since = "1.0.0")] +#[const_trait] +#[rustc_trivial_field_reads] +#[rustc_const_unstable(feature = "const_default", issue = "none")] pub trait Default: Sized { /// Returns the "default value" for a type. /// @@ -149,7 +152,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", issue = "none")] + impl const Default for $t { #[inline(always)] #[doc = $doc] fn default() -> $t { diff --git a/library/core/src/iter/sources/empty.rs b/library/core/src/iter/sources/empty.rs index 3c3acceded889..a33cf21cb6aad 100644 --- a/library/core/src/iter/sources/empty.rs +++ b/library/core/src/iter/sources/empty.rs @@ -81,7 +81,8 @@ impl Clone for Empty { // not #[derive] because that adds a Default bound on T, // which isn't necessary. #[stable(feature = "iter_empty", since = "1.2.0")] -impl Default for Empty { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for Empty { fn default() -> Empty { Empty(marker::PhantomData) } diff --git a/library/core/src/marker.rs b/library/core/src/marker.rs index 0cc5640941a32..d310e22d845ed 100644 --- a/library/core/src/marker.rs +++ b/library/core/src/marker.rs @@ -855,7 +855,8 @@ impl Clone for PhantomData { } #[stable(feature = "rust1", since = "1.0.0")] -impl Default for PhantomData { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for PhantomData { fn default() -> Self { Self } diff --git a/library/core/src/option.rs b/library/core/src/option.rs index f2a1e901188ff..4d6d408710c61 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -2111,7 +2111,8 @@ where impl crate::clone::UseCloned for Option where T: crate::clone::UseCloned {} #[stable(feature = "rust1", since = "1.0.0")] -impl Default for Option { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for Option { /// Returns [`None`][Option::None]. /// /// # Examples diff --git a/library/core/src/ptr/alignment.rs b/library/core/src/ptr/alignment.rs index 3e66e271f03b6..01f6e199ecad1 100644 --- a/library/core/src/ptr/alignment.rs +++ b/library/core/src/ptr/alignment.rs @@ -230,7 +230,8 @@ impl hash::Hash for Alignment { /// Returns [`Alignment::MIN`], which is valid for any type. #[unstable(feature = "ptr_alignment_type", issue = "102070")] -impl Default for Alignment { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for Alignment { fn default() -> Alignment { Alignment::MIN } diff --git a/library/core/src/slice/mod.rs b/library/core/src/slice/mod.rs index 3a3f44c6b8546..5274638a5787e 100644 --- a/library/core/src/slice/mod.rs +++ b/library/core/src/slice/mod.rs @@ -5158,7 +5158,8 @@ where } #[stable(feature = "rust1", since = "1.0.0")] -impl Default for &[T] { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for &[T] { /// Creates an empty slice. fn default() -> Self { &[] @@ -5166,7 +5167,8 @@ impl Default for &[T] { } #[stable(feature = "mut_slice_default", since = "1.5.0")] -impl Default for &mut [T] { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl 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 d250e1478d80a..45c6828f4ef3d 100644 --- a/library/core/src/str/mod.rs +++ b/library/core/src/str/mod.rs @@ -3072,7 +3072,8 @@ impl AsRef<[u8]> for str { } #[stable(feature = "rust1", since = "1.0.0")] -impl Default for &str { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for &str { /// Creates an empty str #[inline] fn default() -> Self { @@ -3081,7 +3082,8 @@ impl Default for &str { } #[stable(feature = "default_mut_str", since = "1.28.0")] -impl Default for &mut str { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for &mut str { /// Creates an empty mutable str #[inline] fn default() -> Self { diff --git a/tests/ui/const-generics/std/const-generics-alloc.rs b/tests/ui/const-generics/std/const-generics-alloc.rs new file mode 100644 index 0000000000000..07725ef02f185 --- /dev/null +++ b/tests/ui/const-generics/std/const-generics-alloc.rs @@ -0,0 +1,9 @@ +//@ run-pass +#![feature(const_trait_impl, const_default)] +#![allow(dead_code)] +// alloc::string +const STRING: String = Default::default(); +// alloc::vec +const VEC: Vec<()> = Default::default(); + +fn main() {} diff --git a/tests/ui/const-generics/std/const-generics-core.rs b/tests/ui/const-generics/std/const-generics-core.rs new file mode 100644 index 0000000000000..0d9a300890a77 --- /dev/null +++ b/tests/ui/const-generics/std/const-generics-core.rs @@ -0,0 +1,39 @@ +//@ run-pass +#![feature(const_trait_impl, const_default, ptr_alignment_type, ascii_char, f16, f128)] +#![allow(dead_code)] +// core::default +const UNIT: () = Default::default(); +const BOOL: bool = Default::default(); +const CHAR: char = Default::default(); +const ASCII_CHAR: std::ascii::Char = Default::default(); +const USIZE: usize = Default::default(); +const U8: u8 = Default::default(); +const U16: u16 = Default::default(); +const U32: u32 = Default::default(); +const U64: u64 = Default::default(); +const U128: u128 = Default::default(); +const I8: i8 = Default::default(); +const I16: i16 = Default::default(); +const I32: i32 = Default::default(); +const I64: i64 = Default::default(); +const I128: i128 = Default::default(); +const F16: f16 = Default::default(); +const F32: f32 = Default::default(); +const F64: f64 = Default::default(); +const F128: f128 = Default::default(); +// core::marker +const PHANTOM: std::marker::PhantomData<()> = Default::default(); +// core::option +const OPT: Option = Default::default(); +// core::iter::sources::empty +const EMPTY: std::iter::Empty<()> = Default::default(); +// core::ptr::alignment +const ALIGNMENT: std::ptr::Alignment = Default::default(); +// core::slice +const SLICE: &[()] = Default::default(); +const MUT_SLICE: &mut [()] = Default::default(); +//core::str +const STR: &str = Default::default(); +const MUT_STR: &mut str = Default::default(); + +fn main() {} diff --git a/tests/ui/consts/rustc-impl-const-stability.rs b/tests/ui/consts/rustc-impl-const-stability.rs index 0df8482bec121..93a5e8e4f458d 100644 --- a/tests/ui/consts/rustc-impl-const-stability.rs +++ b/tests/ui/consts/rustc-impl-const-stability.rs @@ -2,7 +2,7 @@ //@ known-bug: #110395 #![crate_type = "lib"] -#![feature(staged_api, const_trait_impl)] +#![feature(staged_api, const_trait_impl, const_default)] #![stable(feature = "foo", since = "1.0.0")] #[stable(feature = "potato", since = "1.27.0")] @@ -12,8 +12,8 @@ pub struct Data { #[stable(feature = "potato", since = "1.27.0")] #[rustc_const_unstable(feature = "data_foo", issue = "none")] -impl const Default for Data { - fn default() -> Data { - Data { _data: 42 } +impl const std::fmt::Debug for Data { + fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { + Ok(()) } } diff --git a/tests/ui/consts/rustc-impl-const-stability.stderr b/tests/ui/consts/rustc-impl-const-stability.stderr index 19c6bb5907f82..a3ef4031a13e6 100644 --- a/tests/ui/consts/rustc-impl-const-stability.stderr +++ b/tests/ui/consts/rustc-impl-const-stability.stderr @@ -1,8 +1,8 @@ -error: const `impl` for trait `Default` which is not marked with `#[const_trait]` +error: const `impl` for trait `Debug` which is not marked with `#[const_trait]` --> $DIR/rustc-impl-const-stability.rs:15:12 | -LL | impl const Default for Data { - | ^^^^^^^ this trait is not `const` +LL | impl const std::fmt::Debug for Data { + | ^^^^^^^^^^^^^^^ this trait is not `const` | = note: marking a trait with `#[const_trait]` ensures all default method bodies are `const` = note: adding a non-const method body in the future would be a breaking change diff --git a/tests/ui/deriving/deriving-default-enum.rs b/tests/ui/deriving/deriving-default-enum.rs index 6b59f39a67d48..0631c85ce8be2 100644 --- a/tests/ui/deriving/deriving-default-enum.rs +++ b/tests/ui/deriving/deriving-default-enum.rs @@ -1,4 +1,5 @@ //@ run-pass +#![allow(dead_code)] // nb: does not impl Default #[derive(Debug, PartialEq)] @@ -8,7 +9,6 @@ struct NotDefault; enum Foo { #[default] Alpha, - #[allow(dead_code)] Beta(NotDefault), } @@ -17,7 +17,6 @@ enum Foo { enum MyOption { #[default] None, - #[allow(dead_code)] Some(T), } diff --git a/tests/ui/lint/dead-code/unused-struct-derive-default.rs b/tests/ui/lint/dead-code/unused-struct-derive-default.rs index f20b7cb66ee51..40a4326708c57 100644 --- a/tests/ui/lint/dead-code/unused-struct-derive-default.rs +++ b/tests/ui/lint/dead-code/unused-struct-derive-default.rs @@ -1,4 +1,4 @@ -#![deny(dead_code)] +#![deny(dead_code)] //~ NOTE the lint level is defined here #[derive(Default)] struct T; //~ ERROR struct `T` is never constructed @@ -7,10 +7,11 @@ struct T; //~ ERROR struct `T` is never constructed struct Used; #[derive(Default)] -enum E { +enum E { //~ NOTE variants in this enum #[default] - A, - B, //~ ERROR variant `B` is never constructed + A, //~ ERROR variants `A` and `B` are never constructed + //~^ NOTE `E` has a derived impl for the trait `Default`, but this is intentionally ignored during dead code analysis + B, } // external crate can call T2::default() to construct T2, diff --git a/tests/ui/lint/dead-code/unused-struct-derive-default.stderr b/tests/ui/lint/dead-code/unused-struct-derive-default.stderr index 7422f9a39f312..3a1119fe28431 100644 --- a/tests/ui/lint/dead-code/unused-struct-derive-default.stderr +++ b/tests/ui/lint/dead-code/unused-struct-derive-default.stderr @@ -10,14 +10,19 @@ note: the lint level is defined here LL | #![deny(dead_code)] | ^^^^^^^^^ -error: variant `B` is never constructed - --> $DIR/unused-struct-derive-default.rs:13:5 +error: variants `A` and `B` are never constructed + --> $DIR/unused-struct-derive-default.rs:12:5 | LL | enum E { - | - variant in this enum -... + | - variants in this enum +LL | #[default] +LL | A, + | ^ +LL | LL | B, | ^ + | + = note: `E` has a derived impl for the trait `Default`, but this is intentionally ignored during dead code analysis error: aborting due to 2 previous errors diff --git a/tests/ui/specialization/const_trait_impl.rs b/tests/ui/specialization/const_trait_impl.rs index 2df92dfad3be5..e917263d1936a 100644 --- a/tests/ui/specialization/const_trait_impl.rs +++ b/tests/ui/specialization/const_trait_impl.rs @@ -2,6 +2,8 @@ #![feature(const_trait_impl, min_specialization, rustc_attrs)] +use std::fmt::Debug; + #[rustc_specialization_trait] #[const_trait] pub unsafe trait Sup { @@ -31,19 +33,19 @@ pub trait A { fn a() -> u32; } -impl const A for T { +impl const A for T { default fn a() -> u32 { 2 } } -impl const A for T { +impl const A for T { default fn a() -> u32 { 3 } } -impl const A for T { +impl const A for T { fn a() -> u32 { T::foo() } diff --git a/tests/ui/specialization/const_trait_impl.stderr b/tests/ui/specialization/const_trait_impl.stderr index ea3ec16ac1eb0..b9c768812c838 100644 --- a/tests/ui/specialization/const_trait_impl.stderr +++ b/tests/ui/specialization/const_trait_impl.stderr @@ -1,58 +1,58 @@ error: `[const]` can only be applied to `#[const_trait]` traits - --> $DIR/const_trait_impl.rs:34:9 + --> $DIR/const_trait_impl.rs:36:9 | -LL | impl const A for T { - | ^^^^^^^ can't be applied to `Default` +LL | impl const A for T { + | ^^^^^^^ can't be applied to `Debug` | -note: `Default` can't be used with `[const]` because it isn't annotated with `#[const_trait]` - --> $SRC_DIR/core/src/default.rs:LL:COL +note: `Debug` can't be used with `[const]` because it isn't annotated with `#[const_trait]` + --> $SRC_DIR/core/src/fmt/mod.rs:LL:COL error: `[const]` can only be applied to `#[const_trait]` traits - --> $DIR/const_trait_impl.rs:40:9 + --> $DIR/const_trait_impl.rs:42:9 | -LL | impl const A for T { - | ^^^^^^^ can't be applied to `Default` +LL | impl const A for T { + | ^^^^^^^ can't be applied to `Debug` | -note: `Default` can't be used with `[const]` because it isn't annotated with `#[const_trait]` - --> $SRC_DIR/core/src/default.rs:LL:COL +note: `Debug` can't be used with `[const]` because it isn't annotated with `#[const_trait]` + --> $SRC_DIR/core/src/fmt/mod.rs:LL:COL error: `[const]` can only be applied to `#[const_trait]` traits - --> $DIR/const_trait_impl.rs:46:9 + --> $DIR/const_trait_impl.rs:48:9 | -LL | impl const A for T { - | ^^^^^^^ can't be applied to `Default` +LL | impl const A for T { + | ^^^^^^^ can't be applied to `Debug` | -note: `Default` can't be used with `[const]` because it isn't annotated with `#[const_trait]` - --> $SRC_DIR/core/src/default.rs:LL:COL +note: `Debug` can't be used with `[const]` because it isn't annotated with `#[const_trait]` + --> $SRC_DIR/core/src/fmt/mod.rs:LL:COL error: `[const]` can only be applied to `#[const_trait]` traits - --> $DIR/const_trait_impl.rs:40:9 + --> $DIR/const_trait_impl.rs:42:9 | -LL | impl const A for T { - | ^^^^^^^ can't be applied to `Default` +LL | impl const A for T { + | ^^^^^^^ can't be applied to `Debug` | -note: `Default` can't be used with `[const]` because it isn't annotated with `#[const_trait]` - --> $SRC_DIR/core/src/default.rs:LL:COL +note: `Debug` can't be used with `[const]` because it isn't annotated with `#[const_trait]` + --> $SRC_DIR/core/src/fmt/mod.rs:LL:COL = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` error: `[const]` can only be applied to `#[const_trait]` traits - --> $DIR/const_trait_impl.rs:34:9 + --> $DIR/const_trait_impl.rs:36:9 | -LL | impl const A for T { - | ^^^^^^^ can't be applied to `Default` +LL | impl const A for T { + | ^^^^^^^ can't be applied to `Debug` | -note: `Default` can't be used with `[const]` because it isn't annotated with `#[const_trait]` - --> $SRC_DIR/core/src/default.rs:LL:COL +note: `Debug` can't be used with `[const]` because it isn't annotated with `#[const_trait]` + --> $SRC_DIR/core/src/fmt/mod.rs:LL:COL = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` error: `[const]` can only be applied to `#[const_trait]` traits - --> $DIR/const_trait_impl.rs:46:9 + --> $DIR/const_trait_impl.rs:48:9 | -LL | impl const A for T { - | ^^^^^^^ can't be applied to `Default` +LL | impl const A for T { + | ^^^^^^^ can't be applied to `Debug` | -note: `Default` can't be used with `[const]` because it isn't annotated with `#[const_trait]` - --> $SRC_DIR/core/src/default.rs:LL:COL +note: `Debug` can't be used with `[const]` because it isn't annotated with `#[const_trait]` + --> $SRC_DIR/core/src/fmt/mod.rs:LL:COL = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` error: aborting due to 6 previous errors diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-gate.rs b/tests/ui/traits/const-traits/const_derives/derive-const-gate.rs index a772d69c9e2e2..e5960cf241294 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-gate.rs +++ b/tests/ui/traits/const-traits/const_derives/derive-const-gate.rs @@ -1,5 +1,6 @@ -#[derive_const(Default)] //~ ERROR use of unstable library feature -//~^ ERROR const `impl` for trait `Default` which is not marked with `#[const_trait]` +#[derive_const(Debug)] //~ ERROR use of unstable library feature +//~^ ERROR const `impl` for trait `Debug` which is not marked with `#[const_trait]` +//~| ERROR cannot call non-const method `Formatter::<'_>::write_str` in constant functions pub struct S; fn main() {} diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr b/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr index 202210a2e659a..5bde358001cbc 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr +++ b/tests/ui/traits/const-traits/const_derives/derive-const-gate.stderr @@ -1,21 +1,30 @@ error[E0658]: use of unstable library feature `derive_const` --> $DIR/derive-const-gate.rs:1:3 | -LL | #[derive_const(Default)] +LL | #[derive_const(Debug)] | ^^^^^^^^^^^^ | = help: add `#![feature(derive_const)]` to the crate attributes to enable = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date -error: const `impl` for trait `Default` which is not marked with `#[const_trait]` +error: const `impl` for trait `Debug` which is not marked with `#[const_trait]` --> $DIR/derive-const-gate.rs:1:16 | -LL | #[derive_const(Default)] - | ^^^^^^^ this trait is not `const` +LL | #[derive_const(Debug)] + | ^^^^^ this trait is not `const` | = note: marking a trait with `#[const_trait]` ensures all default method bodies are `const` = note: adding a non-const method body in the future would be a breaking change -error: aborting due to 2 previous errors +error[E0015]: cannot call non-const method `Formatter::<'_>::write_str` in constant functions + --> $DIR/derive-const-gate.rs:1:16 + | +LL | #[derive_const(Debug)] + | ^^^^^ + | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants + +error: aborting due to 3 previous errors -For more information about this error, try `rustc --explain E0658`. +Some errors have detailed explanations: E0015, E0658. +For more information about an error, try `rustc --explain E0015`. diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr index 27f4bcf46ef82..b5bb0c2603093 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr +++ b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr @@ -1,11 +1,11 @@ -error: const `impl` for trait `Default` which is not marked with `#[const_trait]` +error[E0658]: use of unstable const library feature `const_default` --> $DIR/derive-const-non-const-type.rs:10:16 | LL | #[derive_const(Default)] - | ^^^^^^^ this trait is not `const` + | ^^^^^^^ trait is not stable as const yet | - = note: marking a trait with `#[const_trait]` ensures all default method bodies are `const` - = note: adding a non-const method body in the future would be a breaking change + = help: add `#![feature(const_default)]` to the crate attributes to enable + = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date error[E0015]: cannot call non-const associated function `::default` in constant functions --> $DIR/derive-const-non-const-type.rs:11:14 @@ -19,4 +19,5 @@ LL | pub struct S(A); error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0015`. +Some errors have detailed explanations: E0015, E0658. +For more information about an error, try `rustc --explain E0015`. diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-use.rs b/tests/ui/traits/const-traits/const_derives/derive-const-use.rs index 1e447147213d6..1a3012de06f81 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-use.rs +++ b/tests/ui/traits/const-traits/const_derives/derive-const-use.rs @@ -1,6 +1,6 @@ //@ known-bug: #110395 -#![feature(const_trait_impl, const_cmp, const_default_impls, derive_const)] +#![feature(const_trait_impl, const_default, const_cmp, derive_const)] pub struct A; diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-use.stderr b/tests/ui/traits/const-traits/const_derives/derive-const-use.stderr index ce61eb9a1ab97..4ea11a0c7ed91 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-use.stderr +++ b/tests/ui/traits/const-traits/const_derives/derive-const-use.stderr @@ -1,27 +1,3 @@ -error[E0635]: unknown feature `const_default_impls` - --> $DIR/derive-const-use.rs:3:41 - | -LL | #![feature(const_trait_impl, const_cmp, const_default_impls, derive_const)] - | ^^^^^^^^^^^^^^^^^^^ - -error: const `impl` for trait `Default` which is not marked with `#[const_trait]` - --> $DIR/derive-const-use.rs:7:12 - | -LL | impl const Default for A { - | ^^^^^^^ this trait is not `const` - | - = note: marking a trait with `#[const_trait]` ensures all default method bodies are `const` - = note: adding a non-const method body in the future would be a breaking change - -error: const `impl` for trait `Default` which is not marked with `#[const_trait]` - --> $DIR/derive-const-use.rs:15:16 - | -LL | #[derive_const(Default, PartialEq)] - | ^^^^^^^ this trait is not `const` - | - = note: marking a trait with `#[const_trait]` ensures all default method bodies are `const` - = note: adding a non-const method body in the future would be a breaking change - error[E0277]: the trait bound `(): [const] PartialEq` is not satisfied --> $DIR/derive-const-use.rs:16:14 | @@ -30,35 +6,6 @@ LL | #[derive_const(Default, PartialEq)] LL | pub struct S((), A); | ^^ -error[E0015]: cannot call non-const associated function `::default` in constants - --> $DIR/derive-const-use.rs:18:35 - | -LL | const _: () = assert!(S((), A) == S::default()); - | ^^^^^^^^^^^^ - | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants - -error[E0015]: cannot call non-const associated function `<() as Default>::default` in constant functions - --> $DIR/derive-const-use.rs:16:14 - | -LL | #[derive_const(Default, PartialEq)] - | ------- in this derive macro expansion -LL | pub struct S((), A); - | ^^ - | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants - -error[E0015]: cannot call non-const associated function `::default` in constant functions - --> $DIR/derive-const-use.rs:16:18 - | -LL | #[derive_const(Default, PartialEq)] - | ------- in this derive macro expansion -LL | pub struct S((), A); - | ^ - | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants - -error: aborting due to 7 previous errors +error: aborting due to 1 previous error -Some errors have detailed explanations: E0015, E0277, E0635. -For more information about an error, try `rustc --explain E0015`. +For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/traits/const-traits/std-impl-gate.gated.stderr b/tests/ui/traits/const-traits/std-impl-gate.gated.stderr deleted file mode 100644 index a78cf8ce61ea9..0000000000000 --- a/tests/ui/traits/const-traits/std-impl-gate.gated.stderr +++ /dev/null @@ -1,18 +0,0 @@ -error[E0635]: unknown feature `const_default_impls` - --> $DIR/std-impl-gate.rs:6:46 - | -LL | #![cfg_attr(gated, feature(const_trait_impl, const_default_impls))] - | ^^^^^^^^^^^^^^^^^^^ - -error[E0015]: cannot call non-const associated function ` as Default>::default` in constant functions - --> $DIR/std-impl-gate.rs:13:5 - | -LL | Default::default() - | ^^^^^^^^^^^^^^^^^^ - | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants - -error: aborting due to 2 previous errors - -Some errors have detailed explanations: E0015, E0635. -For more information about an error, try `rustc --explain E0015`. diff --git a/tests/ui/traits/const-traits/std-impl-gate.rs b/tests/ui/traits/const-traits/std-impl-gate.rs index 84091931997f4..d29bccf17c9ab 100644 --- a/tests/ui/traits/const-traits/std-impl-gate.rs +++ b/tests/ui/traits/const-traits/std-impl-gate.rs @@ -1,9 +1,9 @@ // This tests feature gates for const impls in the standard library. //@ revisions: stock gated -//@[gated] known-bug: #110395 +//@[gated] run-pass -#![cfg_attr(gated, feature(const_trait_impl, const_default_impls))] +#![cfg_attr(gated, feature(const_trait_impl, const_default))] fn non_const_context() -> Vec { Default::default() @@ -11,7 +11,8 @@ fn non_const_context() -> Vec { const fn const_context() -> Vec { Default::default() - //[stock]~^ ERROR cannot call non-const associated function + //[stock]~^ ERROR cannot call conditionally-const associated function + //[stock]~| ERROR `Default` is not yet stable as a const trait } fn main() { diff --git a/tests/ui/traits/const-traits/std-impl-gate.stock.stderr b/tests/ui/traits/const-traits/std-impl-gate.stock.stderr index 8728f652ef937..1fa71e41a988d 100644 --- a/tests/ui/traits/const-traits/std-impl-gate.stock.stderr +++ b/tests/ui/traits/const-traits/std-impl-gate.stock.stderr @@ -1,11 +1,25 @@ -error[E0015]: cannot call non-const associated function ` as Default>::default` in constant functions +error[E0658]: cannot call conditionally-const associated function ` as Default>::default` in constant functions --> $DIR/std-impl-gate.rs:13:5 | LL | Default::default() | ^^^^^^^^^^^^^^^^^^ | = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants + = note: see issue #67792 for more information + = help: add `#![feature(const_trait_impl)]` to the crate attributes to enable + = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date -error: aborting due to 1 previous error +error: `Default` is not yet stable as a const trait + --> $DIR/std-impl-gate.rs:13:5 + | +LL | Default::default() + | ^^^^^^^^^^^^^^^^^^ + | +help: add `#![feature(const_default)]` to the crate attributes to enable + | +LL + #![feature(const_default)] + | + +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0015`. +For more information about this error, try `rustc --explain E0658`. From d8d63b649acac7687935661709353ab9c865bf2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Sun, 22 Dec 2024 01:53:06 +0000 Subject: [PATCH 02/11] Update tests --- .../const-traits/const-traits-alloc.rs} | 0 .../const-traits/const-traits-core.rs} | 0 .../const_derives/derive-const-gate.rs | 2 +- .../derive-const-non-const-type.rs | 2 +- .../derive-const-non-const-type.stderr | 28 +++++++++++-------- 5 files changed, 18 insertions(+), 14 deletions(-) rename tests/ui/{const-generics/std/const-generics-alloc.rs => traits/const-traits/const-traits-alloc.rs} (100%) rename tests/ui/{const-generics/std/const-generics-core.rs => traits/const-traits/const-traits-core.rs} (100%) diff --git a/tests/ui/const-generics/std/const-generics-alloc.rs b/tests/ui/traits/const-traits/const-traits-alloc.rs similarity index 100% rename from tests/ui/const-generics/std/const-generics-alloc.rs rename to tests/ui/traits/const-traits/const-traits-alloc.rs diff --git a/tests/ui/const-generics/std/const-generics-core.rs b/tests/ui/traits/const-traits/const-traits-core.rs similarity index 100% rename from tests/ui/const-generics/std/const-generics-core.rs rename to tests/ui/traits/const-traits/const-traits-core.rs diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-gate.rs b/tests/ui/traits/const-traits/const_derives/derive-const-gate.rs index e5960cf241294..04fea1189aea2 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-gate.rs +++ b/tests/ui/traits/const-traits/const_derives/derive-const-gate.rs @@ -1,6 +1,6 @@ #[derive_const(Debug)] //~ ERROR use of unstable library feature //~^ ERROR const `impl` for trait `Debug` which is not marked with `#[const_trait]` -//~| ERROR cannot call non-const method `Formatter::<'_>::write_str` in constant functions +//~| ERROR cannot call non-const method pub struct S; fn main() {} diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.rs b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.rs index 7bda7117a47e6..df421cbf8dbac 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.rs +++ b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.rs @@ -7,7 +7,7 @@ impl Default for A { fn default() -> A { A } } -#[derive_const(Default)] +#[derive_const(Debug)] pub struct S(A); fn main() {} diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr index b5bb0c2603093..aae4a9b860e49 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr +++ b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr @@ -1,23 +1,27 @@ -error[E0658]: use of unstable const library feature `const_default` +error: const `impl` for trait `Debug` which is not marked with `#[const_trait]` --> $DIR/derive-const-non-const-type.rs:10:16 | -LL | #[derive_const(Default)] - | ^^^^^^^ trait is not stable as const yet +LL | #[derive_const(Debug)] + | ^^^^^ this trait is not `const` | - = help: add `#![feature(const_default)]` to the crate attributes to enable - = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date + = note: marking a trait with `#[const_trait]` ensures all default method bodies are `const` + = note: adding a non-const method body in the future would be a breaking change -error[E0015]: cannot call non-const associated function `::default` in constant functions +error[E0277]: `A` doesn't implement `Debug` --> $DIR/derive-const-non-const-type.rs:11:14 | -LL | #[derive_const(Default)] - | ------- in this derive macro expansion +LL | #[derive_const(Debug)] + | ----- in this derive macro expansion LL | pub struct S(A); - | ^ + | ^ the trait `Debug` is not implemented for `A` + | + = note: add `#[derive(Debug)]` to `A` or manually `impl Debug for A` +help: consider annotating `A` with `#[derive(Debug)]` + | +LL + #[derive(Debug)] +LL | pub struct A; | - = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 2 previous errors -Some errors have detailed explanations: E0015, E0658. -For more information about an error, try `rustc --explain E0015`. +For more information about this error, try `rustc --explain E0277`. From 0ed1040e15c37dfcc6d4ebc8cc9f47e81e136eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Wed, 25 Dec 2024 22:36:03 +0000 Subject: [PATCH 03/11] Add `const Default` for `*Cell` --- library/core/src/cell.rs | 12 ++++++++---- tests/ui/traits/const-traits/const-traits-core.rs | 11 +++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index 7ce03e3d83198..d39b090b355c9 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -333,7 +333,8 @@ impl Clone for Cell { } #[stable(feature = "rust1", since = "1.0.0")] -impl Default for Cell { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for Cell { /// Creates a `Cell`, with the `Default` value for T. #[inline] fn default() -> Cell { @@ -1326,7 +1327,8 @@ impl Clone for RefCell { } #[stable(feature = "rust1", since = "1.0.0")] -impl Default for RefCell { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for RefCell { /// Creates a `RefCell`, with the `Default` value for T. #[inline] fn default() -> RefCell { @@ -2333,7 +2335,8 @@ impl UnsafeCell { } #[stable(feature = "unsafe_cell_default", since = "1.10.0")] -impl Default for UnsafeCell { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for UnsafeCell { /// Creates an `UnsafeCell`, with the `Default` value for T. fn default() -> UnsafeCell { UnsafeCell::new(Default::default()) @@ -2440,7 +2443,8 @@ impl SyncUnsafeCell { } #[unstable(feature = "sync_unsafe_cell", issue = "95439")] -impl Default for SyncUnsafeCell { +#[rustc_const_unstable(feature = "const_default", issue = "none")] +impl const Default for SyncUnsafeCell { /// Creates an `SyncUnsafeCell`, with the `Default` value for T. fn default() -> SyncUnsafeCell { SyncUnsafeCell::new(Default::default()) diff --git a/tests/ui/traits/const-traits/const-traits-core.rs b/tests/ui/traits/const-traits/const-traits-core.rs index 0d9a300890a77..6df53daae137f 100644 --- a/tests/ui/traits/const-traits/const-traits-core.rs +++ b/tests/ui/traits/const-traits/const-traits-core.rs @@ -1,5 +1,7 @@ //@ run-pass -#![feature(const_trait_impl, const_default, ptr_alignment_type, ascii_char, f16, f128)] +#![feature( + const_trait_impl, const_default, ptr_alignment_type, ascii_char, f16, f128, sync_unsafe_cell, +)] #![allow(dead_code)] // core::default const UNIT: () = Default::default(); @@ -32,8 +34,13 @@ const ALIGNMENT: std::ptr::Alignment = Default::default(); // core::slice const SLICE: &[()] = Default::default(); const MUT_SLICE: &mut [()] = Default::default(); -//core::str +// core::str const STR: &str = Default::default(); const MUT_STR: &mut str = Default::default(); +// core::cell +const CELL: std::cell::Cell<()> = Default::default(); +const REF_CELL: std::cell::RefCell<()> = Default::default(); +const UNSAFE_CELL: std::cell::UnsafeCell<()> = Default::default(); +const SYNC_UNSAFE_CELL: std::cell::SyncUnsafeCell<()> = Default::default(); fn main() {} From 63a41ccedab6d0e95fca808b441ea0df8bdff59a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Wed, 12 Feb 2025 02:19:44 +0000 Subject: [PATCH 04/11] Add `rustc_const_unstable` to `Debug` --- library/core/src/default.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/library/core/src/default.rs b/library/core/src/default.rs index f4b480e486025..62458a262c609 100644 --- a/library/core/src/default.rs +++ b/library/core/src/default.rs @@ -104,6 +104,7 @@ use crate::ascii::Char as AsciiChar; #[rustc_diagnostic_item = "Default"] #[stable(feature = "rust1", since = "1.0.0")] #[const_trait] +#[rustc_const_unstable(feature = "const_default", issue = "none")] #[rustc_trivial_field_reads] #[rustc_const_unstable(feature = "const_default", issue = "none")] pub trait Default: Sized { From 665064dad816da527dad43aba5dde9a31e54fa80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Wed, 12 Feb 2025 02:36:47 +0000 Subject: [PATCH 05/11] Update tests --- library/core/src/default.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/library/core/src/default.rs b/library/core/src/default.rs index 62458a262c609..26847027aa935 100644 --- a/library/core/src/default.rs +++ b/library/core/src/default.rs @@ -106,7 +106,6 @@ use crate::ascii::Char as AsciiChar; #[const_trait] #[rustc_const_unstable(feature = "const_default", issue = "none")] #[rustc_trivial_field_reads] -#[rustc_const_unstable(feature = "const_default", issue = "none")] pub trait Default: Sized { /// Returns the "default value" for a type. /// From c215d30610330a47a271c076acbb2c3f2a206b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Wed, 12 Feb 2025 17:48:44 +0000 Subject: [PATCH 06/11] [double check] update clippy test The lint should likely still trigger while the const Default impl is unstable. --- src/tools/clippy/clippy_utils/src/hir_utils.rs | 1 + src/tools/clippy/tests/ui/or_fun_call.fixed | 4 ++-- src/tools/clippy/tests/ui/or_fun_call.rs | 2 +- src/tools/clippy/tests/ui/or_fun_call.stderr | 8 +------- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/tools/clippy/clippy_utils/src/hir_utils.rs b/src/tools/clippy/clippy_utils/src/hir_utils.rs index c37231d093129..2cfc11dd42e54 100644 --- a/src/tools/clippy/clippy_utils/src/hir_utils.rs +++ b/src/tools/clippy/clippy_utils/src/hir_utils.rs @@ -26,6 +26,7 @@ type SpanlessEqCallback<'a> = dyn FnMut(&Expr<'_>, &Expr<'_>) -> bool + 'a; /// Determines how paths are hashed and compared for equality. #[derive(Copy, Clone, Debug, Default)] +#[allow(dead_code)] pub enum PathCheck { /// Paths must match exactly and are hashed by their exact HIR tree. /// diff --git a/src/tools/clippy/tests/ui/or_fun_call.fixed b/src/tools/clippy/tests/ui/or_fun_call.fixed index 34f3e04684193..38822bdbb3068 100644 --- a/src/tools/clippy/tests/ui/or_fun_call.fixed +++ b/src/tools/clippy/tests/ui/or_fun_call.fixed @@ -406,8 +406,8 @@ fn fn_call_in_nested_expr() { val: String::from("123"), }); - let _ = opt_foo.unwrap_or_else(|| Foo { val: String::default() }); - //~^ or_fun_call + // ok, `String::default()` is now `const` + let _ = opt_foo.unwrap_or(Foo { val: String::default() }); } mod result_map_or { diff --git a/src/tools/clippy/tests/ui/or_fun_call.rs b/src/tools/clippy/tests/ui/or_fun_call.rs index dc57bd6060ac0..7e8647f221c33 100644 --- a/src/tools/clippy/tests/ui/or_fun_call.rs +++ b/src/tools/clippy/tests/ui/or_fun_call.rs @@ -406,8 +406,8 @@ fn fn_call_in_nested_expr() { val: String::from("123"), }); + // ok, `String::default()` is now `const` let _ = opt_foo.unwrap_or(Foo { val: String::default() }); - //~^ or_fun_call } mod result_map_or { diff --git a/src/tools/clippy/tests/ui/or_fun_call.stderr b/src/tools/clippy/tests/ui/or_fun_call.stderr index 0f159fe8bff4b..0d88929e131ca 100644 --- a/src/tools/clippy/tests/ui/or_fun_call.stderr +++ b/src/tools/clippy/tests/ui/or_fun_call.stderr @@ -240,12 +240,6 @@ error: use of `unwrap_or` to construct default value LL | let _ = opt.unwrap_or({ i32::default() }); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unwrap_or_default()` -error: function call inside of `unwrap_or` - --> tests/ui/or_fun_call.rs:409:21 - | -LL | let _ = opt_foo.unwrap_or(Foo { val: String::default() }); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `unwrap_or_else(|| Foo { val: String::default() })` - error: function call inside of `map_or` --> tests/ui/or_fun_call.rs:424:19 | @@ -264,5 +258,5 @@ error: function call inside of `get_or_insert` LL | let _ = x.get_or_insert(g()); | ^^^^^^^^^^^^^^^^^^ help: try: `get_or_insert_with(g)` -error: aborting due to 41 previous errors +error: aborting due to 40 previous errors From 456b03989fe5e87d29121a9cd601066f38523a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 27 Jun 2025 21:47:11 +0000 Subject: [PATCH 07/11] Remove `rustc_trivial_field_reads` from `trait Default` --- library/core/src/default.rs | 1 - src/tools/clippy/clippy_utils/src/hir_utils.rs | 1 - tests/ui/deriving/deriving-default-enum.rs | 3 ++- .../lint/dead-code/unused-struct-derive-default.rs | 5 ++--- .../dead-code/unused-struct-derive-default.stderr | 13 ++++--------- 5 files changed, 8 insertions(+), 15 deletions(-) diff --git a/library/core/src/default.rs b/library/core/src/default.rs index 26847027aa935..2067a923ff9ba 100644 --- a/library/core/src/default.rs +++ b/library/core/src/default.rs @@ -105,7 +105,6 @@ use crate::ascii::Char as AsciiChar; #[stable(feature = "rust1", since = "1.0.0")] #[const_trait] #[rustc_const_unstable(feature = "const_default", issue = "none")] -#[rustc_trivial_field_reads] pub trait Default: Sized { /// Returns the "default value" for a type. /// diff --git a/src/tools/clippy/clippy_utils/src/hir_utils.rs b/src/tools/clippy/clippy_utils/src/hir_utils.rs index 2cfc11dd42e54..c37231d093129 100644 --- a/src/tools/clippy/clippy_utils/src/hir_utils.rs +++ b/src/tools/clippy/clippy_utils/src/hir_utils.rs @@ -26,7 +26,6 @@ type SpanlessEqCallback<'a> = dyn FnMut(&Expr<'_>, &Expr<'_>) -> bool + 'a; /// Determines how paths are hashed and compared for equality. #[derive(Copy, Clone, Debug, Default)] -#[allow(dead_code)] pub enum PathCheck { /// Paths must match exactly and are hashed by their exact HIR tree. /// diff --git a/tests/ui/deriving/deriving-default-enum.rs b/tests/ui/deriving/deriving-default-enum.rs index 0631c85ce8be2..6b59f39a67d48 100644 --- a/tests/ui/deriving/deriving-default-enum.rs +++ b/tests/ui/deriving/deriving-default-enum.rs @@ -1,5 +1,4 @@ //@ run-pass -#![allow(dead_code)] // nb: does not impl Default #[derive(Debug, PartialEq)] @@ -9,6 +8,7 @@ struct NotDefault; enum Foo { #[default] Alpha, + #[allow(dead_code)] Beta(NotDefault), } @@ -17,6 +17,7 @@ enum Foo { enum MyOption { #[default] None, + #[allow(dead_code)] Some(T), } diff --git a/tests/ui/lint/dead-code/unused-struct-derive-default.rs b/tests/ui/lint/dead-code/unused-struct-derive-default.rs index 40a4326708c57..2d1f79079cabd 100644 --- a/tests/ui/lint/dead-code/unused-struct-derive-default.rs +++ b/tests/ui/lint/dead-code/unused-struct-derive-default.rs @@ -9,9 +9,8 @@ struct Used; #[derive(Default)] enum E { //~ NOTE variants in this enum #[default] - A, //~ ERROR variants `A` and `B` are never constructed - //~^ NOTE `E` has a derived impl for the trait `Default`, but this is intentionally ignored during dead code analysis - B, + A, + B, //~ ERROR variant `B` is never constructed } // external crate can call T2::default() to construct T2, diff --git a/tests/ui/lint/dead-code/unused-struct-derive-default.stderr b/tests/ui/lint/dead-code/unused-struct-derive-default.stderr index 3a1119fe28431..7422f9a39f312 100644 --- a/tests/ui/lint/dead-code/unused-struct-derive-default.stderr +++ b/tests/ui/lint/dead-code/unused-struct-derive-default.stderr @@ -10,19 +10,14 @@ note: the lint level is defined here LL | #![deny(dead_code)] | ^^^^^^^^^ -error: variants `A` and `B` are never constructed - --> $DIR/unused-struct-derive-default.rs:12:5 +error: variant `B` is never constructed + --> $DIR/unused-struct-derive-default.rs:13:5 | LL | enum E { - | - variants in this enum -LL | #[default] -LL | A, - | ^ -LL | + | - variant in this enum +... LL | B, | ^ - | - = note: `E` has a derived impl for the trait `Default`, but this is intentionally ignored during dead code analysis error: aborting due to 2 previous errors From dba9c5519d2e84b75248486e450fec68e6f57d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 27 Jun 2025 22:00:06 +0000 Subject: [PATCH 08/11] Fix test --- .../derive-const-non-const-type.rs | 6 ++++-- .../derive-const-non-const-type.stderr | 19 ++++++------------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.rs b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.rs index df421cbf8dbac..0bc25ce5f650a 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.rs +++ b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.rs @@ -3,8 +3,10 @@ pub struct A; -impl Default for A { - fn default() -> A { A } +impl std::fmt::Debug for A { + fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { + panic!() + } } #[derive_const(Debug)] diff --git a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr index aae4a9b860e49..c0bd360ebe5d0 100644 --- a/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr +++ b/tests/ui/traits/const-traits/const_derives/derive-const-non-const-type.stderr @@ -1,5 +1,5 @@ error: const `impl` for trait `Debug` which is not marked with `#[const_trait]` - --> $DIR/derive-const-non-const-type.rs:10:16 + --> $DIR/derive-const-non-const-type.rs:12:16 | LL | #[derive_const(Debug)] | ^^^^^ this trait is not `const` @@ -7,21 +7,14 @@ LL | #[derive_const(Debug)] = note: marking a trait with `#[const_trait]` ensures all default method bodies are `const` = note: adding a non-const method body in the future would be a breaking change -error[E0277]: `A` doesn't implement `Debug` - --> $DIR/derive-const-non-const-type.rs:11:14 +error[E0015]: cannot call non-const method `Formatter::<'_>::debug_tuple_field1_finish` in constant functions + --> $DIR/derive-const-non-const-type.rs:12:16 | LL | #[derive_const(Debug)] - | ----- in this derive macro expansion -LL | pub struct S(A); - | ^ the trait `Debug` is not implemented for `A` - | - = note: add `#[derive(Debug)]` to `A` or manually `impl Debug for A` -help: consider annotating `A` with `#[derive(Debug)]` - | -LL + #[derive(Debug)] -LL | pub struct A; + | ^^^^^ | + = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0277`. +For more information about this error, try `rustc --explain E0015`. From 6f672e7cebada2a627a03a38b102064e3048231d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 1 Jul 2025 17:15:26 +0000 Subject: [PATCH 09/11] Set issue --- library/alloc/src/string.rs | 2 +- library/alloc/src/vec/mod.rs | 2 +- library/core/src/cell.rs | 8 ++++---- library/core/src/default.rs | 4 ++-- library/core/src/iter/sources/empty.rs | 2 +- library/core/src/marker.rs | 2 +- library/core/src/option.rs | 2 +- library/core/src/ptr/alignment.rs | 2 +- library/core/src/slice/mod.rs | 4 ++-- library/core/src/str/mod.rs | 4 ++-- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs index 7109d3ae50353..84b8242320221 100644 --- a/library/alloc/src/string.rs +++ b/library/alloc/src/string.rs @@ -2611,7 +2611,7 @@ impl_eq! { Cow<'a, str>, &'b str } impl_eq! { Cow<'a, str>, String } #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for String { /// Creates an empty `String`. #[inline] diff --git a/library/alloc/src/vec/mod.rs b/library/alloc/src/vec/mod.rs index 7250c0943b76e..cd1b275a31b58 100644 --- a/library/alloc/src/vec/mod.rs +++ b/library/alloc/src/vec/mod.rs @@ -3840,7 +3840,7 @@ unsafe impl<#[may_dangle] T, A: Allocator> Drop for Vec { } #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for Vec { /// Creates an empty `Vec`. /// diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index d39b090b355c9..083bd071ac04d 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -333,7 +333,7 @@ impl Clone for Cell { } #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for Cell { /// Creates a `Cell`, with the `Default` value for T. #[inline] @@ -1327,7 +1327,7 @@ impl Clone for RefCell { } #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for RefCell { /// Creates a `RefCell`, with the `Default` value for T. #[inline] @@ -2335,7 +2335,7 @@ impl UnsafeCell { } #[stable(feature = "unsafe_cell_default", since = "1.10.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for UnsafeCell { /// Creates an `UnsafeCell`, with the `Default` value for T. fn default() -> UnsafeCell { @@ -2443,7 +2443,7 @@ impl SyncUnsafeCell { } #[unstable(feature = "sync_unsafe_cell", issue = "95439")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for SyncUnsafeCell { /// Creates an `SyncUnsafeCell`, with the `Default` value for T. fn default() -> SyncUnsafeCell { diff --git a/library/core/src/default.rs b/library/core/src/default.rs index 2067a923ff9ba..4d108b0c18ed3 100644 --- a/library/core/src/default.rs +++ b/library/core/src/default.rs @@ -104,7 +104,7 @@ use crate::ascii::Char as AsciiChar; #[rustc_diagnostic_item = "Default"] #[stable(feature = "rust1", since = "1.0.0")] #[const_trait] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] pub trait Default: Sized { /// Returns the "default value" for a type. /// @@ -151,7 +151,7 @@ pub macro Default($item:item) { macro_rules! default_impl { ($t:ty, $v:expr, $doc:tt) => { #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_default", issue = "none")] + #[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for $t { #[inline(always)] #[doc = $doc] diff --git a/library/core/src/iter/sources/empty.rs b/library/core/src/iter/sources/empty.rs index a33cf21cb6aad..309962ab70ce1 100644 --- a/library/core/src/iter/sources/empty.rs +++ b/library/core/src/iter/sources/empty.rs @@ -81,7 +81,7 @@ impl Clone for Empty { // not #[derive] because that adds a Default bound on T, // which isn't necessary. #[stable(feature = "iter_empty", since = "1.2.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for Empty { fn default() -> Empty { Empty(marker::PhantomData) diff --git a/library/core/src/marker.rs b/library/core/src/marker.rs index d310e22d845ed..8fb27bca51949 100644 --- a/library/core/src/marker.rs +++ b/library/core/src/marker.rs @@ -855,7 +855,7 @@ impl Clone for PhantomData { } #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for PhantomData { fn default() -> Self { Self diff --git a/library/core/src/option.rs b/library/core/src/option.rs index 4d6d408710c61..38eb2662b3451 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -2111,7 +2111,7 @@ where impl crate::clone::UseCloned for Option where T: crate::clone::UseCloned {} #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for Option { /// Returns [`None`][Option::None]. /// diff --git a/library/core/src/ptr/alignment.rs b/library/core/src/ptr/alignment.rs index 01f6e199ecad1..304cde05af9bc 100644 --- a/library/core/src/ptr/alignment.rs +++ b/library/core/src/ptr/alignment.rs @@ -230,7 +230,7 @@ impl hash::Hash for Alignment { /// Returns [`Alignment::MIN`], which is valid for any type. #[unstable(feature = "ptr_alignment_type", issue = "102070")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for Alignment { fn default() -> Alignment { Alignment::MIN diff --git a/library/core/src/slice/mod.rs b/library/core/src/slice/mod.rs index 5274638a5787e..dd8d7e54b1812 100644 --- a/library/core/src/slice/mod.rs +++ b/library/core/src/slice/mod.rs @@ -5158,7 +5158,7 @@ where } #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for &[T] { /// Creates an empty slice. fn default() -> Self { @@ -5167,7 +5167,7 @@ impl const Default for &[T] { } #[stable(feature = "mut_slice_default", since = "1.5.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for &mut [T] { /// Creates a mutable empty slice. fn default() -> Self { diff --git a/library/core/src/str/mod.rs b/library/core/src/str/mod.rs index 45c6828f4ef3d..8907174931cb9 100644 --- a/library/core/src/str/mod.rs +++ b/library/core/src/str/mod.rs @@ -3072,7 +3072,7 @@ impl AsRef<[u8]> for str { } #[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for &str { /// Creates an empty str #[inline] @@ -3082,7 +3082,7 @@ impl const Default for &str { } #[stable(feature = "default_mut_str", since = "1.28.0")] -#[rustc_const_unstable(feature = "const_default", issue = "none")] +#[rustc_const_unstable(feature = "const_default", issue = "67792")] impl const Default for &mut str { /// Creates an empty mutable str #[inline] From 37eb6280b7f588eed593abe08a68062eb42ecd61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 1 Jul 2025 17:15:40 +0000 Subject: [PATCH 10/11] fix test --- tests/ui/lint/dead-code/unused-struct-derive-default.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ui/lint/dead-code/unused-struct-derive-default.rs b/tests/ui/lint/dead-code/unused-struct-derive-default.rs index 2d1f79079cabd..bfbdf57b0dcdc 100644 --- a/tests/ui/lint/dead-code/unused-struct-derive-default.rs +++ b/tests/ui/lint/dead-code/unused-struct-derive-default.rs @@ -7,7 +7,7 @@ struct T; //~ ERROR struct `T` is never constructed struct Used; #[derive(Default)] -enum E { //~ NOTE variants in this enum +enum E { //~ NOTE variant in this enum #[default] A, B, //~ ERROR variant `B` is never constructed From c8e3810c446b16fecd357dc1cfba3eaa7979dc54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 1 Jul 2025 18:01:51 +0000 Subject: [PATCH 11/11] Change `~const` to `[const]` --- library/core/src/cell.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index 083bd071ac04d..907df795a238b 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -334,7 +334,7 @@ impl Clone for Cell { #[stable(feature = "rust1", since = "1.0.0")] #[rustc_const_unstable(feature = "const_default", issue = "67792")] -impl const Default for Cell { +impl const Default for Cell { /// Creates a `Cell`, with the `Default` value for T. #[inline] fn default() -> Cell { @@ -1328,7 +1328,7 @@ impl Clone for RefCell { #[stable(feature = "rust1", since = "1.0.0")] #[rustc_const_unstable(feature = "const_default", issue = "67792")] -impl const Default for RefCell { +impl const Default for RefCell { /// Creates a `RefCell`, with the `Default` value for T. #[inline] fn default() -> RefCell { @@ -2336,7 +2336,7 @@ impl UnsafeCell { #[stable(feature = "unsafe_cell_default", since = "1.10.0")] #[rustc_const_unstable(feature = "const_default", issue = "67792")] -impl const Default for UnsafeCell { +impl const Default for UnsafeCell { /// Creates an `UnsafeCell`, with the `Default` value for T. fn default() -> UnsafeCell { UnsafeCell::new(Default::default()) @@ -2444,7 +2444,7 @@ impl SyncUnsafeCell { #[unstable(feature = "sync_unsafe_cell", issue = "95439")] #[rustc_const_unstable(feature = "const_default", issue = "67792")] -impl const Default for SyncUnsafeCell { +impl const Default for SyncUnsafeCell { /// Creates an `SyncUnsafeCell`, with the `Default` value for T. fn default() -> SyncUnsafeCell { SyncUnsafeCell::new(Default::default())