diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-07-21 12:41:12 +0200 |
---|---|---|
committer | CohenArthur <arthur.cohen@embecosm.com> | 2023-07-27 09:40:30 +0000 |
commit | dc9eaa15e986ed104f3416014b1d0cdd97896960 (patch) | |
tree | 678f73464a0e96b74d18b67d61abc3ed336044eb /gcc/rust | |
parent | 18837b84b58b81fb749ce1e7f8a59bf19787fbd8 (diff) | |
download | gcc-dc9eaa15e986ed104f3416014b1d0cdd97896960.zip gcc-dc9eaa15e986ed104f3416014b1d0cdd97896960.tar.gz gcc-dc9eaa15e986ed104f3416014b1d0cdd97896960.tar.bz2 |
Emit error with proc macro on non functions
An error should be emitted when a proc_macro, proc_macro_attribute or
proc_macro_derive attribute is met on any non function item. Those
attribute shall be placed only on bare functions.
gcc/rust/ChangeLog:
* util/rust-attributes.cc (is_proc_macro_type): Add function to
identify matching proc macro attribute type.
(check_proc_macro_non_function): Add function to check and emit
error.
(AttributeChecker::visit): Add cal to new check function.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc/rust')
-rw-r--r-- | gcc/rust/util/rust-attributes.cc | 106 |
1 files changed, 80 insertions, 26 deletions
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc index 1b2a62d..e6404dc 100644 --- a/gcc/rust/util/rust-attributes.cc +++ b/gcc/rust/util/rust-attributes.cc @@ -198,6 +198,33 @@ check_doc_attribute (const AST::Attribute &attribute) } } +static bool +is_proc_macro_type (const AST::Attribute &attribute) +{ + BuiltinAttrDefinition result; + if (!is_builtin (attribute, result)) + return false; + + auto name = result.name; + return name == "proc_macro" || name == "proc_macro_derive" + || name == "proc_macro_attribute"; +} + +// Emit an error when one encountered attribute is either #[proc_macro], +// #[proc_macro_attribute] or #[proc_macro_derive] +static void +check_proc_macro_non_function (const AST::AttrVec &attributes) +{ + for (auto &attr : attributes) + { + if (is_proc_macro_type (attr)) + rust_error_at ( + attr.get_locus (), + "the %<#[%s]%> attribute may only be used on bare functions", + attr.get_path ().get_segments ()[0].as_string ().c_str ()); + } +} + void AttributeChecker::check_attribute (const AST::Attribute &attribute) { @@ -517,12 +544,16 @@ AttributeChecker::visit (AST::Method &) {} void -AttributeChecker::visit (AST::Module &) -{} +AttributeChecker::visit (AST::Module &module) +{ + check_proc_macro_non_function (module.get_outer_attrs ()); +} void -AttributeChecker::visit (AST::ExternCrate &) -{} +AttributeChecker::visit (AST::ExternCrate &crate) +{ + check_proc_macro_non_function (crate.get_outer_attrs ()); +} void AttributeChecker::visit (AST::UseTreeGlob &) @@ -537,8 +568,10 @@ AttributeChecker::visit (AST::UseTreeRebind &) {} void -AttributeChecker::visit (AST::UseDeclaration &) -{} +AttributeChecker::visit (AST::UseDeclaration &declaration) +{ + check_proc_macro_non_function (declaration.get_outer_attrs ()); +} void AttributeChecker::visit (AST::Function &fun) @@ -581,18 +614,23 @@ AttributeChecker::visit (AST::Function &fun) } void -AttributeChecker::visit (AST::TypeAlias &) -{} +AttributeChecker::visit (AST::TypeAlias &alias) +{ + check_proc_macro_non_function (alias.get_outer_attrs ()); +} void AttributeChecker::visit (AST::StructStruct &struct_item) { check_attributes (struct_item.get_outer_attrs ()); + check_proc_macro_non_function (struct_item.get_outer_attrs ()); } void -AttributeChecker::visit (AST::TupleStruct &) -{} +AttributeChecker::visit (AST::TupleStruct &tuplestruct) +{ + check_proc_macro_non_function (tuplestruct.get_outer_attrs ()); +} void AttributeChecker::visit (AST::EnumItem &) @@ -611,20 +649,28 @@ AttributeChecker::visit (AST::EnumItemDiscriminant &) {} void -AttributeChecker::visit (AST::Enum &) -{} +AttributeChecker::visit (AST::Enum &enumeration) +{ + check_proc_macro_non_function (enumeration.get_outer_attrs ()); +} void -AttributeChecker::visit (AST::Union &) -{} +AttributeChecker::visit (AST::Union &u) +{ + check_proc_macro_non_function (u.get_outer_attrs ()); +} void -AttributeChecker::visit (AST::ConstantItem &) -{} +AttributeChecker::visit (AST::ConstantItem &item) +{ + check_proc_macro_non_function (item.get_outer_attrs ()); +} void -AttributeChecker::visit (AST::StaticItem &) -{} +AttributeChecker::visit (AST::StaticItem &item) +{ + check_proc_macro_non_function (item.get_outer_attrs ()); +} void AttributeChecker::visit (AST::TraitItemFunc &) @@ -643,16 +689,22 @@ AttributeChecker::visit (AST::TraitItemType &) {} void -AttributeChecker::visit (AST::Trait &) -{} +AttributeChecker::visit (AST::Trait &trait) +{ + check_proc_macro_non_function (trait.get_outer_attrs ()); +} void -AttributeChecker::visit (AST::InherentImpl &) -{} +AttributeChecker::visit (AST::InherentImpl &impl) +{ + check_proc_macro_non_function (impl.get_outer_attrs ()); +} void -AttributeChecker::visit (AST::TraitImpl &) -{} +AttributeChecker::visit (AST::TraitImpl &impl) +{ + check_proc_macro_non_function (impl.get_outer_attrs ()); +} void AttributeChecker::visit (AST::ExternalTypeItem &) @@ -667,8 +719,10 @@ AttributeChecker::visit (AST::ExternalFunctionItem &) {} void -AttributeChecker::visit (AST::ExternBlock &) -{} +AttributeChecker::visit (AST::ExternBlock &block) +{ + check_proc_macro_non_function (block.get_outer_attrs ()); +} // rust-macro.h void |