mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-31 06:22:00 +00:00
defatalize ProcMacroDerive::expand
Also remove ExtCtxt::struct_span_fatal.
This commit is contained in:
parent
ce8880d1d8
commit
c1ef1b3bca
@ -1020,9 +1020,6 @@ impl<'a> ExtCtxt<'a> {
|
||||
pub fn struct_span_err<S: Into<MultiSpan>>(&self, sp: S, msg: &str) -> DiagnosticBuilder<'a> {
|
||||
self.parse_sess.span_diagnostic.struct_span_err(sp, msg)
|
||||
}
|
||||
pub fn struct_span_fatal<S: Into<MultiSpan>>(&self, sp: S, msg: &str) -> DiagnosticBuilder<'a> {
|
||||
self.parse_sess.span_diagnostic.struct_span_fatal(sp, msg)
|
||||
}
|
||||
|
||||
/// Emit `msg` attached to `sp`, and stop compilation immediately.
|
||||
///
|
||||
|
@ -5,7 +5,7 @@ use rustc_ast::ast::{self, ItemKind, MetaItemKind, NestedMetaItem};
|
||||
use rustc_ast::token;
|
||||
use rustc_ast::tokenstream::{self, TokenStream};
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use rustc_errors::{Applicability, ErrorReported, FatalError};
|
||||
use rustc_errors::{Applicability, ErrorReported};
|
||||
use rustc_span::symbol::sym;
|
||||
use rustc_span::{Span, DUMMY_SP};
|
||||
|
||||
@ -86,8 +86,7 @@ impl MultiItemModifier for ProcMacroDerive {
|
||||
| Annotatable::Expr(_) => {
|
||||
ecx.span_err(
|
||||
span,
|
||||
"proc-macro derives may only be \
|
||||
applied to a struct, enum, or union",
|
||||
"proc-macro derives may only be applied to a struct, enum, or union",
|
||||
);
|
||||
return ExpandResult::Ready(Vec::new());
|
||||
}
|
||||
@ -97,8 +96,7 @@ impl MultiItemModifier for ProcMacroDerive {
|
||||
_ => {
|
||||
ecx.span_err(
|
||||
span,
|
||||
"proc-macro derives may only be \
|
||||
applied to a struct, enum, or union",
|
||||
"proc-macro derives may only be applied to a struct, enum, or union",
|
||||
);
|
||||
return ExpandResult::Ready(Vec::new());
|
||||
}
|
||||
@ -111,20 +109,16 @@ impl MultiItemModifier for ProcMacroDerive {
|
||||
let stream = match self.client.run(&EXEC_STRATEGY, server, input) {
|
||||
Ok(stream) => stream,
|
||||
Err(e) => {
|
||||
let msg = "proc-macro derive panicked";
|
||||
let mut err = ecx.struct_span_fatal(span, msg);
|
||||
let mut err = ecx.struct_span_err(span, "proc-macro derive panicked");
|
||||
if let Some(s) = e.as_str() {
|
||||
err.help(&format!("message: {}", s));
|
||||
}
|
||||
|
||||
err.emit();
|
||||
FatalError.raise();
|
||||
return ExpandResult::Ready(vec![]);
|
||||
}
|
||||
};
|
||||
|
||||
let error_count_before = ecx.parse_sess.span_diagnostic.err_count();
|
||||
let msg = "proc-macro derive produced unparseable tokens";
|
||||
|
||||
let mut parser =
|
||||
rustc_parse::stream_to_parser(ecx.parse_sess, stream, Some("proc-macro derive"));
|
||||
let mut items = vec![];
|
||||
@ -134,18 +128,15 @@ impl MultiItemModifier for ProcMacroDerive {
|
||||
Ok(None) => break,
|
||||
Ok(Some(item)) => items.push(Annotatable::Item(item)),
|
||||
Err(mut err) => {
|
||||
// FIXME: handle this better
|
||||
err.cancel();
|
||||
ecx.struct_span_fatal(span, msg).emit();
|
||||
FatalError.raise();
|
||||
err.emit();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// fail if there have been errors emitted
|
||||
if ecx.parse_sess.span_diagnostic.err_count() > error_count_before {
|
||||
ecx.struct_span_fatal(span, msg).emit();
|
||||
FatalError.raise();
|
||||
ecx.struct_span_err(span, "proc-macro derive produced unparseable tokens").emit();
|
||||
}
|
||||
|
||||
ExpandResult::Ready(items)
|
||||
|
@ -3,11 +3,9 @@
|
||||
#[macro_use]
|
||||
extern crate derive_bad;
|
||||
|
||||
#[derive(
|
||||
A
|
||||
)]
|
||||
//~^^ ERROR proc-macro derive produced unparseable tokens
|
||||
#[derive(A)]
|
||||
//~^ ERROR proc-macro derive produced unparseable tokens
|
||||
//~| ERROR expected `:`, found `}`
|
||||
struct A;
|
||||
struct A; //~ ERROR the name `A` is defined multiple times
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,16 +1,28 @@
|
||||
error: expected `:`, found `}`
|
||||
--> $DIR/derive-bad.rs:7:5
|
||||
--> $DIR/derive-bad.rs:6:10
|
||||
|
|
||||
LL | A
|
||||
| ^ expected `:`
|
||||
LL | #[derive(A)]
|
||||
| ^ expected `:`
|
||||
|
|
||||
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: proc-macro derive produced unparseable tokens
|
||||
--> $DIR/derive-bad.rs:7:5
|
||||
--> $DIR/derive-bad.rs:6:10
|
||||
|
|
||||
LL | A
|
||||
| ^
|
||||
LL | #[derive(A)]
|
||||
| ^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error[E0428]: the name `A` is defined multiple times
|
||||
--> $DIR/derive-bad.rs:9:1
|
||||
|
|
||||
LL | #[derive(A)]
|
||||
| - previous definition of the type `A` here
|
||||
...
|
||||
LL | struct A;
|
||||
| ^^^^^^^^^ `A` redefined here
|
||||
|
|
||||
= note: `A` must be defined only once in the type namespace of this module
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0428`.
|
||||
|
@ -5,6 +5,7 @@ extern crate test_macros;
|
||||
|
||||
#[derive(Identity, Panic)] //~ ERROR proc-macro derive panicked
|
||||
struct Baz {
|
||||
//~^ ERROR the name `Baz` is defined multiple times
|
||||
a: i32,
|
||||
b: i32,
|
||||
}
|
||||
|
@ -6,5 +6,17 @@ LL | #[derive(Identity, Panic)]
|
||||
|
|
||||
= help: message: panic-derive
|
||||
|
||||
error: aborting due to previous error
|
||||
error[E0428]: the name `Baz` is defined multiple times
|
||||
--> $DIR/issue-36935.rs:7:1
|
||||
|
|
||||
LL | struct Baz {
|
||||
| ^^^^^^^^^^
|
||||
| |
|
||||
| `Baz` redefined here
|
||||
| previous definition of the type `Baz` here
|
||||
|
|
||||
= note: `Baz` must be defined only once in the type namespace of this module
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0428`.
|
||||
|
Loading…
Reference in New Issue
Block a user