about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-11-01 18:02:30 -0700
committerBrian Anderson <banderson@mozilla.com>2013-11-18 16:19:46 -0800
commit35e6c0252422b178cc3b21f7f1510c80bcd064c8 (patch)
treed4d861f5c53c260281728fdd11e6a8b6d6ed29bf /src
parent3d569df41de221ce5b0ffd385caaa9fd6d5fb2ff (diff)
downloadrust-35e6c0252422b178cc3b21f7f1510c80bcd064c8.tar.gz
rust-35e6c0252422b178cc3b21f7f1510c80bcd064c8.zip
Use '..' as multi-field wildcard in enums and structs.
Diffstat (limited to 'src')
-rw-r--r--src/libsyntax/parse/obsolete.rs10
-rw-r--r--src/libsyntax/parse/parser.rs17
-rw-r--r--src/test/run-pass/ignore-all-the-things.rs44
3 files changed, 70 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);
diff --git a/src/test/run-pass/ignore-all-the-things.rs b/src/test/run-pass/ignore-all-the-things.rs
new file mode 100644
index 00000000000..b71f139c684
--- /dev/null
+++ b/src/test/run-pass/ignore-all-the-things.rs
@@ -0,0 +1,44 @@
+// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+struct Foo(int, int, int, int);
+struct Bar{a: int, b: int, c: int, d: int}
+
+pub fn main() {
+    let Foo(..) = Foo(5, 5, 5, 5);
+    let Foo(*) = Foo(5, 5, 5, 5);
+    let Bar{..} = Bar{a: 5, b: 5, c: 5, d: 5};
+    let Bar{_} = Bar{a: 5, b: 5, c: 5, d: 5};
+    //let (..) = (5, 5, 5, 5);
+    //let Foo(a, b, ..) = Foo(5, 5, 5, 5);
+    //let Foo(.., d) = Foo(5, 5, 5, 5);
+    //let (a, b, ..) = (5, 5, 5, 5);
+    //let (.., c, d) = (5, 5, 5, 5);
+    let Bar{b: b, ..} = Bar{a: 5, b: 5, c: 5, d: 5};
+    let Bar{b: b, _} = Bar{a: 5, b: 5, c: 5, d: 5};
+    /*match [5, 5, 5, 5] {
+        [a, ..] => { }
+    }*/
+    /*match [5, 5, 5, 5] {
+        [.., b] => { }
+    }*/
+    /*match [5, 5, 5, 5] {
+        [a, .., b] => { }
+    }*/
+    match [5, 5, 5] {
+        [a, .._] => { }
+    }
+    match [5, 5, 5] {
+        [.._, a] => { }
+    }
+    match [5, 5, 5] {
+        [a, .._, b] => { }
+    }
+}