From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id 5D67F3870846; Tue, 7 May 2024 16:29:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5D67F3870846 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1715099357; bh=dwarB6IFHwSl5cOJFQpktDv1U9GDZeJX9/o5b+UQGx0=; h=From:To:Subject:Date:From; b=ew8vY2RQg4DSkohvI8uLudj77t+Ed1RN5N9FVXWmPW7GpBs8mm0cDRTTcmX2CMode 8WMwECoZKjeeLgXcAxOpRB79MbZ9GUN7l5cNcaKB9wX6BG4JB0fy83v2wGCh4gwmHp 2A47gMVMqUB6yNcTnmvk2HvIhC7jHJXPkX1s+iy8= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/rust/master] Improve parsing of raw string literals X-Act-Checkin: gcc X-Git-Author: Owen Avery X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: 01092b83913733d26f2c4d9bfdc22ff2eb0b0bbb X-Git-Newrev: e36c3ece68cecba3170ab2d35de6e0a0c8bac40e Message-Id: <20240507162917.5D67F3870846@sourceware.org> Date: Tue, 7 May 2024 16:29:17 +0000 (GMT) List-Id: https://gcc.gnu.org/g:e36c3ece68cecba3170ab2d35de6e0a0c8bac40e commit e36c3ece68cecba3170ab2d35de6e0a0c8bac40e Author: Owen Avery Date: Tue Mar 26 21:10:05 2024 -0400 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: --- gcc/rust/lex/rust-lex.cc | 21 ++++++++++++++++++--- 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 7c37e83d6cb7..e5c9148976c1 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 000000000000..70977510ba38 --- /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" }