Skip to content

Commit 810c4de

Browse files
committed
auto merge of #11075 : alexcrichton/rust/issue-10392, r=brson
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
2 parents 5399c82 + bfb760c commit 810c4de

File tree

4 files changed

+79
-2
lines changed

4 files changed

+79
-2
lines changed

src/libsyntax/parse/parser.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -2800,8 +2800,13 @@ impl Parser {
28002800
let mut etc = false;
28012801
let mut first = true;
28022802
while *self.token != token::RBRACE {
2803-
if first { first = false; }
2804-
else { self.expect(&token::COMMA); }
2803+
if first {
2804+
first = false;
2805+
} else {
2806+
self.expect(&token::COMMA);
2807+
// accept trailing commas
2808+
if *self.token == token::RBRACE { break }
2809+
}
28052810

28062811
etc = *self.token == token::UNDERSCORE || *self.token == token::DOTDOT;
28072812
if *self.token == token::UNDERSCORE {
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
struct A { foo: int }
12+
13+
fn a() -> A { fail!() }
14+
15+
fn main() {
16+
let A { .., } = a(); //~ ERROR: expected `}`
17+
}
18+

src/test/compile-fail/issue-10392.rs

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
struct A { foo: int }
12+
13+
fn a() -> A { fail!() }
14+
15+
fn main() {
16+
let A { , } = a(); //~ ERROR: expected ident
17+
}

src/test/run-pass/issue-10392.rs

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
struct A { foo: int }
12+
struct B { a: int, b: int, c: int }
13+
14+
fn mka() -> A { fail!() }
15+
fn mkb() -> B { fail!() }
16+
17+
fn test() {
18+
let A { foo, } = mka();
19+
let A {
20+
foo,
21+
} = mka();
22+
23+
let B { a, b, c, } = mkb();
24+
25+
match mka() {
26+
A { foo: _foo, } => {}
27+
}
28+
29+
match Some(mka()) {
30+
Some(A { foo: _foo, }) => {}
31+
None => {}
32+
}
33+
}
34+
35+
pub fn main() {
36+
if false { test() }
37+
}

0 commit comments

Comments
 (0)