Permit deriving default on enums with #[default]
This commit is contained in:
parent
fd853c00e2
commit
c70147fd66
13 changed files with 372 additions and 75 deletions
19
src/test/ui/deriving/deriving-default-enum.rs
Normal file
19
src/test/ui/deriving/deriving-default-enum.rs
Normal 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);
|
||||
}
|
||||
|
|
@ -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,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +0,0 @@
|
|||
#[derive(Default)] //~ ERROR E0665
|
||||
enum Food {
|
||||
Sweet,
|
||||
Salty,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
||||
|
|
@ -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`.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
#[derive(Default)] //~ ERROR deriving `Default` on enums is experimental
|
||||
enum Foo {
|
||||
#[default]
|
||||
Alpha,
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -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`.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
|
|||
|
|
@ -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 {}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue