From: Vishruth-Thimmaiah <vishruththimma...@gmail.com>

Fixes an ICE when a raw byte string is not terminated

Fixes Rust-GCC#3731

gcc/rust/ChangeLog:

        * lex/rust-lex.cc (Lexer::parse_raw_byte_string):
        Fix infinite looping when a raw byte string is not terminated.

gcc/testsuite/ChangeLog:

        * rust/compile/torture/unended-raw-byte-string.rs:
        New test to ensure correct error message for unended raw byte string.

Signed-off-by: Vishruth Thimmaiah <vishruththimma...@gmail.com>
---
 gcc/rust/lex/rust-lex.cc                               | 10 +++++-----
 .../rust/compile/torture/unended-raw-byte-string.rs    |  6 ++++++
 2 files changed, 11 insertions(+), 5 deletions(-)
 create mode 100644 
gcc/testsuite/rust/compile/torture/unended-raw-byte-string.rs

diff --git a/gcc/rust/lex/rust-lex.cc b/gcc/rust/lex/rust-lex.cc
index 8a5668f3858..76ff15c21bc 100644
--- a/gcc/rust/lex/rust-lex.cc
+++ b/gcc/rust/lex/rust-lex.cc
@@ -1897,6 +1897,11 @@ Lexer::parse_raw_byte_string (location_t loc)
              break;
            }
        }
+      else if (current_char.is_eof ())
+       {
+         rust_error_at (string_begin_locus, "unended raw byte string literal");
+         return Token::make (END_OF_FILE, get_current_location ());
+       }
       else if (current_char.value > 127)
        {
          rust_error_at (get_current_location (),
@@ -1904,11 +1909,6 @@ Lexer::parse_raw_byte_string (location_t loc)
                         current_char.as_string ().c_str ());
          current_char = 0;
        }
-      else if (current_char.is_eof ())
-       {
-         rust_error_at (string_begin_locus, "unended raw byte string literal");
-         return Token::make (END_OF_FILE, get_current_location ());
-       }
 
       length++;
       current_column++;
diff --git a/gcc/testsuite/rust/compile/torture/unended-raw-byte-string.rs 
b/gcc/testsuite/rust/compile/torture/unended-raw-byte-string.rs
new file mode 100644
index 00000000000..91a3c9a2ff8
--- /dev/null
+++ b/gcc/testsuite/rust/compile/torture/unended-raw-byte-string.rs
@@ -0,0 +1,6 @@
+// { dg-excess-errors "...." }
+fn main() {
+    // { dg-error "unended raw byte string literal" "" { target *-*-* } .+1 }
+    let s = br##"123"#
+}
+
-- 
2.49.0

Reply via email to