about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPiotr Czarnecki <pioczarn@gmail.com>2014-10-24 16:38:23 +0100
committerPiotr Czarnecki <pioczarn@gmail.com>2014-10-24 18:07:52 +0100
commitf21977318112a1b7491bbf462dfefbd8ec14743e (patch)
tree45d69384119d63e2f17a0ff57bee1f2eb7602f38
parent48daba088b0f353cc4fdaba144da7a2c1b1de87f (diff)
downloadrust-f21977318112a1b7491bbf462dfefbd8ec14743e.tar.gz
rust-f21977318112a1b7491bbf462dfefbd8ec14743e.zip
regex: The first range in a character class can start with a left bracket
-rw-r--r--src/libregex/parse.rs6
-rw-r--r--src/libregex/test/tests.rs7
2 files changed, 8 insertions, 5 deletions
diff --git a/src/libregex/parse.rs b/src/libregex/parse.rs
index b7313ff6c1a..35583be372c 100644
--- a/src/libregex/parse.rs
+++ b/src/libregex/parse.rs
@@ -374,10 +374,6 @@ impl<'a> Parser<'a> {
         let mut ranges: Vec<(char, char)> = vec!();
         let mut alts: Vec<Ast> = vec!();
 
-        if self.peek_is(1, ']') {
-            try!(self.expect(']'));
-            ranges.push((']', ']'))
-        }
         while self.peek_is(1, '-') {
             try!(self.expect('-'));
             ranges.push(('-', '-'))
@@ -411,7 +407,7 @@ impl<'a> Parser<'a> {
                         ast => fail!("Unexpected AST item '{}'", ast),
                     }
                 }
-                ']' => {
+                ']' if ranges.len() > 0 || alts.len() > 0 => {
                     if ranges.len() > 0 {
                         let flags = negated | (self.flags & FLAG_NOCASE);
                         let mut ast = AstClass(combine_ranges(ranges), flags);
diff --git a/src/libregex/test/tests.rs b/src/libregex/test/tests.rs
index 4f4137265c0..06f7db27418 100644
--- a/src/libregex/test/tests.rs
+++ b/src/libregex/test/tests.rs
@@ -54,6 +54,13 @@ fn quoted_bracket_set() {
 }
 
 #[test]
+fn first_range_starts_with_left_bracket() {
+    let re = regex!(r"([[-z])");
+    let ms = re.find_iter("[]").collect::<Vec<(uint, uint)>>();
+    assert_eq!(ms, vec![(0, 1), (1, 2)]);
+}
+
+#[test]
 fn range_ends_with_escape() {
     let re = regex!(r"([\[-\x{5d}])");
     let ms = re.find_iter("[]").collect::<Vec<(uint, uint)>>();