Attr.h revision ddc2a53584f91b1fdcc466f1ea1345d97c428802
1//===--- Attr.h - Classes for representing attributes ----------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file defines the Attr interface and subclasses.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_AST_ATTR_H
15#define LLVM_CLANG_AST_ATTR_H
16
17#include "clang/AST/AttrIterator.h"
18#include "clang/AST/Decl.h"
19#include "clang/AST/Type.h"
20#include "clang/Basic/AttrKinds.h"
21#include "clang/Basic/LLVM.h"
22#include "clang/Basic/SourceLocation.h"
23#include "clang/Basic/VersionTuple.h"
24#include "llvm/ADT/SmallVector.h"
25#include "llvm/ADT/StringRef.h"
26#include "llvm/ADT/StringSwitch.h"
27#include "llvm/Support/ErrorHandling.h"
28#include "llvm/Support/raw_ostream.h"
29#include <cassert>
30#include <cstring>
31
32namespace clang {
33  class ASTContext;
34  class IdentifierInfo;
35  class ObjCInterfaceDecl;
36  class Expr;
37  class QualType;
38  class FunctionDecl;
39  class TypeSourceInfo;
40
41/// Attr - This represents one attribute.
42class Attr {
43private:
44  SourceRange Range;
45  unsigned AttrKind : 16;
46
47protected:
48  /// An index into the spelling list of an
49  /// attribute defined in Attr.td file.
50  unsigned SpellingListIndex : 4;
51
52  bool Inherited : 1;
53
54  bool IsPackExpansion : 1;
55
56  virtual ~Attr();
57
58  void* operator new(size_t bytes) throw() {
59    llvm_unreachable("Attrs cannot be allocated with regular 'new'.");
60  }
61  void operator delete(void* data) throw() {
62    llvm_unreachable("Attrs cannot be released with regular 'delete'.");
63  }
64
65public:
66  // Forward so that the regular new and delete do not hide global ones.
67  void* operator new(size_t Bytes, ASTContext &C,
68                     size_t Alignment = 16) throw() {
69    return ::operator new(Bytes, C, Alignment);
70  }
71  void operator delete(void *Ptr, ASTContext &C,
72                       size_t Alignment) throw() {
73    return ::operator delete(Ptr, C, Alignment);
74  }
75
76protected:
77  Attr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
78    : Range(R), AttrKind(AK), SpellingListIndex(SpellingListIndex),
79      Inherited(false), IsPackExpansion(false) {}
80
81public:
82
83  attr::Kind getKind() const {
84    return static_cast<attr::Kind>(AttrKind);
85  }
86
87  unsigned getSpellingListIndex() const { return SpellingListIndex; }
88
89  SourceLocation getLocation() const { return Range.getBegin(); }
90  SourceRange getRange() const { return Range; }
91  void setRange(SourceRange R) { Range = R; }
92
93  bool isInherited() const { return Inherited; }
94
95  void setPackExpansion(bool PE) { IsPackExpansion = PE; }
96  bool isPackExpansion() const { return IsPackExpansion; }
97
98  // Clone this attribute.
99  virtual Attr *clone(ASTContext &C) const = 0;
100
101  virtual bool isLateParsed() const { return false; }
102
103  // Pretty print this attribute.
104  virtual void printPretty(raw_ostream &OS,
105                           const PrintingPolicy &Policy) const = 0;
106};
107
108class InheritableAttr : public Attr {
109  virtual void anchor();
110protected:
111  InheritableAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
112    : Attr(AK, R, SpellingListIndex) {}
113
114public:
115  void setInherited(bool I) { Inherited = I; }
116
117  // Implement isa/cast/dyncast/etc.
118  static bool classof(const Attr *A) {
119    return A->getKind() <= attr::LAST_INHERITABLE;
120  }
121};
122
123class InheritableParamAttr : public InheritableAttr {
124  virtual void anchor();
125protected:
126  InheritableParamAttr(attr::Kind AK, SourceRange R,
127                       unsigned SpellingListIndex = 0)
128    : InheritableAttr(AK, R, SpellingListIndex) {}
129
130public:
131  // Implement isa/cast/dyncast/etc.
132  static bool classof(const Attr *A) {
133    // Relies on relative order of enum emission with respect to MS inheritance
134    // attrs.
135    return A->getKind() <= attr::LAST_INHERITABLE_PARAM;
136  }
137};
138
139class MSInheritanceAttr : public InheritableAttr {
140  virtual void anchor();
141protected:
142  MSInheritanceAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
143    : InheritableAttr(AK, R, SpellingListIndex) {}
144
145public:
146  // Implement isa/cast/dyncast/etc.
147  static bool classof(const Attr *A) {
148    // Relies on relative order of enum emission with respect to param attrs.
149    return (A->getKind() <= attr::LAST_MS_INHERITANCE &&
150            A->getKind() > attr::LAST_INHERITABLE_PARAM);
151  }
152};
153
154#include "clang/AST/Attrs.inc"
155
156}  // end namespace clang
157
158#endif
159