Attr.h revision 5bab788d40026ad6e932a3cd9b86bc13f8a27661
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 { 23d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 24d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute. 25d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr { 26d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic: 27d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson enum Kind { 28d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes Alias, 29d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Aligned, 30af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar AlwaysInline, 31aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek Annotate, 32a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar AsmLabel, // Represent GCC asm label extension. 333068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar Constructor, 34ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Deprecated, 353068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar Destructor, 36ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLImport, 37ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLExport, 3873798892751e378cbcdef43579c1d41685091fd0Ted Kremenek FastCall, 39ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Format, 4073798892751e378cbcdef43579c1d41685091fd0Ted Kremenek IBOutletKind, // Clang-specific. Use "Kind" suffix to not conflict with 4173798892751e378cbcdef43579c1d41685091fd0Ted Kremenek NonNull, 4273798892751e378cbcdef43579c1d41685091fd0Ted Kremenek NoReturn, 4373798892751e378cbcdef43579c1d41685091fd0Ted Kremenek NoThrow, 44fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian ObjCNSObject, 450db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner ObjCException, 46f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor Overloadable, // Clang-specific 4773798892751e378cbcdef43579c1d41685091fd0Ted Kremenek Packed, 4817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar Section, 4927ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes StdCall, 5096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek TransparentUnion, 51bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian Unavailable, 5273798892751e378cbcdef43579c1d41685091fd0Ted Kremenek Unused, 53b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar Used, 5473798892751e378cbcdef43579c1d41685091fd0Ted Kremenek Visibility, 55026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner WarnUnusedResult, 569eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff Weak, 57232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson Blocks, 58232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson Const, 59f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson Pure, 60d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson Cleanup, 615bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson Nodebug, 625bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson Noinline 63d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson }; 64d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 65d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate: 6681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Attr *Next; 67d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Kind AttrKind; 682f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov bool Inherited : 1; 692f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 70d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected: 712f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov Attr(Kind AK) : Next(0), AttrKind(AK), Inherited(false) {} 72b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlssonpublic: 73d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson virtual ~Attr() { 7481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson delete Next; 75d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 76b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson 77ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor /// \brief Whether this attribute should be merged to new 78ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor /// declarations. 79ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor virtual bool isMerged() const { return true; } 80ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor 81d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson Kind getKind() const { return AttrKind; } 822f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 8381226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Attr *getNext() { return Next; } 8481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson const Attr *getNext() const { return Next; } 8581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson void setNext(Attr *next) { Next = next; } 862f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 872f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov bool isInherited() const { return Inherited; } 882f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov void setInherited(bool value) { Inherited = value; } 892f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 90d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson void addAttr(Attr *attr) { 91d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson assert((attr != 0) && "addAttr(): attr is null"); 9281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 9381226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson // FIXME: This doesn't preserve the order in any way. 9481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson attr->Next = Next; 9581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson Next = attr; 96d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 97d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 98d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Implement isa/cast/dyncast/etc. 99d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const Attr *) { return true; } 100d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 101d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 102d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass PackedAttr : public Attr { 1033b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar unsigned Alignment; 1043b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 105d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic: 1063b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar PackedAttr(unsigned alignment) : Attr(Packed), Alignment(alignment) {} 1073b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 1083b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar /// getAlignment - The specified alignment in bits. 1093b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar unsigned getAlignment() const { return Alignment; } 1103b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 111d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson // Implement isa/cast/dyncast/etc. 112d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const Attr *A) { 113d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson return A->getKind() == Packed; 114d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson } 115d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson static bool classof(const PackedAttr *A) { return true; } 116d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 117042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson 118042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr { 119042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson unsigned Alignment; 120042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic: 121042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {} 1223b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar 1233b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar /// getAlignment - The specified alignment in bits. 124042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson unsigned getAlignment() const { return Alignment; } 125042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson 126042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson // Implement isa/cast/dyncast/etc. 127042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson static bool classof(const Attr *A) { 128042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson return A->getKind() == Aligned; 129042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson } 130042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson static bool classof(const AlignedAttr *A) { return true; } 131042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson}; 13281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson 133c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr { 134c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman std::string Annotation; 135c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic: 136c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {} 137c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 138c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman const std::string& getAnnotation() const { return Annotation; } 139c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 140c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman // Implement isa/cast/dyncast/etc. 141c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman static bool classof(const Attr *A) { 142c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman return A->getKind() == Annotate; 143c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman } 144c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman static bool classof(const AnnotateAttr *A) { return true; } 145c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman}; 146d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 147a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarclass AsmLabelAttr : public Attr { 148a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar std::string Label; 149a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarpublic: 150a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar AsmLabelAttr(const std::string &L) : Attr(AsmLabel), Label(L) {} 151a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar 152a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar const std::string& getLabel() const { return Label; } 153a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar 154a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar // Implement isa/cast/dyncast/etc. 155a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar static bool classof(const Attr *A) { 156a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar return A->getKind() == AsmLabel; 157a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar } 158a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar static bool classof(const AsmLabelAttr *A) { return true; } 159a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar}; 160a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar 161af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbarclass AlwaysInlineAttr : public Attr { 162af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbarpublic: 163af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar AlwaysInlineAttr() : Attr(AlwaysInline) {} 164af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar 165af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar // Implement isa/cast/dyncast/etc. 166af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar 167af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar static bool classof(const Attr *A) { return A->getKind() == AlwaysInline; } 168af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar static bool classof(const AlwaysInlineAttr *A) { return true; } 169af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar}; 170af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar 171d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr { 172d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes std::string Aliasee; 173d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic: 174d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {} 175d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 176d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes const std::string& getAliasee() const { return Aliasee; } 177d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 178d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes // Implement isa/cast/dyncast/etc. 179d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 180d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes static bool classof(const Attr *A) { return A->getKind() == Alias; } 181d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes static bool classof(const AliasAttr *A) { return true; } 182d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes}; 1833068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 1843068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass ConstructorAttr : public Attr { 1853068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar int priority; 1863068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic: 1873068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar ConstructorAttr(int p) : Attr(Constructor), priority(p) {} 1886bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar 1896bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar int getPriority() const { return priority; } 1903068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 1913068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar // Implement isa/cast/dyncast/etc. 1923068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const Attr *A) { return A->getKind() == Constructor; } 1933068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const ConstructorAttr *A) { return true; } 1943068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar}; 19596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek 1963068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass DestructorAttr : public Attr { 1973068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar int priority; 1983068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic: 1993068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar DestructorAttr(int p) : Attr(Destructor), 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() == Destructor; } 2053068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar static bool classof(const DestructorAttr *A) { return true; } 2063068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar}; 2073068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar 20896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr { 20996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic: 21096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek IBOutletAttr() : Attr(IBOutletKind) {} 21196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek 21296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek // Implement isa/cast/dyncast/etc. 21396329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek static bool classof(const Attr *A) { 21496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek return A->getKind() == IBOutletKind; 21596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek } 21696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek static bool classof(const IBOutletAttr *A) { return true; } 21796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek}; 218d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes 219aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekclass NoReturnAttr : public Attr { 220aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekpublic: 221aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek NoReturnAttr() : Attr(NoReturn) {} 222aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek 223aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek // Implement isa/cast/dyncast/etc. 224aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek static bool classof(const Attr *A) { return A->getKind() == NoReturn; } 225aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek static bool classof(const NoReturnAttr *A) { return true; } 226aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek}; 227c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman 2287e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerclass DeprecatedAttr : public Attr { 2297e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerpublic: 2307e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner DeprecatedAttr() : Attr(Deprecated) {} 2317e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner 2327e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner // Implement isa/cast/dyncast/etc. 2337e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner static bool classof(const Attr *A) { return A->getKind() == Deprecated; } 2347e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner static bool classof(const DeprecatedAttr *A) { return true; } 2357e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner}; 2367e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner 23717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarclass SectionAttr : public Attr { 23817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar std::string Name; 23917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarpublic: 24017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar SectionAttr(const std::string &N) : Attr(Section), Name(N) {} 24117f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar 24217f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar const std::string& getName() const { return Name; } 24317f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar 24417f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar // Implement isa/cast/dyncast/etc. 24517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar static bool classof(const Attr *A) { 24617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar return A->getKind() == Section; 24717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar } 24817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar static bool classof(const SectionAttr *A) { return true; } 24917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar}; 25017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar 251bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanianclass UnavailableAttr : public Attr { 252bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanianpublic: 253bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian UnavailableAttr() : Attr(Unavailable) {} 254bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian 255bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian // Implement isa/cast/dyncast/etc. 256bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian 257bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian static bool classof(const Attr *A) { return A->getKind() == Unavailable; } 258bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian static bool classof(const UnavailableAttr *A) { return true; } 259bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian}; 260bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian 26173798892751e378cbcdef43579c1d41685091fd0Ted Kremenekclass UnusedAttr : public Attr { 26273798892751e378cbcdef43579c1d41685091fd0Ted Kremenekpublic: 26373798892751e378cbcdef43579c1d41685091fd0Ted Kremenek UnusedAttr() : Attr(Unused) {} 26473798892751e378cbcdef43579c1d41685091fd0Ted Kremenek 26573798892751e378cbcdef43579c1d41685091fd0Ted Kremenek // Implement isa/cast/dyncast/etc. 26673798892751e378cbcdef43579c1d41685091fd0Ted Kremenek static bool classof(const Attr *A) { return A->getKind() == Unused; } 26773798892751e378cbcdef43579c1d41685091fd0Ted Kremenek static bool classof(const UnusedAttr *A) { return true; } 26873798892751e378cbcdef43579c1d41685091fd0Ted Kremenek}; 26973798892751e378cbcdef43579c1d41685091fd0Ted Kremenek 270b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbarclass UsedAttr : public Attr { 271b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbarpublic: 272b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar UsedAttr() : Attr(Used) {} 273b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar 274b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar // Implement isa/cast/dyncast/etc. 275b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar static bool classof(const Attr *A) { return A->getKind() == Used; } 276b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar static bool classof(const UsedAttr *A) { return true; } 277b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar}; 278b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar 279ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass WeakAttr : public Attr { 280ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 281ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner WeakAttr() : Attr(Weak) {} 282ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 283ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 284ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 285ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Weak; } 286ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const WeakAttr *A) { return true; } 287ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 288ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 289ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass NoThrowAttr : public Attr { 290ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 291ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner NoThrowAttr() : Attr(NoThrow) {} 292ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 293ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 294ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == NoThrow; } 295ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const NoThrowAttr *A) { return true; } 296ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 297232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 298232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlssonclass ConstAttr : public Attr { 299232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlssonpublic: 300232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson ConstAttr() : Attr(Const) {} 301232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 302232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson // Implement isa/cast/dyncast/etc. 303232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson static bool classof(const Attr *A) { return A->getKind() == Const; } 304232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson static bool classof(const ConstAttr *A) { return true; } 305232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson}; 306232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 307232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlssonclass PureAttr : public Attr { 308232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlssonpublic: 309232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson PureAttr() : Attr(Pure) {} 310232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 311232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson // Implement isa/cast/dyncast/etc. 312232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson static bool classof(const Attr *A) { return A->getKind() == Pure; } 313232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson static bool classof(const PureAttr *A) { return true; } 314232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson}; 315232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson 316eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekclass NonNullAttr : public Attr { 317eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek unsigned* ArgNums; 318eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek unsigned Size; 319eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekpublic: 32055b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek NonNullAttr(unsigned* arg_nums = 0, unsigned size = 0) : Attr(NonNull), 32155b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek ArgNums(0), Size(0) { 32255b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek 3230db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner if (size == 0) return; 3240db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner assert(arg_nums); 3250db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner ArgNums = new unsigned[size]; 3260db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner Size = size; 3270db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size); 328eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 329eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek 330eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek virtual ~NonNullAttr() { 331eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek delete [] ArgNums; 332eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 333eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek 334584def7364f51e35bfcaf5c3c64673096533addaTed Kremenek bool isNonNull(unsigned arg) const { 335eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true; 336eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek } 33755b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek 33855b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek static bool classof(const Attr *A) { return A->getKind() == NonNull; } 33955b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek static bool classof(const NonNullAttr *A) { return true; } 340eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek}; 341ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 342ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass FormatAttr : public Attr { 343ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner std::string Type; 344ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int formatIdx, firstArg; 345ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 346ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner FormatAttr(const std::string &type, int idx, int first) : Attr(Format), 347ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner Type(type), formatIdx(idx), firstArg(first) {} 348ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 349ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner const std::string& getType() const { return Type; } 3503c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor void setType(const std::string &type) { Type = type; } 351ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int getFormatIdx() const { return formatIdx; } 352ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner int getFirstArg() const { return firstArg; } 353ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 354ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 355ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 356ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Format; } 357ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const FormatAttr *A) { return true; } 358ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 359ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 360ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr { 361ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 3624f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman /// @brief An enumeration for the kinds of visibility of symbols. 3634f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman enum VisibilityTypes { 3644f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman DefaultVisibility = 0, 3654f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman HiddenVisibility, 3664f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman ProtectedVisibility 3674f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman }; 3684f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate: 3694f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityTypes VisibilityType; 3704f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic: 3714f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityAttr(VisibilityTypes v) : Attr(Visibility), 372ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner VisibilityType(v) {} 373ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 3744f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman VisibilityTypes getVisibility() const { return VisibilityType; } 375ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 376ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 377ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 378ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == Visibility; } 379ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const VisibilityAttr *A) { return true; } 380ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 381ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 382ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLImportAttr : public Attr { 383ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 384ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLImportAttr() : Attr(DLLImport) {} 385ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 386ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 387ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 388ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == DLLImport; } 389ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const DLLImportAttr *A) { return true; } 390ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 391ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 392ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLExportAttr : public Attr { 393ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic: 394ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner DLLExportAttr() : Attr(DLLExport) {} 395ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 396ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner // Implement isa/cast/dyncast/etc. 397ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 398ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const Attr *A) { return A->getKind() == DLLExport; } 399ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner static bool classof(const DLLExportAttr *A) { return true; } 400ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}; 401ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner 402440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass FastCallAttr : public Attr { 403440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic: 404440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman FastCallAttr() : Attr(FastCall) {} 405440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 406440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman // Implement isa/cast/dyncast/etc. 407440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 408440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const Attr *A) { return A->getKind() == FastCall; } 409440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const FastCallAttr *A) { return true; } 410440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman}; 411440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 412440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass StdCallAttr : public Attr { 413440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic: 414440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman StdCallAttr() : Attr(StdCall) {} 415440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 416440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman // Implement isa/cast/dyncast/etc. 417440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 418440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const Attr *A) { return A->getKind() == StdCall; } 419440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman static bool classof(const StdCallAttr *A) { return true; } 420440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman}; 421440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman 42227ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopesclass TransparentUnionAttr : public Attr { 42327ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopespublic: 42427ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes TransparentUnionAttr() : Attr(TransparentUnion) {} 42527ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes 42627ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes // Implement isa/cast/dyncast/etc. 42727ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes 42827ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes static bool classof(const Attr *A) { return A->getKind() == TransparentUnion; } 42927ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes static bool classof(const TransparentUnionAttr *A) { return true; } 43027ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes}; 43127ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes 432fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanianclass ObjCNSObjectAttr : public Attr { 433fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian// Implement isa/cast/dyncast/etc. 434fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanianpublic: 435fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian ObjCNSObjectAttr() : Attr(ObjCNSObject) {} 436fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian 437fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanianstatic bool classof(const Attr *A) { return A->getKind() == ObjCNSObject; } 438fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanianstatic bool classof(const ObjCNSObjectAttr *A) { return true; } 439fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian}; 440fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian 4410db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner 4420db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattnerclass ObjCExceptionAttr : public Attr { 4430db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattnerpublic: 4440db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner ObjCExceptionAttr() : Attr(ObjCException) {} 4450db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner 4460db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner // Implement isa/cast/dyncast/etc. 4470db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner static bool classof(const Attr *A) { return A->getKind() == ObjCException; } 4480db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner static bool classof(const ObjCExceptionAttr *A) { return true; } 4490db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner}; 4500db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner 4510db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner 452f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorclass OverloadableAttr : public Attr { 453f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorpublic: 454f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor OverloadableAttr() : Attr(Overloadable) { } 455f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor 456ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor virtual bool isMerged() const { return false; } 457ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor 458f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor static bool classof(const Attr *A) { return A->getKind() == Overloadable; } 459f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor static bool classof(const OverloadableAttr *) { return true; } 460f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor}; 461f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor 4629eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffclass BlocksAttr : public Attr { 4639eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic: 4649eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff enum BlocksAttrTypes { 4659eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff ByRef = 0 4669eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff }; 4679eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffprivate: 4689eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff BlocksAttrTypes BlocksAttrType; 4699eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic: 4709eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff BlocksAttr(BlocksAttrTypes t) : Attr(Blocks), BlocksAttrType(t) {} 4719eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 4729eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff BlocksAttrTypes getType() const { return BlocksAttrType; } 4739eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 4749eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff // Implement isa/cast/dyncast/etc. 4759eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 4769eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff static bool classof(const Attr *A) { return A->getKind() == Blocks; } 477fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian static bool classof(const BlocksAttr *A) { return true; } 4789eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff}; 4799eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff 480f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass FunctionDecl; 481f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 482f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass CleanupAttr : public Attr { 483f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson FunctionDecl *FD; 484f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 485f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonpublic: 486f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson CleanupAttr(FunctionDecl *fd) : Attr(Cleanup), FD(fd) {} 487f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 488f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson const FunctionDecl *getFunctionDecl() const { return FD; } 489f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 490f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson // Implement isa/cast/dyncast/etc. 491f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 492f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson static bool classof(const Attr *A) { return A->getKind() == Cleanup; } 493f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson static bool classof(const CleanupAttr *A) { return true; } 494f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson}; 495f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson 496d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlssonclass NodebugAttr : public Attr { 497d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlssonpublic: 498d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson NodebugAttr() : Attr(Nodebug) {} 499d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson 500d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson // Implement isa/cast/dyncast/etc. 501d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson 502d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson static bool classof(const Attr *A) { return A->getKind() == Nodebug; } 5035bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson static bool classof(const NodebugAttr *A) { return true; } 504d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson}; 505d87df37e0adaba0d5e33da7b1a14d7f1d94c5eefAnders Carlsson 506026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattnerclass WarnUnusedResultAttr : public Attr { 507026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattnerpublic: 508026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner WarnUnusedResultAttr() : Attr(WarnUnusedResult) {} 509026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner 510026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner // Implement isa/cast/dyncast/etc. 511026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner static bool classof(const Attr *A) { return A->getKind() == WarnUnusedResult;} 512026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner static bool classof(const WarnUnusedResultAttr *A) { return true; } 513026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner}; 5145bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson 5155bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlssonclass NoinlineAttr : public Attr { 5165bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlssonpublic: 5175bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson NoinlineAttr() : Attr(Noinline) {} 5185bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson 5195bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson // Implement isa/cast/dyncast/etc. 5205bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson 5215bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson static bool classof(const Attr *A) { return A->getKind() == Noinline; } 5225bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson static bool classof(const NoinlineAttr *A) { return true; } 5235bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson}; 5245bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson 525d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson} // end namespace clang 526d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 527d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif 528