Skip to content

Commit 4bea03d

Browse files
committed
defatalize AttrProcMacro::expand
1 parent 76c5a4f commit 4bea03d

File tree

3 files changed

+16
-18
lines changed

3 files changed

+16
-18
lines changed

src/librustc_expand/base.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ pub trait AttrProcMacro {
325325
span: Span,
326326
annotation: TokenStream,
327327
annotated: TokenStream,
328-
) -> TokenStream;
328+
) -> Result<TokenStream, ErrorReported>;
329329
}
330330

331331
impl<F> AttrProcMacro for F
@@ -338,9 +338,9 @@ where
338338
_span: Span,
339339
annotation: TokenStream,
340340
annotated: TokenStream,
341-
) -> TokenStream {
341+
) -> Result<TokenStream, ErrorReported> {
342342
// FIXME setup implicit context in TLS before calling self.
343-
(*self)(annotation, annotated)
343+
Ok((*self)(annotation, annotated))
344344
}
345345
}
346346

src/librustc_expand/expand.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -704,8 +704,11 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
704704
if let MacArgs::Eq(..) = attr_item.args {
705705
self.cx.span_err(span, "key-value macro attributes are not supported");
706706
}
707-
let tok_result =
708-
expander.expand(self.cx, span, attr_item.args.inner_tokens(), tokens);
707+
let inner_tokens = attr_item.args.inner_tokens();
708+
let tok_result = match expander.expand(self.cx, span, inner_tokens, tokens) {
709+
Err(_) => return ExpandResult::Ready(fragment_kind.dummy(span)),
710+
Ok(ts) => ts,
711+
};
709712
self.parse_ast_fragment(tok_result, fragment_kind, &attr_item.path, span)
710713
}
711714
SyntaxExtensionKind::LegacyAttr(expander) => {

src/librustc_expand/proc_macro.rs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,16 @@ impl base::AttrProcMacro for AttrProcMacro {
4545
span: Span,
4646
annotation: TokenStream,
4747
annotated: TokenStream,
48-
) -> TokenStream {
48+
) -> Result<TokenStream, ErrorReported> {
4949
let server = proc_macro_server::Rustc::new(ecx);
50-
match self.client.run(&EXEC_STRATEGY, server, annotation, annotated) {
51-
Ok(stream) => stream,
52-
Err(e) => {
53-
let msg = "custom attribute panicked";
54-
let mut err = ecx.struct_span_fatal(span, msg);
55-
if let Some(s) = e.as_str() {
56-
err.help(&format!("message: {}", s));
57-
}
58-
59-
err.emit();
60-
FatalError.raise();
50+
self.client.run(&EXEC_STRATEGY, server, annotation, annotated).map_err(|e| {
51+
let mut err = ecx.struct_span_err(span, "custom attribute panicked");
52+
if let Some(s) = e.as_str() {
53+
err.help(&format!("message: {}", s));
6154
}
62-
}
55+
err.emit();
56+
ErrorReported
57+
})
6358
}
6459
}
6560

0 commit comments

Comments
 (0)