@@ -130,9 +130,7 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt<'_>,
130130 }
131131
132132 // Which arm's failure should we report? (the one furthest along)
133- let mut best_fail_spot = DUMMY_SP ;
134- let mut best_fail_tok = None ;
135- let mut best_fail_text = None ;
133+ let mut best_failure: Option < ( Token , & str ) > = None ;
136134
137135 for ( i, lhs) in lhses. iter ( ) . enumerate ( ) { // try each arm's matchers
138136 let lhs_tt = match * lhs {
@@ -190,21 +188,20 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt<'_>,
190188 arm_span,
191189 } )
192190 }
193- Failure ( token, msg) => if token. span . lo ( ) >= best_fail_spot. lo ( ) {
194- best_fail_spot = token. span ;
195- best_fail_tok = Some ( token. kind ) ;
196- best_fail_text = Some ( msg) ;
197- } ,
191+ Failure ( token, msg) => match best_failure {
192+ Some ( ( ref best_token, _) ) if best_token. span . lo ( ) >= token. span . lo ( ) => { }
193+ _ => best_failure = Some ( ( token, msg) )
194+ }
198195 Error ( err_sp, ref msg) => {
199196 cx. span_fatal ( err_sp. substitute_dummy ( sp) , & msg[ ..] )
200197 }
201198 }
202199 }
203200
204- let best_fail_msg = parse_failure_msg ( best_fail_tok . expect ( "ran no matchers" ) ) ;
205- let span = best_fail_spot . substitute_dummy ( sp) ;
206- let mut err = cx. struct_span_err ( span, & best_fail_msg ) ;
207- err. span_label ( span, best_fail_text . unwrap_or ( & best_fail_msg ) ) ;
201+ let ( token , label ) = best_failure . expect ( "ran no matchers" ) ;
202+ let span = token . span . substitute_dummy ( sp) ;
203+ let mut err = cx. struct_span_err ( span, & parse_failure_msg ( token . kind ) ) ;
204+ err. span_label ( span, label ) ;
208205 if let Some ( sp) = def_span {
209206 if cx. source_map ( ) . span_to_filename ( sp) . is_real ( ) && !sp. is_dummy ( ) {
210207 err. span_label ( cx. source_map ( ) . def_span ( sp) , "when calling this macro" ) ;
0 commit comments