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