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