Attr.h revision d4cbda6292b321c2e7dce7f039d92918fee99b3a
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,
4027ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes    TransparentUnion
41d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  };
42d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
43d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate:
4481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *Next;
45d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind AttrKind;
46d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
47d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected:
48f78915fa196b3d284ad756f65eecadaefef71eefAnders Carlsson  Attr(Kind AK) : Next(0), AttrKind(AK) {}
49b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlssonpublic:
50d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  virtual ~Attr() {
5181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    delete Next;
52d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
53b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson
54d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind getKind() const { return AttrKind; }
55d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
5681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *getNext() { return Next; }
5781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  const Attr *getNext() const { return Next; }
5881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  void setNext(Attr *next) { Next = next; }
59d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
60d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  void addAttr(Attr *attr) {
61d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    assert((attr != 0) && "addAttr(): attr is null");
6281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
6381226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    // FIXME: This doesn't preserve the order in any way.
6481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    attr->Next = Next;
6581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    Next = attr;
66d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
67d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
68d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
69d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *) { return true; }
70d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
71d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
72d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass PackedAttr : public Attr {
73d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
74d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  PackedAttr() : Attr(Packed) {}
75d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
76d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
77d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *A) {
78d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    return A->getKind() == Packed;
79d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
80d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const PackedAttr *A) { return true; }
81d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
82042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
83042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr {
84042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned Alignment;
85042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic:
86042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {}
87042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
88042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned getAlignment() const { return Alignment; }
89042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
90042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  // Implement isa/cast/dyncast/etc.
91042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const Attr *A) {
92042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson    return A->getKind() == Aligned;
93042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  }
94042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const AlignedAttr *A) { return true; }
95042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson};
9681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
97c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr {
98c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  std::string Annotation;
99c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic:
100c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {}
101c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
102c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  const std::string& getAnnotation() const { return Annotation; }
103c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
104c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  // Implement isa/cast/dyncast/etc.
105c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const Attr *A) {
106c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman    return A->getKind() == Annotate;
107c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  }
108c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const AnnotateAttr *A) { return true; }
109c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman};
110d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
111d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr {
112d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  std::string Aliasee;
113d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic:
114d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {}
115d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
116d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  const std::string& getAliasee() const { return Aliasee; }
117d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
118d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  // Implement isa/cast/dyncast/etc.
119d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
120d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const Attr *A) { return A->getKind() == Alias; }
121d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const AliasAttr *A) { return true; }
122d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes};
123d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
124aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekclass NoReturnAttr : public Attr {
125aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekpublic:
126aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  NoReturnAttr() : Attr(NoReturn) {}
127aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek
128aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  // Implement isa/cast/dyncast/etc.
129aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek
130aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  static bool classof(const Attr *A) { return A->getKind() == NoReturn; }
131aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  static bool classof(const NoReturnAttr *A) { return true; }
132aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek};
133c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
1347e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerclass DeprecatedAttr : public Attr {
1357e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerpublic:
1367e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  DeprecatedAttr() : Attr(Deprecated) {}
1377e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
1387e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  // Implement isa/cast/dyncast/etc.
1397e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
1407e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  static bool classof(const Attr *A) { return A->getKind() == Deprecated; }
1417e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  static bool classof(const DeprecatedAttr *A) { return true; }
1427e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner};
1437e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
144ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass WeakAttr : public Attr {
145ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
146ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  WeakAttr() : Attr(Weak) {}
147ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
148ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
149ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
150ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Weak; }
151ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const WeakAttr *A) { return true; }
152ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
153ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
154ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass NoThrowAttr : public Attr {
155ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
156ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  NoThrowAttr() : Attr(NoThrow) {}
157ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
158ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
159ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
160ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == NoThrow; }
161ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const NoThrowAttr *A) { return true; }
162ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
163ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
164ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass FormatAttr : public Attr {
165ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  std::string Type;
166ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int formatIdx, firstArg;
167ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
168ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  FormatAttr(const std::string &type, int idx, int first) : Attr(Format),
169ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner             Type(type), formatIdx(idx), firstArg(first) {}
170ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
171ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  const std::string& getType() const { return Type; }
172ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFormatIdx() const { return formatIdx; }
173ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFirstArg() const { return firstArg; }
174ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
175ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
176ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
177ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Format; }
178ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const FormatAttr *A) { return true; }
179ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
180ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
181ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr {
182ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
1834f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  /// @brief An enumeration for the kinds of visibility of symbols.
1844f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  enum VisibilityTypes {
1854f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    DefaultVisibility = 0,
1864f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    HiddenVisibility,
1874f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    ProtectedVisibility
1884f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  };
1894f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate:
1904f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes VisibilityType;
1914f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic:
1924f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityAttr(VisibilityTypes v) : Attr(Visibility),
193ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner                 VisibilityType(v) {}
194ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
1954f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes getVisibility() const { return VisibilityType; }
196ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
197ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
198ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
199ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Visibility; }
200ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const VisibilityAttr *A) { return true; }
201ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
202ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
203ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLImportAttr : public Attr {
204ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
205ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  DLLImportAttr() : Attr(DLLImport) {}
206ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
207ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
208ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
209ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == DLLImport; }
210ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const DLLImportAttr *A) { return true; }
211ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
212ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
213ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLExportAttr : public Attr {
214ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
215ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  DLLExportAttr() : Attr(DLLExport) {}
216ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
217ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
218ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
219ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == DLLExport; }
220ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const DLLExportAttr *A) { return true; }
221ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
222ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
223440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass FastCallAttr : public Attr {
224440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic:
225440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  FastCallAttr() : Attr(FastCall) {}
226440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
227440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  // Implement isa/cast/dyncast/etc.
228440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
229440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const Attr *A) { return A->getKind() == FastCall; }
230440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const FastCallAttr *A) { return true; }
231440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman};
232440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
233440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass StdCallAttr : public Attr {
234440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic:
235440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  StdCallAttr() : Attr(StdCall) {}
236440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
237440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  // Implement isa/cast/dyncast/etc.
238440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
239440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const Attr *A) { return A->getKind() == StdCall; }
240440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const StdCallAttr *A) { return true; }
241440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman};
242440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
24327ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopesclass TransparentUnionAttr : public Attr {
24427ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopespublic:
24527ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  TransparentUnionAttr() : Attr(TransparentUnion) {}
24627ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
24727ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  // Implement isa/cast/dyncast/etc.
24827ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
24927ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  static bool classof(const Attr *A) { return A->getKind() == TransparentUnion; }
25027ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  static bool classof(const TransparentUnionAttr *A) { return true; }
25127ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes};
25227ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
253d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}  // end namespace clang
254d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
255d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif
256