Skip to content

Commit

Permalink
Merge pull request #1297 from adamcrume/master
Browse files Browse the repository at this point in the history
Use compile_error! instead of panicking
  • Loading branch information
dtolnay committed Jun 3, 2018
2 parents 2db2b53 + 05e931b commit 7ad3d17
Show file tree
Hide file tree
Showing 63 changed files with 106 additions and 126 deletions.
5 changes: 3 additions & 2 deletions serde_derive/src/lib.rs
Expand Up @@ -53,6 +53,7 @@ extern crate proc_macro2;

mod internals;

use std::str::FromStr;
use proc_macro::TokenStream;
use syn::DeriveInput;

Expand All @@ -71,7 +72,7 @@ pub fn derive_serialize(input: TokenStream) -> TokenStream {
let input: DeriveInput = syn::parse(input).unwrap();
match ser::expand_derive_serialize(&input) {
Ok(expanded) => expanded.into(),
Err(msg) => panic!(msg),
Err(msg) => quote! {compile_error!(#msg);}.into(),
}
}

Expand All @@ -80,6 +81,6 @@ pub fn derive_deserialize(input: TokenStream) -> TokenStream {
let input: DeriveInput = syn::parse(input).unwrap();
match de::expand_derive_deserialize(&input) {
Ok(expanded) => expanded.into(),
Err(msg) => panic!(msg),
Err(msg) => quote! {compile_error!(#msg);}.into(),
}
}
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/borrow/bad_lifetimes.rs
Expand Up @@ -9,9 +9,9 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: failed to parse borrowed lifetimes: "zzz"
struct Test<'a> {
#[serde(borrow = "zzz")] //~^^ HELP: failed to parse borrowed lifetimes: "zzz"
#[serde(borrow = "zzz")]
s: &'a str,
}

Expand Down
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/borrow/duplicate_lifetime.rs
Expand Up @@ -9,9 +9,9 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: duplicate borrowed lifetime `'a`
struct Test<'a> {
#[serde(borrow = "'a + 'a")] //~^^ HELP: duplicate borrowed lifetime `'a`
#[serde(borrow = "'a + 'a")]
s: &'a str,
}

Expand Down
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/borrow/duplicate_variant.rs
Expand Up @@ -12,9 +12,9 @@ extern crate serde_derive;
#[derive(Deserialize)]
struct Str<'a>(&'a str);

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 15:10: 15:21: duplicate serde attribute `borrow`
enum Test<'a> {
#[serde(borrow)] //~^^ HELP: duplicate serde attribute `borrow`
#[serde(borrow)]
S(#[serde(borrow)] Str<'a>)
}

Expand Down
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/borrow/empty_lifetimes.rs
Expand Up @@ -9,9 +9,9 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: at least one lifetime must be borrowed
struct Test<'a> {
#[serde(borrow = "")] //~^^ HELP: at least one lifetime must be borrowed
#[serde(borrow = "")]
s: &'a str,
}

Expand Down
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/borrow/no_lifetimes.rs
Expand Up @@ -9,9 +9,9 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: field `s` has no lifetimes to borrow
struct Test {
#[serde(borrow)] //~^^ HELP: field `s` has no lifetimes to borrow
#[serde(borrow)]
s: String,
}

Expand Down
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/borrow/struct_variant.rs
Expand Up @@ -12,9 +12,9 @@ extern crate serde_derive;
#[derive(Deserialize)]
struct Str<'a>(&'a str);

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 15:10: 15:21: #[serde(borrow)] may only be used on newtype variants
enum Test<'a> {
#[serde(borrow)] //~^^ HELP: #[serde(borrow)] may only be used on newtype variants
#[serde(borrow)]
S { s: Str<'a> }
}

Expand Down
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/borrow/wrong_lifetime.rs
Expand Up @@ -9,9 +9,9 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: field `s` does not have lifetime 'b
struct Test<'a> {
#[serde(borrow = "'b")] //~^^ HELP: field `s` does not have lifetime 'b
#[serde(borrow = "'b")]
s: &'a str,
}

