@@ -549,7 +549,7 @@ impl<'a> Parser<'a> {
549
549
-> Self {
550
550
let mut parser = Parser {
551
551
sess,
552
- token : token:: Underscore ,
552
+ token : token:: Whitespace ,
553
553
span : syntax_pos:: DUMMY_SP ,
554
554
prev_span : syntax_pos:: DUMMY_SP ,
555
555
meta_var_span : None ,
@@ -800,11 +800,7 @@ impl<'a> Parser<'a> {
800
800
Err ( if self . prev_token_kind == PrevTokenKind :: DocComment {
801
801
self . span_fatal_err ( self . prev_span , Error :: UselessDocComment )
802
802
} else {
803
- let mut err = self . expected_ident_found ( ) ;
804
- if self . token == token:: Underscore {
805
- err. note ( "`_` is a wildcard pattern, not an identifier" ) ;
806
- }
807
- err
803
+ self . expected_ident_found ( )
808
804
} )
809
805
}
810
806
}
@@ -1602,7 +1598,7 @@ impl<'a> Parser<'a> {
1602
1598
let e = self . parse_expr ( ) ?;
1603
1599
self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
1604
1600
TyKind :: Typeof ( e)
1605
- } else if self . eat ( & token :: Underscore ) {
1601
+ } else if self . eat_keyword ( keywords :: Underscore ) {
1606
1602
// A type to be inferred `_`
1607
1603
TyKind :: Infer
1608
1604
} else if self . token_is_bare_fn_keyword ( ) {
@@ -1796,7 +1792,7 @@ impl<'a> Parser<'a> {
1796
1792
_ => 0 ,
1797
1793
} ;
1798
1794
1799
- self . look_ahead ( offset, |t| t. is_ident ( ) || t == & token :: Underscore ) &&
1795
+ self . look_ahead ( offset, |t| t. is_ident ( ) ) &&
1800
1796
self . look_ahead ( offset + 1 , |t| t == & token:: Colon )
1801
1797
}
1802
1798
@@ -2782,7 +2778,7 @@ impl<'a> Parser<'a> {
2782
2778
} ,
2783
2779
token:: CloseDelim ( _) | token:: Eof => unreachable ! ( ) ,
2784
2780
_ => {
2785
- let ( token, span) = ( mem:: replace ( & mut self . token , token:: Underscore ) , self . span ) ;
2781
+ let ( token, span) = ( mem:: replace ( & mut self . token , token:: Whitespace ) , self . span ) ;
2786
2782
self . bump ( ) ;
2787
2783
TokenTree :: Token ( span, token)
2788
2784
}
@@ -3815,11 +3811,6 @@ impl<'a> Parser<'a> {
3815
3811
let lo = self . span ;
3816
3812
let pat;
3817
3813
match self . token {
3818
- token:: Underscore => {
3819
- // Parse _
3820
- self . bump ( ) ;
3821
- pat = PatKind :: Wild ;
3822
- }
3823
3814
token:: BinOp ( token:: And ) | token:: AndAnd => {
3824
3815
// Parse &pat / &mut pat
3825
3816
self . expect_and ( ) ?;
@@ -3849,8 +3840,11 @@ impl<'a> Parser<'a> {
3849
3840
self . expect ( & token:: CloseDelim ( token:: Bracket ) ) ?;
3850
3841
pat = PatKind :: Slice ( before, slice, after) ;
3851
3842
}
3852
- // At this point, token != _, &, &&, (, [
3853
- _ => if self . eat_keyword ( keywords:: Mut ) {
3843
+ // At this point, token != &, &&, (, [
3844
+ _ => if self . eat_keyword ( keywords:: Underscore ) {
3845
+ // Parse _
3846
+ pat = PatKind :: Wild ;
3847
+ } else if self . eat_keyword ( keywords:: Mut ) {
3854
3848
// Parse mut ident @ pat / mut ref ident @ pat
3855
3849
let mutref_span = self . prev_span . to ( self . span ) ;
3856
3850
let binding_mode = if self . eat_keyword ( keywords:: Ref ) {
@@ -7065,10 +7059,12 @@ impl<'a> Parser<'a> {
7065
7059
7066
7060
fn parse_rename ( & mut self ) -> PResult < ' a , Option < Ident > > {
7067
7061
if self . eat_keyword ( keywords:: As ) {
7068
- if self . eat ( & token:: Underscore ) {
7069
- Ok ( Some ( Ident :: with_empty_ctxt ( Symbol :: gensym ( "_" ) ) ) )
7070
- } else {
7071
- self . parse_ident ( ) . map ( Some )
7062
+ match self . token {
7063
+ token:: Ident ( ident) if ident. name == keywords:: Underscore . name ( ) => {
7064
+ self . bump ( ) ; // `_`
7065
+ Ok ( Some ( Ident { name : ident. name . gensymed ( ) , ..ident } ) )
7066
+ }
7067
+ _ => self . parse_ident ( ) . map ( Some ) ,
7072
7068
}
7073
7069
} else {
7074
7070
Ok ( None )
0 commit comments