about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2014-08-21 15:47:37 -0700
committerBrian Anderson <banderson@mozilla.com>2014-08-21 15:47:39 -0700
commitbc7a85de295c909dcefd4eb7392a9aff2129ab05 (patch)
tree3a57c519b8017cbe702a850e931e0c99cf551bf2 /src/libsyntax/parse
parentf92015f71b3a49abd490e704a011d14786f6bf87 (diff)
downloadrust-bc7a85de295c909dcefd4eb7392a9aff2129ab05.tar.gz
rust-bc7a85de295c909dcefd4eb7392a9aff2129ab05.zip
syntax: Fix complexity of string parsing. Closes #16624.
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/mod.rs21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs
index e76e4adcd7f..17a27a5a39e 100644
--- a/src/libsyntax/parse/mod.rs
+++ b/src/libsyntax/parse/mod.rs
@@ -412,14 +412,21 @@ pub fn str_lit(lit: &str) -> String {
     loop {
         match chars.next() {
             Some((i, c)) => {
-                let em = error(i);
                 match c {
                     '\\' => {
-                        if chars.peek().expect(em.as_slice()).val1() == '\n' {
+                        let ch = chars.peek().unwrap_or_else(|| {
+                            fail!("{}", error(i).as_slice())
+                        }).val1();
+
+                        if ch == '\n' {
                             eat(&mut chars);
-                        } else if chars.peek().expect(em.as_slice()).val1() == '\r' {
+                        } else if ch == '\r' {
                             chars.next();
-                            if chars.peek().expect(em.as_slice()).val1() != '\n' {
+                            let ch = chars.peek().unwrap_or_else(|| {
+                                fail!("{}", error(i).as_slice())
+                            }).val1();
+
+                            if ch != '\n' {
                                 fail!("lexer accepted bare CR");
                             }
                             eat(&mut chars);
@@ -433,7 +440,11 @@ pub fn str_lit(lit: &str) -> String {
                         }
                     },
                     '\r' => {
-                        if chars.peek().expect(em.as_slice()).val1() != '\n' {
+                        let ch = chars.peek().unwrap_or_else(|| {
+                            fail!("{}", error(i).as_slice())
+                        }).val1();
+
+                        if ch != '\n' {
                             fail!("lexer accepted bare CR");
                         }
                         chars.next();