1801e60946bc879afeb37bcd3372e441e8f631c79James Dennett//===--- Attr.h - Classes for representing attributes ----------*- C++ -*-===// 2d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// 3d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// The LLVM Compiler Infrastructure 4d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// 5d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// This file is distributed under the University of Illinois Open Source 6d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// License. See LICENSE.TXT for details. 7d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// 8d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//===----------------------------------------------------------------------===// 9d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// 10d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// This file defines the Attr interface and subclasses. 11d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson// 12d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson//===----------------------------------------------------------------------===// 13d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 1481226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson#ifndef LLVM_CLANG_AST_ATTR_H 1581226601148d7e7c187b96c6ef86e83df204f59fAnders Carlsson#define LLVM_CLANG_AST_ATTR_H 16d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 172fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/AttrIterator.h" 18ddc2a53584f91b1fdcc466f1ea1345d97c428802Richard Smith#include "clang/AST/Decl.h" 19a8fb24fa3151567056f6125999cea69e39604f35Fariborz Jahanian#include "clang/AST/Type.h" 202fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/Basic/AttrKinds.h" 212fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/Basic/LLVM.h" 22cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt#include "clang/Basic/SourceLocation.h" 230a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor#include "clang/Basic/VersionTuple.h" 249594675cc1eb52a054de13c4a21e466643847480Chris Lattner#include "llvm/ADT/SmallVector.h" 259594675cc1eb52a054de13c4a21e466643847480Chris Lattner#include "llvm/ADT/StringRef.h" 269594675cc1eb52a054de13c4a21e466643847480Chris Lattner#include "llvm/ADT/StringSwitch.h" 279fe8c74a93ac8e92512615c5f83e7a328b3b0544David Blaikie#include "llvm/Support/ErrorHandling.h" 281bea8807bcd2be10bf6309a3a848489434464cedDouglas Gregor#include "llvm/Support/raw_ostream.h" 296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include <algorithm> 30baa66fc389ca0a9f11e0c864304bcfd89de39439Anders Carlsson#include <cassert> 31adf21bdb3d17acfdb74657fcbc5035a404c6c8f4Anders Carlsson 32d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonnamespace clang { 33cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner class ASTContext; 34857e918a8a40deb128840308a318bf623d68295fTed Kremenek class IdentifierInfo; 35857e918a8a40deb128840308a318bf623d68295fTed Kremenek class ObjCInterfaceDecl; 364ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth class Expr; 37a8fb24fa3151567056f6125999cea69e39604f35Fariborz Jahanian class QualType; 38cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt class FunctionDecl; 39cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt class TypeSourceInfo; 40d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 41d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson/// Attr - This represents one attribute. 42d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonclass Attr { 43d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprivate: 44ffcc3105d223899740e79f3f8199f3881df4d1deArgyrios Kyrtzidis SourceRange Range; 45cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt unsigned AttrKind : 16; 462f402708e62f89fb875442802e3d3f20fc909d33Anton Korobeynikov 47d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlssonprotected: 4851d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han /// An index into the spelling list of an 4951d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han /// attribute defined in Attr.td file. 5051d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han unsigned SpellingListIndex : 4; 51a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne bool Inherited : 1; 52f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith bool IsPackExpansion : 1; 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Implicit : 1; 54f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith 551de22a26c0e126b08edb2eda9d9091c021d96dc6Douglas Gregor virtual ~Attr(); 5651d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han 570b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner void* operator new(size_t bytes) throw() { 58b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Attrs cannot be allocated with regular 'new'."); 590b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner } 600b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner void operator delete(void* data) throw() { 61b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Attrs cannot be released with regular 'delete'."); 620b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner } 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Huntpublic: 65cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt // Forward so that the regular new and delete do not hide global ones. 66cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt void* operator new(size_t Bytes, ASTContext &C, 67cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt size_t Alignment = 16) throw() { 68cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt return ::operator new(Bytes, C, Alignment); 69cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt } 70cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt void operator delete(void *Ptr, ASTContext &C, 71a87cdc03f4014545a8440110c1f4f68701100576Eli Friedman size_t Alignment) throw() { 72cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt return ::operator delete(Ptr, C, Alignment); 73cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt } 74cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt 750b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnerprotected: 7651d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han Attr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0) 7751d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han : Range(R), AttrKind(AK), SpellingListIndex(SpellingListIndex), 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Inherited(false), IsPackExpansion(false), Implicit(false) {} 79cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt 80cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattnerpublic: 811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 82cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt attr::Kind getKind() const { 83cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt return static_cast<attr::Kind>(AttrKind); 84d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson } 8551d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han 8651d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han unsigned getSpellingListIndex() const { return SpellingListIndex; } 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual const char *getSpelling() const = 0; 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 89ffcc3105d223899740e79f3f8199f3881df4d1deArgyrios Kyrtzidis SourceLocation getLocation() const { return Range.getBegin(); } 90ffcc3105d223899740e79f3f8199f3881df4d1deArgyrios Kyrtzidis SourceRange getRange() const { return Range; } 91ffcc3105d223899740e79f3f8199f3881df4d1deArgyrios Kyrtzidis void setRange(SourceRange R) { Range = R; } 921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 93192e7f7e7f0493f7cdfda1d752e6de340d4e3ffePeter Collingbourne bool isInherited() const { return Inherited; } 94192e7f7e7f0493f7cdfda1d752e6de340d4e3ffePeter Collingbourne 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief Returns true if the attribute has been implicitly created instead 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// of explicitly written by the user. 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isImplicit() const { return Implicit; } 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setImplicit(bool I) { Implicit = I; } 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 100f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith void setPackExpansion(bool PE) { IsPackExpansion = PE; } 101f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith bool isPackExpansion() const { return IsPackExpansion; } 102f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith 1039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor // Clone this attribute. 104f6565a9f7318b1ca6ea9510003dde7b89696daabRichard Smith virtual Attr *clone(ASTContext &C) const = 0; 1059f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 10623323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins virtual bool isLateParsed() const { return false; } 10723323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 1081bea8807bcd2be10bf6309a3a848489434464cedDouglas Gregor // Pretty print this attribute. 109cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko virtual void printPretty(raw_ostream &OS, 1100dae729a69c4fccc38c97d5dd44f7b20bb20de1cRichard Smith const PrintingPolicy &Policy) const = 0; 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief By default, attributes cannot be duplicated when being merged; 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// however, an attribute can override this. Returns true if the attribute 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// can be duplicated when merging. 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual bool duplicatesAllowed() const { return false; } 116d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson}; 117387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt 118a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourneclass InheritableAttr : public Attr { 11999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 120a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourneprotected: 12151d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han InheritableAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0) 12251d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han : Attr(AK, R, SpellingListIndex) {} 123a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne 124a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbournepublic: 125a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne void setInherited(bool I) { Inherited = I; } 126a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne 127a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne // Implement isa/cast/dyncast/etc. 128a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne static bool classof(const Attr *A) { 129a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne return A->getKind() <= attr::LAST_INHERITABLE; 130a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne } 131a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne}; 132a97d70b7ea9633e8cbf976510d7a9ea66f4ac96cPeter Collingbourne 133eca5d22c16eb784e5f35ca816fa22e0c0e060417John McCallclass InheritableParamAttr : public InheritableAttr { 134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void anchor() override; 135eca5d22c16eb784e5f35ca816fa22e0c0e060417John McCallprotected: 13651d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han InheritableParamAttr(attr::Kind AK, SourceRange R, 13751d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han unsigned SpellingListIndex = 0) 13851d8c52ad36129760eaa586f85176037e2cd0d0eMichael Han : InheritableAttr(AK, R, SpellingListIndex) {} 139eca5d22c16eb784e5f35ca816fa22e0c0e060417John McCall 140eca5d22c16eb784e5f35ca816fa22e0c0e060417John McCallpublic: 141eca5d22c16eb784e5f35ca816fa22e0c0e060417John McCall // Implement isa/cast/dyncast/etc. 142eca5d22c16eb784e5f35ca816fa22e0c0e060417John McCall static bool classof(const Attr *A) { 143852e3d7143cda1cdf6771c17559d38822cc296b3Reid Kleckner // Relies on relative order of enum emission with respect to MS inheritance 144852e3d7143cda1cdf6771c17559d38822cc296b3Reid Kleckner // attrs. 145eca5d22c16eb784e5f35ca816fa22e0c0e060417John McCall return A->getKind() <= attr::LAST_INHERITABLE_PARAM; 146eca5d22c16eb784e5f35ca816fa22e0c0e060417John McCall } 147eca5d22c16eb784e5f35ca816fa22e0c0e060417John McCall}; 148eca5d22c16eb784e5f35ca816fa22e0c0e060417John McCall 149387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt#include "clang/AST/Attrs.inc" 1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Attr *At) { 153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DB.AddTaggedVal(reinterpret_cast<intptr_t>(At), 154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagnosticsEngine::ak_attr); 155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return DB; 156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesinline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, 159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Attr *At) { 160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PD.AddTaggedVal(reinterpret_cast<intptr_t>(At), 161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagnosticsEngine::ak_attr); 162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return PD; 163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 164d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson} // end namespace clang 165d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson 166d429cd459aef723fa0e7a44ac957d4c2256e241cAnders Carlsson#endif 167