From 7bee7795147cd4144bc723fc71582a257954c377 Mon Sep 17 00:00:00 2001 From: Thomas de Zeeuw Date: Tue, 21 Feb 2017 00:15:00 +0100 Subject: [PATCH] Only allow #[serde(default)]` on structs --- serde_codegen_internals/src/attr.rs | 9 ++++++++- test_suite/tests/compile-fail/default-attribute/enum.rs | 8 ++++++++ .../default-attribute/nameless_struct_fields.rs | 8 ++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 test_suite/tests/compile-fail/default-attribute/enum.rs create mode 100644 test_suite/tests/compile-fail/default-attribute/nameless_struct_fields.rs 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() { }