From: Owen Avery Date: Wed, 27 Mar 2024 01:10:05 +0000 (-0400) Subject: gccrs: Improve parsing of raw string literals X-Git-Tag: basepoints/gcc-16~6966 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6ea7ffe427c989b857020263483f7622031a58fe;p=thirdparty%2Fgcc.git gccrs: 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 --- 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" }