1245431Sdim//===--- Attr.h - Classes for representing attributes ----------*- C++ -*-===//
2193326Sed//
3193326Sed//                     The LLVM Compiler Infrastructure
4193326Sed//
5193326Sed// This file is distributed under the University of Illinois Open Source
6193326Sed// License. See LICENSE.TXT for details.
7193326Sed//
8193326Sed//===----------------------------------------------------------------------===//
9193326Sed//
10193326Sed//  This file defines the Attr interface and subclasses.
11193326Sed//
12193326Sed//===----------------------------------------------------------------------===//
13193326Sed
14193326Sed#ifndef LLVM_CLANG_AST_ATTR_H
15193326Sed#define LLVM_CLANG_AST_ATTR_H
16193326Sed
17252723Sdim#include "clang/AST/AttrIterator.h"
18263509Sdim#include "clang/AST/Decl.h"
19252723Sdim#include "clang/AST/Type.h"
20252723Sdim#include "clang/Basic/AttrKinds.h"
21226890Sdim#include "clang/Basic/LLVM.h"
22212904Sdim#include "clang/Basic/SourceLocation.h"
23221345Sdim#include "clang/Basic/VersionTuple.h"
24226890Sdim#include "llvm/ADT/SmallVector.h"
25226890Sdim#include "llvm/ADT/StringRef.h"
26226890Sdim#include "llvm/ADT/StringSwitch.h"
27226890Sdim#include "llvm/Support/ErrorHandling.h"
28235633Sdim#include "llvm/Support/raw_ostream.h"
29193326Sed#include <cassert>
30193326Sed#include <cstring>
31193326Sed
32193326Sednamespace clang {
33193326Sed  class ASTContext;
34208600Srdivacky  class IdentifierInfo;
35208600Srdivacky  class ObjCInterfaceDecl;
36210299Sed  class Expr;
37212904Sdim  class QualType;
38212904Sdim  class FunctionDecl;
39212904Sdim  class TypeSourceInfo;
40193326Sed
41193326Sed/// Attr - This represents one attribute.
42193326Sedclass Attr {
43193326Sedprivate:
44226890Sdim  SourceRange Range;
45212904Sdim  unsigned AttrKind : 16;
46218893Sdim
47218893Sdimprotected:
48252723Sdim  /// An index into the spelling list of an
49252723Sdim  /// attribute defined in Attr.td file.
50252723Sdim  unsigned SpellingListIndex : 4;
51252723Sdim
52193326Sed  bool Inherited : 1;
53193326Sed
54252723Sdim  bool IsPackExpansion : 1;
55252723Sdim
56212904Sdim  virtual ~Attr();
57252723Sdim
58193326Sed  void* operator new(size_t bytes) throw() {
59226890Sdim    llvm_unreachable("Attrs cannot be allocated with regular 'new'.");
60193326Sed  }
61193326Sed  void operator delete(void* data) throw() {
62226890Sdim    llvm_unreachable("Attrs cannot be released with regular 'delete'.");
63193326Sed  }
64198092Srdivacky
65212904Sdimpublic:
66212904Sdim  // Forward so that the regular new and delete do not hide global ones.
67212904Sdim  void* operator new(size_t Bytes, ASTContext &C,
68212904Sdim                     size_t Alignment = 16) throw() {
69212904Sdim    return ::operator new(Bytes, C, Alignment);
70212904Sdim  }
71212904Sdim  void operator delete(void *Ptr, ASTContext &C,
72212904Sdim                       size_t Alignment) throw() {
73212904Sdim    return ::operator delete(Ptr, C, Alignment);
74212904Sdim  }
75212904Sdim
76193326Sedprotected:
77252723Sdim  Attr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
78252723Sdim    : Range(R), AttrKind(AK), SpellingListIndex(SpellingListIndex),
79252723Sdim      Inherited(false), IsPackExpansion(false) {}
80212904Sdim
81193326Sedpublic:
82198092Srdivacky
83212904Sdim  attr::Kind getKind() const {
84212904Sdim    return static_cast<attr::Kind>(AttrKind);
85212904Sdim  }
86252723Sdim
87252723Sdim  unsigned getSpellingListIndex() const { return SpellingListIndex; }
88193326Sed
89226890Sdim  SourceLocation getLocation() const { return Range.getBegin(); }
90226890Sdim  SourceRange getRange() const { return Range; }
91226890Sdim  void setRange(SourceRange R) { Range = R; }
92193326Sed
93193326Sed  bool isInherited() const { return Inherited; }
94193326Sed
95252723Sdim  void setPackExpansion(bool PE) { IsPackExpansion = PE; }
96252723Sdim  bool isPackExpansion() const { return IsPackExpansion; }
97252723Sdim
98193326Sed  // Clone this attribute.
99252723Sdim  virtual Attr *clone(ASTContext &C) const = 0;
100193326Sed
101235633Sdim  virtual bool isLateParsed() const { return false; }
102235633Sdim
103235633Sdim  // Pretty print this attribute.
104252723Sdim  virtual void printPretty(raw_ostream &OS,
105245431Sdim                           const PrintingPolicy &Policy) const = 0;
106193326Sed};
107210299Sed
108218893Sdimclass InheritableAttr : public Attr {
109235633Sdim  virtual void anchor();
110218893Sdimprotected:
111252723Sdim  InheritableAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
112252723Sdim    : Attr(AK, R, SpellingListIndex) {}
113218893Sdim
114218893Sdimpublic:
115218893Sdim  void setInherited(bool I) { Inherited = I; }
116218893Sdim
117218893Sdim  // Implement isa/cast/dyncast/etc.
118218893Sdim  static bool classof(const Attr *A) {
119218893Sdim    return A->getKind() <= attr::LAST_INHERITABLE;
120218893Sdim  }
121218893Sdim};
122218893Sdim
123221345Sdimclass InheritableParamAttr : public InheritableAttr {
124235633Sdim  virtual void anchor();
125221345Sdimprotected:
126252723Sdim  InheritableParamAttr(attr::Kind AK, SourceRange R,
127252723Sdim                       unsigned SpellingListIndex = 0)
128252723Sdim    : InheritableAttr(AK, R, SpellingListIndex) {}
129221345Sdim
130221345Sdimpublic:
131221345Sdim  // Implement isa/cast/dyncast/etc.
132221345Sdim  static bool classof(const Attr *A) {
133252723Sdim    // Relies on relative order of enum emission with respect to MS inheritance
134252723Sdim    // attrs.
135221345Sdim    return A->getKind() <= attr::LAST_INHERITABLE_PARAM;
136221345Sdim  }
137221345Sdim};
138221345Sdim
139252723Sdimclass MSInheritanceAttr : public InheritableAttr {
140252723Sdim  virtual void anchor();
141252723Sdimprotected:
142252723Sdim  MSInheritanceAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
143252723Sdim    : InheritableAttr(AK, R, SpellingListIndex) {}
144193326Sed
145193326Sedpublic:
146252723Sdim  // Implement isa/cast/dyncast/etc.
147252723Sdim  static bool classof(const Attr *A) {
148252723Sdim    // Relies on relative order of enum emission with respect to param attrs.
149263509Sdim    return (A->getKind() <= attr::LAST_MS_INHERITANCE &&
150252723Sdim            A->getKind() > attr::LAST_INHERITABLE_PARAM);
151193326Sed  }
152193326Sed};
153193326Sed
154252723Sdim#include "clang/AST/Attrs.inc"
155193326Sed
156193326Sed}  // end namespace clang
157193326Sed
158193326Sed#endif
159