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