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]>
---
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 fc11abf1f1c..878613f7044 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 00000000000..4580aa25614
--- /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 00000000000..f9aff48c616
--- /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 ¶m) 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 ¯o_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 ¶m) override;
+ void visit (AST::VariadicParam ¶m) override;
+ void visit (AST::SelfParam ¶m) 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 4765e630d35..e0564f2a407 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 364ca081142..9872cc0e764 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 f03fa90d9c0..39339f27c93 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 3e5aea815e8..778cc9e33db 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 ¶m) 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 ¯o_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 ¶m) override;
- void visit (AST::VariadicParam ¶m) override;
- void visit (AST::SelfParam ¶m) override;
-};
-
tl::optional<BuiltinAttrDefinition>
lookup_builtin (const AST::Attribute &attribute);
--
2.50.1