diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-11-07 18:32:58 +0100 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 19:13:12 +0100 |
commit | ea4cd6453d3a3af501edcc97d362f7c4e9e83995 (patch) | |
tree | a967dcf5e1a9807bf34890f94457e306f219b6e3 | |
parent | 6b8365a990df346a4cc0e4fa545e5259de20edc9 (diff) | |
download | gcc-ea4cd6453d3a3af501edcc97d362f7c4e9e83995.zip gcc-ea4cd6453d3a3af501edcc97d362f7c4e9e83995.tar.gz gcc-ea4cd6453d3a3af501edcc97d362f7c4e9e83995.tar.bz2 |
gccrs: Add lifetime name validation pass
Add lifetime name check in ast validation visitor.
gcc/rust/ChangeLog:
* checks/errors/rust-ast-validation.cc (RS_TOKEN): Add keyword set.
(RS_TOKEN_KEYWORD): Likewise.
(ASTValidation::visit): Add validation on lifetime visit.
* checks/errors/rust-ast-validation.h: Add function prototype.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
-rw-r--r-- | gcc/rust/checks/errors/rust-ast-validation.cc | 23 | ||||
-rw-r--r-- | gcc/rust/checks/errors/rust-ast-validation.h | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/gcc/rust/checks/errors/rust-ast-validation.cc b/gcc/rust/checks/errors/rust-ast-validation.cc index 92822fe..d27d3e8 100644 --- a/gcc/rust/checks/errors/rust-ast-validation.cc +++ b/gcc/rust/checks/errors/rust-ast-validation.cc @@ -21,6 +21,29 @@ namespace Rust { +namespace { +// TODO: make constexpr when update to c++20 +const std::map<std::string, TokenId> keywords = { +#define RS_TOKEN(x, y) +#define RS_TOKEN_KEYWORD(tok, key) {key, tok}, + RS_TOKEN_LIST +#undef RS_TOKEN_KEYWORD +#undef RS_TOKEN +}; +} // namespace + +void +ASTValidation::visit (AST::Lifetime &lifetime) +{ + auto name = lifetime.get_lifetime_name (); + auto valid = std::set<std::string>{"static", "_"}; + if (valid.find (name) == valid.end () + && keywords.find (name) != keywords.end ()) + rust_error_at (lifetime.get_locus (), "lifetimes cannot use keyword names"); + + AST::ContextualASTVisitor::visit (lifetime); +} + void ASTValidation::visit (AST::ConstantItem &const_item) { diff --git a/gcc/rust/checks/errors/rust-ast-validation.h b/gcc/rust/checks/errors/rust-ast-validation.h index 1b1403f..ef0b2ac 100644 --- a/gcc/rust/checks/errors/rust-ast-validation.h +++ b/gcc/rust/checks/errors/rust-ast-validation.h @@ -34,6 +34,7 @@ public: void check (AST::Crate &crate) { AST::ContextualASTVisitor::visit (crate); } virtual void visit (AST::ConstantItem &const_item); + virtual void visit (AST::Lifetime &lifetime); }; } // namespace Rust |