From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id CBCFC38582BE; Tue, 19 Jul 2022 21:57:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CBCFC38582BE 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] lexer: Allow specifiying tokens as reserved in certain editions X-Act-Checkin: gcc X-Git-Author: Arthur Cohen X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: fb1b2a6bf5eed9dd9405dca9b9c895f48509875e X-Git-Newrev: 66af31d5bc5a1ea76be381dc9246fbe4fe034fbb Message-Id: <20220719215757.CBCFC38582BE@sourceware.org> Date: Tue, 19 Jul 2022 21:57:57 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 19 Jul 2022 21:57:57 -0000 https://gcc.gnu.org/g:66af31d5bc5a1ea76be381dc9246fbe4fe034fbb commit 66af31d5bc5a1ea76be381dc9246fbe4fe034fbb Author: Arthur Cohen Date: Tue Jul 19 13:09:17 2022 +0200 lexer: Allow specifiying tokens as reserved in certain editions 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. Diff: --- gcc/rust/lex/rust-lex.cc | 19 +++++++++++++++++-- gcc/rust/rust-session-manager.h | 6 ++++-- gcc/testsuite/rust/compile/macro-issue1395-2.rs | 7 +++++++ 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 93d96d33dd6..ecf151dc778 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 c68e796461f..24a15f55393 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 (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 00000000000..1df6a3a0038 --- /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 00000000000..b0368c1610f --- /dev/null +++ b/gcc/testsuite/rust/compile/macro-issue1395.rs @@ -0,0 +1,5 @@ +// Default edition is 2015 - this is valid + +macro_rules! try { + () => {}; +}