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

Both attribute utility and attribute checker (pre-expansion) were mixed
within the same file/translation unit. Splitting them apart will allow
a shorter header to include and make both file easier to navigate.

gcc/rust/ChangeLog:

        * Make-lang.in: Add a new rust-attribute-checker file.
        * checks/errors/rust-builtin-attribute-checker.h 
(check_valid_attribute_for_item):
        Change BuiltinAttributeChecker doc comment.
        * rust-session-manager.cc: Include the new rust-attribute-checker
        header.
        * util/rust-attributes.cc (AttributeChecker::AttributeChecker): Move to
        rust-attribute-checker.cc.
        (AttributeChecker::go): Likewise.
        (is_proc_macro_type): Likewise.
        (check_proc_macro_non_function): Likewise.
        (check_proc_macro_non_root): Likewise.
        (AttributeChecker::visit): Likewise.
        * util/rust-attributes.h (class AttributeChecker): Move to
        rust-attribute-checker.h.
        * checks/errors/rust-attribute-checker.cc: New file.
        * checks/errors/rust-attribute-checker.h: New file.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/1dd416791aafc60d40feae798945ab67775d34ab

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4505

 gcc/rust/Make-lang.in                         |   1 +
 .../checks/errors/rust-attribute-checker.cc   | 773 ++++++++++++++++++
 .../checks/errors/rust-attribute-checker.h    | 224 +++++
 .../errors/rust-builtin-attribute-checker.h   |  12 +
 gcc/rust/rust-session-manager.cc              |   1 +
 gcc/rust/util/rust-attributes.cc              | 747 -----------------
 gcc/rust/util/rust-attributes.h               | 195 +----
 7 files changed, 1012 insertions(+), 941 deletions(-)
 create mode 100644 gcc/rust/checks/errors/rust-attribute-checker.cc
 create mode 100644 gcc/rust/checks/errors/rust-attribute-checker.h

diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in
index fc11abf1f..878613f70 100644
--- a/gcc/rust/Make-lang.in
+++ b/gcc/rust/Make-lang.in
@@ -126,6 +126,7 @@ GRS_OBJS = \
     rust/rust-hir.o \
     rust/rust-hir-map.o \
     rust/rust-attributes.o \
+    rust/rust-attribute-checker.o \
     rust/rust-builtin-attribute-checker.o \
     rust/rust-keyword-values.o \
     rust/rust-abi.o \
