Attr.h revision 5b53005fb9ef24b8bdfe995f29b4662de468128a
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,
53cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner    GNUInline,
5473798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    IBOutletKind, // Clang-specific.  Use "Kind" suffix to not conflict with
5573798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    NoReturn,
5673798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    NoThrow,
576e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Nodebug,
586e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Noinline,
596e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    NonNull,
600db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    ObjCException,
616e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    ObjCNSObject,
62b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek    CFReturnsRetained,   // Clang/Checker-specific.
63b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek    NSReturnsRetained,   // Clang/Checker-specific.
64f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor    Overloadable, // Clang-specific
6573798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Packed,
666e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    Pure,
67ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian    Regparm,
6817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar    Section,
695b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian    Sentinel,
7027ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes    StdCall,
7196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    TransparentUnion,
72bc1c877fe28fb6a825f0b226a0a2da99e713ea03Fariborz Jahanian    Unavailable,
7373798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Unused,
74b805dad4aa386aeae0f72512895bd238678d37a5Daniel Dunbar    Used,
7573798892751e378cbcdef43579c1d41685091fd0Ted Kremenek    Visibility,
76026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    WarnUnusedResult,
779eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff    Weak,
786e775dbafba2ab6634decc489eb3b4301b4b506bDaniel Dunbar    WeakImport
79d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  };
80d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
81d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate:
8281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *Next;
83d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind AttrKind;
842f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  bool Inherited : 1;
852f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
86d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected:
870b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void* operator new(size_t bytes) throw() {
880b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(0 && "Attrs cannot be allocated with regular 'new'.");
890b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    return 0;
900b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
910b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void operator delete(void* data) throw() {
920b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(0 && "Attrs cannot be released with regular 'delete'.");
930b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
940b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
950b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnerprotected:
962f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  Attr(Kind AK) : Next(0), AttrKind(AK), Inherited(false) {}
97d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  virtual ~Attr() {
980b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    assert(Next == 0 && "Destroy didn't work");
99d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
100cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattnerpublic:
101cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner
1020b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  void Destroy(ASTContext &C);
1030b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
104ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  /// \brief Whether this attribute should be merged to new
105ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  /// declarations.
106ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  virtual bool isMerged() const { return true; }
107ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor
108d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind getKind() const { return AttrKind; }
1092f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
11081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *getNext() { return Next; }
11181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  const Attr *getNext() const { return Next; }
11281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  void setNext(Attr *next) { Next = next; }
1132f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
1142f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  bool isInherited() const { return Inherited; }
1152f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov  void setInherited(bool value) { Inherited = value; }
1162f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov
117d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  void addAttr(Attr *attr) {
118d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    assert((attr != 0) && "addAttr(): attr is null");
11981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
12081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    // FIXME: This doesn't preserve the order in any way.
12181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    attr->Next = Next;
12281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    Next = attr;
123d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
124d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
1259f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Clone this attribute.
1269f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const = 0;
1279f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
128d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
129d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *) { return true; }
130d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
131d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
1329f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor#define DEF_SIMPLE_ATTR(ATTR)                                           \
1339f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorclass ATTR##Attr : public Attr {                                        \
1349f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorpublic:                                                                 \
1359f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  ATTR##Attr() : Attr(ATTR) {}                                          \
136e351aa10dab6eb8b9b502166c7035dc7b0e723e0Ted Kremenek  virtual Attr *clone(ASTContext &C) const { return ::new (C) ATTR##Attr; }\
1379f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const Attr *A) { return A->getKind() == ATTR; }   \
1389f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const ATTR##Attr *A) { return true; }             \
1399f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
1409f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
141d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass PackedAttr : public Attr {
1423b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  unsigned Alignment;
1433b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
144d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
1453b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  PackedAttr(unsigned alignment) : Attr(Packed), Alignment(alignment) {}
1463b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1473b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  /// getAlignment - The specified alignment in bits.
1483b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  unsigned getAlignment() const { return Alignment; }
1493b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1509f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const {
1519f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return ::new (C) PackedAttr(Alignment);
1529f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
1539f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
154d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
155d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *A) {
156d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    return A->getKind() == Packed;
157d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
158d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const PackedAttr *A) { return true; }
159d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
160042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
161042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr {
162042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned Alignment;
163042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic:
164042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {}
1653b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar
1663b0db908ebd07eaa26bc90deba5e826de00fe515Daniel Dunbar  /// getAlignment - The specified alignment in bits.
167042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned getAlignment() const { return Alignment; }
1689f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1699f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AlignedAttr(Alignment); }
170042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
171042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  // Implement isa/cast/dyncast/etc.
172042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const Attr *A) {
173042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson    return A->getKind() == Aligned;
174042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  }
175042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const AlignedAttr *A) { return true; }
176042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson};
17781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
178c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr {
179c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  std::string Annotation;
180c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic:
181c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {}
182c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
183c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  const std::string& getAnnotation() const { return Annotation; }
1849f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1859f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AnnotateAttr(Annotation); }
186c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
187c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  // Implement isa/cast/dyncast/etc.
188c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const Attr *A) {
189c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman    return A->getKind() == Annotate;
190c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  }
191c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const AnnotateAttr *A) { return true; }
192c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman};
193d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
194a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarclass AsmLabelAttr : public Attr {
195a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  std::string Label;
196a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbarpublic:
197a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  AsmLabelAttr(const std::string &L) : Attr(AsmLabel), Label(L) {}
198a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
199a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  const std::string& getLabel() const { return Label; }
200a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
2019f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr* clone(ASTContext &C) const { return ::new (C) AsmLabelAttr(Label); }
2029f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
203a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  // Implement isa/cast/dyncast/etc.
204a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  static bool classof(const Attr *A) {
205a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar    return A->getKind() == AsmLabel;
206a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  }
207a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar  static bool classof(const AsmLabelAttr *A) { return true; }
208a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar};
209a80f8749f2968d19595ca2544114932bf0ca2c11Daniel Dunbar
2109f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AlwaysInline);
211af668b0e7d3581dea3b4f29a9262686e83887e5bDaniel Dunbar
212d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr {
213d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  std::string Aliasee;
214d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic:
215d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {}
216d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
217d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  const std::string& getAliasee() const { return Aliasee; }
218d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2199f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) AliasAttr(Aliasee); }
220d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2219f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
222d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const Attr *A) { return A->getKind() == Alias; }
223d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const AliasAttr *A) { return true; }
224d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes};
2253068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2263068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass ConstructorAttr : public Attr {
2273068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  int priority;
2283068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic:
2293068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  ConstructorAttr(int p) : Attr(Constructor), priority(p) {}
2306bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
2316bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  int getPriority() const { return priority; }
2323068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2339f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) ConstructorAttr(priority); }
2349f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2353068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  // Implement isa/cast/dyncast/etc.
2363068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const Attr *A) { return A->getKind() == Constructor; }
2373068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const ConstructorAttr *A) { return true; }
2383068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar};
23996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek
2403068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarclass DestructorAttr : public Attr {
2413068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  int priority;
2423068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbarpublic:
2433068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  DestructorAttr(int p) : Attr(Destructor), priority(p) {}
2446bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar
2456bfed7e411adc46eaf616371f85f68305c6e6257Daniel Dunbar  int getPriority() const { return priority; }
2463068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
2479f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) DestructorAttr(priority); }
2489f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2493068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  // Implement isa/cast/dyncast/etc.
2503068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const Attr *A) { return A->getKind() == Destructor; }
2513068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar  static bool classof(const DestructorAttr *A) { return true; }
2523068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar};
2533068ae0feb5d477477f45045f7ec9d0414fe57f3Daniel Dunbar
254cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattnerclass GNUInlineAttr : public Attr {
25526e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattnerpublic:
256cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner  GNUInlineAttr() : Attr(GNUInline) {}
2579f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2589f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) GNUInlineAttr; }
2599f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
26026e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner  // Implement isa/cast/dyncast/etc.
2619f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  static bool classof(const Attr *A) {
2629f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return A->getKind() == GNUInline;
2639f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
264cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner  static bool classof(const GNUInlineAttr *A) { return true; }
26526e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner};
26626e25545b26ec06f5d674dbae00fb168e6688d90Chris Lattner
26796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr {
26896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic:
26996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  IBOutletAttr() : Attr(IBOutletKind) {}
2709f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2719f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) IBOutletAttr; }
2729f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
27396329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  // Implement isa/cast/dyncast/etc.
27496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const Attr *A) {
27596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    return A->getKind() == IBOutletKind;
27696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  }
27796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const IBOutletAttr *A) { return true; }
27896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek};
279d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
2809f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoReturn);
2819f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(AnalyzerNoReturn);
2829f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Deprecated);
2837e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
28417f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarclass SectionAttr : public Attr {
28517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  std::string Name;
28617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbarpublic:
28717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  SectionAttr(const std::string &N) : Attr(Section), Name(N) {}
28817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar
28917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  const std::string& getName() const { return Name; }
2909f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
2919f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) SectionAttr(Name); }
2929f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
29317f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  // Implement isa/cast/dyncast/etc.
29417f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  static bool classof(const Attr *A) {
29517f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar    return A->getKind() == Section;
29617f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  }
29717f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar  static bool classof(const SectionAttr *A) { return true; }
29817f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar};
29917f194f4393a67fd28ad822c06d32b8cb99bad3fDaniel Dunbar
3009f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unavailable);
3019f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Unused);
3029f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Used);
3039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Weak);
3049f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WeakImport);
3059f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(NoThrow);
3069f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Const);
3079f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Pure);
308232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson
309eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekclass NonNullAttr : public Attr {
310eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned* ArgNums;
311eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned Size;
312eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekpublic:
31355b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek  NonNullAttr(unsigned* arg_nums = 0, unsigned size = 0) : Attr(NonNull),
31455b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek    ArgNums(0), Size(0) {
31555b0c192e1ce00513a000f4c98bed7da5cf152b8Ted Kremenek
3160db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    if (size == 0) return;
3170db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    assert(arg_nums);
3180db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    ArgNums = new unsigned[size];
3190db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    Size = size;
3200db29ece81d360dcefbe912339c34abe5917f6a9Chris Lattner    memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size);
321eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
322eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek
323eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  virtual ~NonNullAttr() {
324eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    delete [] ArgNums;
325eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
32668a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor
32768a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  typedef const unsigned *iterator;
32868a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  iterator begin() const { return ArgNums; }
32968a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  iterator end() const { return ArgNums + Size; }
33068a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor  unsigned size() const { return Size; }
33168a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor
332584def7364f51e35bfcaf5c3c64673096533addaTed Kremenek  bool isNonNull(unsigned arg) const {
333eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true;
334eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
3359f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
3369f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) NonNullAttr(ArgNums, Size); }
3379f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
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
3549f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
3559f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return ::new (C) FormatAttr(Type, formatIdx, firstArg);
3569f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
357ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3589f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
359ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Format; }
360ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const FormatAttr *A) { return true; }
361ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
362ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3635b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianclass SentinelAttr : public Attr {
3645b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int sentinel, NullPos;
3655b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanianpublic:
3665b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  SentinelAttr(int sentinel_val, int nullPos) : Attr(Sentinel),
3675b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian               sentinel(sentinel_val), NullPos(nullPos) {}
3685b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int getSentinel() const { return sentinel; }
3695b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  int getNullPos() const { return NullPos; }
3705b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
3715b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  virtual Attr *clone(ASTContext &C) const {
3725b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian    return ::new (C) SentinelAttr(sentinel, NullPos);
3735b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  }
3745b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
3755b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  // Implement isa/cast/dyncast/etc.
3765b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == Sentinel; }
3775b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian  static bool classof(const SentinelAttr *A) { return true; }
3785b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian};
3795b53005fb9ef24b8bdfe995f29b4662de468128aFariborz Jahanian
380ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr {
381ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
3824f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  /// @brief An enumeration for the kinds of visibility of symbols.
3834f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  enum VisibilityTypes {
3844f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    DefaultVisibility = 0,
3854f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    HiddenVisibility,
3864f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    ProtectedVisibility
3874f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  };
3884f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate:
3894f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes VisibilityType;
3904f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic:
3914f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityAttr(VisibilityTypes v) : Attr(Visibility),
392ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner                 VisibilityType(v) {}
393ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3944f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes getVisibility() const { return VisibilityType; }
395ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3969f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) VisibilityAttr(VisibilityType); }
397ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3989f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
399ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Visibility; }
400ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const VisibilityAttr *A) { return true; }
401ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
402ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
4039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(DLLImport);
4049f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(DLLExport);
4059f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(FastCall);
4069f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(StdCall);
4079f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(TransparentUnion);
4089f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCNSObject);
4099f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(ObjCException);
41027ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
411f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorclass OverloadableAttr : public Attr {
412f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregorpublic:
413f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  OverloadableAttr() : Attr(Overloadable) { }
414f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor
415ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor  virtual bool isMerged() const { return false; }
416ae17094c001972a5949944a0a77ef6adf2a92c8fDouglas Gregor
4170c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
4180c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor    return ::new (C) OverloadableAttr;
4190c74e8a4e8865ec9ebb8efc0af247a3c077236c4Douglas Gregor  }
4209f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
421f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  static bool classof(const Attr *A) { return A->getKind() == Overloadable; }
422f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor  static bool classof(const OverloadableAttr *) { return true; }
423f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor};
424f9201e0ff1779567150b70856753d9f2c6a91467Douglas Gregor
4259eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffclass BlocksAttr : public Attr {
4269eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic:
4279eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  enum BlocksAttrTypes {
4289eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff    ByRef = 0
4299eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  };
4309eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffprivate:
4319eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttrTypes BlocksAttrType;
4329eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroffpublic:
4339eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttr(BlocksAttrTypes t) : Attr(Blocks), BlocksAttrType(t) {}
4349eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4359eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  BlocksAttrTypes getType() const { return BlocksAttrType; }
4369eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4379f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) BlocksAttr(BlocksAttrType); }
4389eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
4399f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
4409eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff  static bool classof(const Attr *A) { return A->getKind() == Blocks; }
441fa23c1d9adc99c662c1c0e192817185809d95614Fariborz Jahanian  static bool classof(const BlocksAttr *A) { return true; }
4429eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff};
4439eae5761c0691c0f11d7a823b8ee54f05786cbbeSteve Naroff
444f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass FunctionDecl;
445f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
446f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonclass CleanupAttr : public Attr {
447f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  FunctionDecl *FD;
448f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
449f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlssonpublic:
450f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  CleanupAttr(FunctionDecl *fd) : Attr(Cleanup), FD(fd) {}
451f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
452f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  const FunctionDecl *getFunctionDecl() const { return FD; }
453f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4549f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const { return ::new (C) CleanupAttr(FD); }
455f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4569f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
457f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  static bool classof(const Attr *A) { return A->getKind() == Cleanup; }
458f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson  static bool classof(const CleanupAttr *A) { return true; }
459f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson};
460f6e35d0b9f1e9f1b4c5d3ef924415fa5e7c89849Anders Carlsson
4619f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Nodebug);
4629f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(WarnUnusedResult);
4639f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas GregorDEF_SIMPLE_ATTR(Noinline);
4645bab788d40026ad6e932a3cd9b86bc13f8a27661Anders Carlsson
465ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianclass RegparmAttr : public Attr {
46655d3aaf9a537888734762170823daf750ea9036dEli Friedman  unsigned NumParams;
46755d3aaf9a537888734762170823daf750ea9036dEli Friedman
468ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanianpublic:
46955d3aaf9a537888734762170823daf750ea9036dEli Friedman  RegparmAttr(unsigned np) : Attr(Regparm), NumParams(np) {}
47055d3aaf9a537888734762170823daf750ea9036dEli Friedman
4711102f4282ceb430dbc9fcedb9dd2ad25898a09e8Anton Korobeynikov  unsigned getNumParams() const { return NumParams; }
47255d3aaf9a537888734762170823daf750ea9036dEli Friedman
4739f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  virtual Attr *clone(ASTContext &C) const {
4749f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor    return ::new (C) RegparmAttr(NumParams);
4759f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  }
4769f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
4779f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor  // Implement isa/cast/dyncast/etc.
478ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian  static bool classof(const Attr *A) { return A->getKind() == Regparm; }
479ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian  static bool classof(const RegparmAttr *A) { return true; }
480ee760330a415635369556796a97afcfd6207f4dcFariborz Jahanian};
4810fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek
482b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek// Checker-specific attributes.
483b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(CFReturnsRetained);
484b71368d28532908ae1c2dc23f91761781205b3d0Ted KremenekDEF_SIMPLE_ATTR(NSReturnsRetained);
485b71368d28532908ae1c2dc23f91761781205b3d0Ted Kremenek
4860fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek#undef DEF_SIMPLE_ATTR
4870fc169e864aef7fc9a782e60b222a360f406704aTed Kremenek
488d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}  // end namespace clang
489d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
490d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif
491