Improve error when a 'de lifetime parameter already exists
This commit is contained in:
parent
12fe42ed45
commit
7e3efaf6c5
@ -82,6 +82,11 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<Tokens, Str
|
||||
}
|
||||
|
||||
fn precondition(cx: &Ctxt, cont: &Container) {
|
||||
precondition_sized(cx, cont);
|
||||
precondition_no_de_lifetime(cx, cont);
|
||||
}
|
||||
|
||||
fn precondition_sized(cx: &Ctxt, cont: &Container) {
|
||||
if let Data::Struct(_, ref fields) = cont.data {
|
||||
if let Some(last) = fields.last() {
|
||||
if let syn::Type::Slice(_) = *last.ty {
|
||||
@ -91,6 +96,17 @@ fn precondition(cx: &Ctxt, cont: &Container) {
|
||||
}
|
||||
}
|
||||
|
||||
fn precondition_no_de_lifetime(cx: &Ctxt, cont: &Container) {
|
||||
if let BorrowedLifetimes::Borrowed(_) = borrowed_lifetimes(cont) {
|
||||
for param in cont.generics.lifetimes() {
|
||||
if param.lifetime.to_string() == "'de" {
|
||||
cx.error("cannot deserialize when there is a lifetime parameter called 'de");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Parameters {
|
||||
/// Name of the type the `derive` is on.
|
||||
local: syn::Ident,
|
||||
|
@ -0,0 +1,15 @@
|
||||
// Copyright 2018 Serde Developers
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[macro_use]
|
||||
extern crate serde_derive;
|
||||
|
||||
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
||||
struct S<'de> {
|
||||
s: &'de str, //~^^ HELP: cannot deserialize when there is a lifetime parameter called 'de
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user