@@ -1063,6 +1063,17 @@ impl<'a> Parser<'a> {
10631063 }
10641064 }
10651065
1066+ /// Possibly parses mutability (`const` or `mut`).
1067+ fn parse_const_or_mut ( & mut self ) -> Option < Mutability > {
1068+ if self . eat_keyword ( kw:: Mut ) {
1069+ Some ( Mutability :: Mutable )
1070+ } else if self . eat_keyword ( kw:: Const ) {
1071+ Some ( Mutability :: Immutable )
1072+ } else {
1073+ None
1074+ }
1075+ }
1076+
10661077 fn parse_field_name ( & mut self ) -> PResult < ' a , Ident > {
10671078 if let token:: Literal ( token:: Lit { kind : token:: Integer , symbol, suffix } ) =
10681079 self . token . kind {
@@ -1276,6 +1287,17 @@ impl<'a> Parser<'a> {
12761287 }
12771288 }
12781289
1290+ /// Recover for the grammar `*self`, `*const self`, and `*mut self`.
1291+ fn recover_self_ptr ( & mut self ) -> PResult < ' a , ( ast:: SelfKind , Ident , Span ) > {
1292+ let msg = "cannot pass `self` by raw pointer" ;
1293+ let span = self . token . span ;
1294+ self . struct_span_err ( span, msg)
1295+ . span_label ( span, msg)
1296+ . emit ( ) ;
1297+
1298+ Ok ( ( SelfKind :: Value ( Mutability :: Immutable ) , self . expect_self_ident ( ) , self . prev_span ) )
1299+ }
1300+
12791301 /// Parse `self` or `self: TYPE`. We already know the current token is `self`.
12801302 fn parse_self_possibly_typed ( & mut self , m : Mutability ) -> PResult < ' a , ( SelfKind , Ident , Span ) > {
12811303 let eself_ident = self . expect_self_ident ( ) ;
@@ -1327,30 +1349,19 @@ impl<'a> Parser<'a> {
13271349 return Ok ( None ) ;
13281350 } , self . expect_self_ident ( ) , self . prev_span )
13291351 }
1330- token:: BinOp ( token:: Star ) => {
1331- // `*self`
1332- // `*const self`
1333- // `*mut self`
1334- // `*not_self`
1335- // Emit special error for `self` cases.
1336- let msg = "cannot pass `self` by raw pointer" ;
1337- ( if self . is_isolated_self ( 1 ) {
1338- self . bump ( ) ;
1339- self . struct_span_err ( self . token . span , msg)
1340- . span_label ( self . token . span , msg)
1341- . emit ( ) ;
1342- SelfKind :: Value ( Mutability :: Immutable )
1343- } else if self . look_ahead ( 1 , |t| t. is_mutability ( ) ) &&
1344- self . is_isolated_self ( 2 ) {
1345- self . bump ( ) ;
1346- self . bump ( ) ;
1347- self . struct_span_err ( self . token . span , msg)
1348- . span_label ( self . token . span , msg)
1349- . emit ( ) ;
1350- SelfKind :: Value ( Mutability :: Immutable )
1351- } else {
1352- return Ok ( None ) ;
1353- } , self . expect_self_ident ( ) , self . prev_span )
1352+ // `*self`
1353+ token:: BinOp ( token:: Star ) if self . is_isolated_self ( 1 ) => {
1354+ self . bump ( ) ;
1355+ self . recover_self_ptr ( ) ?
1356+ }
1357+ // `*mut self` and `*const self`
1358+ token:: BinOp ( token:: Star ) if
1359+ self . look_ahead ( 1 , |t| t. is_mutability ( ) )
1360+ && self . is_isolated_self ( 2 ) =>
1361+ {
1362+ self . bump ( ) ;
1363+ self . bump ( ) ;
1364+ self . recover_self_ptr ( ) ?
13541365 }
13551366 // `self` and `self: TYPE`
13561367 token:: Ident ( ..) if self . is_isolated_self ( 0 ) => {
0 commit comments