mirror of https://github.com/rust-lang/rust.git
auto merge of #8944 : alexcrichton/rust/issue-8938, r=huonw
Otherwise extra stuff after a lone '}' character is simply ignored, which is very bad. Closes #8938
This commit is contained in:
commit
2bd628eafa
|
@ -149,6 +149,7 @@ pub struct SelectArm<'self> {
|
|||
pub struct Parser<'self> {
|
||||
priv input: &'self str,
|
||||
priv cur: str::CharOffsetIterator<'self>,
|
||||
priv depth: uint,
|
||||
}
|
||||
|
||||
impl<'self> iterator::Iterator<Piece<'self>> for Parser<'self> {
|
||||
|
@ -168,6 +169,11 @@ impl<'self> iterator::Iterator<Piece<'self>> for Parser<'self> {
|
|||
self.escape(); // ensure it's a valid escape sequence
|
||||
Some(String(self.string(pos + 1))) // skip the '\' character
|
||||
}
|
||||
Some((_, '}')) if self.depth == 0 => {
|
||||
self.cur.next();
|
||||
self.err(~"unmatched `}` found");
|
||||
None
|
||||
}
|
||||
Some((_, '}')) | None => { None }
|
||||
Some((pos, _)) => {
|
||||
Some(String(self.string(pos)))
|
||||
|
@ -182,6 +188,7 @@ impl<'self> Parser<'self> {
|
|||
Parser {
|
||||
input: s,
|
||||
cur: s.char_offset_iter(),
|
||||
depth: 0,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -393,7 +400,9 @@ impl<'self> Parser<'self> {
|
|||
if !self.wsconsume('{') {
|
||||
self.err(~"selector must be followed by `{`");
|
||||
}
|
||||
self.depth += 1;
|
||||
let pieces = self.collect();
|
||||
self.depth -= 1;
|
||||
if !self.wsconsume('}') {
|
||||
self.err(~"selector case must be terminated by `}`");
|
||||
}
|
||||
|
@ -494,7 +503,9 @@ impl<'self> Parser<'self> {
|
|||
if !self.wsconsume('{') {
|
||||
self.err(~"selector must be followed by `{`");
|
||||
}
|
||||
self.depth += 1;
|
||||
let pieces = self.collect();
|
||||
self.depth -= 1;
|
||||
if !self.wsconsume('}') {
|
||||
self.err(~"selector case must be terminated by `}`");
|
||||
}
|
||||
|
|
|
@ -71,4 +71,7 @@ fn main() {
|
|||
format!("{0, select, other{{}}}", "a"); //~ ERROR: cannot use implicit
|
||||
format!("{0, plural, other{{}}}", 1); //~ ERROR: cannot use implicit
|
||||
format!("{0, plural, other{{1:.*d}}}", 1, 2); //~ ERROR: cannot use implicit
|
||||
|
||||
format!("foo } bar"); //~ ERROR: unmatched `}` found
|
||||
format!("foo }"); //~ ERROR: unmatched `}` found
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue