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.
///
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};
| 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());
}
_ => {
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());
}
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![];
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)
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`.