diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-11-07 18:32:58 +0100 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2023-11-14 18:27:16 +0000 |
commit | afbc038914ccaf8fcc97815846926760e7b23d55 (patch) | |
tree | 9c71b883854a68660e8bca23686a4183f0250c82 /gcc | |
parent | 9864d7fe8a6dd8abe1cf95e36e35b1762d4d34fe (diff) | |
download | gcc-afbc038914ccaf8fcc97815846926760e7b23d55.zip gcc-afbc038914ccaf8fcc97815846926760e7b23d55.tar.gz gcc-afbc038914ccaf8fcc97815846926760e7b23d55.tar.bz2 |
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>
Diffstat (limited to 'gcc')
-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 |