@@ -84,7 +84,7 @@ use rustc_parse::parser::{FollowedByType, Parser, PathStyle};
8484use rustc_session:: parse:: ParseSess ;
8585use rustc_span:: symbol:: { kw, sym, Ident , MacroRulesNormalizedIdent , Symbol } ;
8686
87- use rustc_errors:: { FatalError , PResult } ;
87+ use rustc_errors:: PResult ;
8888use rustc_span:: Span ;
8989use smallvec:: { smallvec, SmallVec } ;
9090
@@ -271,6 +271,7 @@ crate enum ParseResult<T> {
271271 Failure ( Token , & ' static str ) ,
272272 /// Fatal error (malformed macro?). Abort compilation.
273273 Error ( rustc_span:: Span , String ) ,
274+ ErrorReported ,
274275}
275276
276277/// 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
652653 Success ( _) => { }
653654 Failure ( token, msg) => return Failure ( token, msg) ,
654655 Error ( sp, msg) => return Error ( sp, msg) ,
656+ ErrorReported => return ErrorReported ,
655657 }
656658
657659 // 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
735737 let mut item = bb_items. pop ( ) . unwrap ( ) ;
736738 if let TokenTree :: MetaVarDecl ( span, _, ident) = item. top_elts . get_tt ( item. idx ) {
737739 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) ) ) ;
742745 item. idx += 1 ;
743746 item. match_cur += 1 ;
744747 } else {
@@ -849,20 +852,16 @@ fn may_begin_with(token: &Token, name: Name) -> bool {
849852/// # Returns
850853///
851854/// 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 , ( ) > {
853856 // FIXME(Centril): Consider moving this to `parser.rs` to make
854857 // the visibilities of the methods used below `pub(super)` at most.
855-
856858 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 ( ) ) ) ;
865860 }
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+ } )
866865}
867866
868867fn parse_nt_inner < ' a > ( p : & mut Parser < ' a > , sp : Span , name : Symbol ) -> PResult < ' a , Nonterminal > {
0 commit comments