Attr.h revision 0b2b6e1cb1573bb295c0a65813dc4df8d57f305b
1d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//===--- Attr.h - Classes for representing expressions ----------*- C++ -*-===// 2d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// 3d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// The LLVM Compiler Infrastructure 4d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// 5d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// This file is distributed under the University of Illinois Open Source 6d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// License. See LICENSE.TXT for details. 7d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// 8d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//===----------------------------------------------------------------------===// 9d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// 10d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// This file defines the Attr interface and subclasses. 11d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// 12d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//===----------------------------------------------------------------------===// 13d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 1481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson#ifndef LLVM_CLANG_AST_ATTR_H 1581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson#define LLVM_CLANG_AST_ATTR_H 16d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 17baa66fc389ca0a9f11e0c864304bcfd89de39439Anders Carlsson#include <cassert> 18ea7e97e14f2f1f9817d2ae8a25ec6ea652e5287fArgyrios Kyrtzidis#include <cstring> 19c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman#include <string> 20eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek#include <algorithm> 21adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlsson 22d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonnamespace clang { 23cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner class ASTContext; 24d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 25d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute. 26d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr { 27d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic: 28d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson enum Kind { 29d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes Alias, 30d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Aligned, 31af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar AlwaysInline, 32aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek Annotate, 33a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar AsmLabel, // Represent GCC asm label extension. 343068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar Constructor, 35ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Deprecated, 363068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar Destructor, 37ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLImport, 38ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLExport, 3973798892751e378cbcdef43579c1d41685091fd0Ted Kremenek FastCall, 40ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Format, 4173798892751e378cbcdef43579c1d41685091fd0Ted Kremenek IBOutletKind, // Clang-specific. Use "Kind" suffix to not conflict with 4273798892751e378cbcdef43579c1d41685091fd0Ted Kremenek NonNull, 4373798892751e378cbcdef43579c1d41685091fd0Ted Kremenek NoReturn, 4473798892751e378cbcdef43579c1d41685091fd0Ted Kremenek NoThrow, 45fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian ObjCNSObject, 460db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner ObjCException, 47f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor Overloadable, // Clang-specific 4873798892751e378cbcdef43579c1d41685091fd0Ted Kremenek Packed, 4917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar Section, 5027ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes StdCall, 5196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek TransparentUnion, 52bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian Unavailable, 5373798892751e378cbcdef43579c1d41685091fd0Ted Kremenek Unused, 54b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar Used, 5573798892751e378cbcdef43579c1d41685091fd0Ted Kremenek Visibility, 56026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner WarnUnusedResult, 579eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff Weak, 58232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson Blocks, 59232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson Const, 60f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson Pure, 61d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson Cleanup, 625bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson Nodebug, 635bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson Noinline 64d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson }; 65d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 66d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate: 6781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Attr *Next; 68d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Kind AttrKind; 692f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov bool Inherited : 1; 702f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 71d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected: 720b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner void* operator new(size_t bytes) throw() { 730b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner assert(0 && "Attrs cannot be allocated with regular 'new'."); 740b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner return 0; 750b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner } 760b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner void operator delete(void* data) throw() { 770b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner assert(0 && "Attrs cannot be released with regular 'delete'."); 780b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner } 790b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 800b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnerprotected: 812f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov Attr(Kind AK) : Next(0), AttrKind(AK), Inherited(false) {} 82d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson virtual ~Attr() { 830b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner assert(Next == 0 && "Destroy didn't work"); 84d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 85cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattnerpublic: 86cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner 870b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner void Destroy(ASTContext &C); 880b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 89ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor /// \brief Whether this attribute should be merged to new 90ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor /// declarations. 91ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor virtual bool isMerged() const { return true; } 92ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor 93d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Kind getKind() const { return AttrKind; } 942f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 9581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Attr *getNext() { return Next; } 9681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson const Attr *getNext() const { return Next; } 9781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson void setNext(Attr *next) { Next = next; } 982f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 992f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov bool isInherited() const { return Inherited; } 1002f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov void setInherited(bool value) { Inherited = value; } 1012f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 102d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson void addAttr(Attr *attr) { 103d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson assert((attr != 0) && "addAttr(): attr is null"); 10481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 10581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson // FIXME: This doesn't preserve the order in any way. 10681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson attr->Next = Next; 10781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Next = attr; 108d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 109d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 110d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Implement isa/cast/dyncast/etc. 111d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const Attr *) { return true; } 112d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 113d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 114d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass PackedAttr : public Attr { 1153b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar unsigned Alignment; 1163b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 117d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic: 1183b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar PackedAttr(unsigned alignment) : Attr(Packed), Alignment(alignment) {} 1193b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 1203b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar /// getAlignment - The specified alignment in bits. 1213b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar unsigned getAlignment() const { return Alignment; } 1223b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 123d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Implement isa/cast/dyncast/etc. 124d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const Attr *A) { 125d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson return A->getKind() == Packed; 126d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 127d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const PackedAttr *A) { return true; } 128d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 129042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson 130042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr { 131042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson unsigned Alignment; 132042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic: 133042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {} 1343b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 1353b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar /// getAlignment - The specified alignment in bits. 136042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson unsigned getAlignment() const { return Alignment; } 137042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson 138042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson // Implement isa/cast/dyncast/etc. 139042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson static bool classof(const Attr *A) { 140042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson return A->getKind() == Aligned; 141042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson } 142042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson static bool classof(const AlignedAttr *A) { return true; } 143042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson}; 14481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 145c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr { 146c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman std::string Annotation; 147c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic: 148c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {} 149c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 150c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman const std::string& getAnnotation() const { return Annotation; } 151c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 152c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman // Implement isa/cast/dyncast/etc. 153c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman static bool classof(const Attr *A) { 154c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman return A->getKind() == Annotate; 155c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman } 156c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman static bool classof(const AnnotateAttr *A) { return true; } 157c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman}; 158d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 159a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarclass AsmLabelAttr : public Attr { 160a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar std::string Label; 161a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarpublic: 162a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar AsmLabelAttr(const std::string &L) : Attr(AsmLabel), Label(L) {} 163a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar 164a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar const std::string& getLabel() const { return Label; } 165a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar 166a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar // Implement isa/cast/dyncast/etc. 167a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar static bool classof(const Attr *A) { 168a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar return A->getKind() == AsmLabel; 169a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar } 170a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar static bool classof(const AsmLabelAttr *A) { return true; } 171a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar}; 172a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar 173af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbarclass AlwaysInlineAttr : public Attr { 174af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbarpublic: 175af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar AlwaysInlineAttr() : Attr(AlwaysInline) {} 176af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar 177af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar // Implement isa/cast/dyncast/etc. 178af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar 179af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar static bool classof(const Attr *A) { return A->getKind() == AlwaysInline; } 180af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar static bool classof(const AlwaysInlineAttr *A) { return true; } 181af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar}; 182af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar 183d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr { 184d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes std::string Aliasee; 185d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic: 186d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {} 187d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 188d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes const std::string& getAliasee() const { return Aliasee; } 189d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 190d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // Implement isa/cast/dyncast/etc. 191d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 192d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes static bool classof(const Attr *A) { return A->getKind() == Alias; } 193d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes static bool classof(const AliasAttr *A) { return true; } 194d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes}; 1953068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 1963068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass ConstructorAttr : public Attr { 1973068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar int priority; 1983068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic: 1993068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar ConstructorAttr(int p) : Attr(Constructor), priority(p) {} 2006bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 2016bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar int getPriority() const { return priority; } 2023068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 2033068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar // Implement isa/cast/dyncast/etc. 2043068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const Attr *A) { return A->getKind() == Constructor; } 2053068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const ConstructorAttr *A) { return true; } 2063068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar}; 20796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek 2083068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass DestructorAttr : public Attr { 2093068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar int priority; 2103068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic: 2113068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar DestructorAttr(int p) : Attr(Destructor), priority(p) {} 2126bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 2136bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar int getPriority() const { return priority; } 2143068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 2153068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar // Implement isa/cast/dyncast/etc. 2163068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const Attr *A) { return A->getKind() == Destructor; } 2173068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const DestructorAttr *A) { return true; } 2183068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar}; 2193068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 22096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr { 22196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic: 22296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek IBOutletAttr() : Attr(IBOutletKind) {} 22396329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek 22496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek // Implement isa/cast/dyncast/etc. 22596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek static bool classof(const Attr *A) { 22696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek return A->getKind() == IBOutletKind; 22796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek } 22896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek static bool classof(const IBOutletAttr *A) { return true; } 22996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek}; 230d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 231aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekclass NoReturnAttr : public Attr { 232aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekpublic: 233aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek NoReturnAttr() : Attr(NoReturn) {} 234aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek 235aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek // Implement isa/cast/dyncast/etc. 236aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek static bool classof(const Attr *A) { return A->getKind() == NoReturn; } 237aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek static bool classof(const NoReturnAttr *A) { return true; } 238aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek}; 239c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 2407e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerclass DeprecatedAttr : public Attr { 2417e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerpublic: 2427e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner DeprecatedAttr() : Attr(Deprecated) {} 2437e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner 2447e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner // Implement isa/cast/dyncast/etc. 2457e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner static bool classof(const Attr *A) { return A->getKind() == Deprecated; } 2467e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner static bool classof(const DeprecatedAttr *A) { return true; } 2477e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner}; 2487e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner 24917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarclass SectionAttr : public Attr { 25017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar std::string Name; 25117f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarpublic: 25217f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar SectionAttr(const std::string &N) : Attr(Section), Name(N) {} 25317f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar 25417f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar const std::string& getName() const { return Name; } 25517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar 25617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar // Implement isa/cast/dyncast/etc. 25717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar static bool classof(const Attr *A) { 25817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar return A->getKind() == Section; 25917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar } 26017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar static bool classof(const SectionAttr *A) { return true; } 26117f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar}; 26217f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar 263bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanianclass UnavailableAttr : public Attr { 264bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanianpublic: 265bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian UnavailableAttr() : Attr(Unavailable) {} 266bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian 267bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian // Implement isa/cast/dyncast/etc. 268bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian 269bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian static bool classof(const Attr *A) { return A->getKind() == Unavailable; } 270bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian static bool classof(const UnavailableAttr *A) { return true; } 271bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian}; 272bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian 27373798892751e378cbcdef43579c1d41685091fd0Ted Kremenekclass UnusedAttr : public Attr { 27473798892751e378cbcdef43579c1d41685091fd0Ted Kremenekpublic: 27573798892751e378cbcdef43579c1d41685091fd0Ted Kremenek UnusedAttr() : Attr(Unused) {} 27673798892751e378cbcdef43579c1d41685091fd0Ted Kremenek 27773798892751e378cbcdef43579c1d41685091fd0Ted Kremenek // Implement isa/cast/dyncast/etc. 27873798892751e378cbcdef43579c1d41685091fd0Ted Kremenek static bool classof(const Attr *A) { return A->getKind() == Unused; } 27973798892751e378cbcdef43579c1d41685091fd0Ted Kremenek static bool classof(const UnusedAttr *A) { return true; } 28073798892751e378cbcdef43579c1d41685091fd0Ted Kremenek}; 28173798892751e378cbcdef43579c1d41685091fd0Ted Kremenek 282b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbarclass UsedAttr : public Attr { 283b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbarpublic: 284b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar UsedAttr() : Attr(Used) {} 285b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar 286b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar // Implement isa/cast/dyncast/etc. 287b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar static bool classof(const Attr *A) { return A->getKind() == Used; } 288b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar static bool classof(const UsedAttr *A) { return true; } 289b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar}; 290b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar 291ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass WeakAttr : public Attr { 292ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 293ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner WeakAttr() : Attr(Weak) {} 294ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 295ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 296ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 297ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Weak; } 298ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const WeakAttr *A) { return true; } 299ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 300ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 301ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass NoThrowAttr : public Attr { 302ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 303ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner NoThrowAttr() : Attr(NoThrow) {} 304ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 305ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 306ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == NoThrow; } 307ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const NoThrowAttr *A) { return true; } 308ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 309232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 310232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlssonclass ConstAttr : public Attr { 311232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlssonpublic: 312232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson ConstAttr() : Attr(Const) {} 313232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 314232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson // Implement isa/cast/dyncast/etc. 315232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson static bool classof(const Attr *A) { return A->getKind() == Const; } 316232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson static bool classof(const ConstAttr *A) { return true; } 317232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson}; 318232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 319232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlssonclass PureAttr : public Attr { 320232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlssonpublic: 321232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson PureAttr() : Attr(Pure) {} 322232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 323232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson // Implement isa/cast/dyncast/etc. 324232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson static bool classof(const Attr *A) { return A->getKind() == Pure; } 325232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson static bool classof(const PureAttr *A) { return true; } 326232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson}; 327232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 328eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekclass NonNullAttr : public Attr { 329eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek unsigned* ArgNums; 330eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek unsigned Size; 331eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekpublic: 33255b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek NonNullAttr(unsigned* arg_nums = 0, unsigned size = 0) : Attr(NonNull), 33355b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek ArgNums(0), Size(0) { 33455b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek 3350db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner if (size == 0) return; 3360db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner assert(arg_nums); 3370db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner ArgNums = new unsigned[size]; 3380db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner Size = size; 3390db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size); 340eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 341eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek 342eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek virtual ~NonNullAttr() { 343eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek delete [] ArgNums; 344eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 345eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek 346584def7364f51e35bfcaf5c3c64673096533addaTed Kremenek bool isNonNull(unsigned arg) const { 347eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true; 348eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 34955b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek 35055b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek static bool classof(const Attr *A) { return A->getKind() == NonNull; } 35155b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek static bool classof(const NonNullAttr *A) { return true; } 352eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek}; 353ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 354ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass FormatAttr : public Attr { 355ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner std::string Type; 356ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int formatIdx, firstArg; 357ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 358ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner FormatAttr(const std::string &type, int idx, int first) : Attr(Format), 359ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Type(type), formatIdx(idx), firstArg(first) {} 360ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 361ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner const std::string& getType() const { return Type; } 3623c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor void setType(const std::string &type) { Type = type; } 363ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int getFormatIdx() const { return formatIdx; } 364ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int getFirstArg() const { return firstArg; } 365ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 366ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 367ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 368ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Format; } 369ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const FormatAttr *A) { return true; } 370ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 371ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 372ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr { 373ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 3744f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman /// @brief An enumeration for the kinds of visibility of symbols. 3754f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman enum VisibilityTypes { 3764f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman DefaultVisibility = 0, 3774f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman HiddenVisibility, 3784f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman ProtectedVisibility 3794f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman }; 3804f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate: 3814f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityTypes VisibilityType; 3824f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic: 3834f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityAttr(VisibilityTypes v) : Attr(Visibility), 384ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner VisibilityType(v) {} 385ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 3864f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityTypes getVisibility() const { return VisibilityType; } 387ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 388ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 389ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 390ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Visibility; } 391ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const VisibilityAttr *A) { return true; } 392ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 393ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 394ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLImportAttr : public Attr { 395ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 396ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLImportAttr() : Attr(DLLImport) {} 397ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 398ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 399ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 400ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == DLLImport; } 401ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const DLLImportAttr *A) { return true; } 402ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 403ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 404ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLExportAttr : public Attr { 405ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 406ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLExportAttr() : Attr(DLLExport) {} 407ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 408ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 409ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 410ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == DLLExport; } 411ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const DLLExportAttr *A) { return true; } 412ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 413ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 414440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass FastCallAttr : public Attr { 415440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic: 416440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman FastCallAttr() : Attr(FastCall) {} 417440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 418440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman // Implement isa/cast/dyncast/etc. 419440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 420440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const Attr *A) { return A->getKind() == FastCall; } 421440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const FastCallAttr *A) { return true; } 422440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman}; 423440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 424440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass StdCallAttr : public Attr { 425440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic: 426440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman StdCallAttr() : Attr(StdCall) {} 427440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 428440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman // Implement isa/cast/dyncast/etc. 429440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 430440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const Attr *A) { return A->getKind() == StdCall; } 431440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const StdCallAttr *A) { return true; } 432440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman}; 433440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 43427ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopesclass TransparentUnionAttr : public Attr { 43527ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopespublic: 43627ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes TransparentUnionAttr() : Attr(TransparentUnion) {} 43727ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes 43827ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes // Implement isa/cast/dyncast/etc. 43927ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes 44027ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes static bool classof(const Attr *A) { return A->getKind() == TransparentUnion; } 44127ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes static bool classof(const TransparentUnionAttr *A) { return true; } 44227ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes}; 44327ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes 444fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanianclass ObjCNSObjectAttr : public Attr { 445fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian// Implement isa/cast/dyncast/etc. 446fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanianpublic: 447fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian ObjCNSObjectAttr() : Attr(ObjCNSObject) {} 448fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian 449fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanianstatic bool classof(const Attr *A) { return A->getKind() == ObjCNSObject; } 450fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanianstatic bool classof(const ObjCNSObjectAttr *A) { return true; } 451fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian}; 452fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian 4530db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner 4540db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattnerclass ObjCExceptionAttr : public Attr { 4550db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattnerpublic: 4560db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner ObjCExceptionAttr() : Attr(ObjCException) {} 4570db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner 4580db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner // Implement isa/cast/dyncast/etc. 4590db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner static bool classof(const Attr *A) { return A->getKind() == ObjCException; } 4600db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner static bool classof(const ObjCExceptionAttr *A) { return true; } 4610db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner}; 4620db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner 4630db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner 464f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorclass OverloadableAttr : public Attr { 465f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorpublic: 466f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor OverloadableAttr() : Attr(Overloadable) { } 467f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor 468ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor virtual bool isMerged() const { return false; } 469ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor 470f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor static bool classof(const Attr *A) { return A->getKind() == Overloadable; } 471f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor static bool classof(const OverloadableAttr *) { return true; } 472f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor}; 473f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor 4749eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffclass BlocksAttr : public Attr { 4759eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic: 4769eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff enum BlocksAttrTypes { 4779eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff ByRef = 0 4789eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff }; 4799eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffprivate: 4809eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff BlocksAttrTypes BlocksAttrType; 4819eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic: 4829eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff BlocksAttr(BlocksAttrTypes t) : Attr(Blocks), BlocksAttrType(t) {} 4839eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 4849eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff BlocksAttrTypes getType() const { return BlocksAttrType; } 4859eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 4869eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff // Implement isa/cast/dyncast/etc. 4879eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 4889eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff static bool classof(const Attr *A) { return A->getKind() == Blocks; } 489fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian static bool classof(const BlocksAttr *A) { return true; } 4909eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff}; 4919eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 492f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass FunctionDecl; 493f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 494f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass CleanupAttr : public Attr { 495f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson FunctionDecl *FD; 496f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 497f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonpublic: 498f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson CleanupAttr(FunctionDecl *fd) : Attr(Cleanup), FD(fd) {} 499f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 500f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson const FunctionDecl *getFunctionDecl() const { return FD; } 501f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 502f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson // Implement isa/cast/dyncast/etc. 503f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 504f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson static bool classof(const Attr *A) { return A->getKind() == Cleanup; } 505f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson static bool classof(const CleanupAttr *A) { return true; } 506f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson}; 507f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 508d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlssonclass NodebugAttr : public Attr { 509d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlssonpublic: 510d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson NodebugAttr() : Attr(Nodebug) {} 511d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson 512d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson // Implement isa/cast/dyncast/etc. 513d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson 514d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson static bool classof(const Attr *A) { return A->getKind() == Nodebug; } 5155bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson static bool classof(const NodebugAttr *A) { return true; } 516d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson}; 517d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson 518026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattnerclass WarnUnusedResultAttr : public Attr { 519026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattnerpublic: 520026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner WarnUnusedResultAttr() : Attr(WarnUnusedResult) {} 521026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner 522026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // Implement isa/cast/dyncast/etc. 523026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner static bool classof(const Attr *A) { return A->getKind() == WarnUnusedResult;} 524026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner static bool classof(const WarnUnusedResultAttr *A) { return true; } 525026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner}; 5265bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson 5275bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlssonclass NoinlineAttr : public Attr { 5285bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlssonpublic: 5295bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson NoinlineAttr() : Attr(Noinline) {} 5305bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson 5315bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson // Implement isa/cast/dyncast/etc. 5325bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson 5335bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson static bool classof(const Attr *A) { return A->getKind() == Noinline; } 5345bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson static bool classof(const NoinlineAttr *A) { return true; } 5355bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson}; 5365bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson 537d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson} // end namespace clang 538d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 539d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif 540