@@ -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 ) {
@@ -6346,7 +6352,7 @@ impl<'a> Parser<'a> {
6346
6352
/// Parses an item-position function declaration.
6347
6353
fn parse_item_fn ( & mut self ,
6348
6354
unsafety : Unsafety ,
6349
- asyncness : IsAsync ,
6355
+ asyncness : Spanned < IsAsync > ,
6350
6356
constness : Spanned < Constness > ,
6351
6357
abi : Abi )
6352
6358
-> PResult < ' a , ItemInfo > {
@@ -6378,14 +6384,15 @@ impl<'a> Parser<'a> {
6378
6384
-> PResult < ' a , (
6379
6385
Spanned < Constness > ,
6380
6386
Unsafety ,
6381
- IsAsync ,
6387
+ Spanned < IsAsync > ,
6382
6388
Abi
6383
6389
) >
6384
6390
{
6385
6391
let is_const_fn = self . eat_keyword ( keywords:: Const ) ;
6386
6392
let const_span = self . prev_span ;
6387
6393
let unsafety = self . parse_unsafety ( ) ;
6388
6394
let asyncness = self . parse_asyncness ( ) ;
6395
+ let asyncness = respan ( self . prev_span , asyncness) ;
6389
6396
let ( constness, unsafety, abi) = if is_const_fn {
6390
6397
( respan ( const_span, Constness :: Const ) , unsafety, Abi :: Rust )
6391
6398
} else {
@@ -7796,7 +7803,7 @@ impl<'a> Parser<'a> {
7796
7803
let abi = opt_abi. unwrap_or ( Abi :: C ) ;
7797
7804
let ( ident, item_, extra_attrs) =
7798
7805
self . parse_item_fn ( Unsafety :: Normal ,
7799
- IsAsync :: NotAsync ,
7806
+ respan ( fn_span , IsAsync :: NotAsync ) ,
7800
7807
respan ( fn_span, Constness :: NotConst ) ,
7801
7808
abi) ?;
7802
7809
let prev_span = self . prev_span ;
@@ -7840,7 +7847,7 @@ impl<'a> Parser<'a> {
7840
7847
self . bump ( ) ;
7841
7848
let ( ident, item_, extra_attrs) =
7842
7849
self . parse_item_fn ( unsafety,
7843
- IsAsync :: NotAsync ,
7850
+ respan ( const_span , IsAsync :: NotAsync ) ,
7844
7851
respan ( const_span, Constness :: Const ) ,
7845
7852
Abi :: Rust ) ?;
7846
7853
let prev_span = self . prev_span ;
@@ -7888,14 +7895,15 @@ impl<'a> Parser<'a> {
7888
7895
// ASYNC FUNCTION ITEM
7889
7896
let unsafety = self . parse_unsafety ( ) ;
7890
7897
self . expect_keyword ( keywords:: Async ) ?;
7898
+ let async_span = self . prev_span ;
7891
7899
self . expect_keyword ( keywords:: Fn ) ?;
7892
7900
let fn_span = self . prev_span ;
7893
7901
let ( ident, item_, extra_attrs) =
7894
7902
self . parse_item_fn ( unsafety,
7895
- IsAsync :: Async {
7903
+ respan ( async_span , IsAsync :: Async {
7896
7904
closure_id : ast:: DUMMY_NODE_ID ,
7897
7905
return_impl_trait_id : ast:: DUMMY_NODE_ID ,
7898
- } ,
7906
+ } ) ,
7899
7907
respan ( fn_span, Constness :: NotConst ) ,
7900
7908
Abi :: Rust ) ?;
7901
7909
let prev_span = self . prev_span ;
@@ -7904,6 +7912,13 @@ impl<'a> Parser<'a> {
7904
7912
item_,
7905
7913
visibility,
7906
7914
maybe_append ( attrs, extra_attrs) ) ;
7915
+ if self . span . rust_2015 ( ) {
7916
+ self . diagnostic ( ) . struct_span_err_with_code (
7917
+ async_span,
7918
+ "`async fn` is not permitted in the 2015 edition" ,
7919
+ DiagnosticId :: Error ( "E0670" . into ( ) )
7920
+ ) . emit ( ) ;
7921
+ }
7907
7922
return Ok ( Some ( item) ) ;
7908
7923
}
7909
7924
if self . check_keyword ( keywords:: Unsafe ) &&
@@ -7951,7 +7966,7 @@ impl<'a> Parser<'a> {
7951
7966
let fn_span = self . prev_span ;
7952
7967
let ( ident, item_, extra_attrs) =
7953
7968
self . parse_item_fn ( Unsafety :: Normal ,
7954
- IsAsync :: NotAsync ,
7969
+ respan ( fn_span , IsAsync :: NotAsync ) ,
7955
7970
respan ( fn_span, Constness :: NotConst ) ,
7956
7971
Abi :: Rust ) ?;
7957
7972
let prev_span = self . prev_span ;
@@ -7977,7 +7992,7 @@ impl<'a> Parser<'a> {
7977
7992
let fn_span = self . prev_span ;
7978
7993
let ( ident, item_, extra_attrs) =
7979
7994
self . parse_item_fn ( Unsafety :: Unsafe ,
7980
- IsAsync :: NotAsync ,
7995
+ respan ( fn_span , IsAsync :: NotAsync ) ,
7981
7996
respan ( fn_span, Constness :: NotConst ) ,
7982
7997
abi) ?;
7983
7998
let prev_span = self . prev_span ;
@@ -8244,7 +8259,8 @@ impl<'a> Parser<'a> {
8244
8259
lo : Span ,
8245
8260
visibility : Visibility
8246
8261
) -> PResult < ' a , Option < P < Item > > > {
8247
- if macros_allowed && self . token . is_path_start ( ) {
8262
+ if macros_allowed && self . token . is_path_start ( ) &&
8263
+ !( self . is_async_fn ( ) && self . span . rust_2015 ( ) ) {
8248
8264
// MACRO INVOCATION ITEM
8249
8265
8250
8266
let prev_span = self . prev_span ;
@@ -8299,7 +8315,8 @@ impl<'a> Parser<'a> {
8299
8315
fn parse_assoc_macro_invoc ( & mut self , item_kind : & str , vis : Option < & Visibility > ,
8300
8316
at_end : & mut bool ) -> PResult < ' a , Option < Mac > >
8301
8317
{
8302
- if self . token . is_path_start ( ) {
8318
+ if self . token . is_path_start ( ) &&
8319
+ !( self . is_async_fn ( ) && self . span . rust_2015 ( ) ) {
8303
8320
let prev_span = self . prev_span ;
8304
8321
let lo = self . span ;
8305
8322
let pth = self . parse_path ( PathStyle :: Mod ) ?;
0 commit comments