@@ -7205,44 +7205,41 @@ impl<'a> Parser<'a> {
7205
7205
return Ok ( Some ( item) ) ;
7206
7206
}
7207
7207
7208
- // `unsafe async fn` or `async fn`
7209
- if (
7210
- self . check_keyword ( kw:: Unsafe ) &&
7211
- self . is_keyword_ahead ( 1 , & [ kw:: Async ] )
7212
- ) || (
7213
- self . check_keyword ( kw:: Async ) &&
7214
- self . is_keyword_ahead ( 1 , & [ kw:: Fn ] )
7215
- )
7216
- {
7217
- // ASYNC FUNCTION ITEM
7218
- let unsafety = self . parse_unsafety ( ) ;
7219
- self . expect_keyword ( kw:: Async ) ?;
7220
- let async_span = self . prev_span ;
7221
- self . expect_keyword ( kw:: Fn ) ?;
7222
- let fn_span = self . prev_span ;
7223
- let ( ident, item_, extra_attrs) =
7224
- self . parse_item_fn ( unsafety,
7225
- respan ( async_span, IsAsync :: Async {
7226
- closure_id : ast:: DUMMY_NODE_ID ,
7227
- return_impl_trait_id : ast:: DUMMY_NODE_ID ,
7228
- arguments : Vec :: new ( ) ,
7229
- } ) ,
7230
- respan ( fn_span, Constness :: NotConst ) ,
7231
- Abi :: Rust ) ?;
7232
- let prev_span = self . prev_span ;
7233
- let item = self . mk_item ( lo. to ( prev_span) ,
7234
- ident,
7235
- item_,
7236
- visibility,
7237
- maybe_append ( attrs, extra_attrs) ) ;
7238
- if self . span . rust_2015 ( ) {
7239
- self . diagnostic ( ) . struct_span_err_with_code (
7240
- async_span,
7241
- "`async fn` is not permitted in the 2015 edition" ,
7242
- DiagnosticId :: Error ( "E0670" . into ( ) )
7243
- ) . emit ( ) ;
7208
+ // Parse `async unsafe? fn`.
7209
+ if self . check_keyword ( kw:: Async ) {
7210
+ let async_span = self . span ;
7211
+ if self . is_keyword_ahead ( 1 , & [ kw:: Fn ] )
7212
+ || self . is_keyword_ahead ( 2 , & [ kw:: Fn ] )
7213
+ {
7214
+ // ASYNC FUNCTION ITEM
7215
+ self . bump ( ) ; // `async`
7216
+ let unsafety = self . parse_unsafety ( ) ; // `unsafe`?
7217
+ self . expect_keyword ( kw:: Fn ) ?; // `fn`
7218
+ let fn_span = self . prev_span ;
7219
+ let ( ident, item_, extra_attrs) =
7220
+ self . parse_item_fn ( unsafety,
7221
+ respan ( async_span, IsAsync :: Async {
7222
+ closure_id : ast:: DUMMY_NODE_ID ,
7223
+ return_impl_trait_id : ast:: DUMMY_NODE_ID ,
7224
+ arguments : Vec :: new ( ) ,
7225
+ } ) ,
7226
+ respan ( fn_span, Constness :: NotConst ) ,
7227
+ Abi :: Rust ) ?;
7228
+ let prev_span = self . prev_span ;
7229
+ let item = self . mk_item ( lo. to ( prev_span) ,
7230
+ ident,
7231
+ item_,
7232
+ visibility,
7233
+ maybe_append ( attrs, extra_attrs) ) ;
7234
+ if self . span . rust_2015 ( ) {
7235
+ self . diagnostic ( ) . struct_span_err_with_code (
7236
+ async_span,
7237
+ "`async fn` is not permitted in the 2015 edition" ,
7238
+ DiagnosticId :: Error ( "E0670" . into ( ) )
7239
+ ) . emit ( ) ;
7240
+ }
7241
+ return Ok ( Some ( item) ) ;
7244
7242
}
7245
- return Ok ( Some ( item) ) ;
7246
7243
}
7247
7244
if self . check_keyword ( kw:: Unsafe ) &&
7248
7245
self . is_keyword_ahead ( 1 , & [ kw:: Trait , kw:: Auto ] )
0 commit comments