1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===--- Attr.h - Classes for representing attributes ----------*- C++ -*-===//
2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//                     The LLVM Compiler Infrastructure
4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source
6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details.
7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===//
9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//  This file defines the Attr interface and subclasses.
11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===//
13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_CLANG_AST_ATTR_H
15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_CLANG_AST_ATTR_H
16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/AST/AttrIterator.h"
18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/AST/Decl.h"
19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/AST/Expr.h"
20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/AST/Type.h"
21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/AttrKinds.h"
22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/LLVM.h"
23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/OpenMPKinds.h"
24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/Sanitizers.h"
25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/SourceLocation.h"
26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/VersionTuple.h"
27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/StringSwitch.h"
28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/ErrorHandling.h"
29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/raw_ostream.h"
30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <algorithm>
31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <cassert>
32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace clang {
34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  class ASTContext;
35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  class IdentifierInfo;
36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  class ObjCInterfaceDecl;
37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  class Expr;
38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  class QualType;
39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  class FunctionDecl;
40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  class TypeSourceInfo;
41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Attr - This represents one attribute.
43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass Attr {
44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate:
45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SourceRange Range;
46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned AttrKind : 16;
47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected:
49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// An index into the spelling list of an
50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// attribute defined in Attr.td file.
51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned SpellingListIndex : 4;
52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned Inherited : 1;
53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned IsPackExpansion : 1;
54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned Implicit : 1;
55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned IsLateParsed : 1;
56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned DuplicatesAllowed : 1;
57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void *operator new(size_t bytes) noexcept {
59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("Attrs cannot be allocated with regular 'new'.");
60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void operator delete(void *data) noexcept {
62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    llvm_unreachable("Attrs cannot be released with regular 'delete'.");
63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // Forward so that the regular new and delete do not hide global ones.
67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void *operator new(size_t Bytes, ASTContext &C,
68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                     size_t Alignment = 8) noexcept {
69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return ::operator new(Bytes, C, Alignment);
70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void operator delete(void *Ptr, ASTContext &C, size_t Alignment) noexcept {
72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return ::operator delete(Ptr, C, Alignment);
73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected:
76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Attr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex,
77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot       bool IsLateParsed, bool DuplicatesAllowed)
78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : Range(R), AttrKind(AK), SpellingListIndex(SpellingListIndex),
79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      Inherited(false), IsPackExpansion(false), Implicit(false),
80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      IsLateParsed(IsLateParsed), DuplicatesAllowed(DuplicatesAllowed) {}
81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  attr::Kind getKind() const {
85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return static_cast<attr::Kind>(AttrKind);
86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  unsigned getSpellingListIndex() const { return SpellingListIndex; }
89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const char *getSpelling() const;
90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SourceLocation getLocation() const { return Range.getBegin(); }
92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  SourceRange getRange() const { return Range; }
93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setRange(SourceRange R) { Range = R; }
94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isInherited() const { return Inherited; }
96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// \brief Returns true if the attribute has been implicitly created instead
98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// of explicitly written by the user.
99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isImplicit() const { return Implicit; }
100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setImplicit(bool I) { Implicit = I; }
101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setPackExpansion(bool PE) { IsPackExpansion = PE; }
103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isPackExpansion() const { return IsPackExpansion; }
104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // Clone this attribute.
106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Attr *clone(ASTContext &C) const;
107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool isLateParsed() const { return IsLateParsed; }
109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // Pretty print this attribute.
111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const;
112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// \brief By default, attributes cannot be duplicated when being merged;
114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// however, an attribute can override this. Returns true if the attribute
115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// can be duplicated when merging.
116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool duplicatesAllowed() const { return DuplicatesAllowed; }
117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass StmtAttr : public Attr {
120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected:
121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  StmtAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex,
122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                  bool IsLateParsed, bool DuplicatesAllowed)
123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      : Attr(AK, R, SpellingListIndex, IsLateParsed, DuplicatesAllowed) {}
124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) {
127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A->getKind() >= attr::FirstStmtAttr &&
128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot           A->getKind() <= attr::LastStmtAttr;
129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass InheritableAttr : public Attr {
133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected:
134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InheritableAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex,
135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                  bool IsLateParsed, bool DuplicatesAllowed)
136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      : Attr(AK, R, SpellingListIndex, IsLateParsed, DuplicatesAllowed) {}
137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setInherited(bool I) { Inherited = I; }
140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // Implement isa/cast/dyncast/etc.
142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) {
143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A->getKind() >= attr::FirstInheritableAttr &&
144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot           A->getKind() <= attr::LastInheritableAttr;
145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass InheritableParamAttr : public InheritableAttr {
149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected:
150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  InheritableParamAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex,
151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                       bool IsLateParsed, bool DuplicatesAllowed)
152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      : InheritableAttr(AK, R, SpellingListIndex, IsLateParsed,
153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                        DuplicatesAllowed) {}
154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  // Implement isa/cast/dyncast/etc.
157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) {
158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A->getKind() >= attr::FirstInheritableParamAttr &&
159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot           A->getKind() <= attr::LastInheritableParamAttr;
160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// A parameter attribute which changes the argument-passing ABI rule
164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// for the parameter.
165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ParameterABIAttr : public InheritableParamAttr {
166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected:
167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ParameterABIAttr(attr::Kind AK, SourceRange R,
168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   unsigned SpellingListIndex, bool IsLateParsed,
169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                   bool DuplicatesAllowed)
170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    : InheritableParamAttr(AK, R, SpellingListIndex, IsLateParsed,
171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                           DuplicatesAllowed) {}
172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  ParameterABI getABI() const {
175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    switch (getKind()) {
176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case attr::SwiftContext:
177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return ParameterABI::SwiftContext;
178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case attr::SwiftErrorResult:
179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return ParameterABI::SwiftErrorResult;
180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    case attr::SwiftIndirectResult:
181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      return ParameterABI::SwiftIndirectResult;
182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    default:
183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot      llvm_unreachable("bad parameter ABI attribute kind");
184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    }
185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  static bool classof(const Attr *A) {
188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return A->getKind() >= attr::FirstParameterABIAttr &&
189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot           A->getKind() <= attr::LastParameterABIAttr;
190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot   }
191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/AST/Attrs.inc"
194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                                           const Attr *At) {
197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  DB.AddTaggedVal(reinterpret_cast<intptr_t>(At),
198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                  DiagnosticsEngine::ak_attr);
199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  return DB;
200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}
201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD,
203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                                           const Attr *At) {
204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  PD.AddTaggedVal(reinterpret_cast<intptr_t>(At),
205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                  DiagnosticsEngine::ak_attr);
206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  return PD;
207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}
208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}  // end namespace clang
209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif
211