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