@@ -4084,14 +4084,14 @@ impl<'a> Parser<'a> {
4084
4084
self . token . is_keyword ( keywords:: Extern ) && self . look_ahead ( 1 , |t| t != & token:: ModSep )
4085
4085
}
4086
4086
4087
- fn eat_auto_trait ( & mut self ) -> bool {
4088
- if self . token . is_keyword ( keywords :: Auto )
4089
- && self . look_ahead ( 1 , |t| t . is_keyword ( keywords:: Trait ) )
4090
- {
4091
- self . eat_keyword ( keywords :: Auto ) && self . eat_keyword ( keywords :: Trait )
4092
- } else {
4093
- false
4094
- }
4087
+ fn is_auto_trait_item ( & mut self ) -> bool {
4088
+ // auto trait
4089
+ ( self . token . is_keyword ( keywords:: Auto )
4090
+ && self . look_ahead ( 1 , |t| t . is_keyword ( keywords :: Trait ) ) )
4091
+ || // unsafe auto trait
4092
+ ( self . token . is_keyword ( keywords :: Unsafe ) &&
4093
+ self . look_ahead ( 1 , |t| t . is_keyword ( keywords :: Auto ) ) &&
4094
+ self . look_ahead ( 2 , |t| t . is_keyword ( keywords :: Trait ) ) )
4095
4095
}
4096
4096
4097
4097
fn is_defaultness ( & self ) -> bool {
@@ -4194,7 +4194,8 @@ impl<'a> Parser<'a> {
4194
4194
node : StmtKind :: Item ( macro_def) ,
4195
4195
span : lo. to ( self . prev_span ) ,
4196
4196
}
4197
- // Starts like a simple path, but not a union item or item with `crate` visibility.
4197
+ // Starts like a simple path, being careful to avoid contextual keywords
4198
+ // such as a union items, item with `crate` visibility or auto trait items.
4198
4199
// Our goal here is to parse an arbitrary path `a::b::c` but not something that starts
4199
4200
// like a path (1 token), but it fact not a path.
4200
4201
// `union::b::c` - path, `union U { ... }` - not a path.
@@ -4204,7 +4205,8 @@ impl<'a> Parser<'a> {
4204
4205
!self . token . is_qpath_start ( ) &&
4205
4206
!self . is_union_item ( ) &&
4206
4207
!self . is_crate_vis ( ) &&
4207
- !self . is_extern_non_path ( ) {
4208
+ !self . is_extern_non_path ( ) &&
4209
+ !self . is_auto_trait_item ( ) {
4208
4210
let pth = self . parse_path ( PathStyle :: Expr ) ?;
4209
4211
4210
4212
if !self . eat ( & token:: Not ) {
@@ -6368,7 +6370,8 @@ impl<'a> Parser<'a> {
6368
6370
let is_auto = if self . eat_keyword ( keywords:: Trait ) {
6369
6371
IsAuto :: No
6370
6372
} else {
6371
- self . eat_auto_trait ( ) ;
6373
+ self . eat_keyword ( keywords:: Auto ) ;
6374
+ self . eat_keyword ( keywords:: Trait ) ;
6372
6375
IsAuto :: Yes
6373
6376
} ;
6374
6377
let ( ident, item_, extra_attrs) =
@@ -6482,7 +6485,8 @@ impl<'a> Parser<'a> {
6482
6485
let is_auto = if self . eat_keyword ( keywords:: Trait ) {
6483
6486
IsAuto :: No
6484
6487
} else {
6485
- self . eat_auto_trait ( ) ;
6488
+ self . eat_keyword ( keywords:: Auto ) ;
6489
+ self . eat_keyword ( keywords:: Trait ) ;
6486
6490
IsAuto :: Yes
6487
6491
} ;
6488
6492
// TRAIT ITEM
0 commit comments