Merge pull request #2392 from dtolnay/emptylifetimes

Eliminate special case on empty string passed to borrow=""
This commit is contained in:
David Tolnay
2023-03-08 18:55:51 -08:00
committed by GitHub
3 changed files with 24 additions and 10 deletions
+16 -10
View File
@@ -7,9 +7,9 @@ use std::collections::BTreeSet;
use syn; use syn;
use syn::parse::ParseStream; use syn::parse::ParseStream;
use syn::punctuated::Punctuated; use syn::punctuated::Punctuated;
use syn::Ident;
use syn::Meta::{List, NameValue, Path}; use syn::Meta::{List, NameValue, Path};
use syn::NestedMeta::{Lit, Meta}; use syn::NestedMeta::{Lit, Meta};
use syn::{Ident, Lifetime};
// This module handles parsing of `#[serde(...)]` attributes. The entrypoints // This module handles parsing of `#[serde(...)]` attributes. The entrypoints
// are `attr::Container::from_ast`, `attr::Variant::from_ast`, and // are `attr::Container::from_ast`, `attr::Variant::from_ast`, and
@@ -1657,21 +1657,27 @@ fn parse_lit_into_lifetimes(
lit: &syn::Lit, lit: &syn::Lit,
) -> Result<BTreeSet<syn::Lifetime>, ()> { ) -> Result<BTreeSet<syn::Lifetime>, ()> {
let string = get_lit_str(cx, attr_name, lit)?; 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) = if let Ok(lifetimes) = string.parse_with(|input: ParseStream| {
string.parse_with(Punctuated::<syn::Lifetime, Token![+]>::parse_separated_nonempty)
{
let mut set = BTreeSet::new(); let mut set = BTreeSet::new();
for lifetime in lifetimes { while !input.is_empty() {
let lifetime: Lifetime = input.parse()?;
if !set.insert(lifetime.clone()) { if !set.insert(lifetime.clone()) {
cx.error_spanned_by(lit, format!("duplicate borrowed lifetime `{}`", lifetime)); cx.error_spanned_by(lit, format!("duplicate borrowed lifetime `{}`", lifetime));
} }
if input.is_empty() {
break;
}
input.parse::<Token![+]>()?;
} }
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( cx.error_spanned_by(
@@ -3,6 +3,8 @@ use serde_derive::Deserialize;
#[derive(Deserialize)] #[derive(Deserialize)]
struct Test<'a> { struct Test<'a> {
#[serde(borrow = "")] #[serde(borrow = "")]
r: &'a str,
#[serde(borrow = " ")]
s: &'a str, s: &'a str,
} }
@@ -3,3 +3,9 @@ error: at least one lifetime must be borrowed
| |
5 | #[serde(borrow = "")] 5 | #[serde(borrow = "")]
| ^^ | ^^
error: at least one lifetime must be borrowed
--> tests/ui/borrow/empty_lifetimes.rs:7:22
|
7 | #[serde(borrow = " ")]
| ^^^^