diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-07-26 12:16:12 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:56:02 +0100 |
commit | b05d874fc527f81c54b50e62f204eb8cd04250d8 (patch) | |
tree | f023f9e38fa398d49c0ca9182b952d4e8e3f99ec /gcc | |
parent | 96e4e5d27ec49416148b9a22a6c9bb050d562401 (diff) | |
download | gcc-b05d874fc527f81c54b50e62f204eb8cd04250d8.zip gcc-b05d874fc527f81c54b50e62f204eb8cd04250d8.tar.gz gcc-b05d874fc527f81c54b50e62f204eb8cd04250d8.tar.bz2 |
gccrs: Check proc_macro attributes on non root functions
Check proc_macro, proc_macro_attribute and proc_macro_derive attributes
on non root functions, emit an error when one is found.
gcc/rust/ChangeLog:
* util/rust-attributes.cc (check_proc_macro_non_root): Add
function to emit this specific error.
(AttributeChecker::visit): Modify visitor to propagate to some
containers that were not handled correctly.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/util/rust-attributes.cc | 56 |
1 files changed, 50 insertions, 6 deletions
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc index a39c843..8b133cc 100644 --- a/gcc/rust/util/rust-attributes.cc +++ b/gcc/rust/util/rust-attributes.cc @@ -225,6 +225,24 @@ check_proc_macro_non_function (const AST::AttrVec &attributes) } } +// Emit an error when one attribute is either proc_macro, proc_macro_attribute +// or proc_macro_derive +static void +check_proc_macro_non_root (AST::AttrVec attributes, location_t loc) +{ + for (auto &attr : attributes) + { + if (is_proc_macro_type (attr)) + { + rust_error_at ( + loc, + "functions tagged with %<#[%s]%> must currently " + "reside in the root of the crate", + attr.get_path ().get_segments ().at (0).as_string ().c_str ()); + } + } +} + void AttributeChecker::check_attribute (const AST::Attribute &attribute) { @@ -435,8 +453,20 @@ AttributeChecker::visit (AST::ClosureExprInner &) {} void -AttributeChecker::visit (AST::BlockExpr &) -{} +AttributeChecker::visit (AST::BlockExpr &expr) +{ + for (auto &stmt : expr.get_statements ()) + { + if (stmt->get_stmt_kind () == AST::Stmt::Kind::Item) + { + // Non owning pointer, let it go out of scope + auto item = static_cast<AST::Item *> (stmt.get ()); + check_proc_macro_non_root (item->get_outer_attrs (), + item->get_locus ()); + } + stmt->accept_vis (*this); + } +} void AttributeChecker::visit (AST::ClosureExprInnerTyped &) @@ -479,8 +509,10 @@ AttributeChecker::visit (AST::ReturnExpr &) {} void -AttributeChecker::visit (AST::UnsafeBlockExpr &) -{} +AttributeChecker::visit (AST::UnsafeBlockExpr &expr) +{ + expr.get_block_expr ()->accept_vis (*this); +} void AttributeChecker::visit (AST::LoopExpr &) @@ -540,13 +572,20 @@ AttributeChecker::visit (AST::TypeBoundWhereClauseItem &) {} void -AttributeChecker::visit (AST::Method &) -{} +AttributeChecker::visit (AST::Method &method) +{ + method.get_definition ()->accept_vis (*this); +} void AttributeChecker::visit (AST::Module &module) { check_proc_macro_non_function (module.get_outer_attrs ()); + for (auto &item : module.get_items ()) + { + check_proc_macro_non_root (item->get_outer_attrs (), item->get_locus ()); + item->accept_vis (*this); + } } void @@ -611,6 +650,7 @@ AttributeChecker::visit (AST::Function &fun) check_crate_type (name, attribute); } } + fun.get_definition ()->accept_vis (*this); } void @@ -698,12 +738,16 @@ void AttributeChecker::visit (AST::InherentImpl &impl) { check_proc_macro_non_function (impl.get_outer_attrs ()); + for (auto &item : impl.get_impl_items ()) + item->accept_vis (*this); } void AttributeChecker::visit (AST::TraitImpl &impl) { check_proc_macro_non_function (impl.get_outer_attrs ()); + for (auto &item : impl.get_impl_items ()) + item->accept_vis (*this); } void |