Commit Message
Arthur Cohen
Aug. 1, 2024, 2:57 p.m. UTC
From: Owen Avery <powerboat9.gamer@gmail.com> 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> --- gcc/rust/lex/rust-lex.cc | 21 +++++++++++++++++--- gcc/testsuite/rust/compile/raw-string-loc.rs | 6 ++++++ 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/rust/compile/raw-string-loc.rs
diff --git a/gcc/rust/lex/rust-lex.cc b/gcc/rust/lex/rust-lex.cc index 7c37e83d6cb..e5c9148976c 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 00000000000..70977510ba3 --- /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" }