Permit deriving default on enums with #[default]

This commit is contained in:
Jacob Pratt 2021-06-29 20:22:52 -04:00
parent fd853c00e2
commit c70147fd66
No known key found for this signature in database
GPG key ID: B80E19E4662B5AA4
13 changed files with 372 additions and 75 deletions

View file

@ -0,0 +1,19 @@
// run-pass
#![feature(derive_default_enum)]
// nb: does not impl Default
#[derive(Debug, PartialEq)]
struct NotDefault;
#[derive(Debug, Default, PartialEq)]
enum Foo {
#[default]
Alpha,
#[allow(dead_code)]
Beta(NotDefault),
}
fn main() {
assert_eq!(Foo::default(), Foo::Alpha);
}

View file

@ -5,6 +5,7 @@
#![feature(lang_items)]
#![feature(no_core)]
#![feature(rustc_attrs)]
#![feature(derive_default_enum)]
#![no_core]
@ -30,7 +31,7 @@ mod default {
trait Sized {}
#[derive(Default)]
struct S {
enum S {
#[default] // OK
field: u8,
Foo,
}

View file

@ -1,8 +0,0 @@
#[derive(Default)] //~ ERROR E0665
enum Food {
Sweet,
Salty,
}
fn main() {
}

View file

@ -1,11 +0,0 @@
error[E0665]: `Default` cannot be derived for enums, only structs
--> $DIR/E0665.rs:1:10
|
LL | #[derive(Default)]
| ^^^^^^^
|
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to previous error
For more information about this error, try `rustc --explain E0665`.

View file

@ -0,0 +1,7 @@
#[derive(Default)] //~ ERROR deriving `Default` on enums is experimental
enum Foo {
#[default]
Alpha,
}
fn main() {}

View file

@ -0,0 +1,13 @@
error[E0658]: deriving `Default` on enums is experimental
--> $DIR/feature-gate-derive_default_enum.rs:1:10
|
LL | #[derive(Default)]
| ^^^^^^^
|
= note: see issue #86985 <https://github.com/rust-lang/rust/issues/86985> for more information
= help: add `#![feature(derive_default_enum)]` to the crate attributes to enable
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to previous error
For more information about this error, try `rustc --explain E0658`.

View file

@ -5,9 +5,62 @@
#![feature(asm, llvm_asm)]
#![feature(trace_macros, concat_idents)]
#![feature(derive_default_enum)]
#[derive(Default)] //~ ERROR
enum OrDeriveThis {}
#[derive(Default)] //~ ERROR no default declared
enum NoDeclaredDefault {
Foo,
Bar,
}
#[derive(Default)] //~ ERROR multiple declared defaults
enum MultipleDefaults {
#[default]
Foo,
#[default]
Bar,
#[default]
Baz,
}
#[derive(Default)]
enum ExtraDeriveTokens {
#[default = 1] //~ ERROR `#[default]` attribute does not accept a value
Foo,
}
#[derive(Default)]
enum TwoDefaultAttrs {
#[default]
#[default]
Foo, //~ERROR multiple `#[default]` attributes
Bar,
}
#[derive(Default)]
enum ManyDefaultAttrs {
#[default]
#[default]
#[default]
#[default]
Foo, //~ERROR multiple `#[default]` attributes
Bar,
}
#[derive(Default)]
enum DefaultHasFields {
#[default]
Foo {}, //~ ERROR `#[default]` may only be used on unit variants
Bar,
}
#[derive(Default)]
enum NonExhaustiveDefault {
#[default]
#[non_exhaustive]
Foo, //~ ERROR default variant must be exhaustive
Bar,
}
fn main() {
asm!(invalid); //~ ERROR

View file

@ -1,49 +1,133 @@
error[E0665]: `Default` cannot be derived for enums, only structs
--> $DIR/macros-nonfatal-errors.rs:9:10
error: no default declared
--> $DIR/macros-nonfatal-errors.rs:10:10
|
LL | #[derive(Default)]
| ^^^^^^^
|
= help: make a unit variant default by placing `#[default]` above it
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
error: multiple declared defaults
--> $DIR/macros-nonfatal-errors.rs:16:10
|
LL | #[derive(Default)]
| ^^^^^^^
...
LL | Foo,
| --- first default
LL | #[default]
LL | Bar,
| --- additional default
LL | #[default]
LL | Baz,
| --- additional default
|
= note: only one variant can be default
= note: this error originates in the derive macro `Default` (in Nightly builds, run with -Z macro-backtrace for more info)
error: `#[default]` attribute does not accept a value
--> $DIR/macros-nonfatal-errors.rs:28:5
|
LL | #[default = 1]
| ^^^^^^^^^^^^^^
|
= help: try using `#[default]`
error: multiple `#[default]` attributes
--> $DIR/macros-nonfatal-errors.rs:36:5
|
LL | #[default]
| ---------- `#[default]` used here
LL | #[default]
| ---------- `#[default]` used again here
LL | Foo,
| ^^^
|
= note: only one `#[default]` attribute is needed
help: try removing this
--> $DIR/macros-nonfatal-errors.rs:35:5
|
LL | #[default]
| ^^^^^^^^^^
error: multiple `#[default]` attributes
--> $DIR/macros-nonfatal-errors.rs:46:5
|
LL | #[default]
| ---------- `#[default]` used here
LL | #[default]
| ---------- `#[default]` used again here
...
LL | Foo,
| ^^^
|
= note: only one `#[default]` attribute is needed
help: try removing these
--> $DIR/macros-nonfatal-errors.rs:43:5
|
LL | #[default]
| ^^^^^^^^^^
LL | #[default]
| ^^^^^^^^^^
LL | #[default]
| ^^^^^^^^^^
error: `#[default]` may only be used on unit variants
--> $DIR/macros-nonfatal-errors.rs:53:5
|
LL | Foo {},
| ^^^
|
= help: consider a manual implementation of `Default`
error: default variant must be exhaustive
--> $DIR/macros-nonfatal-errors.rs:61:5
|
LL | #[non_exhaustive]
| ----------------- declared `#[non_exhaustive]` here
LL | Foo,
| ^^^
|
= help: consider a manual implementation of `Default`
error: asm template must be a string literal
--> $DIR/macros-nonfatal-errors.rs:13:10
--> $DIR/macros-nonfatal-errors.rs:66:10
|
LL | asm!(invalid);
| ^^^^^^^
error: inline assembly must be a string literal
--> $DIR/macros-nonfatal-errors.rs:14:15
--> $DIR/macros-nonfatal-errors.rs:67:15
|
LL | llvm_asm!(invalid);
| ^^^^^^^
error: concat_idents! requires ident args.
--> $DIR/macros-nonfatal-errors.rs:16:5
--> $DIR/macros-nonfatal-errors.rs:69:5
|
LL | concat_idents!("not", "idents");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: argument must be a string literal
--> $DIR/macros-nonfatal-errors.rs:18:17
--> $DIR/macros-nonfatal-errors.rs:71:17
|
LL | option_env!(invalid);
| ^^^^^^^
error: expected string literal
--> $DIR/macros-nonfatal-errors.rs:19:10
--> $DIR/macros-nonfatal-errors.rs:72:10
|
LL | env!(invalid);
| ^^^^^^^
error: expected string literal
--> $DIR/macros-nonfatal-errors.rs:20:10
--> $DIR/macros-nonfatal-errors.rs:73:10
|
LL | env!(foo, abr, baz);
| ^^^
error: environment variable `RUST_HOPEFULLY_THIS_DOESNT_EXIST` not defined
--> $DIR/macros-nonfatal-errors.rs:21:5
--> $DIR/macros-nonfatal-errors.rs:74:5
|
LL | env!("RUST_HOPEFULLY_THIS_DOESNT_EXIST");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -51,7 +135,7 @@ LL | env!("RUST_HOPEFULLY_THIS_DOESNT_EXIST");
= note: this error originates in the macro `env` (in Nightly builds, run with -Z macro-backtrace for more info)
error: format argument must be a string literal
--> $DIR/macros-nonfatal-errors.rs:23:13
--> $DIR/macros-nonfatal-errors.rs:76:13
|
LL | format!(invalid);
| ^^^^^^^
@ -62,19 +146,19 @@ LL | format!("{}", invalid);
| ^^^^^
error: argument must be a string literal
--> $DIR/macros-nonfatal-errors.rs:25:14
--> $DIR/macros-nonfatal-errors.rs:78:14
|
LL | include!(invalid);
| ^^^^^^^
error: argument must be a string literal
--> $DIR/macros-nonfatal-errors.rs:27:18
--> $DIR/macros-nonfatal-errors.rs:80:18
|
LL | include_str!(invalid);
| ^^^^^^^
error: couldn't read $DIR/i'd be quite surprised if a file with this name existed: $FILE_NOT_FOUND_MSG (os error 2)
--> $DIR/macros-nonfatal-errors.rs:28:5
--> $DIR/macros-nonfatal-errors.rs:81:5
|
LL | include_str!("i'd be quite surprised if a file with this name existed");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -82,13 +166,13 @@ LL | include_str!("i'd be quite surprised if a file with this name existed")
= note: this error originates in the macro `include_str` (in Nightly builds, run with -Z macro-backtrace for more info)
error: argument must be a string literal
--> $DIR/macros-nonfatal-errors.rs:29:20
--> $DIR/macros-nonfatal-errors.rs:82:20
|
LL | include_bytes!(invalid);
| ^^^^^^^
error: couldn't read $DIR/i'd be quite surprised if a file with this name existed: $FILE_NOT_FOUND_MSG (os error 2)
--> $DIR/macros-nonfatal-errors.rs:30:5
--> $DIR/macros-nonfatal-errors.rs:83:5
|
LL | include_bytes!("i'd be quite surprised if a file with this name existed");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -96,11 +180,10 @@ LL | include_bytes!("i'd be quite surprised if a file with this name existed
= note: this error originates in the macro `include_bytes` (in Nightly builds, run with -Z macro-backtrace for more info)
error: trace_macros! accepts only `true` or `false`
--> $DIR/macros-nonfatal-errors.rs:32:5
--> $DIR/macros-nonfatal-errors.rs:85:5
|
LL | trace_macros!(invalid);
| ^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 15 previous errors
error: aborting due to 21 previous errors
For more information about this error, try `rustc --explain E0665`.

View file

@ -29,7 +29,7 @@ impl Clone for Cat {
impl Default for Cat {
fn default() -> Self {
default();
//~^ ERROR cannot find function `default`
//~^ ERROR cannot find function `default` in this scope [E0425]
loop {}
}
}