@@ -997,35 +997,24 @@ impl<'a> Parser<'a> {
997997 fn parse_item_foreign_mod (
998998 & mut self ,
999999 attrs : & mut Vec < Attribute > ,
1000- unsafety : Unsafe ,
1000+ mut unsafety : Unsafe ,
10011001 ) -> PResult < ' a , ItemInfo > {
1002- let sp_start = self . prev_token . span ;
10031002 let abi = self . parse_abi ( ) ; // ABI?
1004- match self . parse_item_list ( attrs, |p| p. parse_foreign_item ( ForceCollect :: No ) ) {
1005- Ok ( items) => {
1006- let module = ast:: ForeignMod { unsafety, abi, items } ;
1007- Ok ( ( Ident :: empty ( ) , ItemKind :: ForeignMod ( module) ) )
1008- }
1009- Err ( mut err) => {
1010- let current_qual_sp = self . prev_token . span ;
1011- let current_qual_sp = current_qual_sp. to ( sp_start) ;
1012- if let Ok ( current_qual) = self . span_to_snippet ( current_qual_sp) {
1013- // FIXME(davidtwco): avoid depending on the error message text
1014- if err. message [ 0 ] . 0 . expect_str ( ) == "expected `{`, found keyword `unsafe`" {
1015- let invalid_qual_sp = self . token . uninterpolated_span ( ) ;
1016- let invalid_qual = self . span_to_snippet ( invalid_qual_sp) . unwrap ( ) ;
1017-
1018- err. span_suggestion (
1019- current_qual_sp. to ( invalid_qual_sp) ,
1020- & format ! ( "`{}` must come before `{}`" , invalid_qual, current_qual) ,
1021- format ! ( "{} {}" , invalid_qual, current_qual) ,
1022- Applicability :: MachineApplicable ,
1023- ) . note ( "keyword order for functions declaration is `pub`, `default`, `const`, `async`, `unsafe`, `extern`" ) ;
1024- }
1025- }
1026- Err ( err)
1027- }
1003+ if unsafety == Unsafe :: No
1004+ && self . token . is_keyword ( kw:: Unsafe )
1005+ && self . look_ahead ( 1 , |t| t. kind == token:: OpenDelim ( Delimiter :: Brace ) )
1006+ {
1007+ let mut err = self . expect ( & token:: OpenDelim ( Delimiter :: Brace ) ) . unwrap_err ( ) ;
1008+ err. emit ( ) ;
1009+ unsafety = Unsafe :: Yes ( self . token . span ) ;
1010+ self . eat_keyword ( kw:: Unsafe ) ;
10281011 }
1012+ let module = ast:: ForeignMod {
1013+ unsafety,
1014+ abi,
1015+ items : self . parse_item_list ( attrs, |p| p. parse_foreign_item ( ForceCollect :: No ) ) ?,
1016+ } ;
1017+ Ok ( ( Ident :: empty ( ) , ItemKind :: ForeignMod ( module) ) )
10291018 }
10301019
10311020 /// Parses a foreign item (one in an `extern { ... }` block).
0 commit comments