1239462Sdim//===--- 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
17249423Sdim#include "clang/AST/AttrIterator.h"
18263508Sdim#include "clang/AST/Decl.h"
19249423Sdim#include "clang/AST/Type.h"
20249423Sdim#include "clang/Basic/AttrKinds.h"
21226633Sdim#include "clang/Basic/LLVM.h"
22212904Sdim#include "clang/Basic/SourceLocation.h"
23221345Sdim#include "clang/Basic/VersionTuple.h"
24226633Sdim#include "llvm/ADT/SmallVector.h"
25226633Sdim#include "llvm/ADT/StringRef.h"
26226633Sdim#include "llvm/ADT/StringSwitch.h"
27226633Sdim#include "llvm/Support/ErrorHandling.h"
28234353Sdim#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:
44226633Sdim  SourceRange Range;
45212904Sdim  unsigned AttrKind : 16;
46218893Sdim
47218893Sdimprotected:
48249423Sdim  /// An index into the spelling list of an
49249423Sdim  /// attribute defined in Attr.td file.
50249423Sdim  unsigned SpellingListIndex : 4;
51249423Sdim
52193326Sed  bool Inherited : 1;
53193326Sed
54249423Sdim  bool IsPackExpansion : 1;
55249423Sdim
56212904Sdim  virtual ~Attr();
57249423Sdim
58193326Sed  void* operator new(size_t bytes) throw() {
59226633Sdim    llvm_unreachable("Attrs cannot be allocated with regular 'new'.");
60193326Sed  }
61193326Sed  void operator delete(void* data) throw() {
62226633Sdim    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:
77249423Sdim  Attr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
78249423Sdim    : Range(R), AttrKind(AK), SpellingListIndex(SpellingListIndex),
79249423Sdim      Inherited(false), IsPackExpansion(false) {}
80212904Sdim
81193326Sedpublic:
82198092Srdivacky
83212904Sdim  attr::Kind getKind() const {
84212904Sdim    return static_cast<attr::Kind>(AttrKind);
85212904Sdim  }
86249423Sdim
87249423Sdim  unsigned getSpellingListIndex() const { return SpellingListIndex; }
88193326Sed
89226633Sdim  SourceLocation getLocation() const { return Range.getBegin(); }
90226633Sdim  SourceRange getRange() const { return Range; }
91226633Sdim  void setRange(SourceRange R) { Range = R; }
92193326Sed
93193326Sed  bool isInherited() const { return Inherited; }
94193326Sed
95249423Sdim  void setPackExpansion(bool PE) { IsPackExpansion = PE; }
96249423Sdim  bool isPackExpansion() const { return IsPackExpansion; }
97249423Sdim
98193326Sed  // Clone this attribute.
99249423Sdim  virtual Attr *clone(ASTContext &C) const = 0;
100193326Sed
101234353Sdim  virtual bool isLateParsed() const { return false; }
102234353Sdim
103234353Sdim  // Pretty print this attribute.
104249423Sdim  virtual void printPretty(raw_ostream &OS,
105239462Sdim                           const PrintingPolicy &Policy) const = 0;
106193326Sed};
107210299Sed
108218893Sdimclass InheritableAttr : public Attr {
109234353Sdim  virtual void anchor();
110218893Sdimprotected:
111249423Sdim  InheritableAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
112249423Sdim    : 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 {
124234353Sdim  virtual void anchor();
125221345Sdimprotected:
126249423Sdim  InheritableParamAttr(attr::Kind AK, SourceRange R,
127249423Sdim                       unsigned SpellingListIndex = 0)
128249423Sdim    : InheritableAttr(AK, R, SpellingListIndex) {}
129221345Sdim
130221345Sdimpublic:
131221345Sdim  // Implement isa/cast/dyncast/etc.
132221345Sdim  static bool classof(const Attr *A) {
133249423Sdim    // Relies on relative order of enum emission with respect to MS inheritance
134249423Sdim    // attrs.
135221345Sdim    return A->getKind() <= attr::LAST_INHERITABLE_PARAM;
136221345Sdim  }
137221345Sdim};
138221345Sdim
139249423Sdimclass MSInheritanceAttr : public InheritableAttr {
140249423Sdim  virtual void anchor();
141249423Sdimprotected:
142249423Sdim  MSInheritanceAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
143249423Sdim    : InheritableAttr(AK, R, SpellingListIndex) {}
144193326Sed
145193326Sedpublic:
146249423Sdim  // Implement isa/cast/dyncast/etc.
147249423Sdim  static bool classof(const Attr *A) {
148249423Sdim    // Relies on relative order of enum emission with respect to param attrs.
149263508Sdim    return (A->getKind() <= attr::LAST_MS_INHERITANCE &&
150249423Sdim            A->getKind() > attr::LAST_INHERITABLE_PARAM);
151193326Sed  }
152193326Sed};
153193326Sed
154249423Sdim#include "clang/AST/Attrs.inc"
155193326Sed
156193326Sed}  // end namespace clang
157193326Sed
158193326Sed#endif
159