From: Pierre-Emmanuel Patry <[email protected]>

Path must be made of a single literal item, otherwise an error should be
thrown.

gcc/rust/ChangeLog:

        * util/rust-attributes.cc (AttributeChecker::check_attribute): Recurse
        within attr input for additional attribute checking.
        (AttributeChecker::visit): Remove empty definition in favor of default
        ast visitor definition.
        * util/rust-attributes.h: Remove now unused prototypes.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
---
 gcc/rust/util/rust-attributes.cc | 35 +++++++++++++++++++++++---------
 gcc/rust/util/rust-attributes.h  |  2 --
 2 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc
index bd91fdd5d03..49c4282755c 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -326,6 +326,20 @@ check_proc_macro_non_root (AST::AttrVec attributes, 
location_t loc)
 void
 AttributeChecker::check_attribute (const AST::Attribute &attribute)
 {
+  if (!attribute.empty_input ())
+    {
+      const auto &attr_input = attribute.get_attr_input ();
+      auto type = attr_input.get_attr_input_type ();
+      if (type == AST::AttrInput::AttrInputType::TOKEN_TREE)
+       {
+         const auto &option = static_cast<const AST::DelimTokenTree &> (
+           attribute.get_attr_input ());
+         std::unique_ptr<AST::AttrInputMetaItemContainer> meta_item (
+           option.parse_to_meta_item ());
+         AST::DefaultASTVisitor::visit (meta_item);
+       }
+    }
+
   BuiltinAttrDefinition result;
 
   // This checker does not check non-builtin attributes
@@ -354,10 +368,6 @@ void
 AttributeChecker::visit (AST::DelimTokenTree &)
 {}
 
-void
-AttributeChecker::visit (AST::AttrInputMetaItemContainer &)
-{}
-
 void
 AttributeChecker::visit (AST::IdentifierExpr &)
 {}
@@ -421,8 +431,16 @@ AttributeChecker::visit (AST::MetaItemLitExpr &)
 {}
 
 void
-AttributeChecker::visit (AST::MetaItemPathExpr &)
-{}
+AttributeChecker::visit (AST::MetaItemPathExpr &attribute)
+{
+  if (!attribute.get_expr ().is_literal ())
+    {
+      rust_error_at (attribute.get_locus (),
+                    "malformed %<path%> attribute input");
+      rust_inform (attribute.get_locus (),
+                  "must be of the form: %<#[path = \"file\"]%>");
+    }
+}
 
 void
 AttributeChecker::visit (AST::BorrowExpr &)
@@ -648,6 +666,7 @@ AttributeChecker::visit (AST::TypeBoundWhereClauseItem &)
 void
 AttributeChecker::visit (AST::Module &module)
 {
+  check_attributes (module.get_outer_attrs ());
   check_proc_macro_non_function (module.get_outer_attrs ());
   for (auto &item : module.get_items ())
     {
@@ -862,10 +881,6 @@ void
 AttributeChecker::visit (AST::MetaItemPath &)
 {}
 
-void
-AttributeChecker::visit (AST::MetaItemSeq &)
-{}
-
 void
 AttributeChecker::visit (AST::MetaWord &)
 {}
diff --git a/gcc/rust/util/rust-attributes.h b/gcc/rust/util/rust-attributes.h
index 22670991beb..0ad3c2b9284 100644
--- a/gcc/rust/util/rust-attributes.h
+++ b/gcc/rust/util/rust-attributes.h
@@ -112,7 +112,6 @@ private:
   void visit (AST::Crate &crate) override;
   void visit (AST::Token &tok) override;
   void visit (AST::DelimTokenTree &delim_tok_tree) override;
-  void visit (AST::AttrInputMetaItemContainer &input) override;
   void visit (AST::IdentifierExpr &ident_expr) override;
   void visit (AST::Lifetime &lifetime) override;
   void visit (AST::LifetimeParam &lifetime_param) override;
@@ -220,7 +219,6 @@ private:
   void visit (AST::MacroRulesDefinition &rules_def) override;
   void visit (AST::MacroInvocation &macro_invoc) override;
   void visit (AST::MetaItemPath &meta_item) override;
-  void visit (AST::MetaItemSeq &meta_item) override;
   void visit (AST::MetaWord &meta_item) override;
   void visit (AST::MetaNameValueStr &meta_item) override;
   void visit (AST::MetaListPaths &meta_item) override;
-- 
2.50.1

Reply via email to