15208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//===--- Attr.h - Classes for representing attributes ----------*- C++ -*-===//
25208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//
35208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//                     The LLVM Compiler Infrastructure
45208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//
55208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// This file is distributed under the University of Illinois Open Source
65208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI// License. See LICENSE.TXT for details.
75208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//
85208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//===----------------------------------------------------------------------===//
95208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//
105208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//  This file defines the Attr interface and subclasses.
115208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//
125208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI//===----------------------------------------------------------------------===//
135208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI
145208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#ifndef LLVM_CLANG_AST_ATTR_H
155208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#define LLVM_CLANG_AST_ATTR_H
165208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI
175208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#include "clang/AST/AttrIterator.h"
185208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#include "clang/AST/Decl.h"
193dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#include "clang/AST/Type.h"
200b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include "clang/Basic/AttrKinds.h"
2104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI#include "clang/Basic/LLVM.h"
22aafd269675fc45bac6340027c866ea6073643c3bJan Engelhardt#include "clang/Basic/SourceLocation.h"
23cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt#include "clang/Basic/VersionTuple.h"
243dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#include "llvm/ADT/SmallVector.h"
253dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#include "llvm/ADT/StringRef.h"
260b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include "llvm/ADT/StringSwitch.h"
270b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include "llvm/Support/ErrorHandling.h"
280d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#include "llvm/Support/raw_ostream.h"
290b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include <algorithm>
300b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include <cassert>
310b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI
3208b1616e068166e016b3ee7110db10ae5d853422Jan Engelhardtnamespace clang {
333dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI  class ASTContext;
345208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI  class IdentifierInfo;
354e41854423b529d3107c23b85434d50a75d08057Jan Engelhardt  class ObjCInterfaceDecl;
3677f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  class Expr;
3777f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  class QualType;
38ef18e8147903885708d1c264904129af4fb636d6Jan Engelhardt  class FunctionDecl;
393dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI  class TypeSourceInfo;
405a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysinger
415a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysinger/// Attr - This represents one attribute.
425a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysingerclass Attr {
43c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardtprivate:
44c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt  SourceRange Range;
45c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt  unsigned AttrKind : 16;
46c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt
47c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardtprotected:
48c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt  /// An index into the spelling list of an
49c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt  /// attribute defined in Attr.td file.
50c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt  unsigned SpellingListIndex : 4;
5170581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  bool Inherited : 1;
52c31870f9bebb3d4d082016fcfaf8c2177ae32eb2Jan Engelhardt  bool IsPackExpansion : 1;
535a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysinger  bool Implicit : 1;
540d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
550d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI  virtual ~Attr();
560b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI
570b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI  void* operator new(size_t bytes) throw() {
580b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI    llvm_unreachable("Attrs cannot be allocated with regular 'new'.");
590b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI  }
608b7baebc93989106fd5d26b262d0ce191f8ef7c0Jamal Hadi Salim  void operator delete(void* data) throw() {
618b7baebc93989106fd5d26b262d0ce191f8ef7c0Jamal Hadi Salim    llvm_unreachable("Attrs cannot be released with regular 'delete'.");
6240a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim  }
6340a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim
648b7baebc93989106fd5d26b262d0ce191f8ef7c0Jamal Hadi Salimpublic:
6540a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim  // Forward so that the regular new and delete do not hide global ones.
6640a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim  void* operator new(size_t Bytes, ASTContext &C,
6740a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim                     size_t Alignment = 16) throw() {
6840a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim    return ::operator new(Bytes, C, Alignment);
6940a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim  }
7040a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim  void operator delete(void *Ptr, ASTContext &C,
7140a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim                       size_t Alignment) throw() {
7240a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim    return ::operator delete(Ptr, C, Alignment);
7340a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim  }
7440a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salim
7540a8343d3ad0cdbc3a7e69c8d970ad75807c29edJamal Hadi Salimprotected:
768b7baebc93989106fd5d26b262d0ce191f8ef7c0Jamal Hadi Salim  Attr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
77139b3fe4bd5121501e60fe07963ea527d7f0bd36Jamal Hadi Salim    : Range(R), AttrKind(AK), SpellingListIndex(SpellingListIndex),
7884c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim      Inherited(false), IsPackExpansion(false), Implicit(false) {}
79139b3fe4bd5121501e60fe07963ea527d7f0bd36Jamal Hadi Salim
80139b3fe4bd5121501e60fe07963ea527d7f0bd36Jamal Hadi Salimpublic:
81139b3fe4bd5121501e60fe07963ea527d7f0bd36Jamal Hadi Salim
8284c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim  attr::Kind getKind() const {
8384c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim    return static_cast<attr::Kind>(AttrKind);
8484c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim  }
8584c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim
8684c3055bf08d0a8fe5db6e5f3f96dd826a290147Jamal Hadi Salim  unsigned getSpellingListIndex() const { return SpellingListIndex; }
8770581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  virtual const char *getSpelling() const = 0;
8870581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim
8970581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  SourceLocation getLocation() const { return Range.getBegin(); }
9070581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  SourceRange getRange() const { return Range; }
9170581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  void setRange(SourceRange R) { Range = R; }
9270581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim
9370581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  bool isInherited() const { return Inherited; }
9470581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim
9570581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  /// \brief Returns true if the attribute has been implicitly created instead
9670581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  /// of explicitly written by the user.
9770581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  bool isImplicit() const { return Implicit; }
9870581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  void setImplicit(bool I) { Implicit = I; }
9970581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim
100bddcb92d1f0f76d21c4469b1667c8199c9fab126Jan Engelhardt  void setPackExpansion(bool PE) { IsPackExpansion = PE; }
10170581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  bool isPackExpansion() const { return IsPackExpansion; }
10270581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim
10370581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  // Clone this attribute.
10470581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  virtual Attr *clone(ASTContext &C) const = 0;
10570581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim
10670581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  virtual bool isLateParsed() const { return false; }
10770581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim
10870581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  // Pretty print this attribute.
10970581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  virtual void printPretty(raw_ostream &OS,
11070581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim                           const PrintingPolicy &Policy) const = 0;
11170581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim
11270581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  /// \brief By default, attributes cannot be duplicated when being merged;
11370581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  /// however, an attribute can override this. Returns true if the attribute
11470581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  /// can be duplicated when merging.
11570581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim  virtual bool duplicatesAllowed() const { return false; }
11670581922f873a88306dd5b1cb83c5081ee239eb8Jamal Hadi Salim};
117853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salim
118853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salimclass InheritableAttr : public Attr {
119853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salim  virtual void anchor();
120853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salimprotected:
121853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salim  InheritableAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex = 0)
122853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salim    : Attr(AK, R, SpellingListIndex) {}
123853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salim
124853322131026d62df3f8d77d67e5c63be496303cJamal Hadi Salimpublic:
125dacafa55379fd98212031d8c559096c91d7ce93bJan Engelhardt  void setInherited(bool I) { Inherited = I; }
12677f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt
12777f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  // Implement isa/cast/dyncast/etc.
12877f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  static bool classof(const Attr *A) {
12977f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt    return A->getKind() <= attr::LAST_INHERITABLE;
13077f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  }
13177f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt};
13277f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt
13377f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardtclass InheritableParamAttr : public InheritableAttr {
13477f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  void anchor() override;
13577f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardtprotected:
13677f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  InheritableParamAttr(attr::Kind AK, SourceRange R,
13777f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt                       unsigned SpellingListIndex = 0)
13877f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt    : InheritableAttr(AK, R, SpellingListIndex) {}
13977f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt
14077f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardtpublic:
14177f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  // Implement isa/cast/dyncast/etc.
14277f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  static bool classof(const Attr *A) {
14377f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt    // Relies on relative order of enum emission with respect to MS inheritance
14477f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt    // attrs.
14577f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt    return A->getKind() <= attr::LAST_INHERITABLE_PARAM;
14677f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  }
14777f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt};
14877f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt
14977f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt#include "clang/AST/Attrs.inc"
15077f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt
15177f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardtinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
15277f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt                                           const Attr *At) {
15377f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  DB.AddTaggedVal(reinterpret_cast<intptr_t>(At),
15477f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt                  DiagnosticsEngine::ak_attr);
15577f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  return DB;
15677f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt}
15777f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt
15877f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardtinline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD,
15977f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt                                           const Attr *At) {
16077f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  PD.AddTaggedVal(reinterpret_cast<intptr_t>(At),
16177f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt                  DiagnosticsEngine::ak_attr);
16277f48c2f1ef21fa43aa68c25a1457db319ca2526Jan Engelhardt  return PD;
16339bf9c8214d3073a496a8a1eff91046a8d6fbbdfJan Engelhardt}
16439bf9c8214d3073a496a8a1eff91046a8d6fbbdfJan Engelhardt}  // end namespace clang
1650d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
1660b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#endif
167c021c3ce7b1583eb5dd71b10ac3d8ab3cd36beaaJan Engelhardt