Skip to content

Commit 0647a7c

Browse files
committed
Fix creating and filling a collections that was not read
1 parent 85c73ef commit 0647a7c

File tree

2 files changed

+31
-19
lines changed

2 files changed

+31
-19
lines changed

serde_derive/src/de.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -281,13 +281,9 @@ fn deserialize_body(cont: &Container, params: &Parameters) -> Fragment {
281281
} else if let attr::Identifier::No = cont.attrs.identifier() {
282282
match &cont.data {
283283
Data::Enum(variants) => deserialize_enum(params, variants, &cont.attrs),
284-
Data::Struct(Style::Struct, fields) => deserialize_struct(
285-
params,
286-
fields,
287-
&cont.attrs,
288-
cont.attrs.has_flatten(),
289-
StructForm::Struct,
290-
),
284+
Data::Struct(Style::Struct, fields) => {
285+
deserialize_struct(params, fields, &cont.attrs, StructForm::Struct)
286+
}
291287
Data::Struct(Style::Tuple, fields) | Data::Struct(Style::Newtype, fields) => {
292288
deserialize_tuple(
293289
params,
@@ -927,7 +923,6 @@ fn deserialize_struct(
927923
params: &Parameters,
928924
fields: &[Field],
929925
cattrs: &attr::Container,
930-
has_flatten: bool,
931926
form: StructForm,
932927
) -> Fragment {
933928
let this_type = &params.this_type;
@@ -976,6 +971,10 @@ fn deserialize_struct(
976971
)
977972
})
978973
.collect();
974+
975+
let has_flatten = fields
976+
.iter()
977+
.any(|field| field.attrs.flatten() && !field.attrs.skip_deserializing());
979978
let field_visitor = deserialize_field_identifier(&field_names_idents, cattrs, has_flatten);
980979

981980
// untagged struct variants do not get a visit_seq method. The same applies to
@@ -1838,7 +1837,6 @@ fn deserialize_externally_tagged_variant(
18381837
params,
18391838
&variant.fields,
18401839
cattrs,
1841-
variant.attrs.has_flatten(),
18421840
StructForm::ExternallyTagged(variant_ident),
18431841
),
18441842
}
@@ -1882,7 +1880,6 @@ fn deserialize_internally_tagged_variant(
18821880
params,
18831881
&variant.fields,
18841882
cattrs,
1885-
variant.attrs.has_flatten(),
18861883
StructForm::InternallyTagged(variant_ident, deserializer),
18871884
),
18881885
Style::Tuple => unreachable!("checked in serde_derive_internals"),
@@ -1940,7 +1937,6 @@ fn deserialize_untagged_variant(
19401937
params,
19411938
&variant.fields,
19421939
cattrs,
1943-
variant.attrs.has_flatten(),
19441940
StructForm::Untagged(variant_ident, deserializer),
19451941
),
19461942
}

test_suite/tests/test_gen.rs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -547,13 +547,32 @@ fn test_gen() {
547547
}
548548
assert::<FlattenWith>();
549549

550+
#[derive(Serialize, Deserialize)]
551+
pub struct Flatten<T> {
552+
#[serde(flatten)]
553+
t: T,
554+
}
555+
550556
#[derive(Serialize, Deserialize)]
551557
#[serde(deny_unknown_fields)]
552558
pub struct FlattenDenyUnknown<T> {
553559
#[serde(flatten)]
554560
t: T,
555561
}
556562

563+
#[derive(Serialize, Deserialize)]
564+
pub struct SkipDeserializing<T> {
565+
#[serde(skip_deserializing)]
566+
flat: T,
567+
}
568+
569+
#[derive(Serialize, Deserialize)]
570+
#[serde(deny_unknown_fields)]
571+
pub struct SkipDeserializingDenyUnknown<T> {
572+
#[serde(skip_deserializing)]
573+
flat: T,
574+
}
575+
557576
#[derive(Serialize, Deserialize)]
558577
pub struct StaticStrStruct<'a> {
559578
a: &'a str,
@@ -720,14 +739,11 @@ fn test_gen() {
720739
flat: StdOption<T>,
721740
}
722741

723-
#[allow(clippy::collection_is_never_read)] // FIXME
724-
const _: () = {
725-
#[derive(Serialize, Deserialize)]
726-
pub struct FlattenSkipDeserializing<T> {
727-
#[serde(flatten, skip_deserializing)]
728-
flat: T,
729-
}
730-
};
742+
#[derive(Serialize, Deserialize)]
743+
pub struct FlattenSkipDeserializing<T> {
744+
#[serde(flatten, skip_deserializing)]
745+
flat: T,
746+
}
731747

732748
#[derive(Serialize, Deserialize)]
733749
#[serde(untagged)]

0 commit comments

Comments
 (0)