@@ -5116,12 +5116,8 @@ impl<'a> Parser<'a> {
51165116
51175117                let  ident = self . parse_ident ( ) ?; 
51185118                let  ( delim,  tokens)  = self . expect_delimited_token_tree ( ) ?; 
5119-                 if  delim != MacDelimiter :: Brace  { 
5120-                     if  !self . eat ( & token:: Semi )  { 
5121-                         let  msg = "macros that expand to items must either \  
5122-                                     be surrounded with braces or followed by a semicolon"; 
5123-                         self . span_err ( self . prev_span ,  msg) ; 
5124-                     } 
5119+                 if  delim != MacDelimiter :: Brace  && !self . eat ( & token:: Semi )  { 
5120+                     self . report_invalid_macro_expansion_item ( ) ; 
51255121                } 
51265122
51275123                ( ident,  ast:: MacroDef  {  tokens :  tokens,  legacy :  true  } ) 
@@ -5264,13 +5260,8 @@ impl<'a> Parser<'a> {
52645260                // if it has a special ident, it's definitely an item 
52655261                // 
52665262                // Require a semicolon or braces. 
5267-                 if  style != MacStmtStyle :: Braces  { 
5268-                     if  !self . eat ( & token:: Semi )  { 
5269-                         self . span_err ( self . prev_span , 
5270-                                       "macros that expand to items must \  
5271-                                         either be surrounded with braces or \ 
5272-                                         followed by a semicolon") ; 
5273-                     } 
5263+                 if  style != MacStmtStyle :: Braces  && !self . eat ( & token:: Semi )  { 
5264+                     self . report_invalid_macro_expansion_item ( ) ; 
52745265                } 
52755266                let  span = lo. to ( hi) ; 
52765267                Stmt  { 
@@ -8360,13 +8351,8 @@ impl<'a> Parser<'a> {
83608351            } ; 
83618352            // eat a matched-delimiter token tree: 
83628353            let  ( delim,  tts)  = self . expect_delimited_token_tree ( ) ?; 
8363-             if  delim != MacDelimiter :: Brace  { 
8364-                 if  !self . eat ( & token:: Semi )  { 
8365-                     self . span_err ( self . prev_span , 
8366-                                   "macros that expand to items must either \  
8367-                                     be surrounded with braces or followed by \ 
8368-                                     a semicolon") ; 
8369-                 } 
8354+             if  delim != MacDelimiter :: Brace  && !self . eat ( & token:: Semi )  { 
8355+                 self . report_invalid_macro_expansion_item ( ) ; 
83708356            } 
83718357
83728358            let  hi = self . prev_span ; 
@@ -8597,6 +8583,25 @@ impl<'a> Parser<'a> {
85978583            } 
85988584        } 
85998585    } 
8586+ 
8587+     fn  report_invalid_macro_expansion_item ( & self )  { 
8588+         self . struct_span_err ( 
8589+             self . prev_span , 
8590+             "macros that expand to items must be delimited with braces or followed by a semicolon" , 
8591+         ) . multipart_suggestion ( 
8592+             "change the delimiters to curly braces" , 
8593+             vec ! [ 
8594+                 ( self . prev_span. with_hi( self . prev_span. lo( )  + BytePos ( 1 ) ) ,  String :: from( " {" ) ) , 
8595+                 ( self . prev_span. with_lo( self . prev_span. hi( )  - BytePos ( 1 ) ) ,  '}' . to_string( ) ) , 
8596+             ] , 
8597+             Applicability :: MaybeIncorrect , 
8598+         ) . span_suggestion ( 
8599+             self . sess . source_map . next_point ( self . prev_span ) , 
8600+             "add a semicolon" , 
8601+             ';' . to_string ( ) , 
8602+             Applicability :: MaybeIncorrect , 
8603+         ) . emit ( ) ; 
8604+     } 
86008605} 
86018606
86028607pub  fn  emit_unclosed_delims ( unclosed_delims :  & mut  Vec < UnmatchedBrace > ,  handler :  & errors:: Handler )  { 
0 commit comments