Attr.h revision eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2
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>
19eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek#include <algorithm>
20adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlsson
21d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonnamespace clang {
22d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
23d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute.
24d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr {
25d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
26d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  enum Kind {
27d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes    Alias,
28d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    Aligned,
29c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman    Packed,
30aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek    Annotate,
31eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    NonNull,
327e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner    NoReturn,
33ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Deprecated,
34ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Weak,
35ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    DLLImport,
36ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    DLLExport,
37ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    NoThrow,
38ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner    Format,
39440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman    Visibility,
40440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman    FastCall,
4127ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes    StdCall,
4296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    TransparentUnion,
4396329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    IBOutletKind // Clang-specific.  Use "Kind" suffix to not conflict with
4496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek                 // the IBOutlet macro.
45d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  };
46d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
47d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate:
4881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *Next;
49d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind AttrKind;
50d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
51d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected:
52f78915fa196b3d284ad756f65eecadaefef71eefAnders Carlsson  Attr(Kind AK) : Next(0), AttrKind(AK) {}
53b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlssonpublic:
54d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  virtual ~Attr() {
5581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    delete Next;
56d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
57b0dd26825e58a5f2982fd6d4ffa4c4ae6e24ff17Anders Carlsson
58d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  Kind getKind() const { return AttrKind; }
59d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
6081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  Attr *getNext() { return Next; }
6181226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  const Attr *getNext() const { return Next; }
6281226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson  void setNext(Attr *next) { Next = next; }
63d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
64d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  void addAttr(Attr *attr) {
65d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    assert((attr != 0) && "addAttr(): attr is null");
6681226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
6781226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    // FIXME: This doesn't preserve the order in any way.
6881226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    attr->Next = Next;
6981226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson    Next = attr;
70d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
71d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
72d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
73d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *) { return true; }
74d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
75d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
76d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass PackedAttr : public Attr {
77d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonpublic:
78d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  PackedAttr() : Attr(Packed) {}
79d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
80d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  // Implement isa/cast/dyncast/etc.
81d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const Attr *A) {
82d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson    return A->getKind() == Packed;
83d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  }
84d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson  static bool classof(const PackedAttr *A) { return true; }
85d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson};
86042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
87042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonclass AlignedAttr : public Attr {
88042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned Alignment;
89042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlssonpublic:
90042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  AlignedAttr(unsigned alignment) : Attr(Aligned), Alignment(alignment) {}
91042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
92042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  unsigned getAlignment() const { return Alignment; }
93042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson
94042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  // Implement isa/cast/dyncast/etc.
95042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const Attr *A) {
96042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson    return A->getKind() == Aligned;
97042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  }
98042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson  static bool classof(const AlignedAttr *A) { return true; }
99042c4e7e9f0b54104f4f2e098c028aa8247b6bedAnders Carlsson};
10081226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson
101c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanclass AnnotateAttr : public Attr {
102c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  std::string Annotation;
103c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begemanpublic:
104c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {}
105c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
106c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  const std::string& getAnnotation() const { return Annotation; }
107c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
108c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  // Implement isa/cast/dyncast/etc.
109c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const Attr *A) {
110c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman    return A->getKind() == Annotate;
111c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  }
112c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman  static bool classof(const AnnotateAttr *A) { return true; }
113c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman};
114d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
115d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopesclass AliasAttr : public Attr {
116d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  std::string Aliasee;
117d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopespublic:
118d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  AliasAttr(const std::string &aliasee) : Attr(Alias), Aliasee(aliasee) {}
119d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
120d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  const std::string& getAliasee() const { return Aliasee; }
121d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
122d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  // Implement isa/cast/dyncast/etc.
123d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
124d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const Attr *A) { return A->getKind() == Alias; }
125d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes  static bool classof(const AliasAttr *A) { return true; }
126d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes};
12796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek
12896329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekclass IBOutletAttr : public Attr {
12996329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenekpublic:
13096329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  IBOutletAttr() : Attr(IBOutletKind) {}
13196329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek
13296329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  // Implement isa/cast/dyncast/etc.
13396329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const Attr *A) {
13496329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek    return A->getKind() == IBOutletKind;
13596329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  }
13696329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek  static bool classof(const IBOutletAttr *A) { return true; }
13796329d4e07a9bcddb5a927892b70408c8fd8c474Ted Kremenek};
138d4cbda6292b321c2e7dce7f039d92918fee99b3aNuno Lopes
139aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekclass NoReturnAttr : public Attr {
140aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenekpublic:
141aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  NoReturnAttr() : Attr(NoReturn) {}
142aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek
143aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  // Implement isa/cast/dyncast/etc.
144aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek
145aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  static bool classof(const Attr *A) { return A->getKind() == NoReturn; }
146aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek  static bool classof(const NoReturnAttr *A) { return true; }
147aecb38368546aa2cdb58d53bbcb3e8ad46365fc6Ted Kremenek};
148c398f0b5efb2f8ba39cd5b0170cf697f714afbcbNate Begeman
1497e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerclass DeprecatedAttr : public Attr {
1507e669b25144c7cfae0e51d4098016d6982504dbdChris Lattnerpublic:
1517e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  DeprecatedAttr() : Attr(Deprecated) {}
1527e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
1537e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  // Implement isa/cast/dyncast/etc.
1547e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
1557e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  static bool classof(const Attr *A) { return A->getKind() == Deprecated; }
1567e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner  static bool classof(const DeprecatedAttr *A) { return true; }
1577e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner};
1587e669b25144c7cfae0e51d4098016d6982504dbdChris Lattner
159ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass WeakAttr : public Attr {
160ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
161ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  WeakAttr() : Attr(Weak) {}
162ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
163ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
164ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
165ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Weak; }
166ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const WeakAttr *A) { return true; }
167ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
168ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
169ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass NoThrowAttr : public Attr {
170ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
171ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  NoThrowAttr() : Attr(NoThrow) {}
172ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
173ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
174ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
175ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == NoThrow; }
176ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const NoThrowAttr *A) { return true; }
177ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
178eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek
179eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekclass NonNullAttr : public Attr {
180eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned* ArgNums;
181eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  unsigned Size;
182eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenekpublic:
183eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  NonNullAttr(unsigned* arg_nums = 0, unsigned size = 0) : Attr(NonNull) {
184eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    if (size) {
185eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek      assert (arg_nums);
186eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek      ArgNums = new unsigned[size];
187eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek      Size = size;
188eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek      memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size);
189eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    }
190eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    else {
191eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek      ArgNums = 0;
192eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek      Size = 0;
193eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    }
194eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
195eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek
196eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  virtual ~NonNullAttr() {
197eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    delete [] ArgNums;
198eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
199eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek
200eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  bool isNonNull(unsigned arg) {
201eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek    return ArgNums ? std::binary_search(ArgNums, ArgNums+Size, arg) : true;
202eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek  }
203eb2b2a3f1898f146c6e153a64ec58ec5e1750bd2Ted Kremenek};
204ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
205ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass FormatAttr : public Attr {
206ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  std::string Type;
207ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int formatIdx, firstArg;
208ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
209ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  FormatAttr(const std::string &type, int idx, int first) : Attr(Format),
210ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner             Type(type), formatIdx(idx), firstArg(first) {}
211ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
212ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  const std::string& getType() const { return Type; }
213ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFormatIdx() const { return formatIdx; }
214ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int getFirstArg() const { return firstArg; }
215ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
216ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
217ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
218ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Format; }
219ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const FormatAttr *A) { return true; }
220ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
221ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
222ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass VisibilityAttr : public Attr {
223ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
2244f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  /// @brief An enumeration for the kinds of visibility of symbols.
2254f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  enum VisibilityTypes {
2264f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    DefaultVisibility = 0,
2274f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    HiddenVisibility,
2284f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman    ProtectedVisibility
2294f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  };
2304f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanprivate:
2314f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes VisibilityType;
2324f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohmanpublic:
2334f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityAttr(VisibilityTypes v) : Attr(Visibility),
234ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner                 VisibilityType(v) {}
235ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
2364f8d123e3e2c260de3377208106ddba87cee28b4Dan Gohman  VisibilityTypes getVisibility() const { return VisibilityType; }
237ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
238ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
239ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
240ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == Visibility; }
241ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const VisibilityAttr *A) { return true; }
242ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
243ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
244ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLImportAttr : public Attr {
245ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
246ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  DLLImportAttr() : Attr(DLLImport) {}
247ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
248ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
249ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
250ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == DLLImport; }
251ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const DLLImportAttr *A) { return true; }
252ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
253ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
254ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerclass DLLExportAttr : public Attr {
255ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerpublic:
256ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  DLLExportAttr() : Attr(DLLExport) {}
257ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
258ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // Implement isa/cast/dyncast/etc.
259ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
260ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const Attr *A) { return A->getKind() == DLLExport; }
261ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  static bool classof(const DLLExportAttr *A) { return true; }
262ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner};
263ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
264440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass FastCallAttr : public Attr {
265440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic:
266440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  FastCallAttr() : Attr(FastCall) {}
267440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
268440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  // Implement isa/cast/dyncast/etc.
269440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
270440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const Attr *A) { return A->getKind() == FastCall; }
271440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const FastCallAttr *A) { return true; }
272440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman};
273440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
274440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanclass StdCallAttr : public Attr {
275440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begemanpublic:
276440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  StdCallAttr() : Attr(StdCall) {}
277440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
278440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  // Implement isa/cast/dyncast/etc.
279440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
280440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const Attr *A) { return A->getKind() == StdCall; }
281440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman  static bool classof(const StdCallAttr *A) { return true; }
282440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman};
283440b456709526c4277e71d2e0ff49e5d88dc7b17Nate Begeman
28427ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopesclass TransparentUnionAttr : public Attr {
28527ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopespublic:
28627ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  TransparentUnionAttr() : Attr(TransparentUnion) {}
28727ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
28827ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  // Implement isa/cast/dyncast/etc.
28927ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
29027ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  static bool classof(const Attr *A) { return A->getKind() == TransparentUnion; }
29127ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes  static bool classof(const TransparentUnionAttr *A) { return true; }
29227ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes};
29327ae6c6531ac13e4b316e7e0e7b7c846b61a8d15Nuno Lopes
294d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}  // end namespace clang
295d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson
296d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif
297