[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