Attr.h revision a860e755f1f9f071b6a6a2f96128a6a258f5c331
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
279509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// Defined in ASTContext.h
289f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorvoid *operator new(size_t Bytes, clang::ASTContext &C,
299f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor                   size_t Alignment = 16) throw ();
309f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
319509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// It is good practice to pair new/delete operators.  Also, MSVC gives many
329509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// warnings if a matching delete overload is not declared, even though the
339509108b3dde280dca1999b5c054f5b789581e68Chris Lattner// throw() spec guarantees it will not be implicitly called.
349509108b3dde280dca1999b5c054f5b789581e68Chris Lattnervoid operator delete(void *Ptr, clang::ASTContext &C, size_t)
359509108b3dde280dca1999b5c054f5b789581e68Chris Lattner              throw ();
369509108b3dde280dca1999b5c054f5b789581e68Chris Lattner
379f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregornamespace clang {
38d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
39d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute.
40d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr {
41d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
42d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  enum Kind {
43d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes    Alias,
44d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    Aligned,
45af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar    AlwaysInline,
46b725232b46e92f3e36b03a32a6fc75748c312122Ted Kremenek    AnalyzerNoReturn, // Clang-specific.
47aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek    Annotate,
48a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar    AsmLabel, // Represent GCC asm label extension.
496e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Blocks,
506e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Cleanup,
516e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Const,
523068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar    Constructor,
536e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    DLLExport,
546e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    DLLImport,
55ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Deprecated,
563068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar    Destructor,
5773798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    FastCall,
58ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Format,
595b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian    FormatArg,
60cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner    GNUInline,
6173798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    IBOutletKind, // Clang-specific.  Use "Kind" suffix to not conflict with
6273798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    NoReturn,
6373798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    NoThrow,
646e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Nodebug,
656e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Noinline,
666e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    NonNull,
670db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    ObjCException,
686e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    ObjCNSObject,
69b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek    CFReturnsRetained,   // Clang/Checker-specific.
70b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek    NSReturnsRetained,   // Clang/Checker-specific.
71f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor    Overloadable, // Clang-specific
7273798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Packed,
73a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson    PragmaPack,
746e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Pure,
75ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian    Regparm,
766f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman    ReqdWorkGroupSize,   // OpenCL-specific
7717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar    Section,
785b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian    Sentinel,
7927ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes    StdCall,
8096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    TransparentUnion,
81bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian    Unavailable,
8273798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Unused,
83b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar    Used,
8473798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Visibility,
85026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    WarnUnusedResult,
869eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff    Weak,
876e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    WeakImport
88d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  };
89d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
90d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate:
9181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *Next;
92d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind AttrKind;
932f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  bool Inherited : 1;
942f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
95d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected:
960b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void* operator new(size_t bytes) throw() {
970b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(0 && "Attrs cannot be allocated with regular 'new'.");
980b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    return 0;
990b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
1000b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void operator delete(void* data) throw() {
1010b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(0 && "Attrs cannot be released with regular 'delete'.");
1020b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
1030b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
1040b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnerprotected:
1052f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  Attr(Kind AK) : Next(0), AttrKind(AK), Inherited(false) {}
106d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  virtual ~Attr() {
1070b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(Next == 0 && "Destroy didn't work");
108d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
109cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattnerpublic:
110cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner
1110b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void Destroy(ASTContext &C);
1120b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
113ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  /// \brief Whether this attribute should be merged to new
114ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  /// declarations.
115ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  virtual bool isMerged() const { return true; }
116ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor
117d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind getKind() const { return AttrKind; }
1182f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
11981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *getNext() { return Next; }
12081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  const Attr *getNext() const { return Next; }
12181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  void setNext(Attr *next) { Next = next; }
1222f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
1232f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  bool isInherited() const { return Inherited; }
1242f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  void setInherited(bool value) { Inherited = value; }
1252f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
126d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  void addAttr(Attr *attr) {
127d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    assert((attr != 0) && "addAttr(): attr is null");
12881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
12981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    // FIXME: This doesn't preserve the order in any way.
13081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    attr->Next = Next;
13181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    Next = attr;
132d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
133d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
1349f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Clone this attribute.
1359f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const = 0;
1369f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
137d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
138d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *) { return true; }
139d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
140d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
1419f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor#define DEF_SIMPLE_ATTR(ATTR)                                           \
1429f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorclass ATTR##Attr : public Attr {                                        \
1439f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorpublic:                                                                 \
1449f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  ATTR##Attr() : Attr(ATTR) {}                                          \
145e351aa10dab6eb8b9b502166c7035dc7b0e723e0Ted Kremenek  virtual Attr *clone(ASTContext &C) const { return ::new (C) ATTR##Attr; }\
1469f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const Attr *A) { return A->getKind() == ATTR; }   \
1479f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const ATTR##Attr *A) { return true; }             \
1489f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
1499f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
150a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders CarlssonDEF_SIMPLE_ATTR(Packed);
151a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson
152a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlssonclass PragmaPackAttr : public Attr {
1533b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  unsigned Alignment;
1543b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
155d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
156a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson  PragmaPackAttr(unsigned alignment) : Attr(PragmaPack), Alignment(alignment) {}
1573b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1583b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  /// getAlignment - The specified alignment in bits.
1593b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  unsigned getAlignment() const { return Alignment; }
1603b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1619f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const {
162a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson    return ::new (C) PragmaPackAttr(Alignment);
1639f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
1649f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
165d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
166d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *A) {
167a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson    return A->getKind() == PragmaPack;
168d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
169a860e755f1f9f071b6a6a2f96128a6a258f5c331Anders Carlsson  static bool classof(const PragmaPackAttr *A) { return true; }
170d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
171042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
172042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr {
173042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned Alignment;
174042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic:
175042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {}
1763b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1773b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  /// getAlignment - The specified alignment in bits.
178042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned getAlignment() const { return Alignment; }
1799f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1809f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AlignedAttr(Alignment); }
181042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
182042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  // Implement isa/cast/dyncast/etc.
183042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const Attr *A) {
184042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson    return A->getKind() == Aligned;
185042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  }
186042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const AlignedAttr *A) { return true; }
187042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson};
18881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
189c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr {
190c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  std::string Annotation;
191c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic:
192c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {}
193c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
194c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  const std::string& getAnnotation() const { return Annotation; }
1959f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1969f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AnnotateAttr(Annotation); }
197c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
198c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  // Implement isa/cast/dyncast/etc.
199c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const Attr *A) {
200c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman    return A->getKind() == Annotate;
201c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  }
202c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const AnnotateAttr *A) { return true; }
203c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman};
204d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
205a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarclass AsmLabelAttr : public Attr {
206a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  std::string Label;
207a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarpublic:
208a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  AsmLabelAttr(const std::string &L) : Attr(AsmLabel), Label(L) {}
209a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
210a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  const std::string& getLabel() const { return Label; }
211a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
2129f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AsmLabelAttr(Label); }
2139f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
214a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  // Implement isa/cast/dyncast/etc.
215a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  static bool classof(const Attr *A) {
216a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar    return A->getKind() == AsmLabel;
217a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  }
218a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  static bool classof(const AsmLabelAttr *A) { return true; }
219a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar};
220a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
2219f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AlwaysInline);
222af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar
223d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr {
224d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  std::string Aliasee;
225d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic:
226d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {}
227d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
228d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  const std::string& getAliasee() const { return Aliasee; }
229d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2309f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) AliasAttr(Aliasee); }
231d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2329f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
233d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const Attr *A) { return A->getKind() == Alias; }
234d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const AliasAttr *A) { return true; }
235d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes};
2363068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2373068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass ConstructorAttr : public Attr {
2383068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  int priority;
2393068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic:
2403068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  ConstructorAttr(int p) : Attr(Constructor), priority(p) {}
2416bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
2426bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  int getPriority() const { return priority; }
2433068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2449f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) ConstructorAttr(priority); }
2459f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2463068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  // Implement isa/cast/dyncast/etc.
2473068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const Attr *A) { return A->getKind() == Constructor; }
2483068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const ConstructorAttr *A) { return true; }
2493068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar};
25096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek
2513068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass DestructorAttr : public Attr {
2523068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  int priority;
2533068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic:
2543068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  DestructorAttr(int p) : Attr(Destructor), priority(p) {}
2556bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
2566bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  int getPriority() const { return priority; }
2573068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2589f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) DestructorAttr(priority); }
2599f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2603068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  // Implement isa/cast/dyncast/etc.
2613068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const Attr *A) { return A->getKind() == Destructor; }
2623068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const DestructorAttr *A) { return true; }
2633068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar};
2643068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
265cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattnerclass GNUInlineAttr : public Attr {
26626e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattnerpublic:
267cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner  GNUInlineAttr() : Attr(GNUInline) {}
2689f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2699f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) GNUInlineAttr; }
2709f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
27126e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner  // Implement isa/cast/dyncast/etc.
2729f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const Attr *A) {
2739f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return A->getKind() == GNUInline;
2749f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
275cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner  static bool classof(const GNUInlineAttr *A) { return true; }
27626e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner};
27726e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner
27896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr {
27996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic:
28096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  IBOutletAttr() : Attr(IBOutletKind) {}
2819f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2829f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) IBOutletAttr; }
2839f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
28496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  // Implement isa/cast/dyncast/etc.
28596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const Attr *A) {
28696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    return A->getKind() == IBOutletKind;
28796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  }
28896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const IBOutletAttr *A) { return true; }
28996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek};
290d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2919f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoReturn);
2929f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AnalyzerNoReturn);
2939f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Deprecated);
2947e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
29517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarclass SectionAttr : public Attr {
29617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  std::string Name;
29717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarpublic:
29817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  SectionAttr(const std::string &N) : Attr(Section), Name(N) {}
29917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar
30017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  const std::string& getName() const { return Name; }
3019f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
3029f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) SectionAttr(Name); }
3039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
30417f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  // Implement isa/cast/dyncast/etc.
30517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  static bool classof(const Attr *A) {
30617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar    return A->getKind() == Section;
30717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  }
30817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  static bool classof(const SectionAttr *A) { return true; }
30917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar};
31017f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar
3119f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unavailable);
3129f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unused);
3139f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Used);
3149f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Weak);
3159f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WeakImport);
3169f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoThrow);
3179f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Const);
3189f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Pure);
319232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson
320eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekclass NonNullAttr : public Attr {
321eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned* ArgNums;
322eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned Size;
323eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekpublic:
32455b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  NonNullAttr(unsigned* arg_nums = 0, unsigned size = 0) : Attr(NonNull),
32555b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek    ArgNums(0), Size(0) {
32655b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek
3270db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    if (size == 0) return;
3280db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    assert(arg_nums);
3290db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    ArgNums = new unsigned[size];
3300db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    Size = size;
3310db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size);
332eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
333eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek
334eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  virtual ~NonNullAttr() {
335eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    delete [] ArgNums;
336eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
33768a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor
33868a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  typedef const unsigned *iterator;
33968a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  iterator begin() const { return ArgNums; }
34068a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  iterator end() const { return ArgNums + Size; }
34168a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  unsigned size() const { return Size; }
34268a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor
343584def7364f51e35bfcaf5c3c64673096533addaTed Kremenek  bool isNonNull(unsigned arg) const {
344eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true;
345eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
3469f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
3479f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) NonNullAttr(ArgNums, Size); }
3489f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
34955b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  static bool classof(const Attr *A) { return A->getKind() == NonNull; }
35055b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  static bool classof(const NonNullAttr *A) { return true; }
351eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek};
352ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
353ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass FormatAttr : public Attr {
354ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  std::string Type;
355ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int formatIdx, firstArg;
356ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
357ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  FormatAttr(const std::string &type, int idx, int first) : Attr(Format),
358ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner             Type(type), formatIdx(idx), firstArg(first) {}
359ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
360ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  const std::string& getType() const { return Type; }
3613c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  void setType(const std::string &type) { Type = type; }
362ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFormatIdx() const { return formatIdx; }
363ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFirstArg() const { return firstArg; }
364ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3659f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
3669f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return ::new (C) FormatAttr(Type, formatIdx, firstArg);
3679f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
368ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3699f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
370ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Format; }
371ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const FormatAttr *A) { return true; }
372ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
373ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3745b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanianclass FormatArgAttr : public Attr {
3755b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  int formatIdx;
3765b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanianpublic:
3775b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  FormatArgAttr(int idx) : Attr(FormatArg), formatIdx(idx) {}
3785b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  int getFormatIdx() const { return formatIdx; }
3795b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
3805b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  virtual Attr *clone(ASTContext &C) const {
3815b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian    return ::new (C) FormatArgAttr(formatIdx);
3825b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  }
3835b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
3845b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  // Implement isa/cast/dyncast/etc.
3855b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == FormatArg; }
3865b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian  static bool classof(const FormatArgAttr *A) { return true; }
3875b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian};
3885b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian
3895b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianclass SentinelAttr : public Attr {
3905b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int sentinel, NullPos;
3915b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianpublic:
3925b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  SentinelAttr(int sentinel_val, int nullPos) : Attr(Sentinel),
3935b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian               sentinel(sentinel_val), NullPos(nullPos) {}
3945b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int getSentinel() const { return sentinel; }
3955b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int getNullPos() const { return NullPos; }
3965b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
3975b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  virtual Attr *clone(ASTContext &C) const {
3985b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian    return ::new (C) SentinelAttr(sentinel, NullPos);
3995b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  }
4005b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
4015b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  // Implement isa/cast/dyncast/etc.
4025b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == Sentinel; }
4035b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  static bool classof(const SentinelAttr *A) { return true; }
4045b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian};
4055b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
406ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr {
407ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
4084f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  /// @brief An enumeration for the kinds of visibility of symbols.
4094f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  enum VisibilityTypes {
4104f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    DefaultVisibility = 0,
4114f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    HiddenVisibility,
4124f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    ProtectedVisibility
4134f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  };
4144f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate:
4154f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes VisibilityType;
4164f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic:
4174f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityAttr(VisibilityTypes v) : Attr(Visibility),
418ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner                 VisibilityType(v) {}
419ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4204f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes getVisibility() const { return VisibilityType; }
421ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4229f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) VisibilityAttr(VisibilityType); }
423ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4249f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
425ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Visibility; }
426ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const VisibilityAttr *A) { return true; }
427ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
428ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4299f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(DLLImport);
4309f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(DLLExport);
4319f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(FastCall);
4329f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(StdCall);
4339f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(TransparentUnion);
4349f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCNSObject);
4359f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCException);
43627ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
437f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorclass OverloadableAttr : public Attr {
438f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorpublic:
439f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  OverloadableAttr() : Attr(Overloadable) { }
440f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor
441ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  virtual bool isMerged() const { return false; }
442ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor
4430c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
4440c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor    return ::new (C) OverloadableAttr;
4450c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor  }
4469f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
447f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  static bool classof(const Attr *A) { return A->getKind() == Overloadable; }
448f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  static bool classof(const OverloadableAttr *) { return true; }
449f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor};
450f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor
4519eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffclass BlocksAttr : public Attr {
4529eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic:
4539eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  enum BlocksAttrTypes {
4549eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff    ByRef = 0
4559eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  };
4569eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffprivate:
4579eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttrTypes BlocksAttrType;
4589eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic:
4599eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttr(BlocksAttrTypes t) : Attr(Blocks), BlocksAttrType(t) {}
4609eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4619eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttrTypes getType() const { return BlocksAttrType; }
4629eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4639f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) BlocksAttr(BlocksAttrType); }
4649eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4659f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
4669eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  static bool classof(const Attr *A) { return A->getKind() == Blocks; }
467fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian  static bool classof(const BlocksAttr *A) { return true; }
4689eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff};
4699eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
470f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass FunctionDecl;
471f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
472f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass CleanupAttr : public Attr {
473f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  FunctionDecl *FD;
474f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
475f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonpublic:
476f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  CleanupAttr(FunctionDecl *fd) : Attr(Cleanup), FD(fd) {}
477f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
478f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  const FunctionDecl *getFunctionDecl() const { return FD; }
479f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4809f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) CleanupAttr(FD); }
481f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4829f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
483f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  static bool classof(const Attr *A) { return A->getKind() == Cleanup; }
484f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  static bool classof(const CleanupAttr *A) { return true; }
485f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson};
486f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4879f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Nodebug);
4889f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WarnUnusedResult);
4899f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Noinline);
4905bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson
491ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianclass RegparmAttr : public Attr {
49255d3aaf9a537888734762170823daf750ea9036dEli Friedman  unsigned NumParams;
49355d3aaf9a537888734762170823daf750ea9036dEli Friedman
494ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianpublic:
49555d3aaf9a537888734762170823daf750ea9036dEli Friedman  RegparmAttr(unsigned np) : Attr(Regparm), NumParams(np) {}
49655d3aaf9a537888734762170823daf750ea9036dEli Friedman
4971102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  unsigned getNumParams() const { return NumParams; }
49855d3aaf9a537888734762170823daf750ea9036dEli Friedman
4999f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
5009f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return ::new (C) RegparmAttr(NumParams);
5019f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
5029f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
5039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
504ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == Regparm; }
505ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian  static bool classof(const RegparmAttr *A) { return true; }
506ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian};
5070fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek
5086f3d838867538638b9bbf412028e8537ae12f3e5Nate Begemanclass ReqdWorkGroupSizeAttr : public Attr {
5096f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned X, Y, Z;
5106f3d838867538638b9bbf412028e8537ae12f3e5Nate Begemanpublic:
5116f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  ReqdWorkGroupSizeAttr(unsigned X, unsigned Y, unsigned Z)
5126f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  : Attr(ReqdWorkGroupSize), X(X), Y(Y), Z(Z) {}
5136f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman
5146f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned getXDim() const { return X; }
5156f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned getYDim() const { return Y; }
5166f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  unsigned getZDim() const { return Z; }
5176f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman
5186f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  virtual Attr *clone(ASTContext &C) const {
5196f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman    return ::new (C) ReqdWorkGroupSizeAttr(X, Y, Z);
5206f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  }
5216f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman
5226f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  // Implement isa/cast/dyncast/etc.
5236f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  static bool classof(const Attr *A) {
5246f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman    return A->getKind() == ReqdWorkGroupSize;
5256f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  }
5266f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman  static bool classof(const ReqdWorkGroupSizeAttr *A) { return true; }
5276f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman};
5286f3d838867538638b9bbf412028e8537ae12f3e5Nate Begeman
529b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek// Checker-specific attributes.
530b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(CFReturnsRetained);
531b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(NSReturnsRetained);
532b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek
5330fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek#undef DEF_SIMPLE_ATTR
5340fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek
535d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}  // end namespace clang
536d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
537d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif
538