diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-07-19 11:51:22 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-19 11:51:22 +0000 |
commit | 137cd3bbaa05038b01c46f7ac7472da7ca662ed7 (patch) | |
tree | 9541637ba71200d98109f7bc3f698842deb4848e /gcc | |
parent | 1b5676645a52f46de0011b9434f76c249fbb8d81 (diff) | |
parent | 66af31d5bc5a1ea76be381dc9246fbe4fe034fbb (diff) | |
download | gcc-137cd3bbaa05038b01c46f7ac7472da7ca662ed7.zip gcc-137cd3bbaa05038b01c46f7ac7472da7ca662ed7.tar.gz gcc-137cd3bbaa05038b01c46f7ac7472da7ca662ed7.tar.bz2 |
Merge #1397
1397: lexer: Allow specifiying tokens as reserved in certain editions r=CohenArthur a=CohenArthur
Some tokens such as `try` only became reserved keywords in certain
editions. This behavior might happen again in the future and we should
be able to handle it.
Closes #1395
Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/lex/rust-lex.cc | 19 | ||||
-rw-r--r-- | gcc/rust/rust-session-manager.h | 6 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/macro-issue1395-2.rs | 7 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/macro-issue1395.rs | 5 |
4 files changed, 33 insertions, 4 deletions
diff --git a/gcc/rust/lex/rust-lex.cc b/gcc/rust/lex/rust-lex.cc index 93d96d3..ecf151d 100644 --- a/gcc/rust/lex/rust-lex.cc +++ b/gcc/rust/lex/rust-lex.cc @@ -21,6 +21,7 @@ #include "rust-system.h" // for rust_assert and rust_unreachable #include "rust-diagnostics.h" // for rust_error_at #include "rust-linemap.h" +#include "rust-session-manager.h" #include "safe-ctype.h" namespace Rust { @@ -228,10 +229,24 @@ Lexer::classify_keyword (const std::string &str) if (idx == last || str != *idx) return IDENTIFIER; - else - return keyword_keys[idx - keyword_index]; // TODO: possibly replace this x-macro system with something like hash map? + + // We now have the expected token ID of the reserved keyword. However, some + // keywords are reserved starting in certain editions. For example, `try` is + // only a reserved keyword in editions >=2018. The language might gain new + // reserved keywords in the future. + // + // https://doc.rust-lang.org/reference/keywords.html#reserved-keywords + auto id = keyword_keys[idx - keyword_index]; + + // `try` is not a reserved keyword before 2018 + if (Session::get_instance ().options.get_edition () + == CompileOptions::Edition::E2015 + && id == TRY) + return IDENTIFIER; + + return id; } TokenPtr diff --git a/gcc/rust/rust-session-manager.h b/gcc/rust/rust-session-manager.h index c68e796..24a15f5 100644 --- a/gcc/rust/rust-session-manager.h +++ b/gcc/rust/rust-session-manager.h @@ -191,13 +191,13 @@ struct CompileOptions bool proc_macro = false; std::string metadata_output_path; - enum Edition + enum class Edition { E2015 = 0, E2018, E2021, } edition - = E2015; + = Edition::E2015; bool dump_option_enabled (DumpOption option) const { @@ -239,6 +239,8 @@ struct CompileOptions edition = static_cast<Edition> (raw_edition); } + const Edition &get_edition () { return edition; } + void set_metadata_output (const std::string &path) { metadata_output_path = path; diff --git a/gcc/testsuite/rust/compile/macro-issue1395-2.rs b/gcc/testsuite/rust/compile/macro-issue1395-2.rs new file mode 100644 index 0000000..1df6a3a --- /dev/null +++ b/gcc/testsuite/rust/compile/macro-issue1395-2.rs @@ -0,0 +1,7 @@ +// { dg-additional-options "-frust-edition=2018" } + +macro_rules! try { + // { dg-error "expecting .identifier. but .try. found" "" { target *-*-* } .-1 } + // { dg-error "failed to parse item in crate" "" { target *-*-* } .-2 } + () => {}; +} diff --git a/gcc/testsuite/rust/compile/macro-issue1395.rs b/gcc/testsuite/rust/compile/macro-issue1395.rs new file mode 100644 index 0000000..b0368c1 --- /dev/null +++ b/gcc/testsuite/rust/compile/macro-issue1395.rs @@ -0,0 +1,5 @@ +// Default edition is 2015 - this is valid + +macro_rules! try { + () => {}; +} |