1 // Copyright (C) 2020-2024 Free Software Foundation, Inc.
3 // This file is part of GCC.
5 // GCC is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU General Public License as published by the Free
7 // Software Foundation; either version 3, or (at your option) any later
10 // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 // You should have received a copy of the GNU General Public License
16 // along with GCC; see the file COPYING3. If not see
17 // <http://www.gnu.org/licenses/>.
18 #ifndef RUST_ATTRIBUTES_H
19 #define RUST_ATTRIBUTES_H
22 #include "rust-system.h"
23 #include "rust-ast-visitor.h"
40 struct BuiltinAttrDefinition
45 static BuiltinAttrDefinition
get_error ()
47 return BuiltinAttrDefinition
{"", UNKNOWN
};
50 static BuiltinAttrDefinition
&error_node ()
52 static BuiltinAttrDefinition error_node
= get_error ();
56 bool is_error () const { return name
.empty (); }
59 class BuiltinAttributeMappings
62 static BuiltinAttributeMappings
*get ();
64 const BuiltinAttrDefinition
&
65 lookup_builtin (const std::string
&attr_name
) const;
68 BuiltinAttributeMappings ();
70 std::map
<std::string
, const BuiltinAttrDefinition
> mappings
;
74 * Checks the validity of various attributes. The goal of this visitor is to
75 * make sure that attributes are applied in allowed contexts, for example to
76 * make sure that #[inline] is only applied to functions and closures, as well
77 * as checking the "arguments" or input given to these attributes, making sure
78 * it is appropriate and valid.
80 class AttributeChecker
: public AST::DefaultASTVisitor
86 * Check all the attributes of all the items of a crate
88 void go (AST::Crate
&crate
);
91 using AST::DefaultASTVisitor::visit
;
92 /* Check the validity of a given attribute */
93 void check_attribute (const AST::Attribute
&attribute
);
95 /* Check the validity of all given attributes */
96 void check_attributes (const AST::AttrVec
&attributes
);
99 void visit (AST::Crate
&crate
) override
;
100 void visit (AST::Token
&tok
) override
;
101 void visit (AST::DelimTokenTree
&delim_tok_tree
) override
;
102 void visit (AST::AttrInputMetaItemContainer
&input
) override
;
103 void visit (AST::IdentifierExpr
&ident_expr
) override
;
104 void visit (AST::Lifetime
&lifetime
) override
;
105 void visit (AST::LifetimeParam
&lifetime_param
) override
;
106 void visit (AST::ConstGenericParam
&const_param
) override
;
109 void visit (AST::PathInExpression
&path
) override
;
110 void visit (AST::TypePathSegment
&segment
) override
;
111 void visit (AST::TypePathSegmentGeneric
&segment
) override
;
112 void visit (AST::TypePathSegmentFunction
&segment
) override
;
113 void visit (AST::TypePath
&path
) override
;
114 void visit (AST::QualifiedPathInExpression
&path
) override
;
115 void visit (AST::QualifiedPathInType
&path
) override
;
118 void visit (AST::LiteralExpr
&expr
) override
;
119 void visit (AST::AttrInputLiteral
&attr_input
) override
;
120 void visit (AST::AttrInputMacro
&attr_input
) override
;
121 void visit (AST::MetaItemLitExpr
&meta_item
) override
;
122 void visit (AST::MetaItemPathLit
&meta_item
) override
;
123 void visit (AST::BorrowExpr
&expr
) override
;
124 void visit (AST::DereferenceExpr
&expr
) override
;
125 void visit (AST::ErrorPropagationExpr
&expr
) override
;
126 void visit (AST::NegationExpr
&expr
) override
;
127 void visit (AST::ArithmeticOrLogicalExpr
&expr
) override
;
128 void visit (AST::ComparisonExpr
&expr
) override
;
129 void visit (AST::LazyBooleanExpr
&expr
) override
;
130 void visit (AST::TypeCastExpr
&expr
) override
;
131 void visit (AST::AssignmentExpr
&expr
) override
;
132 void visit (AST::CompoundAssignmentExpr
&expr
) override
;
133 void visit (AST::GroupedExpr
&expr
) override
;
134 void visit (AST::ArrayElemsValues
&elems
) override
;
135 void visit (AST::ArrayElemsCopied
&elems
) override
;
136 void visit (AST::ArrayExpr
&expr
) override
;
137 void visit (AST::ArrayIndexExpr
&expr
) override
;
138 void visit (AST::TupleExpr
&expr
) override
;
139 void visit (AST::TupleIndexExpr
&expr
) override
;
140 void visit (AST::StructExprStruct
&expr
) override
;
141 void visit (AST::StructExprFieldIdentifier
&field
) override
;
142 void visit (AST::StructExprFieldIdentifierValue
&field
) override
;
143 void visit (AST::StructExprFieldIndexValue
&field
) override
;
144 void visit (AST::StructExprStructFields
&expr
) override
;
145 void visit (AST::StructExprStructBase
&expr
) override
;
146 void visit (AST::CallExpr
&expr
) override
;
147 void visit (AST::MethodCallExpr
&expr
) override
;
148 void visit (AST::FieldAccessExpr
&expr
) override
;
149 void visit (AST::ClosureExprInner
&expr
) override
;
150 void visit (AST::BlockExpr
&expr
) override
;
151 void visit (AST::ClosureExprInnerTyped
&expr
) override
;
152 void visit (AST::ContinueExpr
&expr
) override
;
153 void visit (AST::BreakExpr
&expr
) override
;
154 void visit (AST::RangeFromToExpr
&expr
) override
;
155 void visit (AST::RangeFromExpr
&expr
) override
;
156 void visit (AST::RangeToExpr
&expr
) override
;
157 void visit (AST::RangeFullExpr
&expr
) override
;
158 void visit (AST::RangeFromToInclExpr
&expr
) override
;
159 void visit (AST::RangeToInclExpr
&expr
) override
;
160 void visit (AST::ReturnExpr
&expr
) override
;
161 void visit (AST::LoopExpr
&expr
) override
;
162 void visit (AST::WhileLoopExpr
&expr
) override
;
163 void visit (AST::WhileLetLoopExpr
&expr
) override
;
164 void visit (AST::ForLoopExpr
&expr
) override
;
165 void visit (AST::IfExpr
&expr
) override
;
166 void visit (AST::IfExprConseqElse
&expr
) override
;
167 void visit (AST::IfLetExpr
&expr
) override
;
168 void visit (AST::IfLetExprConseqElse
&expr
) override
;
169 void visit (AST::MatchExpr
&expr
) override
;
170 void visit (AST::AwaitExpr
&expr
) override
;
171 void visit (AST::AsyncBlockExpr
&expr
) override
;
174 void visit (AST::TypeParam
¶m
) override
;
175 void visit (AST::LifetimeWhereClauseItem
&item
) override
;
176 void visit (AST::TypeBoundWhereClauseItem
&item
) override
;
177 void visit (AST::Module
&module
) override
;
178 void visit (AST::ExternCrate
&crate
) override
;
179 void visit (AST::UseTreeGlob
&use_tree
) override
;
180 void visit (AST::UseTreeList
&use_tree
) override
;
181 void visit (AST::UseTreeRebind
&use_tree
) override
;
182 void visit (AST::UseDeclaration
&use_decl
) override
;
183 void visit (AST::Function
&function
) override
;
184 void visit (AST::TypeAlias
&type_alias
) override
;
185 void visit (AST::StructStruct
&struct_item
) override
;
186 void visit (AST::TupleStruct
&tuple_struct
) override
;
187 void visit (AST::EnumItem
&item
) override
;
188 void visit (AST::EnumItemTuple
&item
) override
;
189 void visit (AST::EnumItemStruct
&item
) override
;
190 void visit (AST::EnumItemDiscriminant
&item
) override
;
191 void visit (AST::Enum
&enum_item
) override
;
192 void visit (AST::Union
&union_item
) override
;
193 void visit (AST::ConstantItem
&const_item
) override
;
194 void visit (AST::StaticItem
&static_item
) override
;
195 void visit (AST::TraitItemConst
&item
) override
;
196 void visit (AST::TraitItemType
&item
) override
;
197 void visit (AST::Trait
&trait
) override
;
198 void visit (AST::InherentImpl
&impl
) override
;
199 void visit (AST::TraitImpl
&impl
) override
;
200 void visit (AST::ExternalTypeItem
&item
) override
;
201 void visit (AST::ExternalStaticItem
&item
) override
;
202 void visit (AST::ExternBlock
&block
) override
;
205 void visit (AST::MacroMatchFragment
&match
) override
;
206 void visit (AST::MacroMatchRepetition
&match
) override
;
207 void visit (AST::MacroMatcher
&matcher
) override
;
208 void visit (AST::MacroRulesDefinition
&rules_def
) override
;
209 void visit (AST::MacroInvocation
¯o_invoc
) override
;
210 void visit (AST::MetaItemPath
&meta_item
) override
;
211 void visit (AST::MetaItemSeq
&meta_item
) override
;
212 void visit (AST::MetaWord
&meta_item
) override
;
213 void visit (AST::MetaNameValueStr
&meta_item
) override
;
214 void visit (AST::MetaListPaths
&meta_item
) override
;
215 void visit (AST::MetaListNameValueStr
&meta_item
) override
;
218 void visit (AST::LiteralPattern
&pattern
) override
;
219 void visit (AST::IdentifierPattern
&pattern
) override
;
220 void visit (AST::WildcardPattern
&pattern
) override
;
221 void visit (AST::RestPattern
&pattern
) override
;
222 // void visit(RangePatternBound& bound) override;
223 void visit (AST::RangePatternBoundLiteral
&bound
) override
;
224 void visit (AST::RangePatternBoundPath
&bound
) override
;
225 void visit (AST::RangePatternBoundQualPath
&bound
) override
;
226 void visit (AST::RangePattern
&pattern
) override
;
227 void visit (AST::ReferencePattern
&pattern
) override
;
228 // void visit(StructPatternField& field) override;
229 void visit (AST::StructPatternFieldTuplePat
&field
) override
;
230 void visit (AST::StructPatternFieldIdentPat
&field
) override
;
231 void visit (AST::StructPatternFieldIdent
&field
) override
;
232 void visit (AST::StructPattern
&pattern
) override
;
233 // void visit(TupleStructItems& tuple_items) override;
234 void visit (AST::TupleStructItemsNoRange
&tuple_items
) override
;
235 void visit (AST::TupleStructItemsRange
&tuple_items
) override
;
236 void visit (AST::TupleStructPattern
&pattern
) override
;
237 // void visit(TuplePatternItems& tuple_items) override;
238 void visit (AST::TuplePatternItemsMultiple
&tuple_items
) override
;
239 void visit (AST::TuplePatternItemsRanged
&tuple_items
) override
;
240 void visit (AST::TuplePattern
&pattern
) override
;
241 void visit (AST::GroupedPattern
&pattern
) override
;
242 void visit (AST::SlicePattern
&pattern
) override
;
243 void visit (AST::AltPattern
&pattern
) override
;
246 void visit (AST::EmptyStmt
&stmt
) override
;
247 void visit (AST::LetStmt
&stmt
) override
;
248 void visit (AST::ExprStmt
&stmt
) override
;
251 void visit (AST::TraitBound
&bound
) override
;
252 void visit (AST::ImplTraitType
&type
) override
;
253 void visit (AST::TraitObjectType
&type
) override
;
254 void visit (AST::ParenthesisedType
&type
) override
;
255 void visit (AST::ImplTraitTypeOneBound
&type
) override
;
256 void visit (AST::TraitObjectTypeOneBound
&type
) override
;
257 void visit (AST::TupleType
&type
) override
;
258 void visit (AST::NeverType
&type
) override
;
259 void visit (AST::RawPointerType
&type
) override
;
260 void visit (AST::ReferenceType
&type
) override
;
261 void visit (AST::ArrayType
&type
) override
;
262 void visit (AST::SliceType
&type
) override
;
263 void visit (AST::InferredType
&type
) override
;
264 void visit (AST::BareFunctionType
&type
) override
;
265 void visit (AST::FunctionParam
¶m
) override
;
266 void visit (AST::VariadicParam
¶m
) override
;
267 void visit (AST::SelfParam
¶m
) override
;
270 } // namespace Analysis
273 #endif /* ! RUST_ATTRIBUTES_H */