about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPiotr Czarnecki <pioczarn@gmail.com>2014-10-24 14:28:10 +0100
committerPiotr Czarnecki <pioczarn@gmail.com>2014-10-24 17:59:29 +0100
commite2e47d6eb5425cd860137d632c1b8688e5e74241 (patch)
tree66873e2d6c18f8f768417f6f252d592d5e4fed30
parent00cc6d24099eb93ecfeb9bf807ab9e5130a01749 (diff)
downloadrust-e2e47d6eb5425cd860137d632c1b8688e5e74241.tar.gz
rust-e2e47d6eb5425cd860137d632c1b8688e5e74241.zip
regex: Fix control flow in the parser
-rw-r--r--src/libregex/parse.rs32
-rw-r--r--src/libregex/test/tests.rs10
2 files changed, 24 insertions, 18 deletions
diff --git a/src/libregex/parse.rs b/src/libregex/parse.rs
index 1d1d1a0e9c5..2b6aa669f3c 100644
--- a/src/libregex/parse.rs
+++ b/src/libregex/parse.rs
@@ -411,9 +411,6 @@ impl<'a> Parser<'a> {
                         ast => fail!("Unexpected AST item '{}'", ast),
                     }
                 }
-                _ => {},
-            }
-            match c {
                 ']' => {
                     if ranges.len() > 0 {
                         let flags = negated | (self.flags & FLAG_NOCASE);
@@ -431,22 +428,21 @@ impl<'a> Parser<'a> {
                     }
                     return Ok(())
                 }
-                c => {
-                    if self.peek_is(1, '-') && !self.peek_is(2, ']') {
-                        try!(self.expect('-'))
-                        try!(self.noteof("not a ']'"))
-                        let c2 = self.cur();
-                        if c2 < c {
-                            return self.err(format!("Invalid character class \
-                                                     range '{}-{}'",
-                                                    c,
-                                                    c2).as_slice())
-                        }
-                        ranges.push((c, self.cur()))
-                    } else {
-                        ranges.push((c, c))
-                    }
+            }
+
+            if self.peek_is(1, '-') && !self.peek_is(2, ']') {
+                try!(self.expect('-'))
+                try!(self.noteof("not a ']'"))
+                let c2 = self.cur();
+                if c2 < c {
+                    return self.err(format!("Invalid character class \
+                                             range '{}-{}'",
+                                            c,
+                                            c2).as_slice())
                 }
+                ranges.push((c, self.cur()))
+            } else {
+                ranges.push((c, c))
             }
         }
     }
diff --git a/src/libregex/test/tests.rs b/src/libregex/test/tests.rs
index 088425c0888..fa645c84dd8 100644
--- a/src/libregex/test/tests.rs
+++ b/src/libregex/test/tests.rs
@@ -43,6 +43,16 @@ fn empty_regex_nonempty_match() {
     assert_eq!(ms, vec![(0, 0), (1, 1), (2, 2), (3, 3)]);
 }
 
+#[test]
+fn quoted_bracket_set() {
+    let re = regex!(r"([\x{5b}\x{5d}])");
+    let ms = re.find_iter("[]").collect::<Vec<(uint, uint)>>();
+    assert_eq!(ms, vec![(0, 1), (1, 2)]);
+    let re = regex!(r"([\[\]])");
+    let ms = re.find_iter("[]").collect::<Vec<(uint, uint)>>();
+    assert_eq!(ms, vec![(0, 1), (1, 2)]);
+}
+
 macro_rules! replace(
     ($name:ident, $which:ident, $re:expr,
      $search:expr, $replace:expr, $result:expr) => (