1111use { ast, attr} ;
1212use syntax_pos:: { Span , DUMMY_SP } ;
1313use edition:: Edition ;
14+ use errors:: FatalError ;
1415use ext:: base:: { DummyResult , ExtCtxt , MacResult , SyntaxExtension } ;
1516use ext:: base:: { NormalTT , TTMacroExpander } ;
1617use ext:: expand:: { AstFragment , AstFragmentKind } ;
@@ -130,6 +131,7 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
130131 // Which arm's failure should we report? (the one furthest along)
131132 let mut best_fail_spot = DUMMY_SP ;
132133 let mut best_fail_tok = None ;
134+ let mut best_fail_text = None ;
133135
134136 for ( i, lhs) in lhses. iter ( ) . enumerate ( ) { // try each arm's matchers
135137 let lhs_tt = match * lhs {
@@ -185,9 +187,10 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
185187 macro_ident : name
186188 } )
187189 }
188- Failure ( sp, tok) => if sp. lo ( ) >= best_fail_spot. lo ( ) {
190+ Failure ( sp, tok, t ) => if sp. lo ( ) >= best_fail_spot. lo ( ) {
189191 best_fail_spot = sp;
190192 best_fail_tok = Some ( tok) ;
193+ best_fail_text = Some ( t) ;
191194 } ,
192195 Error ( err_sp, ref msg) => {
193196 cx. span_fatal ( err_sp. substitute_dummy ( sp) , & msg[ ..] )
@@ -198,7 +201,7 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt,
198201 let best_fail_msg = parse_failure_msg ( best_fail_tok. expect ( "ran no matchers" ) ) ;
199202 let span = best_fail_spot. substitute_dummy ( sp) ;
200203 let mut err = cx. struct_span_err ( span, & best_fail_msg) ;
201- err. span_label ( span, best_fail_msg) ;
204+ err. span_label ( span, best_fail_text . unwrap_or ( best_fail_msg) ) ;
202205 if let Some ( sp) = def_span {
203206 if cx. source_map ( ) . span_to_filename ( sp) . is_real ( ) && !sp. is_dummy ( ) {
204207 err. span_label ( cx. source_map ( ) . def_span ( sp) , "when calling this macro" ) ;
@@ -278,9 +281,13 @@ pub fn compile(sess: &ParseSess, features: &Features, def: &ast::Item, edition:
278281
279282 let argument_map = match parse ( sess, body. stream ( ) , & argument_gram, None , true ) {
280283 Success ( m) => m,
281- Failure ( sp, tok) => {
284+ Failure ( sp, tok, t ) => {
282285 let s = parse_failure_msg ( tok) ;
283- sess. span_diagnostic . span_fatal ( sp. substitute_dummy ( def. span ) , & s) . raise ( ) ;
286+ let sp = sp. substitute_dummy ( def. span ) ;
287+ let mut err = sess. span_diagnostic . struct_span_fatal ( sp, & s) ;
288+ err. span_label ( sp, t) ;
289+ err. emit ( ) ;
290+ FatalError . raise ( ) ;
284291 }
285292 Error ( sp, s) => {
286293 sess. span_diagnostic . span_fatal ( sp. substitute_dummy ( def. span ) , & s) . raise ( ) ;
0 commit comments