Parse numeric fields in struct expressions and patterns
This commit is contained in:
parent
59be332a1b
commit
f6624782d4
3 changed files with 54 additions and 2 deletions
|
@ -2009,10 +2009,19 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn parse_field_name(&mut self) -> PResult<'a, Ident> {
|
||||||
|
if let token::Literal(token::Integer(name), None) = self.token {
|
||||||
|
self.bump();
|
||||||
|
Ok(Ident::with_empty_ctxt(name))
|
||||||
|
} else {
|
||||||
|
self.parse_ident()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Parse ident COLON expr
|
/// Parse ident COLON expr
|
||||||
pub fn parse_field(&mut self) -> PResult<'a, Field> {
|
pub fn parse_field(&mut self) -> PResult<'a, Field> {
|
||||||
let lo = self.span.lo;
|
let lo = self.span.lo;
|
||||||
let i = self.parse_ident()?;
|
let i = self.parse_field_name()?;
|
||||||
let hi = self.last_span.hi;
|
let hi = self.last_span.hi;
|
||||||
self.expect(&token::Colon)?;
|
self.expect(&token::Colon)?;
|
||||||
let e = self.parse_expr()?;
|
let e = self.parse_expr()?;
|
||||||
|
@ -3508,7 +3517,7 @@ impl<'a> Parser<'a> {
|
||||||
// Check if a colon exists one ahead. This means we're parsing a fieldname.
|
// Check if a colon exists one ahead. This means we're parsing a fieldname.
|
||||||
let (subpat, fieldname, is_shorthand) = if self.look_ahead(1, |t| t == &token::Colon) {
|
let (subpat, fieldname, is_shorthand) = if self.look_ahead(1, |t| t == &token::Colon) {
|
||||||
// Parsing a pattern of the form "fieldname: pat"
|
// Parsing a pattern of the form "fieldname: pat"
|
||||||
let fieldname = self.parse_ident()?;
|
let fieldname = self.parse_field_name()?;
|
||||||
self.bump();
|
self.bump();
|
||||||
let pat = self.parse_pat()?;
|
let pat = self.parse_pat()?;
|
||||||
hi = pat.span.hi;
|
hi = pat.span.hi;
|
||||||
|
|
20
src/test/compile-fail/numeric-fields.rs
Normal file
20
src/test/compile-fail/numeric-fields.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright 2016 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.
|
||||||
|
|
||||||
|
#![feature(relaxed_adts)]
|
||||||
|
|
||||||
|
struct S(u8, u16);
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let s = S{0b1: 10, 0: 11}; //~ ERROR structure `S` has no field named `0b1`
|
||||||
|
match s {
|
||||||
|
S{0: a, 0x1: b, ..} => {} //~ ERROR does not have a field named `0x1`
|
||||||
|
}
|
||||||
|
}
|
23
src/test/run-pass/numeric-fields.rs
Normal file
23
src/test/run-pass/numeric-fields.rs
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
// Copyright 2016 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.
|
||||||
|
|
||||||
|
#![feature(relaxed_adts)]
|
||||||
|
|
||||||
|
struct S(u8, u16);
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let s = S{1: 10, 0: 11};
|
||||||
|
match s {
|
||||||
|
S{0: a, 1: b, ..} => {
|
||||||
|
assert_eq!(a, 11);
|
||||||
|
assert_eq!(b, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue