From: Pierre-Emmanuel Patry Date: Tue, 7 Nov 2023 17:32:58 +0000 (+0100) Subject: gccrs: Add lifetime name validation pass X-Git-Tag: basepoints/gcc-15~2004 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ea4cd6453d3a3af501edcc97d362f7c4e9e83995;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/checks/errors/rust-ast-validation.cc b/gcc/rust/checks/errors/rust-ast-validation.cc index 92822fe96f3b..d27d3e861ef9 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 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{"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 1b1403fe72de..ef0b2ac05386 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