@@ -43,7 +43,7 @@ use ast::{MutImmutable, MutMutable, mac_, mac_invoc_tt, matcher, match_nontermin
43
43
use ast:: { match_seq, match_tok, method, mt, BiMul , Mutability } ;
44
44
use ast:: { named_field, UnNeg , noreturn, UnNot , Pat , PatBox , PatEnum } ;
45
45
use ast:: { PatIdent , PatLit , PatRange , PatRegion , PatStruct } ;
46
- use ast:: { PatTup , PatUniq , PatWild , private} ;
46
+ use ast:: { PatTup , PatUniq , PatWild , PatWildMulti , private} ;
47
47
use ast:: { BiRem , required} ;
48
48
use ast:: { ret_style, return_val, BiShl , BiShr , Stmt , StmtDecl } ;
49
49
use ast:: { StmtExpr , StmtSemi , StmtMac , struct_def, struct_field} ;
@@ -2724,17 +2724,35 @@ impl Parser {
2724
2724
}
2725
2725
}
2726
2726
2727
- let subpat = self . parse_pat ( ) ;
2728
2727
if is_slice {
2729
- match subpat {
2730
- @ast:: Pat { node : PatWild , _ } => ( ) ,
2731
- @ast:: Pat { node : PatIdent ( _, _, _) , _ } => ( ) ,
2732
- @ast:: Pat { span, _ } => self . span_fatal (
2733
- span, "expected an identifier or `_`"
2734
- )
2728
+ if * self . token == token:: COMMA || * self . token == token:: RBRACKET {
2729
+ slice = Some ( @ast:: Pat {
2730
+ id : ast:: DUMMY_NODE_ID ,
2731
+ node : PatWildMulti ,
2732
+ span : * self . span ,
2733
+ } )
2734
+ } else {
2735
+ let subpat = self . parse_pat ( ) ;
2736
+ match subpat {
2737
+ @ast:: Pat { id, node : PatWild , span } => {
2738
+ // NOTE #5830 activate after snapshot
2739
+ // self.obsolete(*self.span, ObsoleteVecDotDotWildcard);
2740
+ slice = Some ( @ast:: Pat {
2741
+ id : id,
2742
+ node : PatWildMulti ,
2743
+ span : span
2744
+ } )
2745
+ } ,
2746
+ @ast:: Pat { node : PatIdent ( _, _, _) , _ } => {
2747
+ slice = Some ( subpat) ;
2748
+ }
2749
+ @ast:: Pat { span, _ } => self . span_fatal (
2750
+ span, "expected an identifier or nothing"
2751
+ )
2752
+ }
2735
2753
}
2736
- slice = Some ( subpat) ;
2737
2754
} else {
2755
+ let subpat = self . parse_pat ( ) ;
2738
2756
if before_slice {
2739
2757
before. push ( subpat) ;
2740
2758
} else {
@@ -2755,7 +2773,12 @@ impl Parser {
2755
2773
if first { first = false ; }
2756
2774
else { self . expect ( & token:: COMMA ) ; }
2757
2775
2776
+ etc = * self . token == token:: UNDERSCORE || * self . token == token:: DOTDOT ;
2758
2777
if * self . token == token:: UNDERSCORE {
2778
+ // NOTE #5830 activate after snapshot
2779
+ // self.obsolete(*self.span, ObsoleteStructWildcard);
2780
+ }
2781
+ if etc {
2759
2782
self . bump ( ) ;
2760
2783
if * self . token != token:: RBRACE {
2761
2784
self . fatal (
@@ -3016,9 +3039,19 @@ impl Parser {
3016
3039
_ => false ,
3017
3040
}
3018
3041
} ;
3019
- if is_star {
3042
+ let is_dotdot = do self . look_ahead ( 1 ) |t| {
3043
+ match * t {
3044
+ token:: DOTDOT => true ,
3045
+ _ => false ,
3046
+ }
3047
+ } ;
3048
+ if is_star | is_dotdot {
3020
3049
// This is a "top constructor only" pat
3021
3050
self . bump ( ) ;
3051
+ if is_star {
3052
+ // NOTE #5830 activate after snapshot
3053
+ // self.obsolete(*self.span, ObsoleteEnumWildcard);
3054
+ }
3022
3055
self . bump ( ) ;
3023
3056
self . expect ( & token:: RPAREN ) ;
3024
3057
pat = PatEnum ( enum_path, None ) ;
0 commit comments