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