diff --git a/gcc/rust/checks/errors/rust-attribute-checker.cc 
b/gcc/rust/checks/errors/rust-attribute-checker.cc
new file mode 100644
index 000000000..4580aa256
--- /dev/null
+++ b/gcc/rust/checks/errors/rust-attribute-checker.cc
@@ -0,0 +1,773 @@
+// Copyright (C) 2026 Free Software Foundation, Inc.
+
+// This file is part of GCC.
+
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include "rust-attribute-checker.h"
+#include "rust-attributes.h"
+#include "rust-attribute-values.h"
+#include "rust-diagnostics.h"
+#include "rust-session-manager.h"
+
+namespace Rust {
+namespace Analysis {
+
+using Attrs = Values::Attributes;
+
+static bool
+is_proc_macro_type (const AST::Attribute &attribute)
+{
+  auto result_opt = lookup_builtin (attribute);
+  if (!result_opt.has_value ())
+    return false;
+  auto result = result_opt.value ();
+
+  auto name = result.name;
+  return name == Attrs::PROC_MACRO || name == Attrs::PROC_MACRO_DERIVE
+        || name == Attrs::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::Attribute &attr)
+{
+  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 ());
+}
+
+// Emit an error when one attribute is either proc_macro, proc_macro_attribute
+// or proc_macro_derive
+static void
+check_proc_macro_non_root (const AST::Attribute &attr, location_t loc)
+{
+  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 ());
+    }
+}
+
+AttributeChecker::AttributeChecker () {}
+
+void
+AttributeChecker::go (AST::Crate &crate)
+{
+  visit (crate);
+}
+
+void
+AttributeChecker::visit (AST::Attribute &attribute)
+{
+  auto &session = Session::get_instance ();
+  if (attribute.get_path () == Values::Attributes::CFG_ATTR)
+    {
+      if (!attribute.is_parsed_to_meta_item ())
+       attribute.parse_attr_to_meta_item ();
+      if (!attribute.check_cfg_predicate (session))
+       return; // Do not emit errors for attribute that'll get stripped.
+    }
+
+  AST::DefaultASTVisitor::visit (attribute);
+}
+
+void
+AttributeChecker::visit (AST::Token &)
+{}
+
+void
+AttributeChecker::visit (AST::DelimTokenTree &)
+{}
+
+void
+AttributeChecker::visit (AST::IdentifierExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::Lifetime &)
+{}
+
+void
+AttributeChecker::visit (AST::LifetimeParam &)
+{}
+
+void
+AttributeChecker::visit (AST::ConstGenericParam &)
+{}
+
+// rust-path.h
+void
+AttributeChecker::visit (AST::PathInExpression &)
+{}
+
+void
+AttributeChecker::visit (AST::TypePathSegment &)
+{}
+
+void
+AttributeChecker::visit (AST::TypePathSegmentGeneric &)
+{}
+
+void
+AttributeChecker::visit (AST::TypePathSegmentFunction &)
+{}
+
+void
+AttributeChecker::visit (AST::TypePath &)
+{}
+
+void
+AttributeChecker::visit (AST::QualifiedPathInExpression &)
+{}
+
+void
+AttributeChecker::visit (AST::QualifiedPathInType &)
+{}
+
+// rust-expr.h
+void
+AttributeChecker::visit (AST::LiteralExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::AttrInputLiteral &)
+{}
+
+void
+AttributeChecker::visit (AST::MetaItemLitExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::MetaItemPathExpr &attribute)
+{
+  if (!attribute.get_expr ().is_literal ())
+    {
+      rust_error_at (attribute.get_expr ().get_locus (),
+                    "malformed %<path%> attribute input");
+      rust_inform (attribute.get_expr ().get_locus (),
+                  "must be of the form: %<#[path = \"file\"]%>");
+    }
+}
+
+void
+AttributeChecker::visit (AST::BorrowExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::DereferenceExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::ErrorPropagationExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::NegationExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::ArithmeticOrLogicalExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::ComparisonExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::LazyBooleanExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::TypeCastExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::AssignmentExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::CompoundAssignmentExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::GroupedExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::ArrayElemsValues &)
+{}
+
+void
+AttributeChecker::visit (AST::ArrayElemsCopied &)
+{}
+
+void
+AttributeChecker::visit (AST::ArrayExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::ArrayIndexExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::TupleExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::TupleIndexExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::StructExprStruct &)
+{}
+
+void
+AttributeChecker::visit (AST::StructExprFieldIdentifier &)
+{}
+
+void
+AttributeChecker::visit (AST::StructExprFieldIdentifierValue &)
+{}
+
+void
+AttributeChecker::visit (AST::StructExprFieldIndexValue &)
+{}
+
+void
+AttributeChecker::visit (AST::StructExprStructFields &)
+{}
+
+void
+AttributeChecker::visit (AST::StructExprStructBase &)
+{}
+
+void
+AttributeChecker::visit (AST::CallExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::MethodCallExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::FieldAccessExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::ClosureExprInner &)
+{}
+
+void
+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 ());
+         for (auto &attr : item->get_outer_attrs ())
+           check_proc_macro_non_root (attr, item->get_locus ());
+       }
+    }
+  AST::DefaultASTVisitor::visit (expr);
+}
+
+void
+AttributeChecker::visit (AST::ClosureExprInnerTyped &)
+{}
+
+void
+AttributeChecker::visit (AST::ContinueExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::BreakExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::RangeFromToExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::RangeFromExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::RangeToExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::RangeFullExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::RangeFromToInclExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::RangeToInclExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::ReturnExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::LoopExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::WhileLoopExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::WhileLetLoopExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::ForLoopExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::IfExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::IfExprConseqElse &)
+{}
+
+void
+AttributeChecker::visit (AST::IfLetExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::IfLetExprConseqElse &)
+{}
+
+void
+AttributeChecker::visit (AST::MatchExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::AwaitExpr &)
+{}
+
+void
+AttributeChecker::visit (AST::AsyncBlockExpr &)
+{}
+
+// rust-item.h
+void
+AttributeChecker::visit (AST::TypeParam &)
+{}
+
+void
+AttributeChecker::visit (AST::LifetimeWhereClauseItem &)
+{}
+
+void
+AttributeChecker::visit (AST::TypeBoundWhereClauseItem &)
+{}
+
+void
+AttributeChecker::visit (AST::Module &module)
+{
+  for (auto &attr : module.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+
+  for (auto &item : module.get_items ())
+    for (auto &attr : item->get_outer_attrs ())
+      check_proc_macro_non_root (attr, item->get_locus ());
+
+  AST::DefaultASTVisitor::visit (module);
+}
+
+void
+AttributeChecker::visit (AST::ExternCrate &crate)
+{
+  for (auto &attr : crate.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+}
+
+void
+AttributeChecker::visit (AST::UseTreeGlob &)
+{}
+
+void
+AttributeChecker::visit (AST::UseTreeList &)
+{}
+
+void
+AttributeChecker::visit (AST::UseTreeRebind &)
+{}
+
+void
+AttributeChecker::visit (AST::UseDeclaration &declaration)
+{
+  for (auto &attr : declaration.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+}
+
+void
+AttributeChecker::visit (AST::Function &fun)
+{
+  if (fun.has_body ())
+    fun.get_definition ().value ()->accept_vis (*this);
+}
+
+void
+AttributeChecker::visit (AST::TypeAlias &alias)
+{
+  for (auto &attr : alias.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+}
+
+void
+AttributeChecker::visit (AST::StructStruct &struct_item)
+{
+  for (auto &attr : struct_item.get_outer_attrs ())
+    {
+      check_proc_macro_non_function (attr);
+    }
+
+  AST::DefaultASTVisitor::visit (struct_item);
+}
+
+void
+AttributeChecker::visit (AST::TupleStruct &tuplestruct)
+{
+  for (auto &attr : tuplestruct.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+}
+
+void
+AttributeChecker::visit (AST::EnumItem &)
+{}
+
+void
+AttributeChecker::visit (AST::EnumItemTuple &)
+{}
+
+void
+AttributeChecker::visit (AST::EnumItemStruct &)
+{}
+
+void
+AttributeChecker::visit (AST::EnumItemDiscriminant &)
+{}
+
+void
+AttributeChecker::visit (AST::Enum &enumeration)
+{
+  for (auto &attr : enumeration.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+}
+
+void
+AttributeChecker::visit (AST::Union &u)
+{
+  for (auto &attr : u.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+}
+
+void
+AttributeChecker::visit (AST::ConstantItem &item)
+{
+  for (auto &attr : item.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+}
+
+void
+AttributeChecker::visit (AST::StaticItem &item)
+{
+  for (auto &attr : item.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+}
+
+void
+AttributeChecker::visit (AST::TraitItemType &)
+{}
+
+void
+AttributeChecker::visit (AST::Trait &trait)
+{
+  for (auto &attr : trait.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+
+  AST::DefaultASTVisitor::visit (trait);
+}
+
+void
+AttributeChecker::visit (AST::InherentImpl &impl)
+{
+  for (auto &attr : impl.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+
+  AST::DefaultASTVisitor::visit (impl);
+}
+
+void
+AttributeChecker::visit (AST::TraitImpl &impl)
+{
+  for (auto &attr : impl.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+
+  AST::DefaultASTVisitor::visit (impl);
+}
+
+void
+AttributeChecker::visit (AST::ExternalTypeItem &)
+{}
+
+void
+AttributeChecker::visit (AST::ExternalStaticItem &)
+{}
+
+void
+AttributeChecker::visit (AST::ExternBlock &block)
+{
+  for (auto &attr : block.get_outer_attrs ())
+    check_proc_macro_non_function (attr);
+}
+
+// rust-macro.h
+void
+AttributeChecker::visit (AST::MacroMatchFragment &)
+{}
+
+void
+AttributeChecker::visit (AST::MacroMatchRepetition &)
+{}
+
+void
+AttributeChecker::visit (AST::MacroMatcher &)
+{}
+
+void
+AttributeChecker::visit (AST::MacroRulesDefinition &)
+{}
+
+void
+AttributeChecker::visit (AST::MacroInvocation &)
+{}
+
+void
+AttributeChecker::visit (AST::MetaItemPath &)
+{}
+
+void
+AttributeChecker::visit (AST::MetaWord &)
+{}
+
+void
+AttributeChecker::visit (AST::MetaNameValueStr &)
+{}
+
+void
+AttributeChecker::visit (AST::MetaListPaths &)
+{}
+
+void
+AttributeChecker::visit (AST::MetaListNameValueStr &)
+{}
+
+// rust-pattern.h
+void
+AttributeChecker::visit (AST::LiteralPattern &)
+{}
+
+void
+AttributeChecker::visit (AST::IdentifierPattern &)
+{}
+
+void
+AttributeChecker::visit (AST::WildcardPattern &)
+{}
+
+void
+AttributeChecker::visit (AST::RestPattern &)
+{}
+
+// void AttributeChecker::visit(RangePatternBound& ){}
+
+void
+AttributeChecker::visit (AST::RangePatternBoundLiteral &)
+{}
+
+void
+AttributeChecker::visit (AST::RangePatternBoundPath &)
+{}
+
+void
+AttributeChecker::visit (AST::RangePatternBoundQualPath &)
+{}
+
+void
+AttributeChecker::visit (AST::RangePattern &)
+{}
+
+void
+AttributeChecker::visit (AST::ReferencePattern &)
+{}
+
+// void AttributeChecker::visit(StructPatternField& ){}
+
+void
+AttributeChecker::visit (AST::StructPatternFieldTuplePat &)
+{}
+
+void
+AttributeChecker::visit (AST::StructPatternFieldIdentPat &)
+{}
+
+void
+AttributeChecker::visit (AST::StructPatternFieldIdent &)
+{}
+
+void
+AttributeChecker::visit (AST::StructPattern &)
+{}
+
+// void AttributeChecker::visit(TupleStructItems& ){}
+
+void
+AttributeChecker::visit (AST::TupleStructItemsNoRest &)
+{}
+
+void
+AttributeChecker::visit (AST::TupleStructItemsHasRest &)
+{}
+
+void
+AttributeChecker::visit (AST::TupleStructPattern &)
+{}
+
+// void AttributeChecker::visit(TuplePatternItems& ){}
+
+void
+AttributeChecker::visit (AST::TuplePatternItemsNoRest &)
+{}
+
+void
+AttributeChecker::visit (AST::TuplePatternItemsHasRest &)
+{}
+
+void
+AttributeChecker::visit (AST::TuplePattern &)
+{}
+
+void
+AttributeChecker::visit (AST::GroupedPattern &)
+{}
+
+void
+AttributeChecker::visit (AST::SlicePattern &)
+{}
+
+void
+AttributeChecker::visit (AST::AltPattern &)
+{}
+
+// rust-stmt.h
+void
+AttributeChecker::visit (AST::EmptyStmt &)
+{}
+
+void
+AttributeChecker::visit (AST::LetStmt &)
+{}
+
+void
+AttributeChecker::visit (AST::ExprStmt &)
+{}
+
+// rust-type.h
+void
+AttributeChecker::visit (AST::TraitBound &)
+{}
+
+void
+AttributeChecker::visit (AST::ImplTraitType &)
+{}
+
+void
+AttributeChecker::visit (AST::TraitObjectType &)
+{}
+
+void
+AttributeChecker::visit (AST::ParenthesisedType &)
+{}
+
+void
+AttributeChecker::visit (AST::ImplTraitTypeOneBound &)
+{}
+
+void
+AttributeChecker::visit (AST::TraitObjectTypeOneBound &)
+{}
+
+void
+AttributeChecker::visit (AST::TupleType &)
+{}
+
+void
+AttributeChecker::visit (AST::NeverType &)
+{}
+
+void
+AttributeChecker::visit (AST::RawPointerType &)
+{}
+
+void
+AttributeChecker::visit (AST::ReferenceType &)
+{}
+
+void
+AttributeChecker::visit (AST::ArrayType &)
+{}
+
+void
+AttributeChecker::visit (AST::SliceType &)
+{}
+
+void
+AttributeChecker::visit (AST::InferredType &)
+{}
+
+void
+AttributeChecker::visit (AST::BareFunctionType &)
+{}
+
+void
+AttributeChecker::visit (AST::SelfParam &)
+{}
+
+void
+AttributeChecker::visit (AST::VariadicParam &)
+{}
+
+void
+AttributeChecker::visit (AST::FunctionParam &)
+{}
+
+} // namespace Analysis
+} // namespace Rust
diff --git a/gcc/rust/checks/errors/rust-attribute-checker.h 
b/gcc/rust/checks/errors/rust-attribute-checker.h
new file mode 100644
index 000000000..f9aff48c6
--- /dev/null
+++ b/gcc/rust/checks/errors/rust-attribute-checker.h
@@ -0,0 +1,224 @@
+// Copyright (C) 2026 Free Software Foundation, Inc.
+
+// This file is part of GCC.
+
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#ifndef RUST_ATTRIBUTE_CHECKER_H
+#define RUST_ATTRIBUTE_CHECKER_H
+
+#include "rust-ast-visitor.h"
+
+namespace Rust {
+namespace Analysis {
+
+/**
+ * Checks the validity of various pre-expansion attributes.
+ * The goal of this visitor is to make sure that attributes that are used for
+ * macro expansion are applied in allowed contexts and correctly used.
+ *
+ * Examples:
+ * - A proc macro derive attribute `#[derive(Something)]`shall not be used on a
+ * function.
+ */
+class AttributeChecker : public AST::DefaultASTVisitor
+{
+public:
+  AttributeChecker ();
+
+  /**
+   * Check all the attributes of all the items of a crate
+   */
+  void go (AST::Crate &crate);
+
+private:
+  using AST::DefaultASTVisitor::visit;
+
+  /* Check the validity of an inner attribute */
+  void check_inner_attribute (const AST::Attribute &attribute);
+
+  /* Check the validity of a given attribute */
+  // rust-ast.h
+  void visit (AST::Attribute &attribute) override;
+  void visit (AST::Token &tok) override;
+  void visit (AST::DelimTokenTree &delim_tok_tree) override;
+  void visit (AST::IdentifierExpr &ident_expr) override;
+  void visit (AST::Lifetime &lifetime) override;
+  void visit (AST::LifetimeParam &lifetime_param) override;
+  void visit (AST::ConstGenericParam &const_param) override;
+
+  // rust-path.h
+  void visit (AST::PathInExpression &path) override;
+  void visit (AST::TypePathSegment &segment) override;
+  void visit (AST::TypePathSegmentGeneric &segment) override;
+  void visit (AST::TypePathSegmentFunction &segment) override;
+  void visit (AST::TypePath &path) override;
+  void visit (AST::QualifiedPathInExpression &path) override;
+  void visit (AST::QualifiedPathInType &path) override;
+
+  // rust-expr.h
+  void visit (AST::LiteralExpr &expr) override;
+  void visit (AST::AttrInputLiteral &attr_input) override;
+  void visit (AST::MetaItemLitExpr &meta_item) override;
+  void visit (AST::MetaItemPathExpr &meta_item) override;
+  void visit (AST::BorrowExpr &expr) override;
+  void visit (AST::DereferenceExpr &expr) override;
+  void visit (AST::ErrorPropagationExpr &expr) override;
+  void visit (AST::NegationExpr &expr) override;
+  void visit (AST::ArithmeticOrLogicalExpr &expr) override;
+  void visit (AST::ComparisonExpr &expr) override;
+  void visit (AST::LazyBooleanExpr &expr) override;
+  void visit (AST::TypeCastExpr &expr) override;
+  void visit (AST::AssignmentExpr &expr) override;
+  void visit (AST::CompoundAssignmentExpr &expr) override;
+  void visit (AST::GroupedExpr &expr) override;
+  void visit (AST::ArrayElemsValues &elems) override;
+  void visit (AST::ArrayElemsCopied &elems) override;
+  void visit (AST::ArrayExpr &expr) override;
+  void visit (AST::ArrayIndexExpr &expr) override;
+  void visit (AST::TupleExpr &expr) override;
+  void visit (AST::TupleIndexExpr &expr) override;
+  void visit (AST::StructExprStruct &expr) override;
+  void visit (AST::StructExprFieldIdentifier &field) override;
+  void visit (AST::StructExprFieldIdentifierValue &field) override;
+  void visit (AST::StructExprFieldIndexValue &field) override;
+  void visit (AST::StructExprStructFields &expr) override;
+  void visit (AST::StructExprStructBase &expr) override;
+  void visit (AST::CallExpr &expr) override;
+  void visit (AST::MethodCallExpr &expr) override;
+  void visit (AST::FieldAccessExpr &expr) override;
+  void visit (AST::ClosureExprInner &expr) override;
+  void visit (AST::BlockExpr &expr) override;
+  void visit (AST::ClosureExprInnerTyped &expr) override;
+  void visit (AST::ContinueExpr &expr) override;
+  void visit (AST::BreakExpr &expr) override;
+  void visit (AST::RangeFromToExpr &expr) override;
+  void visit (AST::RangeFromExpr &expr) override;
+  void visit (AST::RangeToExpr &expr) override;
+  void visit (AST::RangeFullExpr &expr) override;
+  void visit (AST::RangeFromToInclExpr &expr) override;
+  void visit (AST::RangeToInclExpr &expr) override;
+  void visit (AST::ReturnExpr &expr) override;
+  void visit (AST::LoopExpr &expr) override;
+  void visit (AST::WhileLoopExpr &expr) override;
+  void visit (AST::WhileLetLoopExpr &expr) override;
+  void visit (AST::ForLoopExpr &expr) override;
+  void visit (AST::IfExpr &expr) override;
+  void visit (AST::IfExprConseqElse &expr) override;
+  void visit (AST::IfLetExpr &expr) override;
+  void visit (AST::IfLetExprConseqElse &expr) override;
+  void visit (AST::MatchExpr &expr) override;
+  void visit (AST::AwaitExpr &expr) override;
+  void visit (AST::AsyncBlockExpr &expr) override;
+
+  // rust-item.h
+  void visit (AST::TypeParam &param) override;
+  void visit (AST::LifetimeWhereClauseItem &item) override;
+  void visit (AST::TypeBoundWhereClauseItem &item) override;
+  void visit (AST::Module &module) override;
+  void visit (AST::ExternCrate &crate) override;
+  void visit (AST::UseTreeGlob &use_tree) override;
+  void visit (AST::UseTreeList &use_tree) override;
+  void visit (AST::UseTreeRebind &use_tree) override;
+  void visit (AST::UseDeclaration &use_decl) override;
+  void visit (AST::Function &function) override;
+  void visit (AST::TypeAlias &type_alias) override;
+  void visit (AST::StructStruct &struct_item) override;
+  void visit (AST::TupleStruct &tuple_struct) override;
+  void visit (AST::EnumItem &item) override;
+  void visit (AST::EnumItemTuple &item) override;
+  void visit (AST::EnumItemStruct &item) override;
+  void visit (AST::EnumItemDiscriminant &item) override;
+  void visit (AST::Enum &enum_item) override;
+  void visit (AST::Union &union_item) override;
+  void visit (AST::ConstantItem &const_item) override;
+  void visit (AST::StaticItem &static_item) override;
+  void visit (AST::TraitItemType &item) override;
+  void visit (AST::Trait &trait) override;
+  void visit (AST::InherentImpl &impl) override;
+  void visit (AST::TraitImpl &impl) override;
+  void visit (AST::ExternalTypeItem &item) override;
+  void visit (AST::ExternalStaticItem &item) override;
+  void visit (AST::ExternBlock &block) override;
+
+  // rust-macro.h
+  void visit (AST::MacroMatchFragment &match) override;
+  void visit (AST::MacroMatchRepetition &match) override;
+  void visit (AST::MacroMatcher &matcher) override;
+  void visit (AST::MacroRulesDefinition &rules_def) override;
+  void visit (AST::MacroInvocation &macro_invoc) override;
+  void visit (AST::MetaItemPath &meta_item) override;
+  void visit (AST::MetaWord &meta_item) override;
+  void visit (AST::MetaNameValueStr &meta_item) override;
+  void visit (AST::MetaListPaths &meta_item) override;
+  void visit (AST::MetaListNameValueStr &meta_item) override;
+
+  // rust-pattern.h
+  void visit (AST::LiteralPattern &pattern) override;
+  void visit (AST::IdentifierPattern &pattern) override;
+  void visit (AST::WildcardPattern &pattern) override;
+  void visit (AST::RestPattern &pattern) override;
+  // void visit(RangePatternBound& bound) override;
+  void visit (AST::RangePatternBoundLiteral &bound) override;
+  void visit (AST::RangePatternBoundPath &bound) override;
+  void visit (AST::RangePatternBoundQualPath &bound) override;
+  void visit (AST::RangePattern &pattern) override;
+  void visit (AST::ReferencePattern &pattern) override;
+  // void visit(StructPatternField& field) override;
+  void visit (AST::StructPatternFieldTuplePat &field) override;
+  void visit (AST::StructPatternFieldIdentPat &field) override;
+  void visit (AST::StructPatternFieldIdent &field) override;
+  void visit (AST::StructPattern &pattern) override;
+  // void visit(TupleStructItems& tuple_items) override;
+  void visit (AST::TupleStructItemsNoRest &tuple_items) override;
+  void visit (AST::TupleStructItemsHasRest &tuple_items) override;
+  void visit (AST::TupleStructPattern &pattern) override;
+  // void visit(TuplePatternItems& tuple_items) override;
+  void visit (AST::TuplePatternItemsNoRest &tuple_items) override;
+  void visit (AST::TuplePatternItemsHasRest &tuple_items) override;
+  void visit (AST::TuplePattern &pattern) override;
+  void visit (AST::GroupedPattern &pattern) override;
+  void visit (AST::SlicePattern &pattern) override;
+  void visit (AST::AltPattern &pattern) override;
+
+  // rust-stmt.h
+  void visit (AST::EmptyStmt &stmt) override;
+  void visit (AST::LetStmt &stmt) override;
+  void visit (AST::ExprStmt &stmt) override;
+
+  // rust-type.h
+  void visit (AST::TraitBound &bound) override;
+  void visit (AST::ImplTraitType &type) override;
+  void visit (AST::TraitObjectType &type) override;
+  void visit (AST::ParenthesisedType &type) override;
+  void visit (AST::ImplTraitTypeOneBound &type) override;
+  void visit (AST::TraitObjectTypeOneBound &type) override;
+  void visit (AST::TupleType &type) override;
+  void visit (AST::NeverType &type) override;
+  void visit (AST::RawPointerType &type) override;
+  void visit (AST::ReferenceType &type) override;
+  void visit (AST::ArrayType &type) override;
+  void visit (AST::SliceType &type) override;
+  void visit (AST::InferredType &type) override;
+  void visit (AST::BareFunctionType &type) override;
+  void visit (AST::FunctionParam &param) override;
+  void visit (AST::VariadicParam &param) override;
+  void visit (AST::SelfParam &param) override;
+};
+
+} // namespace Analysis
+} // namespace Rust
+
+#endif /* ! RUST_ATTRIBUTE_CHECKER_H */
diff --git a/gcc/rust/checks/errors/rust-builtin-attribute-checker.h 
b/gcc/rust/checks/errors/rust-builtin-attribute-checker.h
index 4765e630d..e0564f2a4 100644
--- a/gcc/rust/checks/errors/rust-builtin-attribute-checker.h
+++ b/gcc/rust/checks/errors/rust-builtin-attribute-checker.h
@@ -27,6 +27,18 @@ namespace Analysis {
 void check_valid_attribute_for_item (const AST::Attribute &attr,
                                     const AST::Item &item);
 
+/**
+ * Checks the validity of builtin attributes.
+ *
+ * The goal of this visitor is to  make sure that builtin attributes are
+ * correctly used by enforcing those rules:
+ *
+ * - Attributes are applied in allowed contexts, for example to make sure that
+ * #[inline] is only applied to functions and closures, as well as checking the
+ * "arguments"
+ *
+ * - input given to these attributes is appropriate and valid.
+ */
 class BuiltinAttributeChecker : public AST::DefaultASTVisitor
 {
   using AST::DefaultASTVisitor::visit;
diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc
index 364ca0811..9872cc0e7 100644
--- a/gcc/rust/rust-session-manager.cc
+++ b/gcc/rust/rust-session-manager.cc
@@ -60,6 +60,7 @@
 #include "rust-borrow-checker.h"
 #include "rust-ast-validation.h"
 #include "rust-tyty-variance-analysis.h"
+#include "rust-attribute-checker.h"
 #include "rust-builtin-attribute-checker.h"
 
 #include "input.h"
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc
index f03fa90d9..39339f27c 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -16,14 +16,9 @@
 // along with GCC; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-#include "rust-ast-visitor.h"
-#include "rust-system.h"
-#include "rust-session-manager.h"
 #include "rust-attributes.h"
 #include "rust-ast.h"
 #include "rust-ast-full.h"
-#include "rust-diagnostics.h"
-#include "rust-unicode.h"
 #include "rust-attribute-values.h"
 
 namespace Rust {
@@ -186,14 +181,6 @@ BuiltinAttributeMappings::BuiltinAttributeMappings ()
     }
 }
 
-AttributeChecker::AttributeChecker () {}
-
-void
-AttributeChecker::go (AST::Crate &crate)
-{
-  visit (crate);
-}
-
 tl::optional<BuiltinAttrDefinition>
 lookup_builtin (const AST::Attribute &attribute)
 {
@@ -209,739 +196,5 @@ lookup_builtin (const AST::Attribute &attribute)
     segments.at (0).get_segment_name ());
 }
 
-static bool
-is_proc_macro_type (const AST::Attribute &attribute)
-{
-  auto result_opt = lookup_builtin (attribute);
-  if (!result_opt.has_value ())
-    return false;
-  auto result = result_opt.value ();
-
-  auto name = result.name;
-  return name == Attrs::PROC_MACRO || name == Attrs::PROC_MACRO_DERIVE
-        || name == Attrs::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::Attribute &attr)
-{
-  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 ());
-}
-
-// Emit an error when one attribute is either proc_macro, proc_macro_attribute
-// or proc_macro_derive
-static void
-check_proc_macro_non_root (const AST::Attribute &attr, location_t loc)
-{
-  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::visit (AST::Attribute &attribute)
-{
-  auto &session = Session::get_instance ();
-  if (attribute.get_path () == Values::Attributes::CFG_ATTR)
-    {
-      if (!attribute.is_parsed_to_meta_item ())
-       attribute.parse_attr_to_meta_item ();
-      if (!attribute.check_cfg_predicate (session))
-       return; // Do not emit errors for attribute that'll get stripped.
-    }
-
-  AST::DefaultASTVisitor::visit (attribute);
-}
-
-void
-AttributeChecker::visit (AST::Token &)
-{}
-
-void
-AttributeChecker::visit (AST::DelimTokenTree &)
-{}
-
-void
-AttributeChecker::visit (AST::IdentifierExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::Lifetime &)
-{}
-
-void
-AttributeChecker::visit (AST::LifetimeParam &)
-{}
-
-void
-AttributeChecker::visit (AST::ConstGenericParam &)
-{}
-
-// rust-path.h
-void
-AttributeChecker::visit (AST::PathInExpression &)
-{}
-
-void
-AttributeChecker::visit (AST::TypePathSegment &)
-{}
-
-void
-AttributeChecker::visit (AST::TypePathSegmentGeneric &)
-{}
-
-void
-AttributeChecker::visit (AST::TypePathSegmentFunction &)
-{}
-
-void
-AttributeChecker::visit (AST::TypePath &)
-{}
-
-void
-AttributeChecker::visit (AST::QualifiedPathInExpression &)
-{}
-
-void
-AttributeChecker::visit (AST::QualifiedPathInType &)
-{}
-
-// rust-expr.h
-void
-AttributeChecker::visit (AST::LiteralExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::AttrInputLiteral &)
-{}
-
-void
-AttributeChecker::visit (AST::MetaItemLitExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::MetaItemPathExpr &attribute)
-{
-  if (!attribute.get_expr ().is_literal ())
-    {
-      rust_error_at (attribute.get_expr ().get_locus (),
-                    "malformed %<path%> attribute input");
-      rust_inform (attribute.get_expr ().get_locus (),
-                  "must be of the form: %<#[path = \"file\"]%>");
-    }
-}
-
-void
-AttributeChecker::visit (AST::BorrowExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::DereferenceExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::ErrorPropagationExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::NegationExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::ArithmeticOrLogicalExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::ComparisonExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::LazyBooleanExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::TypeCastExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::AssignmentExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::CompoundAssignmentExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::GroupedExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::ArrayElemsValues &)
-{}
-
-void
-AttributeChecker::visit (AST::ArrayElemsCopied &)
-{}
-
-void
-AttributeChecker::visit (AST::ArrayExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::ArrayIndexExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::TupleExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::TupleIndexExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::StructExprStruct &)
-{}
-
-void
-AttributeChecker::visit (AST::StructExprFieldIdentifier &)
-{}
-
-void
-AttributeChecker::visit (AST::StructExprFieldIdentifierValue &)
-{}
-
-void
-AttributeChecker::visit (AST::StructExprFieldIndexValue &)
-{}
-
-void
-AttributeChecker::visit (AST::StructExprStructFields &)
-{}
-
-void
-AttributeChecker::visit (AST::StructExprStructBase &)
-{}
-
-void
-AttributeChecker::visit (AST::CallExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::MethodCallExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::FieldAccessExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::ClosureExprInner &)
-{}
-
-void
-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 ());
-         for (auto &attr : item->get_outer_attrs ())
-           check_proc_macro_non_root (attr, item->get_locus ());
-       }
-    }
-  AST::DefaultASTVisitor::visit (expr);
-}
-
-void
-AttributeChecker::visit (AST::ClosureExprInnerTyped &)
-{}
-
-void
-AttributeChecker::visit (AST::ContinueExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::BreakExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::RangeFromToExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::RangeFromExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::RangeToExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::RangeFullExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::RangeFromToInclExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::RangeToInclExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::ReturnExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::LoopExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::WhileLoopExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::WhileLetLoopExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::ForLoopExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::IfExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::IfExprConseqElse &)
-{}
-
-void
-AttributeChecker::visit (AST::IfLetExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::IfLetExprConseqElse &)
-{}
-
-void
-AttributeChecker::visit (AST::MatchExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::AwaitExpr &)
-{}
-
-void
-AttributeChecker::visit (AST::AsyncBlockExpr &)
-{}
-
-// rust-item.h
-void
-AttributeChecker::visit (AST::TypeParam &)
-{}
-
-void
-AttributeChecker::visit (AST::LifetimeWhereClauseItem &)
-{}
-
-void
-AttributeChecker::visit (AST::TypeBoundWhereClauseItem &)
-{}
-
-void
-AttributeChecker::visit (AST::Module &module)
-{
-  for (auto &attr : module.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-
-  for (auto &item : module.get_items ())
-    for (auto &attr : item->get_outer_attrs ())
-      check_proc_macro_non_root (attr, item->get_locus ());
-
-  AST::DefaultASTVisitor::visit (module);
-}
-
-void
-AttributeChecker::visit (AST::ExternCrate &crate)
-{
-  for (auto &attr : crate.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-}
-
-void
-AttributeChecker::visit (AST::UseTreeGlob &)
-{}
-
-void
-AttributeChecker::visit (AST::UseTreeList &)
-{}
-
-void
-AttributeChecker::visit (AST::UseTreeRebind &)
-{}
-
-void
-AttributeChecker::visit (AST::UseDeclaration &declaration)
-{
-  for (auto &attr : declaration.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-}
-
-void
-AttributeChecker::visit (AST::Function &fun)
-{
-  if (fun.has_body ())
-    fun.get_definition ().value ()->accept_vis (*this);
-}
-
-void
-AttributeChecker::visit (AST::TypeAlias &alias)
-{
-  for (auto &attr : alias.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-}
-
-void
-AttributeChecker::visit (AST::StructStruct &struct_item)
-{
-  for (auto &attr : struct_item.get_outer_attrs ())
-    {
-      check_proc_macro_non_function (attr);
-    }
-
-  AST::DefaultASTVisitor::visit (struct_item);
-}
-
-void
-AttributeChecker::visit (AST::TupleStruct &tuplestruct)
-{
-  for (auto &attr : tuplestruct.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-}
-
-void
-AttributeChecker::visit (AST::EnumItem &)
-{}
-
-void
-AttributeChecker::visit (AST::EnumItemTuple &)
-{}
-
-void
-AttributeChecker::visit (AST::EnumItemStruct &)
-{}
-
-void
-AttributeChecker::visit (AST::EnumItemDiscriminant &)
-{}
-
-void
-AttributeChecker::visit (AST::Enum &enumeration)
-{
-  for (auto &attr : enumeration.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-}
-
-void
-AttributeChecker::visit (AST::Union &u)
-{
-  for (auto &attr : u.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-}
-
-void
-AttributeChecker::visit (AST::ConstantItem &item)
-{
-  for (auto &attr : item.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-}
-
-void
-AttributeChecker::visit (AST::StaticItem &item)
-{
-  for (auto &attr : item.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-}
-
-void
-AttributeChecker::visit (AST::TraitItemType &)
-{}
-
-void
-AttributeChecker::visit (AST::Trait &trait)
-{
-  for (auto &attr : trait.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-
-  AST::DefaultASTVisitor::visit (trait);
-}
-
-void
-AttributeChecker::visit (AST::InherentImpl &impl)
-{
-  for (auto &attr : impl.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-
-  AST::DefaultASTVisitor::visit (impl);
-}
-
-void
-AttributeChecker::visit (AST::TraitImpl &impl)
-{
-  for (auto &attr : impl.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-
-  AST::DefaultASTVisitor::visit (impl);
-}
-
-void
-AttributeChecker::visit (AST::ExternalTypeItem &)
-{}
-
-void
-AttributeChecker::visit (AST::ExternalStaticItem &)
-{}
-
-void
-AttributeChecker::visit (AST::ExternBlock &block)
-{
-  for (auto &attr : block.get_outer_attrs ())
-    check_proc_macro_non_function (attr);
-}
-
-// rust-macro.h
-void
-AttributeChecker::visit (AST::MacroMatchFragment &)
-{}
-
-void
-AttributeChecker::visit (AST::MacroMatchRepetition &)
-{}
-
-void
-AttributeChecker::visit (AST::MacroMatcher &)
-{}
-
-void
-AttributeChecker::visit (AST::MacroRulesDefinition &)
-{}
-
-void
-AttributeChecker::visit (AST::MacroInvocation &)
-{}
-
-void
-AttributeChecker::visit (AST::MetaItemPath &)
-{}
-
-void
-AttributeChecker::visit (AST::MetaWord &)
-{}
-
-void
-AttributeChecker::visit (AST::MetaNameValueStr &)
-{}
-
-void
-AttributeChecker::visit (AST::MetaListPaths &)
-{}
-
-void
-AttributeChecker::visit (AST::MetaListNameValueStr &)
-{}
-
-// rust-pattern.h
-void
-AttributeChecker::visit (AST::LiteralPattern &)
-{}
-
-void
-AttributeChecker::visit (AST::IdentifierPattern &)
-{}
-
-void
-AttributeChecker::visit (AST::WildcardPattern &)
-{}
-
-void
-AttributeChecker::visit (AST::RestPattern &)
-{}
-
-// void AttributeChecker::visit(RangePatternBound& ){}
-
-void
-AttributeChecker::visit (AST::RangePatternBoundLiteral &)
-{}
-
-void
-AttributeChecker::visit (AST::RangePatternBoundPath &)
-{}
-
-void
-AttributeChecker::visit (AST::RangePatternBoundQualPath &)
-{}
-
-void
-AttributeChecker::visit (AST::RangePattern &)
-{}
-
-void
-AttributeChecker::visit (AST::ReferencePattern &)
-{}
-
-// void AttributeChecker::visit(StructPatternField& ){}
-
-void
-AttributeChecker::visit (AST::StructPatternFieldTuplePat &)
-{}
-
-void
-AttributeChecker::visit (AST::StructPatternFieldIdentPat &)
-{}
-
-void
-AttributeChecker::visit (AST::StructPatternFieldIdent &)
-{}
-
-void
-AttributeChecker::visit (AST::StructPattern &)
-{}
-
-// void AttributeChecker::visit(TupleStructItems& ){}
-
-void
-AttributeChecker::visit (AST::TupleStructItemsNoRest &)
-{}
-
-void
-AttributeChecker::visit (AST::TupleStructItemsHasRest &)
-{}
-
-void
-AttributeChecker::visit (AST::TupleStructPattern &)
-{}
-
-// void AttributeChecker::visit(TuplePatternItems& ){}
-
-void
-AttributeChecker::visit (AST::TuplePatternItemsNoRest &)
-{}
-
-void
-AttributeChecker::visit (AST::TuplePatternItemsHasRest &)
-{}
-
-void
-AttributeChecker::visit (AST::TuplePattern &)
-{}
-
-void
-AttributeChecker::visit (AST::GroupedPattern &)
-{}
-
-void
-AttributeChecker::visit (AST::SlicePattern &)
-{}
-
-void
-AttributeChecker::visit (AST::AltPattern &)
-{}
-
-// rust-stmt.h
-void
-AttributeChecker::visit (AST::EmptyStmt &)
-{}
-
-void
-AttributeChecker::visit (AST::LetStmt &)
-{}
-
-void
-AttributeChecker::visit (AST::ExprStmt &)
-{}
-
-// rust-type.h
-void
-AttributeChecker::visit (AST::TraitBound &)
-{}
-
-void
-AttributeChecker::visit (AST::ImplTraitType &)
-{}
-
-void
-AttributeChecker::visit (AST::TraitObjectType &)
-{}
-
-void
-AttributeChecker::visit (AST::ParenthesisedType &)
-{}
-
-void
-AttributeChecker::visit (AST::ImplTraitTypeOneBound &)
-{}
-
-void
-AttributeChecker::visit (AST::TraitObjectTypeOneBound &)
-{}
-
-void
-AttributeChecker::visit (AST::TupleType &)
-{}
-
-void
-AttributeChecker::visit (AST::NeverType &)
-{}
-
-void
-AttributeChecker::visit (AST::RawPointerType &)
-{}
-
-void
-AttributeChecker::visit (AST::ReferenceType &)
-{}
-
-void
-AttributeChecker::visit (AST::ArrayType &)
-{}
-
-void
-AttributeChecker::visit (AST::SliceType &)
-{}
-
-void
-AttributeChecker::visit (AST::InferredType &)
-{}
-
-void
-AttributeChecker::visit (AST::BareFunctionType &)
-{}
-
-void
-AttributeChecker::visit (AST::SelfParam &)
-{}
-
-void
-AttributeChecker::visit (AST::VariadicParam &)
-{}
-
-void
-AttributeChecker::visit (AST::FunctionParam &)
-{}
-
 } // namespace Analysis
 } // namespace Rust
diff --git a/gcc/rust/util/rust-attributes.h b/gcc/rust/util/rust-attributes.h
index 3e5aea815..778cc9e33 100644
--- a/gcc/rust/util/rust-attributes.h
+++ b/gcc/rust/util/rust-attributes.h
@@ -19,8 +19,7 @@
 #define RUST_ATTRIBUTES_H
 
 #include "rust-ast.h"
-#include "rust-system.h"
-#include "rust-ast-visitor.h"
+#include "optional.h"
 
 namespace Rust {
 namespace Analysis {
@@ -84,198 +83,6 @@ private:
   std::map<std::string, const BuiltinAttrDefinition> mappings;
 };
 
-/**
- * Checks the validity of various attributes. The goal of this visitor is to
- * make sure that attributes are applied in allowed contexts, for example to
- * make sure that #[inline] is only applied to functions and closures, as well
- * as checking the "arguments" or input given to these attributes, making sure
- * it is appropriate and valid.
- */
-class AttributeChecker : public AST::DefaultASTVisitor
-{
-public:
-  AttributeChecker ();
-
-  /**
-   * Check all the attributes of all the items of a crate
-   */
-  void go (AST::Crate &crate);
-
-private:
-  using AST::DefaultASTVisitor::visit;
-
-  /* Check the validity of an inner attribute */
-  void check_inner_attribute (const AST::Attribute &attribute);
-  /* Check the validity of a given attribute */
-
-  // rust-ast.h
-  void visit (AST::Attribute &attribute) override;
-  void visit (AST::Token &tok) override;
-  void visit (AST::DelimTokenTree &delim_tok_tree) override;
-  void visit (AST::IdentifierExpr &ident_expr) override;
-  void visit (AST::Lifetime &lifetime) override;
-  void visit (AST::LifetimeParam &lifetime_param) override;
-  void visit (AST::ConstGenericParam &const_param) override;
-
-  // rust-path.h
-  void visit (AST::PathInExpression &path) override;
-  void visit (AST::TypePathSegment &segment) override;
-  void visit (AST::TypePathSegmentGeneric &segment) override;
-  void visit (AST::TypePathSegmentFunction &segment) override;
-  void visit (AST::TypePath &path) override;
-  void visit (AST::QualifiedPathInExpression &path) override;
-  void visit (AST::QualifiedPathInType &path) override;
-
-  // rust-expr.h
-  void visit (AST::LiteralExpr &expr) override;
-  void visit (AST::AttrInputLiteral &attr_input) override;
-  void visit (AST::MetaItemLitExpr &meta_item) override;
-  void visit (AST::MetaItemPathExpr &meta_item) override;
-  void visit (AST::BorrowExpr &expr) override;
-  void visit (AST::DereferenceExpr &expr) override;
-  void visit (AST::ErrorPropagationExpr &expr) override;
-  void visit (AST::NegationExpr &expr) override;
-  void visit (AST::ArithmeticOrLogicalExpr &expr) override;
-  void visit (AST::ComparisonExpr &expr) override;
-  void visit (AST::LazyBooleanExpr &expr) override;
-  void visit (AST::TypeCastExpr &expr) override;
-  void visit (AST::AssignmentExpr &expr) override;
-  void visit (AST::CompoundAssignmentExpr &expr) override;
-  void visit (AST::GroupedExpr &expr) override;
-  void visit (AST::ArrayElemsValues &elems) override;
-  void visit (AST::ArrayElemsCopied &elems) override;
-  void visit (AST::ArrayExpr &expr) override;
-  void visit (AST::ArrayIndexExpr &expr) override;
-  void visit (AST::TupleExpr &expr) override;
-  void visit (AST::TupleIndexExpr &expr) override;
-  void visit (AST::StructExprStruct &expr) override;
-  void visit (AST::StructExprFieldIdentifier &field) override;
-  void visit (AST::StructExprFieldIdentifierValue &field) override;
-  void visit (AST::StructExprFieldIndexValue &field) override;
-  void visit (AST::StructExprStructFields &expr) override;
-  void visit (AST::StructExprStructBase &expr) override;
-  void visit (AST::CallExpr &expr) override;
-  void visit (AST::MethodCallExpr &expr) override;
-  void visit (AST::FieldAccessExpr &expr) override;
-  void visit (AST::ClosureExprInner &expr) override;
-  void visit (AST::BlockExpr &expr) override;
-  void visit (AST::ClosureExprInnerTyped &expr) override;
-  void visit (AST::ContinueExpr &expr) override;
-  void visit (AST::BreakExpr &expr) override;
-  void visit (AST::RangeFromToExpr &expr) override;
-  void visit (AST::RangeFromExpr &expr) override;
-  void visit (AST::RangeToExpr &expr) override;
-  void visit (AST::RangeFullExpr &expr) override;
-  void visit (AST::RangeFromToInclExpr &expr) override;
-  void visit (AST::RangeToInclExpr &expr) override;
-  void visit (AST::ReturnExpr &expr) override;
-  void visit (AST::LoopExpr &expr) override;
-  void visit (AST::WhileLoopExpr &expr) override;
-  void visit (AST::WhileLetLoopExpr &expr) override;
-  void visit (AST::ForLoopExpr &expr) override;
-  void visit (AST::IfExpr &expr) override;
-  void visit (AST::IfExprConseqElse &expr) override;
-  void visit (AST::IfLetExpr &expr) override;
-  void visit (AST::IfLetExprConseqElse &expr) override;
-  void visit (AST::MatchExpr &expr) override;
-  void visit (AST::AwaitExpr &expr) override;
-  void visit (AST::AsyncBlockExpr &expr) override;
-
-  // rust-item.h
-  void visit (AST::TypeParam &param) override;
-  void visit (AST::LifetimeWhereClauseItem &item) override;
-  void visit (AST::TypeBoundWhereClauseItem &item) override;
-  void visit (AST::Module &module) override;
-  void visit (AST::ExternCrate &crate) override;
-  void visit (AST::UseTreeGlob &use_tree) override;
-  void visit (AST::UseTreeList &use_tree) override;
-  void visit (AST::UseTreeRebind &use_tree) override;
-  void visit (AST::UseDeclaration &use_decl) override;
-  void visit (AST::Function &function) override;
-  void visit (AST::TypeAlias &type_alias) override;
-  void visit (AST::StructStruct &struct_item) override;
-  void visit (AST::TupleStruct &tuple_struct) override;
-  void visit (AST::EnumItem &item) override;
-  void visit (AST::EnumItemTuple &item) override;
-  void visit (AST::EnumItemStruct &item) override;
-  void visit (AST::EnumItemDiscriminant &item) override;
-  void visit (AST::Enum &enum_item) override;
-  void visit (AST::Union &union_item) override;
-  void visit (AST::ConstantItem &const_item) override;
-  void visit (AST::StaticItem &static_item) override;
-  void visit (AST::TraitItemType &item) override;
-  void visit (AST::Trait &trait) override;
-  void visit (AST::InherentImpl &impl) override;
-  void visit (AST::TraitImpl &impl) override;
-  void visit (AST::ExternalTypeItem &item) override;
-  void visit (AST::ExternalStaticItem &item) override;
-  void visit (AST::ExternBlock &block) override;
-
-  // rust-macro.h
-  void visit (AST::MacroMatchFragment &match) override;
-  void visit (AST::MacroMatchRepetition &match) override;
-  void visit (AST::MacroMatcher &matcher) override;
-  void visit (AST::MacroRulesDefinition &rules_def) override;
-  void visit (AST::MacroInvocation &macro_invoc) override;
-  void visit (AST::MetaItemPath &meta_item) override;
-  void visit (AST::MetaWord &meta_item) override;
-  void visit (AST::MetaNameValueStr &meta_item) override;
-  void visit (AST::MetaListPaths &meta_item) override;
-  void visit (AST::MetaListNameValueStr &meta_item) override;
-
-  // rust-pattern.h
-  void visit (AST::LiteralPattern &pattern) override;
-  void visit (AST::IdentifierPattern &pattern) override;
-  void visit (AST::WildcardPattern &pattern) override;
-  void visit (AST::RestPattern &pattern) override;
-  // void visit(RangePatternBound& bound) override;
-  void visit (AST::RangePatternBoundLiteral &bound) override;
-  void visit (AST::RangePatternBoundPath &bound) override;
-  void visit (AST::RangePatternBoundQualPath &bound) override;
-  void visit (AST::RangePattern &pattern) override;
-  void visit (AST::ReferencePattern &pattern) override;
-  // void visit(StructPatternField& field) override;
-  void visit (AST::StructPatternFieldTuplePat &field) override;
-  void visit (AST::StructPatternFieldIdentPat &field) override;
-  void visit (AST::StructPatternFieldIdent &field) override;
-  void visit (AST::StructPattern &pattern) override;
-  // void visit(TupleStructItems& tuple_items) override;
-  void visit (AST::TupleStructItemsNoRest &tuple_items) override;
-  void visit (AST::TupleStructItemsHasRest &tuple_items) override;
-  void visit (AST::TupleStructPattern &pattern) override;
-  // void visit(TuplePatternItems& tuple_items) override;
-  void visit (AST::TuplePatternItemsNoRest &tuple_items) override;
-  void visit (AST::TuplePatternItemsHasRest &tuple_items) override;
-  void visit (AST::TuplePattern &pattern) override;
-  void visit (AST::GroupedPattern &pattern) override;
-  void visit (AST::SlicePattern &pattern) override;
-  void visit (AST::AltPattern &pattern) override;
-
-  // rust-stmt.h
-  void visit (AST::EmptyStmt &stmt) override;
-  void visit (AST::LetStmt &stmt) override;
-  void visit (AST::ExprStmt &stmt) override;
-
-  // rust-type.h
-  void visit (AST::TraitBound &bound) override;
-  void visit (AST::ImplTraitType &type) override;
-  void visit (AST::TraitObjectType &type) override;
-  void visit (AST::ParenthesisedType &type) override;
-  void visit (AST::ImplTraitTypeOneBound &type) override;
-  void visit (AST::TraitObjectTypeOneBound &type) override;
-  void visit (AST::TupleType &type) override;
-  void visit (AST::NeverType &type) override;
-  void visit (AST::RawPointerType &type) override;
-  void visit (AST::ReferenceType &type) override;
-  void visit (AST::ArrayType &type) override;
-  void visit (AST::SliceType &type) override;
-  void visit (AST::InferredType &type) override;
-  void visit (AST::BareFunctionType &type) override;
-  void visit (AST::FunctionParam &param) override;
-  void visit (AST::VariadicParam &param) override;
-  void visit (AST::SelfParam &param) override;
-};
-
 tl::optional<BuiltinAttrDefinition>
 lookup_builtin (const AST::Attribute &attribute);
 
-- 
2.53.0

Reply via email to