]> git.lizzy.rs Git - rust.git/commitdiff
Accept trailing commas in struct patterns
authorAlex Crichton <alex@alexcrichton.com>
Thu, 19 Dec 2013 17:21:05 +0000 (09:21 -0800)
committerAlex Crichton <alex@alexcrichton.com>
Thu, 19 Dec 2013 17:29:41 +0000 (09:29 -0800)
We decided in the 12/10/13 weekly meeting that trailing commas should be
accepted pretty much anywhere. They are currently not allowed in struct
patterns, and this commit adds support for that.

Closes #10392

src/libsyntax/parse/parser.rs
src/test/compile-fail/issue-10392-2.rs [new file with mode: 0644]
src/test/compile-fail/issue-10392.rs [new file with mode: 0644]
src/test/run-pass/issue-10392.rs [new file with mode: 0644]

index 35ea06d62ca77836cb658c4cf959226952fa7835..729d03204352858c92ce57394623e8de0c1c5ce2 100644 (file)
@@ -2800,8 +2800,13 @@ fn parse_pat_fields(&self) -> (~[ast::FieldPat], bool) {
         let mut etc = false;
         let mut first = true;
         while *self.token != token::RBRACE {
-            if first { first = false; }
-            else { self.expect(&token::COMMA); }
+            if first {
+                first = false;
+            } else {
+                self.expect(&token::COMMA);
+                // accept trailing commas
+                if *self.token == token::RBRACE { break }
+            }
 
             etc = *self.token == token::UNDERSCORE || *self.token == token::DOTDOT;
             if *self.token == token::UNDERSCORE {
diff --git a/src/test/compile-fail/issue-10392-2.rs b/src/test/compile-fail/issue-10392-2.rs
new file mode 100644 (file)
index 0000000..8d7125d
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2012-2013 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 A { foo: int }
+
+fn a() -> A { fail!() }
+
+fn main() {
+    let A { .., } = a(); //~ ERROR: expected `}`
+}
+
diff --git a/src/test/compile-fail/issue-10392.rs b/src/test/compile-fail/issue-10392.rs
new file mode 100644 (file)
index 0000000..4557043
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2012-2013 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 A { foo: int }
+
+fn a() -> A { fail!() }
+
+fn main() {
+    let A { , } = a(); //~ ERROR: expected ident
+}
diff --git a/src/test/run-pass/issue-10392.rs b/src/test/run-pass/issue-10392.rs
new file mode 100644 (file)
index 0000000..796fae7
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright 2013 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 A { foo: int }
+struct B { a: int, b: int, c: int }
+
+fn mka() -> A { fail!() }
+fn mkb() -> B { fail!() }
+
+fn test() {
+    let A { foo, } = mka();
+    let A {
+        foo,
+    } = mka();
+
+    let B { a, b, c, } = mkb();
+
+    match mka() {
+        A { foo: _foo, } => {}
+    }
+
+    match Some(mka()) {
+        Some(A { foo: _foo, }) => {}
+        None => {}
+    }
+}
+
+pub fn main() {
+    if false { test() }
+}