@@ -997,35 +997,24 @@ impl<'a> Parser<'a> {
997
997
fn parse_item_foreign_mod (
998
998
& mut self ,
999
999
attrs : & mut Vec < Attribute > ,
1000
- unsafety : Unsafe ,
1000
+ mut unsafety : Unsafe ,
1001
1001
) -> PResult < ' a , ItemInfo > {
1002
- let sp_start = self . prev_token . span ;
1003
1002
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 ) ;
1028
1011
}
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) ) )
1029
1018
}
1030
1019
1031
1020
/// Parses a foreign item (one in an `extern { ... }` block).
0 commit comments