@@ -84,7 +84,7 @@ use rustc_parse::parser::{FollowedByType, Parser, PathStyle};
84
84
use rustc_session:: parse:: ParseSess ;
85
85
use rustc_span:: symbol:: { kw, sym, Ident , MacroRulesNormalizedIdent , Symbol } ;
86
86
87
- use rustc_errors:: { FatalError , PResult } ;
87
+ use rustc_errors:: PResult ;
88
88
use rustc_span:: Span ;
89
89
use smallvec:: { smallvec, SmallVec } ;
90
90
@@ -271,6 +271,7 @@ crate enum ParseResult<T> {
271
271
Failure ( Token , & ' static str ) ,
272
272
/// Fatal error (malformed macro?). Abort compilation.
273
273
Error ( rustc_span:: Span , String ) ,
274
+ ErrorReported ,
274
275
}
275
276
276
277
/// A `ParseResult` where the `Success` variant contains a mapping of
@@ -652,6 +653,7 @@ pub(super) fn parse_tt(parser: &mut Cow<'_, Parser<'_>>, ms: &[TokenTree]) -> Na
652
653
Success ( _) => { }
653
654
Failure ( token, msg) => return Failure ( token, msg) ,
654
655
Error ( sp, msg) => return Error ( sp, msg) ,
656
+ ErrorReported => return ErrorReported ,
655
657
}
656
658
657
659
// inner parse loop handled all cur_items, so it's empty
@@ -735,10 +737,11 @@ pub(super) fn parse_tt(parser: &mut Cow<'_, Parser<'_>>, ms: &[TokenTree]) -> Na
735
737
let mut item = bb_items. pop ( ) . unwrap ( ) ;
736
738
if let TokenTree :: MetaVarDecl ( span, _, ident) = item. top_elts . get_tt ( item. idx ) {
737
739
let match_cur = item. match_cur ;
738
- item. push_match (
739
- match_cur,
740
- MatchedNonterminal ( Lrc :: new ( parse_nt ( parser. to_mut ( ) , span, ident. name ) ) ) ,
741
- ) ;
740
+ let nt = match parse_nt ( parser. to_mut ( ) , span, ident. name ) {
741
+ Err ( ( ) ) => return ErrorReported ,
742
+ Ok ( nt) => nt,
743
+ } ;
744
+ item. push_match ( match_cur, MatchedNonterminal ( Lrc :: new ( nt) ) ) ;
742
745
item. idx += 1 ;
743
746
item. match_cur += 1 ;
744
747
} else {
@@ -849,20 +852,16 @@ fn may_begin_with(token: &Token, name: Name) -> bool {
849
852
/// # Returns
850
853
///
851
854
/// The parsed non-terminal.
852
- fn parse_nt ( p : & mut Parser < ' _ > , sp : Span , name : Symbol ) -> Nonterminal {
855
+ fn parse_nt ( p : & mut Parser < ' _ > , sp : Span , name : Symbol ) -> Result < Nonterminal , ( ) > {
853
856
// FIXME(Centril): Consider moving this to `parser.rs` to make
854
857
// the visibilities of the methods used below `pub(super)` at most.
855
-
856
858
if name == sym:: tt {
857
- return token:: NtTT ( p. parse_token_tree ( ) ) ;
858
- }
859
- match parse_nt_inner ( p, sp, name) {
860
- Ok ( nt) => nt,
861
- Err ( mut err) => {
862
- err. emit ( ) ;
863
- FatalError . raise ( ) ;
864
- }
859
+ return Ok ( token:: NtTT ( p. parse_token_tree ( ) ) ) ;
865
860
}
861
+ parse_nt_inner ( p, sp, name) . map_err ( |mut err| {
862
+ err. span_label ( sp, format ! ( "while parsing argument for this `{}` macro fragment" , name) )
863
+ . emit ( )
864
+ } )
866
865
}
867
866
868
867
fn parse_nt_inner < ' a > ( p : & mut Parser < ' a > , sp : Span , name : Symbol ) -> PResult < ' a , Nonterminal > {
0 commit comments