aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-11-07 18:32:58 +0100
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2023-11-14 18:27:16 +0000
commitafbc038914ccaf8fcc97815846926760e7b23d55 (patch)
tree9c71b883854a68660e8bca23686a4183f0250c82 /gcc
parent9864d7fe8a6dd8abe1cf95e36e35b1762d4d34fe (diff)
downloadgcc-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.cc23
-rw-r--r--gcc/rust/checks/errors/rust-ast-validation.h1
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