Expand Down
3 changes: 1 addition & 2 deletions test_suite/tests/compile-fail/conflict/adjacent-tag.rs
Expand Up @@ -9,9 +9,8 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: enum tags `conflict` for type and content conflict with each other
#[serde(tag = "conflict", content = "conflict")]
//~^^ HELP: enum tags `conflict` for type and content conflict with each other
enum E {
A,
B,
Expand Down
Expand Up @@ -9,8 +9,7 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
//~^ HELP: #[serde(flatten)] cannot be used on newtype structs
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: #[serde(flatten)] cannot be used on newtype structs
struct Foo(#[serde(flatten)] HashMap<String, String>);

fn main() {}
Expand Up @@ -9,8 +9,7 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
//~^ HELP: #[serde(flatten] can not be combined with #[serde(skip_deserializing)]
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: #[serde(flatten] can not be combined with #[serde(skip_deserializing)]
struct Foo {
#[serde(flatten, skip_deserializing)]
other: Other,
Expand Down
Expand Up @@ -9,8 +9,7 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
//~^ HELP: #[serde(flatten] can not be combined with #[serde(skip_serializing_if = "...")]
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: #[serde(flatten] can not be combined with #[serde(skip_serializing_if = "...")]
struct Foo {
#[serde(flatten, skip_serializing_if="Option::is_none")]
other: Option<Other>,
Expand Down
Expand Up @@ -9,8 +9,7 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
//~^ HELP: #[serde(flatten] can not be combined with #[serde(skip_serializing)]
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: #[serde(flatten] can not be combined with #[serde(skip_serializing)]
struct Foo {
#[serde(flatten, skip_serializing)]
other: Other,
Expand Down
Expand Up @@ -9,8 +9,7 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
//~^ HELP: #[serde(flatten)] cannot be used on tuple structs
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: #[serde(flatten)] cannot be used on tuple structs
struct Foo(u32, #[serde(flatten)] HashMap<String, String>);

fn main() {}
3 changes: 1 addition & 2 deletions test_suite/tests/compile-fail/conflict/internal-tag.rs
Expand Up @@ -9,9 +9,8 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: variant field name `conflict` conflicts with internal tag
#[serde(tag = "conflict")]
//~^^ HELP: variant field name `conflict` conflicts with internal tag
enum E {
A {
#[serde(rename = "conflict")]
Expand Down
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/default-attribute/enum.rs
Expand Up @@ -9,8 +9,8 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[serde(default)] //~^ HELP: #[serde(default)] can only be used on structs
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: #[serde(default)] can only be used on structs with named fields
#[serde(default)]
enum E {
S { f: u8 },
}
Expand Up @@ -9,8 +9,8 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[serde(default)] //~^ HELP: #[serde(default)] can only be used on structs
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: #[serde(default)] can only be used on structs with named fields
#[serde(default)]
struct T(u8, u8);

fn main() { }
Expand Up @@ -9,9 +9,9 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: unknown serde field attribute `serialize`
struct S {
#[serde(rename="x", serialize="y")] //~^^ HELP: unknown serde field attribute `serialize`
#[serde(rename="x", serialize="y")]
x: (),
}

Expand Down
Expand Up @@ -9,10 +9,10 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: duplicate serde attribute `rename`
struct S {
#[serde(rename="x")]
#[serde(rename(deserialize="y"))] //~^^^ HELP: duplicate serde attribute `rename`
#[serde(rename(deserialize="y"))]
x: (),
}

Expand Down
Expand Up @@ -9,9 +9,9 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: duplicate serde attribute `rename`
struct S {
#[serde(rename(serialize="x"), rename(serialize="y"))] //~^^ HELP: duplicate serde attribute `rename`
#[serde(rename(serialize="x"), rename(serialize="y"))]
x: (),
}

Expand Down
Expand Up @@ -9,10 +9,10 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: duplicate serde attribute `rename`
struct S {
#[serde(rename(serialize="x"))]
#[serde(rename="y")] //~^^^ HELP: duplicate serde attribute `rename`
#[serde(rename="y")]
x: (),
}

Expand Down
Expand Up @@ -9,9 +9,9 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: duplicate serde attribute `rename`
struct S {
#[serde(rename(serialize="x", serialize="y"))] //~^^ HELP: duplicate serde attribute `rename`
#[serde(rename(serialize="x", serialize="y"))]
x: (),
}

Expand Down
Expand Up @@ -9,10 +9,10 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: duplicate serde attribute `rename`
struct S {
#[serde(rename(serialize="x"))]
#[serde(rename(serialize="y"))] //~^^^ HELP: duplicate serde attribute `rename`
#[serde(rename(serialize="y"))]
x: (),
}

Expand Down
Expand Up @@ -9,9 +9,9 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: duplicate serde attribute `serialize_with`
struct S {
#[serde(with = "w", serialize_with = "s")] //~^^ HELP: duplicate serde attribute `serialize_with`
#[serde(with = "w", serialize_with = "s")]
x: (),
}

Expand Down
Expand Up @@ -9,8 +9,8 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[serde(tag = "type")] //~^ HELP: #[serde(tag = "...")] cannot be used with tuple variants
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: #[serde(tag = "...")] cannot be used with tuple variants
#[serde(tag = "type")]
enum E {
Tuple(u8, u8),
}
Expand Down
Expand Up @@ -9,8 +9,8 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[serde(tag = "type")] //~^ HELP: #[serde(tag = "...")] can only be used on enums
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: #[serde(tag = "...")] can only be used on enums
#[serde(tag = "type")]
struct S;

fn main() {}
Expand Up @@ -9,9 +9,9 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: enum cannot be both untagged and internally tagged
#[serde(untagged)]
#[serde(tag = "type")] //~^^ HELP: enum cannot be both untagged and internally tagged
#[serde(tag = "type")]
enum E {
A(u8),
B(String),
Expand Down
Expand Up @@ -9,8 +9,8 @@
#[macro_use]
extern crate serde_derive;

#[derive(Serialize)] //~ ERROR: proc-macro derive panicked
#[serde(untagged)] //~^ HELP: #[serde(untagged)] can only be used on enums
#[derive(Serialize)] //~ ERROR: 12:10: 12:19: #[serde(untagged)] can only be used on enums
#[serde(untagged)]
struct S;

fn main() {}
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/identifier/both.rs
Expand Up @@ -9,8 +9,8 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[serde(field_identifier, variant_identifier)] //~^ HELP: `field_identifier` and `variant_identifier` cannot both be set
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: `field_identifier` and `variant_identifier` cannot both be set
#[serde(field_identifier, variant_identifier)]
enum F {
A,
B,
Expand Down
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/identifier/field_struct.rs
Expand Up @@ -9,8 +9,8 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: `field_identifier` can only be used on an enum
#[serde(field_identifier)]
struct S; //~^^ HELP: `field_identifier` can only be used on an enum
struct S;

fn main() {}
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/identifier/field_tuple.rs
Expand Up @@ -9,11 +9,11 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: field_identifier may only contain unit variants
#[serde(field_identifier)]
enum F {
A,
B(u8, u8), //~^^^^ HELP: field_identifier may only contain unit variants
B(u8, u8),
}

fn main() {}
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/identifier/newtype_not_last.rs
Expand Up @@ -9,11 +9,11 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: `Other` must be the last variant
#[serde(field_identifier)]
enum F {
A,
Other(String), //~^^^^ HELP: `Other` must be the last variant
Other(String),
B,
}

Expand Down
4 changes: 2 additions & 2 deletions test_suite/tests/compile-fail/identifier/not_identifier.rs
Expand Up @@ -9,10 +9,10 @@
#[macro_use]
extern crate serde_derive;

#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
#[derive(Deserialize)] //~ ERROR: 12:10: 12:21: #[serde(other)] may only be used inside a field_identifier
enum F {
A,
#[serde(other)] //~^^^ HELP: #[serde(other)] may only be used inside a field_identifier
#[serde(other)]
B,
}

Expand Down

0 comments on commit 7ad3d17

Please sign in to comment.