@@ -5001,6 +5001,11 @@ impl<'a> Parser<'a> {
5001
5001
)
5002
5002
}
5003
5003
5004
+ fn is_async_fn ( & mut self ) -> bool {
5005
+ self . token . is_keyword ( keywords:: Async ) &&
5006
+ self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Fn ) )
5007
+ }
5008
+
5004
5009
fn is_do_catch_block ( & mut self ) -> bool {
5005
5010
self . token . is_keyword ( keywords:: Do ) &&
5006
5011
self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Catch ) ) &&
@@ -5133,7 +5138,8 @@ impl<'a> Parser<'a> {
5133
5138
!self . is_union_item ( ) &&
5134
5139
!self . is_crate_vis ( ) &&
5135
5140
!self . is_existential_type_decl ( ) &&
5136
- !self . is_auto_trait_item ( ) {
5141
+ !self . is_auto_trait_item ( ) &&
5142
+ !self . is_async_fn ( ) {
5137
5143
let pth = self . parse_path ( PathStyle :: Expr ) ?;
5138
5144
5139
5145
if !self . eat ( & token:: Not ) {
@@ -6384,7 +6390,7 @@ impl<'a> Parser<'a> {
6384
6390
/// Parses an item-position function declaration.
6385
6391
fn parse_item_fn ( & mut self ,
6386
6392
unsafety : Unsafety ,
6387
- asyncness : IsAsync ,
6393
+ asyncness : Spanned < IsAsync > ,
6388
6394
constness : Spanned < Constness > ,
6389
6395
abi : Abi )
6390
6396
-> PResult < ' a , ItemInfo > {
@@ -6416,14 +6422,15 @@ impl<'a> Parser<'a> {
6416
6422
-> PResult < ' a , (
6417
6423
Spanned < Constness > ,
6418
6424
Unsafety ,
6419
- IsAsync ,
6425
+ Spanned < IsAsync > ,
6420
6426
Abi
6421
6427
) >
6422
6428
{
6423
6429
let is_const_fn = self . eat_keyword ( keywords:: Const ) ;
6424
6430
let const_span = self . prev_span ;
6425
6431
let unsafety = self . parse_unsafety ( ) ;
6426
6432
let asyncness = self . parse_asyncness ( ) ;
6433
+ let asyncness = respan ( self . prev_span , asyncness) ;
6427
6434
let ( constness, unsafety, abi) = if is_const_fn {
6428
6435
( respan ( const_span, Constness :: Const ) , unsafety, Abi :: Rust )
6429
6436
} else {
@@ -7834,7 +7841,7 @@ impl<'a> Parser<'a> {
7834
7841
let abi = opt_abi. unwrap_or ( Abi :: C ) ;
7835
7842
let ( ident, item_, extra_attrs) =
7836
7843
self . parse_item_fn ( Unsafety :: Normal ,
7837
- IsAsync :: NotAsync ,
7844
+ respan ( fn_span , IsAsync :: NotAsync ) ,
7838
7845
respan ( fn_span, Constness :: NotConst ) ,
7839
7846
abi) ?;
7840
7847
let prev_span = self . prev_span ;
@@ -7878,7 +7885,7 @@ impl<'a> Parser<'a> {
7878
7885
self . bump ( ) ;
7879
7886
let ( ident, item_, extra_attrs) =
7880
7887
self . parse_item_fn ( unsafety,
7881
- IsAsync :: NotAsync ,
7888
+ respan ( const_span , IsAsync :: NotAsync ) ,
7882
7889
respan ( const_span, Constness :: Const ) ,
7883
7890
Abi :: Rust ) ?;
7884
7891
let prev_span = self . prev_span ;
@@ -7926,14 +7933,15 @@ impl<'a> Parser<'a> {
7926
7933
// ASYNC FUNCTION ITEM
7927
7934
let unsafety = self . parse_unsafety ( ) ;
7928
7935
self . expect_keyword ( keywords:: Async ) ?;
7936
+ let async_span = self . prev_span ;
7929
7937
self . expect_keyword ( keywords:: Fn ) ?;
7930
7938
let fn_span = self . prev_span ;
7931
7939
let ( ident, item_, extra_attrs) =
7932
7940
self . parse_item_fn ( unsafety,
7933
- IsAsync :: Async {
7941
+ respan ( async_span , IsAsync :: Async {
7934
7942
closure_id : ast:: DUMMY_NODE_ID ,
7935
7943
return_impl_trait_id : ast:: DUMMY_NODE_ID ,
7936
- } ,
7944
+ } ) ,
7937
7945
respan ( fn_span, Constness :: NotConst ) ,
7938
7946
Abi :: Rust ) ?;
7939
7947
let prev_span = self . prev_span ;
@@ -7942,6 +7950,13 @@ impl<'a> Parser<'a> {
7942
7950
item_,
7943
7951
visibility,
7944
7952
maybe_append ( attrs, extra_attrs) ) ;
7953
+ if self . span . rust_2015 ( ) {
7954
+ self . diagnostic ( ) . struct_span_err_with_code (
7955
+ async_span,
7956
+ "`async fn` is not permitted in the 2015 edition" ,
7957
+ DiagnosticId :: Error ( "E0670" . into ( ) )
7958
+ ) . emit ( ) ;
7959
+ }
7945
7960
return Ok ( Some ( item) ) ;
7946
7961
}
7947
7962
if self . check_keyword ( keywords:: Unsafe ) &&
@@ -7989,7 +8004,7 @@ impl<'a> Parser<'a> {
7989
8004
let fn_span = self . prev_span ;
7990
8005
let ( ident, item_, extra_attrs) =
7991
8006
self . parse_item_fn ( Unsafety :: Normal ,
7992
- IsAsync :: NotAsync ,
8007
+ respan ( fn_span , IsAsync :: NotAsync ) ,
7993
8008
respan ( fn_span, Constness :: NotConst ) ,
7994
8009
Abi :: Rust ) ?;
7995
8010
let prev_span = self . prev_span ;
@@ -8015,7 +8030,7 @@ impl<'a> Parser<'a> {
8015
8030
let fn_span = self . prev_span ;
8016
8031
let ( ident, item_, extra_attrs) =
8017
8032
self . parse_item_fn ( Unsafety :: Unsafe ,
8018
- IsAsync :: NotAsync ,
8033
+ respan ( fn_span , IsAsync :: NotAsync ) ,
8019
8034
respan ( fn_span, Constness :: NotConst ) ,
8020
8035
abi) ?;
8021
8036
let prev_span = self . prev_span ;
@@ -8282,7 +8297,8 @@ impl<'a> Parser<'a> {
8282
8297
lo : Span ,
8283
8298
visibility : Visibility
8284
8299
) -> PResult < ' a , Option < P < Item > > > {
8285
- if macros_allowed && self . token . is_path_start ( ) {
8300
+ if macros_allowed && self . token . is_path_start ( ) &&
8301
+ !( self . is_async_fn ( ) && self . span . rust_2015 ( ) ) {
8286
8302
// MACRO INVOCATION ITEM
8287
8303
8288
8304
let prev_span = self . prev_span ;
@@ -8337,7 +8353,8 @@ impl<'a> Parser<'a> {
8337
8353
fn parse_assoc_macro_invoc ( & mut self , item_kind : & str , vis : Option < & Visibility > ,
8338
8354
at_end : & mut bool ) -> PResult < ' a , Option < Mac > >
8339
8355
{
8340
- if self . token . is_path_start ( ) {
8356
+ if self . token . is_path_start ( ) &&
8357
+ !( self . is_async_fn ( ) && self . span . rust_2015 ( ) ) {
8341
8358
let prev_span = self . prev_span ;
8342
8359
let lo = self . span ;
8343
8360
let pth = self . parse_path ( PathStyle :: Mod ) ?;
0 commit comments