[gcc r14-8143] gccrs: Add validation pass for label name

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 18:17:21 GMT 2024


https://gcc.gnu.org/g:93ca83c5efd6908b6c5602642004d0364bf9144b

commit r14-8143-g93ca83c5efd6908b6c5602642004d0364bf9144b
Author: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Date:   Wed Nov 8 16:50:50 2023 +0100

    gccrs: Add validation pass for label name
    
    Prevent from using reserved keyword in label name.
    
    gcc/rust/ChangeLog:
    
            * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Check if there is
            a label before visit.
            * checks/errors/rust-ast-validation.cc (ASTValidation::visit): Emit an
            error when a label has a forbidden name.
            * checks/errors/rust-ast-validation.h: Add function prototype.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>

Diff:
---
 gcc/rust/ast/rust-ast-visitor.cc              |  4 +++-
 gcc/rust/checks/errors/rust-ast-validation.cc | 15 +++++++++++++++
 gcc/rust/checks/errors/rust-ast-validation.h  |  1 +
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/gcc/rust/ast/rust-ast-visitor.cc b/gcc/rust/ast/rust-ast-visitor.cc
index 63f850f8c7c..b9ff2f97280 100644
--- a/gcc/rust/ast/rust-ast-visitor.cc
+++ b/gcc/rust/ast/rust-ast-visitor.cc
@@ -494,7 +494,9 @@ void
 DefaultASTVisitor::visit (AST::BreakExpr &expr)
 {
   visit_outer_attrs (expr);
-  visit (expr.get_label ());
+  if (expr.has_label ())
+    visit (expr.get_label ());
+
   if (expr.has_break_expr ())
     visit (expr.get_break_expr ());
 }
diff --git a/gcc/rust/checks/errors/rust-ast-validation.cc b/gcc/rust/checks/errors/rust-ast-validation.cc
index 3af5655d7f3..44dec61b921 100644
--- a/gcc/rust/checks/errors/rust-ast-validation.cc
+++ b/gcc/rust/checks/errors/rust-ast-validation.cc
@@ -36,6 +36,21 @@ ASTValidation::visit (AST::Lifetime &lifetime)
   AST::ContextualASTVisitor::visit (lifetime);
 }
 
+void
+ASTValidation::visit (AST::LoopLabel &label)
+{
+  auto name = label.get_lifetime ().get_lifetime_name ();
+  auto lifetime_name = '\'' + name;
+  auto &keywords = Values::Keywords::keywords;
+  if (keywords.find (name) != keywords.end ())
+    rust_error_at (label.get_locus (), "invalid label name %qs",
+		   lifetime_name.c_str ());
+
+  // WARNING: Do not call ContextualASTVisitor, we don't want to visit the
+  // lifetime
+  // Maybe we should refactor LoopLabel instead ?
+}
+
 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 ef0b2ac0538..a21bcc44f68 100644
--- a/gcc/rust/checks/errors/rust-ast-validation.h
+++ b/gcc/rust/checks/errors/rust-ast-validation.h
@@ -35,6 +35,7 @@ public:
 
   virtual void visit (AST::ConstantItem &const_item);
   virtual void visit (AST::Lifetime &lifetime);
+  virtual void visit (AST::LoopLabel &label);
 };
 
 } // namespace Rust


More information about the Gcc-cvs mailing list