diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-07-26 12:16:12 +0200 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2023-07-27 14:20:52 +0000 |
commit | 67b2057b7aa82f71dd1310123ec0cd1388b21a2f (patch) | |
tree | ddfe8c2a6976fdbbcbc1c471029b9c142b42e6a9 /gcc | |
parent | d62a388625d03c208082944e5cfff52ffa772eac (diff) | |
download | gcc-67b2057b7aa82f71dd1310123ec0cd1388b21a2f.zip gcc-67b2057b7aa82f71dd1310123ec0cd1388b21a2f.tar.gz gcc-67b2057b7aa82f71dd1310123ec0cd1388b21a2f.tar.bz2 |
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 e6404dc..d4182edf 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 |