Attr.h revision 96329d4e07a9bcddb5a927892b70408c8fd8c474
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>
18c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman#include <string>
19adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlsson
20d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonnamespace clang {
21d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
22d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute.
23d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr {
24d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
25d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  enum Kind {
26d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes    Alias,
27d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    Aligned,
28c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman    Packed,
29aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek    Annotate,
307e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner    NoReturn,
31ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Deprecated,
32ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Weak,
33ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    DLLImport,
34ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    DLLExport,
35ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    NoThrow,
36ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Format,
37440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman    Visibility,
38440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman    FastCall,
3927ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes    StdCall,
4096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    TransparentUnion,
4196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    IBOutletKind // Clang-specific.  Use "Kind" suffix to not conflict with
4296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek                 // the IBOutlet macro.
43d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  };
44d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
45d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate:
4681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *Next;
47d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind AttrKind;
48d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
49d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected:
50f78915fa196b3d284ad756f65eecadaefef71eefAnders Carlsson  Attr(Kind AK) : Next(0), AttrKind(AK) {}
51b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlssonpublic:
52d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  virtual ~Attr() {
5381226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    delete Next;
54d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
55b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson
56d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind getKind() const { return AttrKind; }
57d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
5881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *getNext() { return Next; }
5981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  const Attr *getNext() const { return Next; }
6081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  void setNext(Attr *next) { Next = next; }
61d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
62d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  void addAttr(Attr *attr) {
63d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    assert((attr != 0) && "addAttr(): attr is null");
6481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
6581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    // FIXME: This doesn't preserve the order in any way.
6681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    attr->Next = Next;
6781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    Next = attr;
68d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
69d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
70d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
71d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *) { return true; }
72d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
73d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
74d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass PackedAttr : public Attr {
75d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
76d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  PackedAttr() : Attr(Packed) {}
77d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
78d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
79d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *A) {
80d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    return A->getKind() == Packed;
81d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
82d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const PackedAttr *A) { return true; }
83d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
84042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
85042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr {
86042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned Alignment;
87042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic:
88042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {}
89042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
90042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned getAlignment() const { return Alignment; }
91042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
92042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  // Implement isa/cast/dyncast/etc.
93042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const Attr *A) {
94042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson    return A->getKind() == Aligned;
95042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  }
96042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const AlignedAttr *A) { return true; }
97042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson};
9881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
99c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr {
100c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  std::string Annotation;
101c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic:
102c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {}
103c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
104c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  const std::string& getAnnotation() const { return Annotation; }
105c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
106c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  // Implement isa/cast/dyncast/etc.
107c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const Attr *A) {
108c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman    return A->getKind() == Annotate;
109c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  }
110c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const AnnotateAttr *A) { return true; }
111c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman};
112d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
113d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr {
114d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  std::string Aliasee;
115d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic:
116d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {}
117d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
118d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  const std::string& getAliasee() const { return Aliasee; }
119d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
120d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  // Implement isa/cast/dyncast/etc.
121d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
122d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const Attr *A) { return A->getKind() == Alias; }
123d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const AliasAttr *A) { return true; }
124d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes};
12596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek
12696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr {
12796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic:
12896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  IBOutletAttr() : Attr(IBOutletKind) {}
12996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek
13096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  // Implement isa/cast/dyncast/etc.
13196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const Attr *A) {
13296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    return A->getKind() == IBOutletKind;
13396329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  }
13496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const IBOutletAttr *A) { return true; }
13596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek};
136d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
137aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekclass NoReturnAttr : public Attr {
138aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekpublic:
139aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  NoReturnAttr() : Attr(NoReturn) {}
140aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek
141aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  // Implement isa/cast/dyncast/etc.
142aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek
143aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  static bool classof(const Attr *A) { return A->getKind() == NoReturn; }
144aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  static bool classof(const NoReturnAttr *A) { return true; }
145aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek};
146c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
1477e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerclass DeprecatedAttr : public Attr {
1487e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerpublic:
1497e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  DeprecatedAttr() : Attr(Deprecated) {}
1507e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
1517e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  // Implement isa/cast/dyncast/etc.
1527e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
1537e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  static bool classof(const Attr *A) { return A->getKind() == Deprecated; }
1547e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  static bool classof(const DeprecatedAttr *A) { return true; }
1557e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner};
1567e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
157ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass WeakAttr : public Attr {
158ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
159ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  WeakAttr() : Attr(Weak) {}
160ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
161ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
162ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
163ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Weak; }
164ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const WeakAttr *A) { return true; }
165ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
166ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
167ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass NoThrowAttr : public Attr {
168ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
169ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  NoThrowAttr() : Attr(NoThrow) {}
170ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
171ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
172ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
173ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == NoThrow; }
174ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const NoThrowAttr *A) { return true; }
175ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
176ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
177ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass FormatAttr : public Attr {
178ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  std::string Type;
179ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int formatIdx, firstArg;
180ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
181ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  FormatAttr(const std::string &type, int idx, int first) : Attr(Format),
182ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner             Type(type), formatIdx(idx), firstArg(first) {}
183ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
184ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  const std::string& getType() const { return Type; }
185ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFormatIdx() const { return formatIdx; }
186ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFirstArg() const { return firstArg; }
187ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
188ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
189ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
190ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Format; }
191ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const FormatAttr *A) { return true; }
192ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
193ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
194ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr {
195ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
1964f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  /// @brief An enumeration for the kinds of visibility of symbols.
1974f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  enum VisibilityTypes {
1984f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    DefaultVisibility = 0,
1994f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    HiddenVisibility,
2004f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    ProtectedVisibility
2014f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  };
2024f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate:
2034f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes VisibilityType;
2044f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic:
2054f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityAttr(VisibilityTypes v) : Attr(Visibility),
206ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner                 VisibilityType(v) {}
207ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
2084f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes getVisibility() const { return VisibilityType; }
209ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
210ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
211ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
212ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Visibility; }
213ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const VisibilityAttr *A) { return true; }
214ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
215ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
216ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLImportAttr : public Attr {
217ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
218ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  DLLImportAttr() : Attr(DLLImport) {}
219ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
220ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
221ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
222ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == DLLImport; }
223ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const DLLImportAttr *A) { return true; }
224ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
225ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
226ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLExportAttr : public Attr {
227ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
228ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  DLLExportAttr() : Attr(DLLExport) {}
229ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
230ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
231ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
232ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == DLLExport; }
233ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const DLLExportAttr *A) { return true; }
234ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
235ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
236440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass FastCallAttr : public Attr {
237440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic:
238440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  FastCallAttr() : Attr(FastCall) {}
239440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
240440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  // Implement isa/cast/dyncast/etc.
241440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
242440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const Attr *A) { return A->getKind() == FastCall; }
243440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const FastCallAttr *A) { return true; }
244440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman};
245440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
246440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass StdCallAttr : public Attr {
247440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic:
248440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  StdCallAttr() : Attr(StdCall) {}
249440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
250440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  // Implement isa/cast/dyncast/etc.
251440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
252440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const Attr *A) { return A->getKind() == StdCall; }
253440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const StdCallAttr *A) { return true; }
254440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman};
255440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
25627ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopesclass TransparentUnionAttr : public Attr {
25727ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopespublic:
25827ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  TransparentUnionAttr() : Attr(TransparentUnion) {}
25927ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
26027ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  // Implement isa/cast/dyncast/etc.
26127ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
26227ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  static bool classof(const Attr *A) { return A->getKind() == TransparentUnion; }
26327ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  static bool classof(const TransparentUnionAttr *A) { return true; }
26427ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes};
26527ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
266d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}  // end namespace clang
267d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
268d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif
269