@@ -1063,6 +1063,17 @@ impl<'a> Parser<'a> {
1063
1063
}
1064
1064
}
1065
1065
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
+
1066
1077
fn parse_field_name ( & mut self ) -> PResult < ' a , Ident > {
1067
1078
if let token:: Literal ( token:: Lit { kind : token:: Integer , symbol, suffix } ) =
1068
1079
self . token . kind {
@@ -1276,6 +1287,17 @@ impl<'a> Parser<'a> {
1276
1287
}
1277
1288
}
1278
1289
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
+
1279
1301
/// Parse `self` or `self: TYPE`. We already know the current token is `self`.
1280
1302
fn parse_self_possibly_typed ( & mut self , m : Mutability ) -> PResult < ' a , ( SelfKind , Ident , Span ) > {
1281
1303
let eself_ident = self . expect_self_ident ( ) ;
@@ -1327,30 +1349,19 @@ impl<'a> Parser<'a> {
1327
1349
return Ok ( None ) ;
1328
1350
} , self . expect_self_ident ( ) , self . prev_span )
1329
1351
}
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 ( ) ?
1354
1365
}
1355
1366
// `self` and `self: TYPE`
1356
1367
token:: Ident ( ..) if self . is_isolated_self ( 0 ) => {
0 commit comments