Skip to content

Commit 65104ac

Browse files
committed
Remove need for allow(unreachable_code)
1 parent 9360094 commit 65104ac

File tree

2 files changed

+28
-7
lines changed

2 files changed

+28
-7
lines changed

serde_derive/src/de.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,6 @@ fn deserialize_from_struct(
929929
#visit_seq
930930

931931
#[inline]
932-
#[allow(unreachable_code)]
933932
fn visit_map<__A>(self, mut __map: __A) -> _serde::export::Result<Self::Value, __A::Error>
934933
where __A: _serde::de::MapAccess<#delife>
935934
{
@@ -2193,12 +2192,25 @@ fn deserialize_from_map(
21932192
.filter(|&&(field, _)| !field.attrs.skip_deserializing())
21942193
.map(
21952194
|&(field, ref name)| {
2196-
let missing_expr = Expr(expr_is_missing(&field, cattrs));
2197-
let field_name = &field.ident;
2198-
quote! {
2199-
if !#name {
2200-
self.dest.#field_name = #missing_expr;
2201-
};
2195+
let missing_expr = expr_is_missing(&field, cattrs);
2196+
// If missing_expr unconditionally returns an error, don't try
2197+
// to assign its value to self.dest. Maybe this could be handled
2198+
// more elegantly.
2199+
if missing_expr.as_ref().as_str().starts_with("return ") {
2200+
let missing_expr = Stmts(missing_expr);
2201+
quote! {
2202+
if !#name {
2203+
#missing_expr;
2204+
}
2205+
}
2206+
} else {
2207+
let field_name = &field.ident;
2208+
let missing_expr = Expr(missing_expr);
2209+
quote! {
2210+
if !#name {
2211+
self.dest.#field_name = #missing_expr;
2212+
};
2213+
}
22022214
}
22032215
},
22042216
);

serde_derive/src/fragment.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,12 @@ impl ToTokens for Match {
7373
}
7474
}
7575
}
76+
77+
impl AsRef<Tokens> for Fragment {
78+
fn as_ref(&self) -> &Tokens {
79+
match *self {
80+
Fragment::Expr(ref expr) => expr,
81+
Fragment::Block(ref block) => block,
82+
}
83+
}
84+
}

0 commit comments

Comments
 (0)