diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2024-03-26 21:10:05 -0400 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2024-03-28 11:23:31 +0000 |
commit | e36c3ece68cecba3170ab2d35de6e0a0c8bac40e (patch) | |
tree | 2d2f246f69ac9e8e9b34bfa5c947d0f2756c0b11 /gcc | |
parent | 01092b83913733d26f2c4d9bfdc22ff2eb0b0bbb (diff) | |
download | gcc-e36c3ece68cecba3170ab2d35de6e0a0c8bac40e.zip gcc-e36c3ece68cecba3170ab2d35de6e0a0c8bac40e.tar.gz gcc-e36c3ece68cecba3170ab2d35de6e0a0c8bac40e.tar.bz2 |
Improve parsing of raw string literals
gcc/rust/ChangeLog:
* lex/rust-lex.cc
(Lexer::parse_raw_string):
Bring handling of edge cases to par with parse_raw_byte_string.
gcc/testsuite/ChangeLog:
* rust/compile/raw-string-loc.rs: New test.
Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/lex/rust-lex.cc | 21 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/raw-string-loc.rs | 6 |
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/rust/lex/rust-lex.cc b/gcc/rust/lex/rust-lex.cc index 7c37e83..e5c9148 100644 --- a/gcc/rust/lex/rust-lex.cc +++ b/gcc/rust/lex/rust-lex.cc @@ -2152,6 +2152,9 @@ Lexer::parse_raw_string (location_t loc, int initial_hash_count) str.reserve (16); // some sensible default int length = 1 + initial_hash_count; + current_column += length; + + const location_t string_begin_locus = get_current_location (); if (initial_hash_count > 0) skip_input (initial_hash_count - 1); @@ -2162,10 +2165,11 @@ Lexer::parse_raw_string (location_t loc, int initial_hash_count) rust_error_at (get_current_location (), "raw string has no opening %<\"%>"); length++; + current_column++; skip_input (); current_char = peek_input (); - while (!current_char.is_eof ()) + while (true) { if (current_char.value == '"') { @@ -2186,19 +2190,30 @@ Lexer::parse_raw_string (location_t loc, int initial_hash_count) skip_input (initial_hash_count); current_char = peek_input (); length += initial_hash_count + 1; + current_column += initial_hash_count + 1; break; } } + else if (current_char.is_eof ()) + { + rust_error_at (string_begin_locus, "unended raw string literal"); + return Token::make (END_OF_FILE, get_current_location ()); + } length++; + current_column++; + if (current_char == '\n') + { + current_line++; + current_column = 1; + start_line (current_line, max_column_hint); + } str += current_char.as_string (); skip_input (); current_char = peek_input (); } - current_column += length; - loc += length - 1; str.shrink_to_fit (); diff --git a/gcc/testsuite/rust/compile/raw-string-loc.rs b/gcc/testsuite/rust/compile/raw-string-loc.rs new file mode 100644 index 0000000..7097751 --- /dev/null +++ b/gcc/testsuite/rust/compile/raw-string-loc.rs @@ -0,0 +1,6 @@ +const X: &'static str = r#"12 +12"#; + +BREAK +// { dg-error "unrecognised token" "" { target *-*-* } .-1 } +// { dg-excess-errors "error 'failed to parse item' does not have location" } |