@@ -999,10 +999,32 @@ impl<'a> Parser<'a> {
999999 attrs : & mut Vec < Attribute > ,
10001000 unsafety : Unsafe ,
10011001 ) -> PResult < ' a , ItemInfo > {
1002+ let sp_start = self . prev_token . span ;
10021003 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+ }
10061028 }
10071029
10081030 /// Parses a foreign item (one in an `extern { ... }` block).
0 commit comments