error_derive_forbidden_on_non_adt: be more graceful
This commit is contained in:
parent
a8437cf213
commit
13d42f4784
3 changed files with 39 additions and 4 deletions
src
librustc_expand
test/ui/malformed
|
@ -503,13 +503,12 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn error_derive_forbidden_on_non_adt(&self, derives: &[Path], item: &Annotatable) {
|
fn error_derive_forbidden_on_non_adt(&self, derives: &[Path], item: &Annotatable) {
|
||||||
let attr =
|
let attr = attr::find_by_name(item.attrs(), sym::derive);
|
||||||
attr::find_by_name(item.attrs(), sym::derive).expect("`derive` attribute should exist");
|
let span = attr.map_or(item.span(), |attr| attr.span);
|
||||||
let span = attr.span;
|
|
||||||
let mut err = self
|
let mut err = self
|
||||||
.cx
|
.cx
|
||||||
.struct_span_err(span, "`derive` may only be applied to structs, enums and unions");
|
.struct_span_err(span, "`derive` may only be applied to structs, enums and unions");
|
||||||
if let ast::AttrStyle::Inner = attr.style {
|
if let Some(ast::Attribute { style: ast::AttrStyle::Inner, .. }) = attr {
|
||||||
let trait_list = derives.iter().map(|t| pprust::path_to_string(t)).collect::<Vec<_>>();
|
let trait_list = derives.iter().map(|t| pprust::path_to_string(t)).collect::<Vec<_>>();
|
||||||
let suggestion = format!("#[derive({})]", trait_list.join(", "));
|
let suggestion = format!("#[derive({})]", trait_list.join(", "));
|
||||||
err.span_suggestion(
|
err.span_suggestion(
|
||||||
|
|
10
src/test/ui/malformed/issue-69341-malformed-derive-inert.rs
Normal file
10
src/test/ui/malformed/issue-69341-malformed-derive-inert.rs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
fn main() {}
|
||||||
|
|
||||||
|
struct CLI {
|
||||||
|
#[derive(parse())]
|
||||||
|
//~^ ERROR traits in `#[derive(...)]` don't accept arguments
|
||||||
|
//~| ERROR cannot find derive macro `parse` in this scope
|
||||||
|
//~| ERROR cannot find derive macro `parse` in this scope
|
||||||
|
path: (),
|
||||||
|
//~^ ERROR `derive` may only be applied to structs, enums and unions
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
error: traits in `#[derive(...)]` don't accept arguments
|
||||||
|
--> $DIR/issue-69341-malformed-derive-inert.rs:4:19
|
||||||
|
|
|
||||||
|
LL | #[derive(parse())]
|
||||||
|
| ^^ help: remove the arguments
|
||||||
|
|
||||||
|
error: `derive` may only be applied to structs, enums and unions
|
||||||
|
--> $DIR/issue-69341-malformed-derive-inert.rs:8:5
|
||||||
|
|
|
||||||
|
LL | path: (),
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
||||||
|
error: cannot find derive macro `parse` in this scope
|
||||||
|
--> $DIR/issue-69341-malformed-derive-inert.rs:4:14
|
||||||
|
|
|
||||||
|
LL | #[derive(parse())]
|
||||||
|
| ^^^^^
|
||||||
|
|
||||||
|
error: cannot find derive macro `parse` in this scope
|
||||||
|
--> $DIR/issue-69341-malformed-derive-inert.rs:4:14
|
||||||
|
|
|
||||||
|
LL | #[derive(parse())]
|
||||||
|
| ^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
Loading…
Add table
Reference in a new issue