Skip to content

Commit 32a66fc

Browse files
authored
Rollup merge of rust-lang#94457 - jhpratt:stabilize-derive_default_enum, r=davidtwco
Stabilize `derive_default_enum` This stabilizes `#![feature(derive_default_enum)]`, as proposed in [RFC 3107](rust-lang/rfcs#3107) and tracked in rust-lang#87517. In short, it permits you to `#[derive(Default)]` on `enum`s, indicating what the default should be by placing a `#[default]` attribute on the desired variant (which must be a unit variant in the interest of forward compatibility). ``````@rustbot`````` label +S-waiting-on-review +T-lang
2 parents 81c26e4 + a3dd654 commit 32a66fc

File tree

16 files changed

+55
-73
lines changed

16 files changed

+55
-73
lines changed

compiler/rustc_builtin_macros/src/deriving/default.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,7 @@ pub fn expand_deriving_default(
4646
StaticStruct(_, fields) => {
4747
default_struct_substructure(cx, trait_span, substr, fields)
4848
}
49-
StaticEnum(enum_def, _) => {
50-
if !cx.sess.features_untracked().derive_default_enum {
51-
rustc_session::parse::feature_err(
52-
cx.parse_sess(),
53-
sym::derive_default_enum,
54-
span,
55-
"deriving `Default` on enums is experimental",
56-
)
57-
.emit();
58-
}
59-
default_enum_substructure(cx, trait_span, enum_def)
60-
}
49+
StaticEnum(enum_def, _) => default_enum_substructure(cx, trait_span, enum_def),
6150
_ => cx.span_bug(trait_span, "method in `derive(Default)`"),
6251
}
6352
})),

compiler/rustc_feature/src/accepted.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ declare_features! (
126126
(accepted, default_type_params, "1.0.0", None, None),
127127
/// Allows `#[deprecated]` attribute.
128128
(accepted, deprecated, "1.9.0", Some(29935), None),
129+
/// Allows `#[derive(Default)]` and `#[default]` on enums.
130+
(accepted, derive_default_enum, "1.62.0", Some(86985), None),
129131
/// Allows the use of destructuring assignments.
130132
(accepted, destructuring_assignment, "1.59.0", Some(71126), None),
131133
/// Allows `#[doc(alias = "...")]`.

compiler/rustc_feature/src/active.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,6 @@ declare_features! (
368368
(active, deprecated_safe, "1.61.0", Some(94978), None),
369369
/// Allows having using `suggestion` in the `#[deprecated]` attribute.
370370
(active, deprecated_suggestion, "1.61.0", Some(94785), None),
371-
/// Allows `#[derive(Default)]` and `#[default]` on enums.
372-
(active, derive_default_enum, "1.56.0", Some(86985), None),
373371
/// Tells rustdoc to automatically generate `#[doc(cfg(...))]`.
374372
(active, doc_auto_cfg, "1.58.0", Some(43781), None),
375373
/// Allows `#[doc(cfg(...))]`.

compiler/rustc_feature/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//! even if it is stabilized or removed, *do not remove it*. Instead, move the
1212
//! symbol to the `accepted` or `removed` modules respectively.
1313
14-
#![feature(derive_default_enum)]
14+
#![cfg_attr(bootstrap, feature(derive_default_enum))]
1515
#![feature(once_cell)]
1616

1717
mod accepted;

compiler/rustc_infer/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#![feature(bool_to_option)]
1818
#![feature(box_patterns)]
1919
#![feature(control_flow_enum)]
20-
#![feature(derive_default_enum)]
20+
#![cfg_attr(bootstrap, feature(derive_default_enum))]
2121
#![feature(extend_one)]
2222
#![feature(label_break_value)]
2323
#![feature(let_chains)]

compiler/rustc_middle/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#![feature(bool_to_option)]
3131
#![feature(box_patterns)]
3232
#![feature(core_intrinsics)]
33-
#![feature(derive_default_enum)]
33+
#![cfg_attr(bootstrap, feature(derive_default_enum))]
3434
#![feature(discriminant_kind)]
3535
#![feature(exhaustive_patterns)]
3636
#![feature(get_mut_unchecked)]

compiler/rustc_session/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#![feature(crate_visibility_modifier)]
2-
#![feature(derive_default_enum)]
32
#![feature(if_let_guard)]
43
#![feature(let_chains)]
4+
#![cfg_attr(bootstrap, feature(derive_default_enum))]
55
#![feature(let_else)]
66
#![feature(min_specialization)]
77
#![feature(never_type)]

compiler/rustc_trait_selection/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#![feature(box_patterns)]
1717
#![feature(control_flow_enum)]
1818
#![feature(crate_visibility_modifier)]
19-
#![feature(derive_default_enum)]
19+
#![cfg_attr(bootstrap, feature(derive_default_enum))]
2020
#![feature(drain_filter)]
2121
#![feature(hash_drain_filter)]
2222
#![feature(label_break_value)]

library/core/src/default.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,23 @@
5252
/// This trait can be used with `#[derive]` if all of the type's fields implement
5353
/// `Default`. When `derive`d, it will use the default value for each field's type.
5454
///
55+
/// ### `enum`s
56+
///
57+
/// When using `#[derive(Default)]` on an `enum`, you need to choose which unit variant will be
58+
/// default. You do this by placing the `#[default]` attribute on the variant.
59+
///
60+
/// ```
61+
/// #[derive(Default)]
62+
/// enum Kind {
63+
/// #[default]
64+
/// A,
65+
/// B,
66+
/// C,
67+
/// }
68+
/// ```
69+
///
70+
/// You cannot use the `#[default]` attribute on non-unit or non-exhaustive variants.
71+
///
5572
/// ## How can I implement `Default`?
5673
///
5774
/// Provide an implementation for the `default()` method that returns the value of

library/core/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@
167167
#![feature(const_precise_live_drops)]
168168
#![feature(const_refs_to_cell)]
169169
#![feature(decl_macro)]
170-
#![feature(derive_default_enum)]
170+
#![cfg_attr(bootstrap, feature(derive_default_enum))]
171171
#![feature(deprecated_suggestion)]
172172
#![feature(doc_cfg)]
173173
#![feature(doc_notable_trait)]

0 commit comments

Comments
 (0)