]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add lifetime name validation pass
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Tue, 7 Nov 2023 17:32:58 +0000 (18:32 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:13:12 +0000 (19:13 +0100)
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>
gcc/rust/checks/errors/rust-ast-validation.cc
gcc/rust/checks/errors/rust-ast-validation.h

index 92822fe96f3b45daf21ac811063c2dedd7ad7797..d27d3e861ef9f47679352cafe35b6fab911e9f73 100644 (file)
 
 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)
 {
index 1b1403fe72de42147541a3b7f9892dfdda1e4823..ef0b2ac05386ae5f5cc5ba23640e9660b0cd15a2 100644 (file)
@@ -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