From be57a5e00a3093e36431ea5194942b996d6bc4b6 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Wed, 8 Mar 2023 18:45:47 -0800 Subject: [PATCH] Eliminate special case on empty string passed to borrow="" --- serde_derive/src/internals/attr.rs | 26 ++++++++++++------- .../tests/ui/borrow/empty_lifetimes.stderr | 2 +- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/serde_derive/src/internals/attr.rs b/serde_derive/src/internals/attr.rs index 9b2162da..0b81bcc6 100644 --- a/serde_derive/src/internals/attr.rs +++ b/serde_derive/src/internals/attr.rs @@ -7,9 +7,9 @@ use std::collections::BTreeSet; use syn; use syn::parse::ParseStream; use syn::punctuated::Punctuated; -use syn::Ident; use syn::Meta::{List, NameValue, Path}; use syn::NestedMeta::{Lit, Meta}; +use syn::{Ident, Lifetime}; // This module handles parsing of `#[serde(...)]` attributes. The entrypoints // are `attr::Container::from_ast`, `attr::Variant::from_ast`, and @@ -1657,21 +1657,27 @@ fn parse_lit_into_lifetimes( lit: &syn::Lit, ) -> Result, ()> { let string = get_lit_str(cx, attr_name, lit)?; - if string.value().is_empty() { - cx.error_spanned_by(lit, "at least one lifetime must be borrowed"); - return Err(()); - } - if let Ok(lifetimes) = - string.parse_with(Punctuated::::parse_separated_nonempty) - { + if let Ok(lifetimes) = string.parse_with(|input: ParseStream| { let mut set = BTreeSet::new(); - for lifetime in lifetimes { + while !input.is_empty() { + let lifetime: Lifetime = input.parse()?; if !set.insert(lifetime.clone()) { cx.error_spanned_by(lit, format!("duplicate borrowed lifetime `{}`", lifetime)); } + if input.is_empty() { + break; + } + input.parse::()?; } - return Ok(set); + Ok(set) + }) { + return if lifetimes.is_empty() { + cx.error_spanned_by(lit, "at least one lifetime must be borrowed"); + Err(()) + } else { + Ok(lifetimes) + }; } cx.error_spanned_by( diff --git a/test_suite/tests/ui/borrow/empty_lifetimes.stderr b/test_suite/tests/ui/borrow/empty_lifetimes.stderr index 92bc14f0..6f1f5c63 100644 --- a/test_suite/tests/ui/borrow/empty_lifetimes.stderr +++ b/test_suite/tests/ui/borrow/empty_lifetimes.stderr @@ -4,7 +4,7 @@ error: at least one lifetime must be borrowed 5 | #[serde(borrow = "")] | ^^ -error: failed to parse borrowed lifetimes: " " +error: at least one lifetime must be borrowed --> tests/ui/borrow/empty_lifetimes.rs:7:22 | 7 | #[serde(borrow = " ")]