diff options
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/obsolete.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 17 |
2 files changed, 26 insertions, 1 deletions
diff --git a/src/libsyntax/parse/obsolete.rs b/src/libsyntax/parse/obsolete.rs index 20ad13dace6..8fb96a3e07a 100644 --- a/src/libsyntax/parse/obsolete.rs +++ b/src/libsyntax/parse/obsolete.rs @@ -39,6 +39,8 @@ pub enum ObsoleteSyntax { ObsoleteConstPointer, ObsoleteEmptyImpl, ObsoleteLoopAsContinue, + ObsoleteEnumWildcard, + ObsoleteStructWildcard } impl to_bytes::IterBytes for ObsoleteSyntax { @@ -113,6 +115,14 @@ impl ParserObsoleteMethods for Parser { "`loop` is now only used for loops and `continue` is used for \ skipping iterations" ), + ObsoleteEnumWildcard => ( + "enum wildcard", + "use `..` instead of `*` for matching all enum fields" + ), + ObsoleteStructWildcard => ( + "struct wildcard", + "use `..` instead of `_` for matching trailing struct fields" + ), }; self.report(sp, kind, kind_str, desc); diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index ad5da0b9289..ea861305d9f 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2755,7 +2755,12 @@ impl Parser { if first { first = false; } else { self.expect(&token::COMMA); } + etc = *self.token == token::UNDERSCORE || *self.token == token::DOTDOT; if *self.token == token::UNDERSCORE { + // FIXME #5830 activate after snapshot + // self.obsolete(*self.span, ObsoleteStructWildcard); + } + if etc { self.bump(); if *self.token != token::RBRACE { self.fatal( @@ -3016,9 +3021,19 @@ impl Parser { _ => false, } }; - if is_star { + let is_dotdot = do self.look_ahead(1) |t| { + match *t { + token::DOTDOT => true, + _ => false, + } + }; + if is_star | is_dotdot { // This is a "top constructor only" pat self.bump(); + if is_star { + // FIXME #5830 activate after snapshot + // self.obsolete(*self.span, ObsoleteEnumWildcard); + } self.bump(); self.expect(&token::RPAREN); pat = PatEnum(enum_path, None); |
