1
Fork 0

Point at macro arm when it doesn't expand to an expression

This commit is contained in:
Esteban Küber 2018-11-05 12:25:31 -08:00
parent e5cd1edfa1
commit 76449d86c0
2 changed files with 10 additions and 3 deletions

View file

@ -45,16 +45,18 @@ pub struct ParserAnyMacro<'a> {
/// Span of the expansion site of the macro this parser is for /// Span of the expansion site of the macro this parser is for
site_span: Span, site_span: Span,
/// The ident of the macro we're parsing /// The ident of the macro we're parsing
macro_ident: ast::Ident macro_ident: ast::Ident,
arm_span: Span,
} }
impl<'a> ParserAnyMacro<'a> { impl<'a> ParserAnyMacro<'a> {
pub fn make(mut self: Box<ParserAnyMacro<'a>>, kind: AstFragmentKind) -> AstFragment { pub fn make(mut self: Box<ParserAnyMacro<'a>>, kind: AstFragmentKind) -> AstFragment {
let ParserAnyMacro { site_span, macro_ident, ref mut parser } = *self; let ParserAnyMacro { site_span, macro_ident, ref mut parser, arm_span } = *self;
let fragment = panictry!(parser.parse_ast_fragment(kind, true).map_err(|mut e| { let fragment = panictry!(parser.parse_ast_fragment(kind, true).map_err(|mut e| {
if e.span.is_dummy() { // Get around lack of span in error (#30128) if e.span.is_dummy() { // Get around lack of span in error (#30128)
e.set_span(site_span); e.set_span(site_span);
e.span_label(site_span, "in this macro expansion"); e.span_label(site_span, "in this macro expansion");
e.span_label(arm_span, "in this macro arm");
} else if parser.token == token::Eof { // (#52866) } else if parser.token == token::Eof { // (#52866)
e.set_span(parser.sess.source_map().next_point(parser.span)); e.set_span(parser.sess.source_map().next_point(parser.span));
} }
@ -146,6 +148,7 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
quoted::TokenTree::Delimited(_, ref delimed) => delimed.tts.clone(), quoted::TokenTree::Delimited(_, ref delimed) => delimed.tts.clone(),
_ => cx.span_bug(sp, "malformed macro rhs"), _ => cx.span_bug(sp, "malformed macro rhs"),
}; };
let arm_span = rhses[i].span();
let rhs_spans = rhs.iter().map(|t| t.span()).collect::<Vec<_>>(); let rhs_spans = rhs.iter().map(|t| t.span()).collect::<Vec<_>>();
// rhs has holes ( `$id` and `$(...)` that need filled) // rhs has holes ( `$id` and `$(...)` that need filled)
@ -184,7 +187,8 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
// so we can print a useful error message if the parse of the expanded // so we can print a useful error message if the parse of the expanded
// macro leaves unparsed tokens. // macro leaves unparsed tokens.
site_span: sp, site_span: sp,
macro_ident: name macro_ident: name,
arm_span,
}) })
} }
Failure(sp, tok, t) => if sp.lo() >= best_fail_spot.lo() { Failure(sp, tok, t) => if sp.lo() >= best_fail_spot.lo() {

View file

@ -1,6 +1,9 @@
error: expected expression, found the end of the macro arm error: expected expression, found the end of the macro arm
--> $DIR/macro-in-expression-context-2.rs:5:16 --> $DIR/macro-in-expression-context-2.rs:5:16
| |
LL | macro_rules! empty { () => () }
| -- in this macro arm
...
LL | _ => { empty!() } LL | _ => { empty!() }
| ^^^^^^^^ in this macro expansion | ^^^^^^^^ in this macro expansion