@@ -3620,7 +3620,7 @@ impl<'a> Parser<'a> {
36203620 // Parse box pat
36213621 let subpat = self . parse_pat ( ) ?;
36223622 pat = PatKind :: Box ( subpat) ;
3623- } else if self . token . is_ident ( ) && self . token . is_path_start ( ) &&
3623+ } else if self . token . is_ident ( ) && ! self . token . is_any_keyword ( ) &&
36243624 self . look_ahead ( 1 , |t| match * t {
36253625 token:: OpenDelim ( token:: Paren ) | token:: OpenDelim ( token:: Brace ) |
36263626 token:: DotDotDot | token:: ModSep | token:: Not => false ,
@@ -3871,6 +3871,11 @@ impl<'a> Parser<'a> {
38713871 } )
38723872 }
38733873
3874+ fn is_union_item ( & mut self ) -> bool {
3875+ self . token . is_keyword ( keywords:: Union ) &&
3876+ self . look_ahead ( 1 , |t| t. is_ident ( ) && !t. is_any_keyword ( ) )
3877+ }
3878+
38743879 fn parse_stmt_without_recovery ( & mut self ,
38753880 macro_legacy_warnings : bool )
38763881 -> PResult < ' a , Option < Stmt > > {
@@ -3885,10 +3890,10 @@ impl<'a> Parser<'a> {
38853890 node : StmtKind :: Local ( self . parse_local ( attrs. into ( ) ) ?) ,
38863891 span : mk_sp ( lo, self . prev_span . hi ) ,
38873892 }
3888- } else if self . token . is_path_start ( ) && self . token != token :: Lt && {
3889- ! self . check_keyword ( keywords :: Union ) ||
3890- self . look_ahead ( 1 , |t| * t == token :: Not || * t == token:: ModSep )
3891- } {
3893+ // Starts like a simple path, but not a union item.
3894+ } else if self . token . is_path_start ( ) &&
3895+ ! self . token . is_qpath_start ( ) &&
3896+ ! self . is_union_item ( ) {
38923897 let pth = self . parse_path ( PathStyle :: Expr ) ?;
38933898
38943899 if !self . eat ( & token:: Not ) {
@@ -4599,6 +4604,10 @@ impl<'a> Parser<'a> {
45994604 token:: Ident ( ident) => { this. bump ( ) ; codemap:: respan ( this. prev_span , ident) }
46004605 _ => unreachable ! ( )
46014606 } ;
4607+ let isolated_self = |this : & mut Self , n| {
4608+ this. look_ahead ( n, |t| t. is_keyword ( keywords:: SelfValue ) ) &&
4609+ this. look_ahead ( n + 1 , |t| t != & token:: ModSep )
4610+ } ;
46024611
46034612 // Parse optional self parameter of a method.
46044613 // Only a limited set of initial token sequences is considered self parameters, anything
@@ -4611,22 +4620,22 @@ impl<'a> Parser<'a> {
46114620 // &'lt self
46124621 // &'lt mut self
46134622 // ¬_self
4614- if self . look_ahead ( 1 , |t| t . is_keyword ( keywords :: SelfValue ) ) {
4623+ if isolated_self ( self , 1 ) {
46154624 self . bump ( ) ;
46164625 ( SelfKind :: Region ( None , Mutability :: Immutable ) , expect_ident ( self ) )
46174626 } else if self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Mut ) ) &&
4618- self . look_ahead ( 2 , |t| t . is_keyword ( keywords :: SelfValue ) ) {
4627+ isolated_self ( self , 2 ) {
46194628 self . bump ( ) ;
46204629 self . bump ( ) ;
46214630 ( SelfKind :: Region ( None , Mutability :: Mutable ) , expect_ident ( self ) )
46224631 } else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) ) &&
4623- self . look_ahead ( 2 , |t| t . is_keyword ( keywords :: SelfValue ) ) {
4632+ isolated_self ( self , 2 ) {
46244633 self . bump ( ) ;
46254634 let lt = self . parse_lifetime ( ) ?;
46264635 ( SelfKind :: Region ( Some ( lt) , Mutability :: Immutable ) , expect_ident ( self ) )
46274636 } else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) ) &&
46284637 self . look_ahead ( 2 , |t| t. is_keyword ( keywords:: Mut ) ) &&
4629- self . look_ahead ( 3 , |t| t . is_keyword ( keywords :: SelfValue ) ) {
4638+ isolated_self ( self , 3 ) {
46304639 self . bump ( ) ;
46314640 let lt = self . parse_lifetime ( ) ?;
46324641 self . bump ( ) ;
@@ -4641,12 +4650,12 @@ impl<'a> Parser<'a> {
46414650 // *mut self
46424651 // *not_self
46434652 // Emit special error for `self` cases.
4644- if self . look_ahead ( 1 , |t| t . is_keyword ( keywords :: SelfValue ) ) {
4653+ if isolated_self ( self , 1 ) {
46454654 self . bump ( ) ;
46464655 self . span_err ( self . span , "cannot pass `self` by raw pointer" ) ;
46474656 ( SelfKind :: Value ( Mutability :: Immutable ) , expect_ident ( self ) )
46484657 } else if self . look_ahead ( 1 , |t| t. is_mutability ( ) ) &&
4649- self . look_ahead ( 2 , |t| t . is_keyword ( keywords :: SelfValue ) ) {
4658+ isolated_self ( self , 2 ) {
46504659 self . bump ( ) ;
46514660 self . bump ( ) ;
46524661 self . span_err ( self . span , "cannot pass `self` by raw pointer" ) ;
@@ -4656,7 +4665,7 @@ impl<'a> Parser<'a> {
46564665 }
46574666 }
46584667 token:: Ident ( ..) => {
4659- if self . token . is_keyword ( keywords :: SelfValue ) {
4668+ if isolated_self ( self , 0 ) {
46604669 // self
46614670 // self: TYPE
46624671 let eself_ident = expect_ident ( self ) ;
@@ -4667,7 +4676,7 @@ impl<'a> Parser<'a> {
46674676 ( SelfKind :: Value ( Mutability :: Immutable ) , eself_ident)
46684677 }
46694678 } else if self . token . is_keyword ( keywords:: Mut ) &&
4670- self . look_ahead ( 1 , |t| t . is_keyword ( keywords :: SelfValue ) ) {
4679+ isolated_self ( self , 1 ) {
46714680 // mut self
46724681 // mut self: TYPE
46734682 self . bump ( ) ;
@@ -5958,8 +5967,7 @@ impl<'a> Parser<'a> {
59585967 maybe_append ( attrs, extra_attrs) ) ;
59595968 return Ok ( Some ( item) ) ;
59605969 }
5961- if self . check_keyword ( keywords:: Union ) &&
5962- self . look_ahead ( 1 , |t| t. is_ident ( ) && !t. is_any_keyword ( ) ) {
5970+ if self . is_union_item ( ) {
59635971 // UNION ITEM
59645972 self . bump ( ) ;
59655973 let ( ident, item_, extra_attrs) = self . parse_item_union ( ) ?;
0 commit comments