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:
bors 2013-09-04 22:25:42 -07:00
commit 2bd628eafa
2 changed files with 14 additions and 0 deletions

View File

@ -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 `}`");
}

View File

@ -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
}