diff --git a/serde_codegen_internals/src/attr.rs b/serde_codegen_internals/src/attr.rs index 8abf469b..ae3af449 100644 --- a/serde_codegen_internals/src/attr.rs +++ b/serde_codegen_internals/src/attr.rs @@ -167,7 +167,14 @@ impl Item { // Parse `#[serde(default)]` MetaItem(Word(ref name)) if name == "default" => { - default.set_true(); + match item.body { + syn::Body::Struct(_) => { + default.set_true(); + } + _ => { + cx.error("#[serde(default)] can only be used on structs") + } + } } // Parse `#[serde(bound="D: Serialize")]` diff --git a/test_suite/tests/compile-fail/default-attribute/enum.rs b/test_suite/tests/compile-fail/default-attribute/enum.rs new file mode 100644 index 00000000..74c5d7ca --- /dev/null +++ b/test_suite/tests/compile-fail/default-attribute/enum.rs @@ -0,0 +1,8 @@ +#[macro_use] +extern crate serde_derive; + +#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked +#[serde(default)] //~^ HELP: #[serde(default)] can only be used on structs +enum E { + S { f: u8 }, +} diff --git a/test_suite/tests/compile-fail/default-attribute/nameless_struct_fields.rs b/test_suite/tests/compile-fail/default-attribute/nameless_struct_fields.rs new file mode 100644 index 00000000..2e8bccc6 --- /dev/null +++ b/test_suite/tests/compile-fail/default-attribute/nameless_struct_fields.rs @@ -0,0 +1,8 @@ +#[macro_use] +extern crate serde_derive; + +#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked +#[serde(default)] //~^ HELP: #[serde(default)] can only be used on structs +struct T(u8, u8); + +fn main() { }