19#include "llvm/ADT/SmallString.h"
20#include "llvm/ADT/SmallVector.h"
21#include "llvm/ADT/StringRef.h"
36size_t ParsedAttr::allocated_size()
const {
38 else if (IsTypeTagForDatatype)
42 else if (HasParsedType)
53 FreeLists.resize(InlineFreeListsCapacity);
59 assert((size %
sizeof(
void*)) == 0);
60 return ((size -
sizeof(
ParsedAttr)) /
sizeof(
void *));
63void *AttributeFactory::allocate(
size_t size) {
66 if (index < FreeLists.size() && !FreeLists[index].empty()) {
68 FreeLists[index].pop_back();
77 size_t size =
Attr->allocated_size();
81 if (freeListIndex >= FreeLists.size())
82 FreeLists.resize(freeListIndex + 1);
90 FreeLists[freeListIndex].push_back(
Attr);
99 Attrs.insert(Attrs.end(), pool.Attrs.begin(), pool.Attrs.end());
104 assert(&Pool !=
this &&
"AttributePool can't take attributes from itself");
105 llvm::for_each(List.AttrList, [&Pool](
ParsedAttr *A) { Pool.remove(A); });
106 Attrs.insert(Attrs.end(), List.AttrList.begin(), List.AttrList.end());
111#include "clang/Sema/AttrParsedAttrImpl.inc"
124 return IgnoredParsedAttrInfo;
135 if (Ptr->hasSpelling(SyntaxUsed,
FullName))
141 return DefaultParsedAttrInfo;
176 return checkAttributeMatchRuleAppliesTo(
D, MatchRule);
189 S.
Diag(
getLoc(), diag::warn_attribute_ignored) << *
this;
209 bool TargetSpecificSpellingExists =
240 case AT_AddressSpace:
241 case AT_OpenCLPrivateAddressSpace:
242 case AT_OpenCLGlobalAddressSpace:
243 case AT_OpenCLGlobalDeviceAddressSpace:
244 case AT_OpenCLGlobalHostAddressSpace:
245 case AT_OpenCLLocalAddressSpace:
246 case AT_OpenCLConstantAddressSpace:
247 case AT_OpenCLGenericAddressSpace:
248 case AT_NeonPolyVectorType:
249 case AT_NeonVectorType:
250 case AT_ArmMveStrictPolymorphism:
287template <
typename Compare>
289 unsigned Num,
unsigned Diag,
300 diag::err_attribute_wrong_number_arguments,
301 std::not_equal_to<unsigned>());
305 diag::err_attribute_too_few_arguments,
306 std::less<unsigned>());
310 diag::err_attribute_too_many_arguments,
311 std::greater<unsigned>());
319 Result.takeAllFrom(Second);
321 if (
First.Range.getBegin().isValid())
Defines the clang::ASTContext interface.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Target Target
static bool checkAttributeNumArgsImpl(Sema &S, const ParsedAttr &AL, unsigned Num, unsigned Diag, Compare Comp)
static size_t getFreeListIndexForSize(size_t size)
static unsigned getNumAttributeArgs(const ParsedAttr &AL)
__DEVICE__ void * memset(void *__a, int __b, size_t __c)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Attr - This represents one attribute.
std::string getNormalizedFullName() const
Gets the normalized full name, which consists of both scope and name and with surrounding underscores...
Syntax
The style used to specify an attribute.
@ AS_Keyword
__ptr16, alignas(...), etc.
@ AS_ContextSensitiveKeyword
Context-sensitive version of a keyword attribute.
unsigned getAttributeSpellingListIndex() const
bool isRegularKeywordAttribute() const
SourceLocation getLoc() const
bool isStandardAttributeSyntax() const
The attribute is spelled [[]] in either C or C++ mode, including standard attributes spelled with a k...
Kind getParsedKind() const
A factory, from which one makes pools, from which one creates individual attributes which are dealloc...
@ TypeTagForDatatypeAllocSize
void takeFrom(ParsedAttributesView &List, AttributePool &Pool)
Removes the attributes from List, which are owned by Pool, and adds them at the end of this Attribute...
Decl - This represents one declaration (or definition), e.g.
One of these records is kept for each identifier that is lexed.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
ParsedAttr - Represents a syntactic attribute.
bool isTargetSpecificAttr() const
bool hasCustomParsing() const
unsigned getSemanticSpelling() const
If the parsed attribute has a semantic equivalent, and it would have a semantic Spelling enumeration ...
bool appliesToDecl(const Decl *D, attr::SubjectMatchRule MatchRule) const
bool isKnownToGCC() const
bool existsInTarget(const TargetInfo &Target) const
unsigned getMinArgs() const
bool checkExactlyNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has exactly as many args as Num.
bool hasParsedType() const
bool hasVariadicArg() const
const ParsedAttrInfo & getInfo() const
void handleAttrWithDelayedArgs(Sema &S, Decl *D) const
bool diagnoseMutualExclusion(class Sema &S, const Decl *D) const
bool diagnoseAppertainsTo(class Sema &S, const Decl *D) const
bool acceptsExprPack() const
bool isSupportedByPragmaAttribute() const
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
bool checkAtLeastNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at least as many args as Num.
unsigned getNumArgMembers() const
unsigned getMaxArgs() const
bool slidesFromDeclToDeclSpecLegacyBehavior() const
Returns whether a [[]] attribute, if specified ahead of a declaration, should be applied to the decl-...
void getMatchRules(const LangOptions &LangOpts, SmallVectorImpl< std::pair< attr::SubjectMatchRule, bool > > &MatchRules) const
bool isParamExpr(size_t N) const
bool diagnoseLangOpts(class Sema &S) const
bool checkAtMostNumArgs(class Sema &S, unsigned Num) const
Check if the attribute has at most as many args as Num.
ParsedAttributes - A collection of parsed attributes.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
Sema - This implements semantic analysis and AST building for C.
const LangOptions & getLangOpts() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
Exposes information about the current target.
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
SubjectMatchRule
A list of all the recognized kinds of attributes.
The JSON file list parser is used to communicate input to InstallAPI.
llvm::PointerUnion< Expr *, IdentifierLoc * > ArgsUnion
A union of the various pointer types that can be passed to an ParsedAttr as an argument.
void takeAndConcatenateAttrs(ParsedAttributes &First, ParsedAttributes &Second, ParsedAttributes &Result)
Consumes the attributes from First and Second and concatenates them into Result.
@ Result
The result type of a method or function.
const std::list< std::unique_ptr< ParsedAttrInfo > > & getAttributePluginInstances()
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Wraps an identifier and optional source location for the identifier.
static IdentifierLoc * create(ASTContext &Ctx, SourceLocation Loc, IdentifierInfo *Ident)
static ArrayRef< const ParsedAttrInfo * > getAllBuiltin()
unsigned IsKnownToGCC
True if this attribute has any spellings that are known to gcc.
unsigned HasCustomParsing
True if the parsing does not match the semantic content.
unsigned IsType
True if this attribute applies to types.
unsigned IsTargetSpecific
True if this attribute is only available for certain targets.
unsigned IsSupportedByPragmaAttribute
True if this attribute is supported by #pragma clang attribute.
unsigned NumArgs
The number of required arguments of this attribute.
virtual bool diagAppertainsToStmt(Sema &S, const ParsedAttr &Attr, const Stmt *St) const
Check if this attribute appertains to St, and issue a diagnostic if not.
virtual unsigned spellingIndexToSemanticSpelling(const ParsedAttr &Attr) const
Convert the spelling index of Attr to a semantic spelling enum value.
static const ParsedAttrInfo & get(const AttributeCommonInfo &A)
virtual bool isParamExpr(size_t N) const
Returns true if the specified parameter index for this attribute in Attr.td is an ExprArgument or Var...
virtual void getPragmaAttributeMatchRules(llvm::SmallVectorImpl< std::pair< attr::SubjectMatchRule, bool > > &Rules, const LangOptions &LangOpts) const
Populate Rules with the match rules of this attribute.
virtual bool existsInTarget(const TargetInfo &Target) const
Check if this attribute is allowed when compiling for the given target.
virtual bool spellingExistsInTarget(const TargetInfo &Target, const unsigned SpellingListIndex) const
Check if this attribute's spelling is allowed when compiling for the given target.
virtual bool diagAppertainsToDecl(Sema &S, const ParsedAttr &Attr, const Decl *D) const
Check if this attribute appertains to D, and issue a diagnostic if not.
unsigned OptArgs
The number of optional arguments of this attributes.
virtual bool diagMutualExclusion(Sema &S, const ParsedAttr &A, const Decl *D) const
Check if the given attribute is mutually exclusive with other attributes already applied to the given...
unsigned IsStmt
True if this attribute applies to statements.
unsigned NumArgMembers
The number of non-fake arguments specified in the attribute definition.
Describes the trailing object for Availability attribute in ParsedAttr.