diff --git a/serde/Cargo.toml b/serde/Cargo.toml index 06dd85667..db7e6b139 100644 --- a/serde/Cargo.toml +++ b/serde/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "serde" -version = "1.0.157" # remember to update html_root_url and serde_derive dependency +version = "1.0.158" # remember to update html_root_url and serde_derive dependency authors = ["Erick Tryzelaar ", "David Tolnay "] build = "build.rs" categories = ["encoding", "no-std"] @@ -15,7 +15,7 @@ repository = "https://github.com/serde-rs/serde" rust-version = "1.19" [dependencies] -serde_derive = { version = "=1.0.157", optional = true, path = "../serde_derive" } +serde_derive = { version = "=1.0.158", optional = true, path = "../serde_derive" } [dev-dependencies] serde_derive = { version = "1.0", path = "../serde_derive" } diff --git a/serde/src/lib.rs b/serde/src/lib.rs index 841c12a4d..8ba147374 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -93,7 +93,7 @@ //////////////////////////////////////////////////////////////////////////////// // Serde types in rustdoc of other crates get linked to here. -#![doc(html_root_url = "https://docs.rs/serde/1.0.157")] +#![doc(html_root_url = "https://docs.rs/serde/1.0.158")] // Support using Serde without the standard library! #![cfg_attr(not(feature = "std"), no_std)] // Unstable functionality only if the user asks for it. For tracking and diff --git a/serde_derive/Cargo.toml b/serde_derive/Cargo.toml index f2a3e37cf..1a3490abc 100644 --- a/serde_derive/Cargo.toml +++ b/serde_derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "serde_derive" -version = "1.0.157" # remember to update html_root_url +version = "1.0.158" # remember to update html_root_url authors = ["Erick Tryzelaar ", "David Tolnay "] categories = ["no-std"] description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]" @@ -24,7 +24,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0" quote = "1.0" -syn = "2.0" +syn = "2.0.3" [dev-dependencies] serde = { version = "1.0", path = "../serde" } diff --git a/serde_derive/src/internals/attr.rs b/serde_derive/src/internals/attr.rs index d541e3a9f..9875b6606 100644 --- a/serde_derive/src/internals/attr.rs +++ b/serde_derive/src/internals/attr.rs @@ -1381,21 +1381,26 @@ fn get_lit_str2( meta_item_name: Symbol, meta: &ParseNestedMeta, ) -> syn::Result> { - match meta.value()?.parse()? { - syn::Expr::Lit(syn::ExprLit { - lit: syn::Lit::Str(lit), - .. - }) => Ok(Some(lit)), - expr => { - cx.error_spanned_by( - expr, - format!( - "expected serde {} attribute to be a string: `{} = \"...\"`", - attr_name, meta_item_name - ), - ); - Ok(None) - } + let expr: syn::Expr = meta.value()?.parse()?; + let mut value = &expr; + while let syn::Expr::Group(e) = value { + value = &e.expr; + } + if let syn::Expr::Lit(syn::ExprLit { + lit: syn::Lit::Str(lit), + .. + }) = value + { + Ok(Some(lit.clone())) + } else { + cx.error_spanned_by( + expr, + format!( + "expected serde {} attribute to be a string: `{} = \"...\"`", + attr_name, meta_item_name + ), + ); + Ok(None) } } diff --git a/serde_derive/src/internals/check.rs b/serde_derive/src/internals/check.rs index eb1297aa7..05b4b8ff8 100644 --- a/serde_derive/src/internals/check.rs +++ b/serde_derive/src/internals/check.rs @@ -3,8 +3,8 @@ use internals::attr::{Identifier, TagType}; use internals::{ungroup, Ctxt, Derive}; use syn::{Member, Type}; -/// Cross-cutting checks that require looking at more than a single attrs -/// object. Simpler checks should happen when parsing and building the attrs. +// Cross-cutting checks that require looking at more than a single attrs object. +// Simpler checks should happen when parsing and building the attrs. pub fn check(cx: &Ctxt, cont: &mut Container, derive: Derive) { check_remote_generic(cx, cont); check_getter(cx, cont); @@ -17,18 +17,18 @@ pub fn check(cx: &Ctxt, cont: &mut Container, derive: Derive) { check_from_and_try_from(cx, cont); } -/// Remote derive definition type must have either all of the generics of the -/// remote type: -/// -/// #[serde(remote = "Generic")] -/// struct Generic {…} -/// -/// or none of them, i.e. defining impls for one concrete instantiation of the -/// remote type only: -/// -/// #[serde(remote = "Generic")] -/// struct ConcreteDef {…} -/// +// Remote derive definition type must have either all of the generics of the +// remote type: +// +// #[serde(remote = "Generic")] +// struct Generic {…} +// +// or none of them, i.e. defining impls for one concrete instantiation of the +// remote type only: +// +// #[serde(remote = "Generic")] +// struct ConcreteDef {…} +// fn check_remote_generic(cx: &Ctxt, cont: &Container) { if let Some(remote) = cont.attrs.remote() { let local_has_generic = !cont.generics.params.is_empty(); @@ -39,8 +39,8 @@ fn check_remote_generic(cx: &Ctxt, cont: &Container) { } } -/// Getters are only allowed inside structs (not enums) with the `remote` -/// attribute. +// Getters are only allowed inside structs (not enums) with the `remote` +// attribute. fn check_getter(cx: &Ctxt, cont: &Container) { match cont.data { Data::Enum(_) => { @@ -62,7 +62,7 @@ fn check_getter(cx: &Ctxt, cont: &Container) { } } -/// Flattening has some restrictions we can test. +// Flattening has some restrictions we can test. fn check_flatten(cx: &Ctxt, cont: &Container) { match &cont.data { Data::Enum(variants) => { @@ -101,12 +101,12 @@ fn check_flatten_field(cx: &Ctxt, style: Style, field: &Field) { } } -/// The `other` attribute must be used at most once and it must be the last -/// variant of an enum. -/// -/// Inside a `variant_identifier` all variants must be unit variants. Inside a -/// `field_identifier` all but possibly one variant must be unit variants. The -/// last variant may be a newtype variant which is an implicit "other" case. +// The `other` attribute must be used at most once and it must be the last +// variant of an enum. +// +// Inside a `variant_identifier` all variants must be unit variants. Inside a +// `field_identifier` all but possibly one variant must be unit variants. The +// last variant may be a newtype variant which is an implicit "other" case. fn check_identifier(cx: &Ctxt, cont: &Container) { let variants = match &cont.data { Data::Enum(variants) => variants, @@ -189,8 +189,8 @@ fn check_identifier(cx: &Ctxt, cont: &Container) { } } -/// Skip-(de)serializing attributes are not allowed on variants marked -/// (de)serialize_with. +// Skip-(de)serializing attributes are not allowed on variants marked +// (de)serialize_with. fn check_variant_skip_attrs(cx: &Ctxt, cont: &Container) { let variants = match &cont.data { Data::Enum(variants) => variants, @@ -264,10 +264,9 @@ fn check_variant_skip_attrs(cx: &Ctxt, cont: &Container) { } } -/// The tag of an internally-tagged struct variant must not be -/// the same as either one of its fields, as this would result in -/// duplicate keys in the serialized output and/or ambiguity in -/// the to-be-deserialized input. +// The tag of an internally-tagged struct variant must not be the same as either +// one of its fields, as this would result in duplicate keys in the serialized +// output and/or ambiguity in the to-be-deserialized input. fn check_internal_tag_field_name_conflict(cx: &Ctxt, cont: &Container) { let variants = match &cont.data { Data::Enum(variants) => variants, @@ -313,8 +312,8 @@ fn check_internal_tag_field_name_conflict(cx: &Ctxt, cont: &Container) { } } -/// In the case of adjacently-tagged enums, the type and the -/// contents tag must differ, for the same reason. +// In the case of adjacently-tagged enums, the type and the contents tag must +// differ, for the same reason. fn check_adjacent_tag_conflict(cx: &Ctxt, cont: &Container) { let (type_tag, content_tag) = match cont.attrs.tag() { TagType::Adjacent { tag, content } => (tag, content), @@ -332,7 +331,7 @@ fn check_adjacent_tag_conflict(cx: &Ctxt, cont: &Container) { } } -/// Enums and unit structs cannot be transparent. +// Enums and unit structs cannot be transparent. fn check_transparent(cx: &Ctxt, cont: &mut Container, derive: Derive) { if !cont.attrs.transparent() { return; diff --git a/serde_derive/src/lib.rs b/serde_derive/src/lib.rs index 55cde77f7..eda4acb43 100644 --- a/serde_derive/src/lib.rs +++ b/serde_derive/src/lib.rs @@ -13,7 +13,7 @@ //! //! [https://serde.rs/derive.html]: https://serde.rs/derive.html -#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.157")] +#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.158")] #![allow(unknown_lints, bare_trait_objects)] // Ignored clippy lints #![allow( diff --git a/serde_test/Cargo.toml b/serde_test/Cargo.toml index a2bbc084d..1246653d9 100644 --- a/serde_test/Cargo.toml +++ b/serde_test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "serde_test" -version = "1.0.157" # remember to update html_root_url +version = "1.0.158" # remember to update html_root_url authors = ["Erick Tryzelaar ", "David Tolnay "] build = "build.rs" categories = ["development-tools::testing"] diff --git a/serde_test/src/lib.rs b/serde_test/src/lib.rs index afa1aa3bf..908ddfc93 100644 --- a/serde_test/src/lib.rs +++ b/serde_test/src/lib.rs @@ -140,7 +140,7 @@ //! # } //! ``` -#![doc(html_root_url = "https://docs.rs/serde_test/1.0.157")] +#![doc(html_root_url = "https://docs.rs/serde_test/1.0.158")] #![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))] // Ignored clippy lints #![cfg_attr(feature = "cargo-clippy", allow(float_cmp, needless_doctest_main))] diff --git a/test_suite/tests/regression/issue2409.rs b/test_suite/tests/regression/issue2409.rs new file mode 100644 index 000000000..2e3936691 --- /dev/null +++ b/test_suite/tests/regression/issue2409.rs @@ -0,0 +1,11 @@ +use serde::Deserialize; + +macro_rules! bug { + ($serde_path:literal) => { + #[derive(Deserialize)] + #[serde(crate = $serde_path)] + pub struct Struct; + }; +} + +bug!("serde");