Attr.h revision 5b160927672440076aa53c31d84149f70fd8d40e
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;
249f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
259f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
269f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
279f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor// Defined in ASTContext.cpp
289f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorvoid *operator new(size_t Bytes, clang::ASTContext &C,
299f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor                   size_t Alignment = 16) throw ();
309f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
319f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregornamespace clang {
32d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
33d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute.
34d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr {
35d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
36d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  enum Kind {
37d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes    Alias,
38d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    Aligned,
39af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar    AlwaysInline,
40b725232b46e92f3e36b03a32a6fc75748c312122Ted Kremenek    AnalyzerNoReturn, // Clang-specific.
41aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek    Annotate,
42a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar    AsmLabel, // Represent GCC asm label extension.
436e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Blocks,
446e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Cleanup,
456e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Const,
463068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar    Constructor,
476e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    DLLExport,
486e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    DLLImport,
49ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Deprecated,
503068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar    Destructor,
5173798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    FastCall,
52ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Format,
535b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian    FormatArg,
54cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner    GNUInline,
5573798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    IBOutletKind, // Clang-specific.  Use "Kind" suffix to not conflict with
5673798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    NoReturn,
5773798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    NoThrow,
586e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Nodebug,
596e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Noinline,
606e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    NonNull,
610db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    ObjCException,
626e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    ObjCNSObject,
63b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek    CFReturnsRetained,   // Clang/Checker-specific.
64b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek    NSReturnsRetained,   // Clang/Checker-specific.
65f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor    Overloadable, // Clang-specific
6673798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Packed,
676e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Pure,
68ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian    Regparm,
6917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar    Section,
705b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian    Sentinel,
7127ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes    StdCall,
7296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    TransparentUnion,
73bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian    Unavailable,
7473798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Unused,
75b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar    Used,
7673798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Visibility,
77026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    WarnUnusedResult,
789eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff    Weak,
796e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    WeakImport
80d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  };
81d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
82d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate:
8381226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *Next;
84d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind AttrKind;
852f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  bool Inherited : 1;
862f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
87d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected:
880b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void* operator new(size_t bytes) throw() {
890b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(0 && "Attrs cannot be allocated with regular 'new'.");
900b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    return 0;
910b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
920b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void operator delete(void* data) throw() {
930b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(0 && "Attrs cannot be released with regular 'delete'.");
940b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
950b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
960b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnerprotected:
972f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  Attr(Kind AK) : Next(0), AttrKind(AK), Inherited(false) {}
98d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  virtual ~Attr() {
990b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(Next == 0 && "Destroy didn't work");
100d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
101cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattnerpublic:
102cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner
1030b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void Destroy(ASTContext &C);
1040b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
105ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  /// \brief Whether this attribute should be merged to new
106ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  /// declarations.
107ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  virtual bool isMerged() const { return true; }
108ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor
109d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind getKind() const { return AttrKind; }
1102f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
11181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *getNext() { return Next; }
11281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  const Attr *getNext() const { return Next; }
11381226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  void setNext(Attr *next) { Next = next; }
1142f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
1152f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  bool isInherited() const { return Inherited; }
1162f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  void setInherited(bool value) { Inherited = value; }
1172f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
118d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  void addAttr(Attr *attr) {
119d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    assert((attr != 0) && "addAttr(): attr is null");
12081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
12181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    // FIXME: This doesn't preserve the order in any way.
12281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    attr->Next = Next;
12381226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    Next = attr;
124d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
125d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
1269f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Clone this attribute.
1279f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const = 0;
1289f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
129d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
130d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *) { return true; }
131d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
132d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
1339f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor#define DEF_SIMPLE_ATTR(ATTR)                                           \
1349f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorclass ATTR##Attr : public Attr {                                        \
1359f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorpublic:                                                                 \
1369f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  ATTR##Attr() : Attr(ATTR) {}                                          \
137e351aa10dab6eb8b9b502166c7035dc7b0e723e0Ted Kremenek  virtual Attr *clone(ASTContext &C) const { return ::new (C) ATTR##Attr; }\
1389f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const Attr *A) { return A->getKind() == ATTR; }   \
1399f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const ATTR##Attr *A) { return true; }             \
1409f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
1419f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
142d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass PackedAttr : public Attr {
1433b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  unsigned Alignment;
1443b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
145d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
1463b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  PackedAttr(unsigned alignment) : Attr(Packed), Alignment(alignment) {}
1473b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1483b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  /// getAlignment - The specified alignment in bits.
1493b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  unsigned getAlignment() const { return Alignment; }
1503b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1519f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const {
1529f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return ::new (C) PackedAttr(Alignment);
1539f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
1549f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
155d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
156d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *A) {
157d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    return A->getKind() == Packed;
158d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
159d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const PackedAttr *A) { return true; }
160d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
161042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
162042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr {
163042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned Alignment;
164042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic:
165042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {}
1663b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1673b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  /// getAlignment - The specified alignment in bits.
168042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned getAlignment() const { return Alignment; }
1699f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1709f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AlignedAttr(Alignment); }
171042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
172042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  // Implement isa/cast/dyncast/etc.
173042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const Attr *A) {
174042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson    return A->getKind() == Aligned;
175042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  }
176042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const AlignedAttr *A) { return true; }
177042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson};
17881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
179c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr {
180c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  std::string Annotation;
181c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic:
182c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {}
183c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
184c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  const std::string& getAnnotation() const { return Annotation; }
1859f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1869f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AnnotateAttr(Annotation); }
187c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
188c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  // Implement isa/cast/dyncast/etc.
189c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const Attr *A) {
190c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman    return A->getKind() == Annotate;
191c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  }
192c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const AnnotateAttr *A) { return true; }
193c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman};
194d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
195a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarclass AsmLabelAttr : public Attr {
196a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  std::string Label;
197a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarpublic:
198a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  AsmLabelAttr(const std::string &L) : Attr(AsmLabel), Label(L) {}
199a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
200a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  const std::string& getLabel() const { return Label; }
201a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
2029f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AsmLabelAttr(Label); }
2039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
204a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  // Implement isa/cast/dyncast/etc.
205a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  static bool classof(const Attr *A) {
206a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar    return A->getKind() == AsmLabel;
207a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  }
208a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  static bool classof(const AsmLabelAttr *A) { return true; }
209a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar};
210a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
2119f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AlwaysInline);
212af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar
213d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr {
214d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  std::string Aliasee;
215d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic:
216d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {}
217d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
218d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  const std::string& getAliasee() const { return Aliasee; }
219d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2209f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) AliasAttr(Aliasee); }
221d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2229f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
223d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const Attr *A) { return A->getKind() == Alias; }
224d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const AliasAttr *A) { return true; }
225d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes};
2263068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2273068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass ConstructorAttr : public Attr {
2283068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  int priority;
2293068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic:
2303068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  ConstructorAttr(int p) : Attr(Constructor), priority(p) {}
2316bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
2326bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  int getPriority() const { return priority; }
2333068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2349f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) ConstructorAttr(priority); }
2359f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2363068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  // Implement isa/cast/dyncast/etc.
2373068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const Attr *A) { return A->getKind() == Constructor; }
2383068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const ConstructorAttr *A) { return true; }
2393068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar};
24096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek
2413068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass DestructorAttr : public Attr {
2423068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  int priority;
2433068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic:
2443068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  DestructorAttr(int p) : Attr(Destructor), priority(p) {}
2456bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
2466bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  int getPriority() const { return priority; }
2473068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2489f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) DestructorAttr(priority); }
2499f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2503068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  // Implement isa/cast/dyncast/etc.
2513068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const Attr *A) { return A->getKind() == Destructor; }
2523068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const DestructorAttr *A) { return true; }
2533068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar};
2543068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
255cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattnerclass GNUInlineAttr : public Attr {
25626e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattnerpublic:
257cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner  GNUInlineAttr() : Attr(GNUInline) {}
2589f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2599f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) GNUInlineAttr; }
2609f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
26126e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner  // Implement isa/cast/dyncast/etc.
2629f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const Attr *A) {
2639f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return A->getKind() == GNUInline;
2649f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
265cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner  static bool classof(const GNUInlineAttr *A) { return true; }
26626e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner};
26726e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner
26896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr {
26996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic:
27096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  IBOutletAttr() : Attr(IBOutletKind) {}
2719f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2729f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) IBOutletAttr; }
2739f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
27496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  // Implement isa/cast/dyncast/etc.
27596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const Attr *A) {
27696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    return A->getKind() == IBOutletKind;
27796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  }
27896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const IBOutletAttr *A) { return true; }
27996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek};
280d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2819f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoReturn);
2829f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AnalyzerNoReturn);
2839f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Deprecated);
2847e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
28517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarclass SectionAttr : public Attr {
28617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  std::string Name;
28717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarpublic:
28817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  SectionAttr(const std::string &N) : Attr(Section), Name(N) {}
28917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar
29017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  const std::string& getName() const { return Name; }
2919f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2929f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) SectionAttr(Name); }
2939f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
29417f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  // Implement isa/cast/dyncast/etc.
29517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  static bool classof(const Attr *A) {
29617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar    return A->getKind() == Section;
29717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  }
29817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  static bool classof(const SectionAttr *A) { return true; }
29917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar};
30017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar
3019f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unavailable);
3029f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unused);
3039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Used);
3049f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Weak);
3059f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WeakImport);
3069f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoThrow);
3079f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Const);
3089f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Pure);
309232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson
310eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekclass NonNullAttr : public Attr {
311eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned* ArgNums;
312eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned Size;
313eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekpublic:
31455b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  NonNullAttr(unsigned* arg_nums = 0, unsigned size = 0) : Attr(NonNull),
31555b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek    ArgNums(0), Size(0) {
31655b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek
3170db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    if (size == 0) return;
3180db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    assert(arg_nums);
3190db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    ArgNums = new unsigned[size];
3200db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    Size = size;
3210db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size);
322eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
323eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek
324eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  virtual ~NonNullAttr() {
325eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    delete [] ArgNums;
326eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
32768a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor
32868a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  typedef const unsigned *iterator;
32968a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  iterator begin() const { return ArgNums; }
33068a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  iterator end() const { return ArgNums + Size; }
33168a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  unsigned size() const { return Size; }
33268a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor
333584def7364f51e35bfcaf5c3c64673096533addaTed Kremenek  bool isNonNull(unsigned arg) const {
334eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true;
335eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
3369f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
3379f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) NonNullAttr(ArgNums, Size); }
3389f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
33955b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  static bool classof(const Attr *A) { return A->getKind() == NonNull; }
34055b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  static bool classof(const NonNullAttr *A) { return true; }
341eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek};
342ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
343ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass FormatAttr : public Attr {
344ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  std::string Type;
345ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int formatIdx, firstArg;
346ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
347ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  FormatAttr(const std::string &type, int idx, int first) : Attr(Format),
348ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner             Type(type), formatIdx(idx), firstArg(first) {}
349ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
350ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  const std::string& getType() const { return Type; }
3513c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  void setType(const std::string &type) { Type = type; }
352ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFormatIdx() const { return formatIdx; }
353ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFirstArg() const { return firstArg; }
354ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3559f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
3569f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return ::new (C) FormatAttr(Type, formatIdx, firstArg);
3579f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
358ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3599f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
360ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Format; }
361ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const FormatAttr *A) { return true; }
362ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
363ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3645b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanianclass FormatArgAttr : public Attr {
3655b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  int formatIdx;
3665b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanianpublic:
3675b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  FormatArgAttr(int idx) : Attr(FormatArg), formatIdx(idx) {}
3685b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  int getFormatIdx() const { return formatIdx; }
3695b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
3705b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  virtual Attr *clone(ASTContext &C) const {
3715b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian    return ::new (C) FormatArgAttr(formatIdx);
3725b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  }
3735b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
3745b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  // Implement isa/cast/dyncast/etc.
3755b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == FormatArg; }
3765b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  static bool classof(const FormatArgAttr *A) { return true; }
3775b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian};
3785b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
3795b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianclass SentinelAttr : public Attr {
3805b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int sentinel, NullPos;
3815b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianpublic:
3825b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  SentinelAttr(int sentinel_val, int nullPos) : Attr(Sentinel),
3835b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian               sentinel(sentinel_val), NullPos(nullPos) {}
3845b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int getSentinel() const { return sentinel; }
3855b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int getNullPos() const { return NullPos; }
3865b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
3875b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  virtual Attr *clone(ASTContext &C) const {
3885b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian    return ::new (C) SentinelAttr(sentinel, NullPos);
3895b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  }
3905b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
3915b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  // Implement isa/cast/dyncast/etc.
3925b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == Sentinel; }
3935b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  static bool classof(const SentinelAttr *A) { return true; }
3945b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian};
3955b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
396ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr {
397ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
3984f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  /// @brief An enumeration for the kinds of visibility of symbols.
3994f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  enum VisibilityTypes {
4004f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    DefaultVisibility = 0,
4014f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    HiddenVisibility,
4024f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    ProtectedVisibility
4034f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  };
4044f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate:
4054f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes VisibilityType;
4064f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic:
4074f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityAttr(VisibilityTypes v) : Attr(Visibility),
408ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner                 VisibilityType(v) {}
409ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4104f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes getVisibility() const { return VisibilityType; }
411ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4129f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) VisibilityAttr(VisibilityType); }
413ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4149f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
415ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Visibility; }
416ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const VisibilityAttr *A) { return true; }
417ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
418ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4199f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(DLLImport);
4209f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(DLLExport);
4219f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(FastCall);
4229f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(StdCall);
4239f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(TransparentUnion);
4249f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCNSObject);
4259f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCException);
42627ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
427f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorclass OverloadableAttr : public Attr {
428f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorpublic:
429f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  OverloadableAttr() : Attr(Overloadable) { }
430f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor
431ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  virtual bool isMerged() const { return false; }
432ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor
4330c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
4340c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor    return ::new (C) OverloadableAttr;
4350c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor  }
4369f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
437f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  static bool classof(const Attr *A) { return A->getKind() == Overloadable; }
438f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  static bool classof(const OverloadableAttr *) { return true; }
439f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor};
440f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor
4419eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffclass BlocksAttr : public Attr {
4429eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic:
4439eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  enum BlocksAttrTypes {
4449eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff    ByRef = 0
4459eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  };
4469eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffprivate:
4479eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttrTypes BlocksAttrType;
4489eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic:
4499eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttr(BlocksAttrTypes t) : Attr(Blocks), BlocksAttrType(t) {}
4509eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4519eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttrTypes getType() const { return BlocksAttrType; }
4529eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4539f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) BlocksAttr(BlocksAttrType); }
4549eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4559f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
4569eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  static bool classof(const Attr *A) { return A->getKind() == Blocks; }
457fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian  static bool classof(const BlocksAttr *A) { return true; }
4589eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff};
4599eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
460f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass FunctionDecl;
461f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
462f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass CleanupAttr : public Attr {
463f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  FunctionDecl *FD;
464f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
465f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonpublic:
466f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  CleanupAttr(FunctionDecl *fd) : Attr(Cleanup), FD(fd) {}
467f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
468f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  const FunctionDecl *getFunctionDecl() const { return FD; }
469f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4709f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) CleanupAttr(FD); }
471f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4729f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
473f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  static bool classof(const Attr *A) { return A->getKind() == Cleanup; }
474f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  static bool classof(const CleanupAttr *A) { return true; }
475f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson};
476f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4779f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Nodebug);
4789f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WarnUnusedResult);
4799f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Noinline);
4805bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson
481ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianclass RegparmAttr : public Attr {
48255d3aaf9a537888734762170823daf750ea9036dEli Friedman  unsigned NumParams;
48355d3aaf9a537888734762170823daf750ea9036dEli Friedman
484ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianpublic:
48555d3aaf9a537888734762170823daf750ea9036dEli Friedman  RegparmAttr(unsigned np) : Attr(Regparm), NumParams(np) {}
48655d3aaf9a537888734762170823daf750ea9036dEli Friedman
4871102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  unsigned getNumParams() const { return NumParams; }
48855d3aaf9a537888734762170823daf750ea9036dEli Friedman
4899f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
4909f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return ::new (C) RegparmAttr(NumParams);
4919f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
4929f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
4939f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
494ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == Regparm; }
495ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian  static bool classof(const RegparmAttr *A) { return true; }
496ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian};
4970fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek
498b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek// Checker-specific attributes.
499b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(CFReturnsRetained);
500b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(NSReturnsRetained);
501b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek
5020fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek#undef DEF_SIMPLE_ATTR
5030fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek
504d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}  // end namespace clang
505d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
506d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif
507