@@ -933,10 +933,32 @@ impl<'a> Parser<'a> {
933
933
attrs : & mut Vec < Attribute > ,
934
934
unsafety : Unsafe ,
935
935
) -> PResult < ' a , ItemInfo > {
936
+ let sp_start = self . prev_token . span ;
936
937
let abi = self . parse_abi ( ) ; // ABI?
937
- let items = self . parse_item_list ( attrs, |p| p. parse_foreign_item ( ForceCollect :: No ) ) ?;
938
- let module = ast:: ForeignMod { unsafety, abi, items } ;
939
- Ok ( ( Ident :: empty ( ) , ItemKind :: ForeignMod ( module) ) )
938
+ match self . parse_item_list ( attrs, |p| p. parse_foreign_item ( ForceCollect :: No ) ) {
939
+ Ok ( items) => {
940
+ let module = ast:: ForeignMod { unsafety, abi, items } ;
941
+ Ok ( ( Ident :: empty ( ) , ItemKind :: ForeignMod ( module) ) )
942
+ }
943
+ Err ( mut err) => {
944
+ let current_qual_sp = self . prev_token . span ;
945
+ let current_qual_sp = current_qual_sp. to ( sp_start) ;
946
+ if let Ok ( current_qual) = self . span_to_snippet ( current_qual_sp) {
947
+ if err. message ( ) == "expected `{`, found keyword `unsafe`" {
948
+ let invalid_qual_sp = self . token . uninterpolated_span ( ) ;
949
+ let invalid_qual = self . span_to_snippet ( invalid_qual_sp) . unwrap ( ) ;
950
+
951
+ err. span_suggestion (
952
+ current_qual_sp. to ( invalid_qual_sp) ,
953
+ & format ! ( "`{}` must come before `{}`" , invalid_qual, current_qual) ,
954
+ format ! ( "{} {}" , invalid_qual, current_qual) ,
955
+ Applicability :: MachineApplicable ,
956
+ ) . note ( "keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`" ) ;
957
+ }
958
+ }
959
+ Err ( err)
960
+ }
961
+ }
940
962
}
941
963
942
964
/// Parses a foreign item (one in an `extern { ... }` block).
0 commit comments