aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2021-05-21 23:36:36 +0200
committerMarc Poulhiès <dkm@kataplop.net>2021-05-23 16:21:05 +0200
commit5467ac12d7bfd204cd4f1712ecefcbb9bcab6af8 (patch)
tree59a6832709427ef6a721c212051cd26cb8eaec5a
parent99b73780e6e30f962c01532d3ec189ceeecf7f93 (diff)
downloadgcc-5467ac12d7bfd204cd4f1712ecefcbb9bcab6af8.zip
gcc-5467ac12d7bfd204cd4f1712ecefcbb9bcab6af8.tar.gz
gcc-5467ac12d7bfd204cd4f1712ecefcbb9bcab6af8.tar.bz2
Fix raw identifier parsing.
Lexer::parse_raw_identifier added the first character twice. Adds tests for a simple raw identifier, a keyword as raw identifier and xfail tests for a single underscore and forbidden keyword (crate) as raw identifier. To help error diagnostics continue after parse_raw_identifier failed in Lexer::build_token. Fixes: https://github.com/Rust-GCC/gccrs/issues/426
-rw-r--r--gcc/rust/lex/rust-lex.cc7
-rw-r--r--gcc/testsuite/rust.test/compile/raw_identifiers.rs3
-rw-r--r--gcc/testsuite/rust.test/compile/raw_identifiers_keywords.rs3
-rw-r--r--gcc/testsuite/rust.test/xfail_compile/raw_identifiers_bad_keywords.rs3
-rw-r--r--gcc/testsuite/rust.test/xfail_compile/raw_identifiers_underscore.rs3
5 files changed, 16 insertions, 3 deletions
diff --git a/gcc/rust/lex/rust-lex.cc b/gcc/rust/lex/rust-lex.cc
index f95a47d..16fb1ad 100644
--- a/gcc/rust/lex/rust-lex.cc
+++ b/gcc/rust/lex/rust-lex.cc
@@ -743,6 +743,9 @@ Lexer::build_token ()
TokenPtr raw_ident_ptr = parse_raw_identifier (loc);
if (raw_ident_ptr != nullptr)
return raw_ident_ptr;
+ else
+ continue; /* input got parsed, it just wasn't valid. An error
+ was produced. */
}
else
{
@@ -1523,11 +1526,9 @@ Lexer::parse_raw_identifier (Location loc)
current_column += 2;
- str += current_char;
-
bool first_is_underscore = current_char == '_';
- int length = 1;
+ int length = 0;
current_char = peek_input ();
// loop through entire name
while (ISALPHA (current_char) || ISDIGIT (current_char)
diff --git a/gcc/testsuite/rust.test/compile/raw_identifiers.rs b/gcc/testsuite/rust.test/compile/raw_identifiers.rs
new file mode 100644
index 0000000..8746f33
--- /dev/null
+++ b/gcc/testsuite/rust.test/compile/raw_identifiers.rs
@@ -0,0 +1,3 @@
+pub fn square(num: i32) -> i32 { /* { dg-warning "used" } */
+ r#num * num
+} \ No newline at end of file
diff --git a/gcc/testsuite/rust.test/compile/raw_identifiers_keywords.rs b/gcc/testsuite/rust.test/compile/raw_identifiers_keywords.rs
new file mode 100644
index 0000000..c9aa3cf
--- /dev/null
+++ b/gcc/testsuite/rust.test/compile/raw_identifiers_keywords.rs
@@ -0,0 +1,3 @@
+pub fn plus(r#break: i32, r#unsafe: i32) -> i32 { /* { dg-warning "used" } */
+ r#break + r#unsafe
+} \ No newline at end of file
diff --git a/gcc/testsuite/rust.test/xfail_compile/raw_identifiers_bad_keywords.rs b/gcc/testsuite/rust.test/xfail_compile/raw_identifiers_bad_keywords.rs
new file mode 100644
index 0000000..854d7e6
--- /dev/null
+++ b/gcc/testsuite/rust.test/xfail_compile/raw_identifiers_bad_keywords.rs
@@ -0,0 +1,3 @@
+pub fn plus(n: i32, m: i32) -> i32 {
+ r#crate /* { dg-error "forbidden raw identifier" } */
+}
diff --git a/gcc/testsuite/rust.test/xfail_compile/raw_identifiers_underscore.rs b/gcc/testsuite/rust.test/xfail_compile/raw_identifiers_underscore.rs
new file mode 100644
index 0000000..86e9013
--- /dev/null
+++ b/gcc/testsuite/rust.test/xfail_compile/raw_identifiers_underscore.rs
@@ -0,0 +1,3 @@
+pub fn s(num: i32) -> i32 {
+ r#_ * num /* { dg-error "not a valid raw identifier" } */
+}