@@ -999,10 +999,32 @@ impl<'a> Parser<'a> {
999
999
attrs : & mut Vec < Attribute > ,
1000
1000
unsafety : Unsafe ,
1001
1001
) -> PResult < ' a , ItemInfo > {
1002
+ let sp_start = self . prev_token . span ;
1002
1003
let abi = self . parse_abi ( ) ; // ABI?
1003
- let items = self . parse_item_list ( attrs, |p| p. parse_foreign_item ( ForceCollect :: No ) ) ?;
1004
- let module = ast:: ForeignMod { unsafety, abi, items } ;
1005
- Ok ( ( Ident :: empty ( ) , ItemKind :: ForeignMod ( module) ) )
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
+ if err. message ( ) == "expected `{`, found keyword `unsafe`" {
1014
+ let invalid_qual_sp = self . token . uninterpolated_span ( ) ;
1015
+ let invalid_qual = self . span_to_snippet ( invalid_qual_sp) . unwrap ( ) ;
1016
+
1017
+ err. span_suggestion (
1018
+ current_qual_sp. to ( invalid_qual_sp) ,
1019
+ & format ! ( "`{}` must come before `{}`" , invalid_qual, current_qual) ,
1020
+ format ! ( "{} {}" , invalid_qual, current_qual) ,
1021
+ Applicability :: MachineApplicable ,
1022
+ ) . note ( "keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`" ) ;
1023
+ }
1024
+ }
1025
+ Err ( err)
1026
+ }
1027
+ }
1006
1028
}
1007
1029
1008
1030
/// Parses a foreign item (one in an `extern { ... }` block).
0 commit comments