15208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//===--- Attr.h - Classes for representing attributes ----------*- C++ -*-===// 25208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// 35208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// The LLVM Compiler Infrastructure 45208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// 55208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// This file is distributed under the University of Illinois Open Source 65208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// License. See LICENSE.TXT for details. 75208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// 85208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//===----------------------------------------------------------------------===// 95208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// 105208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// This file defines the Attr interface and subclasses. 115208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// 125208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//===----------------------------------------------------------------------===// 135208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI 145208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#ifndef LLVM_CLANG_AST_ATTR_H 155208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#define LLVM_CLANG_AST_ATTR_H 165208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI 175208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#include "clang/AST/AttrIterator.h" 185208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#include "clang/AST/Decl.h" 193dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#include "clang/AST/Type.h" 200b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include "clang/Basic/AttrKinds.h" 2104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI#include "clang/Basic/LLVM.h" 22aafd269675fc45bac6340027c866ea6073643c3bJan Engelhardt#include "clang/Basic/SourceLocation.h" 23cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt#include "clang/Basic/VersionTuple.h" 243dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#include "llvm/ADT/SmallVector.h" 253dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#include "llvm/ADT/StringRef.h" 260b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include "llvm/ADT/StringSwitch.h" 270b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include "llvm/Support/ErrorHandling.h" 280d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#include "llvm/Support/raw_ostream.h" 290b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include <algorithm> 300b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include <cassert> 310b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 3208b1616e068166e016b3ee7110db10ae5d853422Jan Engelhardtnamespace clang { 333dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI class ASTContext; 345208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI class IdentifierInfo; 354e41854423b529d3107c23b85434d50a75d08057Jan Engelhardt class ObjCInterfaceDecl; 3677f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt class Expr; 3777f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt class QualType; 38ef18e8147903885708d1c264904129af4fb636d6Jan Engelhardt class FunctionDecl; 393dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI class TypeSourceInfo; 405a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysinger 415a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysinger/// Attr - This represents one attribute. 425a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysingerclass Attr { 43c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardtprivate: 44c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt SourceRange Range; 45c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt unsigned AttrKind : 16; 46c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt 47c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardtprotected: 48c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt /// An index into the spelling list of an 49c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt /// attribute defined in Attr.td file. 50c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt unsigned SpellingListIndex : 4; 5170581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim bool Inherited : 1; 52c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt bool IsPackExpansion : 1; 535a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysinger bool Implicit : 1; 540d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI 550d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI virtual ~Attr(); 560b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 570b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI void* operator new(size_t bytes) throw() { 580b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI llvm_unreachable("Attrs cannot be allocated with regular 'new'."); 590b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI } 608b7baebc93989106fd5d26b262d0ce191f8ef7c0Jamal Hadi Salim void operator delete(void* data) throw() { 618b7baebc93989106fd5d26b262d0ce191f8ef7c0Jamal Hadi Salim llvm_unreachable("Attrs cannot be released with regular 'delete'."); 6240a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim } 6340a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim 648b7baebc93989106fd5d26b262d0ce191f8ef7c0Jamal Hadi Salimpublic: 6540a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim // Forward so that the regular new and delete do not hide global ones. 6640a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim void* operator new(size_t Bytes, ASTContext &C, 6740a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim size_t Alignment = 16) throw() { 6840a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim return ::operator new(Bytes, C, Alignment); 6940a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim } 7040a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim void operator delete(void *Ptr, ASTContext &C, 7140a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim size_t Alignment) throw() { 7240a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim return ::operator delete(Ptr, C, Alignment); 7340a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim } 7440a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim 7540a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salimprotected: 768b7baebc93989106fd5d26b262d0ce191f8ef7c0Jamal Hadi Salim Attr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0) 77139b3fe4bd5121501e60fe07963ea527d7f0bd36Jamal Hadi Salim : Range(R), AttrKind(AK), SpellingListIndex(SpellingListIndex), 7884c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim Inherited(false), IsPackExpansion(false), Implicit(false) {} 79139b3fe4bd5121501e60fe07963ea527d7f0bd36Jamal Hadi Salim 80139b3fe4bd5121501e60fe07963ea527d7f0bd36Jamal Hadi Salimpublic: 81139b3fe4bd5121501e60fe07963ea527d7f0bd36Jamal Hadi Salim 8284c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim attr::Kind getKind() const { 8384c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim return static_cast<attr::Kind>(AttrKind); 8484c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim } 8584c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim 8684c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim unsigned getSpellingListIndex() const { return SpellingListIndex; } 8770581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim virtual const char *getSpelling() const = 0; 8870581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim 8970581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim SourceLocation getLocation() const { return Range.getBegin(); } 9070581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim SourceRange getRange() const { return Range; } 9170581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim void setRange(SourceRange R) { Range = R; } 9270581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim 9370581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim bool isInherited() const { return Inherited; } 9470581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim 9570581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim /// \brief Returns true if the attribute has been implicitly created instead 9670581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim /// of explicitly written by the user. 9770581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim bool isImplicit() const { return Implicit; } 9870581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim void setImplicit(bool I) { Implicit = I; } 9970581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim 100bddcb92d1f0f76d21c4469b1667c8199c9fab126Jan Engelhardt void setPackExpansion(bool PE) { IsPackExpansion = PE; } 10170581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim bool isPackExpansion() const { return IsPackExpansion; } 10270581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim 10370581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim // Clone this attribute. 10470581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim virtual Attr *clone(ASTContext &C) const = 0; 10570581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim 10670581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim virtual bool isLateParsed() const { return false; } 10770581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim 10870581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim // Pretty print this attribute. 10970581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim virtual void printPretty(raw_ostream &OS, 11070581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim const PrintingPolicy &Policy) const = 0; 11170581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim 11270581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim /// \brief By default, attributes cannot be duplicated when being merged; 11370581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim /// however, an attribute can override this. Returns true if the attribute 11470581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim /// can be duplicated when merging. 11570581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim virtual bool duplicatesAllowed() const { return false; } 11670581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim}; 117853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salim 118853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salimclass InheritableAttr : public Attr { 119853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salim virtual void anchor(); 120853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salimprotected: 121853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salim InheritableAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0) 122853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salim : Attr(AK, R, SpellingListIndex) {} 123853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salim 124853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salimpublic: 125dacafa55379fd98212031d8c559096c91d7ce93bJan Engelhardt void setInherited(bool I) { Inherited = I; } 12677f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt 12777f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt // Implement isa/cast/dyncast/etc. 12877f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt static bool classof(const Attr *A) { 12977f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt return A->getKind() <= attr::LAST_INHERITABLE; 13077f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt } 13177f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt}; 13277f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt 13377f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardtclass InheritableParamAttr : public InheritableAttr { 13477f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt void anchor() override; 13577f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardtprotected: 13677f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt InheritableParamAttr(attr::Kind AK, SourceRange R, 13777f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt unsigned SpellingListIndex = 0) 13877f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt : InheritableAttr(AK, R, SpellingListIndex) {} 13977f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt 14077f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardtpublic: 14177f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt // Implement isa/cast/dyncast/etc. 14277f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt static bool classof(const Attr *A) { 14377f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt // Relies on relative order of enum emission with respect to MS inheritance 14477f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt // attrs. 14577f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt return A->getKind() <= attr::LAST_INHERITABLE_PARAM; 14677f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt } 14777f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt}; 14877f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt 14977f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt#include "clang/AST/Attrs.inc" 15077f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt 15177f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardtinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 15277f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt const Attr *At) { 15377f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt DB.AddTaggedVal(reinterpret_cast<intptr_t>(At), 15477f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt DiagnosticsEngine::ak_attr); 15577f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt return DB; 15677f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt} 15777f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt 15877f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardtinline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, 15977f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt const Attr *At) { 16077f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt PD.AddTaggedVal(reinterpret_cast<intptr_t>(At), 16177f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt DiagnosticsEngine::ak_attr); 16277f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt return PD; 16339bf9c8214d3073a496a8a1eff91046a8d6fbbdfJan Engelhardt} 16439bf9c8214d3073a496a8a1eff91046a8d6fbbdfJan Engelhardt} // end namespace clang 1650d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI 1660b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#endif 167c021c3ce7b1583eb5dd71b10ac3d8ab3cd36beaaJan Engelhardt