xref: /openbsd/gnu/llvm/clang/include/clang/Basic/Attr.td (revision 12c85518)
1e5dd7070Spatrick//==--- Attr.td - attribute definitions -----------------------------------===//
2e5dd7070Spatrick//
3e5dd7070Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick// See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick//
7e5dd7070Spatrick//===----------------------------------------------------------------------===//
8e5dd7070Spatrick
9e5dd7070Spatrick// The documentation is organized by category. Attributes can have category-
10e5dd7070Spatrick// specific documentation that is collated within the larger document.
11e5dd7070Spatrickclass DocumentationCategory<string name> {
12e5dd7070Spatrick  string Name = name;
13e5dd7070Spatrick  code Content = [{}];
14e5dd7070Spatrick}
15e5dd7070Spatrickdef DocCatFunction : DocumentationCategory<"Function Attributes">;
16e5dd7070Spatrickdef DocCatVariable : DocumentationCategory<"Variable Attributes">;
17e5dd7070Spatrickdef DocCatField : DocumentationCategory<"Field Attributes">;
18e5dd7070Spatrickdef DocCatType : DocumentationCategory<"Type Attributes">;
19e5dd7070Spatrickdef DocCatStmt : DocumentationCategory<"Statement Attributes">;
20e5dd7070Spatrickdef DocCatDecl : DocumentationCategory<"Declaration Attributes">;
21e5dd7070Spatrick
22*12c85518Srobert// This category is for attributes which have not yet been properly documented,
23*12c85518Srobert// but should be.
24*12c85518Srobertdef DocCatUndocumented : DocumentationCategory<"Undocumented"> {
25*12c85518Srobert  let Content = [{
26*12c85518SrobertThis section lists attributes which are recognized by Clang, but which are
27*12c85518Srobertcurrently missing documentation.
28*12c85518Srobert}];
29*12c85518Srobert}
30*12c85518Srobert
31*12c85518Srobert// Attributes listed under the InternalOnly category do not generate any entry
32*12c85518Srobert// in the documentation.  This category should be used only when we _want_
33*12c85518Srobert// to not document the attribute, e.g. if the attribute has no spellings.
34*12c85518Srobertdef DocCatInternalOnly : DocumentationCategory<"InternalOnly">;
35e5dd7070Spatrick
36e5dd7070Spatrickclass DocDeprecated<string replacement = ""> {
37e5dd7070Spatrick  // If the Replacement field is empty, no replacement will be listed with the
38e5dd7070Spatrick  // documentation. Otherwise, the documentation will specify the attribute has
39e5dd7070Spatrick  // been superseded by this replacement.
40e5dd7070Spatrick  string Replacement = replacement;
41e5dd7070Spatrick}
42e5dd7070Spatrick
43e5dd7070Spatrick// Specifies the documentation to be associated with the given category.
44e5dd7070Spatrickclass Documentation {
45e5dd7070Spatrick  DocumentationCategory Category;
46e5dd7070Spatrick  code Content;
47e5dd7070Spatrick
48e5dd7070Spatrick  // If the heading is empty, one may be picked automatically. If the attribute
49e5dd7070Spatrick  // only has one spelling, no heading is required as the attribute's sole
50e5dd7070Spatrick  // spelling is sufficient. If all spellings are semantically common, the
51e5dd7070Spatrick  // heading will be the semantic spelling. If the spellings are not
52e5dd7070Spatrick  // semantically common and no heading is provided, an error will be emitted.
53e5dd7070Spatrick  string Heading = "";
54e5dd7070Spatrick
55e5dd7070Spatrick  // When set, specifies that the attribute is deprecated and can optionally
56e5dd7070Spatrick  // specify a replacement attribute.
57e5dd7070Spatrick  DocDeprecated Deprecated;
58e5dd7070Spatrick}
59e5dd7070Spatrick
60*12c85518Srobert// Specifies that the attribute is explicitly omitted from the documentation,
61*12c85518Srobert// because it is not intended to be user-facing.
62*12c85518Srobertdef InternalOnly : Documentation {
63*12c85518Srobert  let Category = DocCatInternalOnly;
64*12c85518Srobert}
65*12c85518Srobert
66*12c85518Srobert// Specifies that the attribute is undocumented, but that it _should_ have
67*12c85518Srobert// documentation.
68e5dd7070Spatrickdef Undocumented : Documentation {
69e5dd7070Spatrick  let Category = DocCatUndocumented;
70*12c85518Srobert  let Content = "No documentation.";
71e5dd7070Spatrick}
72e5dd7070Spatrick
73e5dd7070Spatrickinclude "clang/Basic/AttrDocs.td"
74e5dd7070Spatrick
75e5dd7070Spatrick// An attribute's subject is whatever it appertains to. In this file, it is
76e5dd7070Spatrick// more accurately a list of things that an attribute can appertain to. All
77e5dd7070Spatrick// Decls and Stmts are possibly AttrSubjects (even though the syntax may not
78e5dd7070Spatrick// allow attributes on a given Decl or Stmt).
79e5dd7070Spatrickclass AttrSubject;
80e5dd7070Spatrick
81e5dd7070Spatrickinclude "clang/Basic/DeclNodes.td"
82e5dd7070Spatrickinclude "clang/Basic/StmtNodes.td"
83e5dd7070Spatrick
84e5dd7070Spatrick// A subset-subject is an AttrSubject constrained to operate only on some subset
85e5dd7070Spatrick// of that subject.
86e5dd7070Spatrick//
87e5dd7070Spatrick// The code fragment is a boolean expression that will confirm that the subject
88e5dd7070Spatrick// meets the requirements; the subject will have the name S, and will have the
89e5dd7070Spatrick// type specified by the base. It should be a simple boolean expression. The
90e5dd7070Spatrick// diagnostic string should be a comma-separated list of subject names.
91e5dd7070Spatrickclass SubsetSubject<AttrSubject base, code check, string diag> : AttrSubject {
92e5dd7070Spatrick  AttrSubject Base = base;
93e5dd7070Spatrick  code CheckCode = check;
94e5dd7070Spatrick  string DiagSpelling = diag;
95e5dd7070Spatrick}
96e5dd7070Spatrick
97e5dd7070Spatrickdef LocalVar : SubsetSubject<Var,
98e5dd7070Spatrick                              [{S->hasLocalStorage() && !isa<ParmVarDecl>(S)}],
99e5dd7070Spatrick                              "local variables">;
100e5dd7070Spatrickdef NonParmVar : SubsetSubject<Var,
101e5dd7070Spatrick                               [{S->getKind() != Decl::ParmVar}],
102e5dd7070Spatrick                               "variables">;
103e5dd7070Spatrickdef NonLocalVar : SubsetSubject<Var,
104e5dd7070Spatrick                                [{!S->hasLocalStorage()}],
105e5dd7070Spatrick                                "variables with non-local storage">;
106e5dd7070Spatrickdef NonBitField : SubsetSubject<Field,
107e5dd7070Spatrick                                [{!S->isBitField()}],
108e5dd7070Spatrick                                "non-bit-field non-static data members">;
109e5dd7070Spatrick
110e5dd7070Spatrickdef NonStaticCXXMethod : SubsetSubject<CXXMethod,
111e5dd7070Spatrick                                       [{!S->isStatic()}],
112e5dd7070Spatrick                                       "non-static member functions">;
113e5dd7070Spatrick
114e5dd7070Spatrickdef NonStaticNonConstCXXMethod
115e5dd7070Spatrick    : SubsetSubject<CXXMethod,
116e5dd7070Spatrick                    [{!S->isStatic() && !S->isConst()}],
117e5dd7070Spatrick                    "non-static non-const member functions">;
118e5dd7070Spatrick
119e5dd7070Spatrickdef ObjCInstanceMethod : SubsetSubject<ObjCMethod,
120e5dd7070Spatrick                                       [{S->isInstanceMethod()}],
121e5dd7070Spatrick                                       "Objective-C instance methods">;
122e5dd7070Spatrick
123e5dd7070Spatrickdef Struct : SubsetSubject<Record,
124e5dd7070Spatrick                           [{!S->isUnion()}], "structs">;
125e5dd7070Spatrick
126e5dd7070Spatrickdef TLSVar : SubsetSubject<Var,
127e5dd7070Spatrick                           [{S->getTLSKind() != 0}], "thread-local variables">;
128e5dd7070Spatrick
129e5dd7070Spatrickdef SharedVar : SubsetSubject<Var,
130e5dd7070Spatrick                              [{S->hasGlobalStorage() && !S->getTLSKind()}],
131e5dd7070Spatrick                              "global variables">;
132e5dd7070Spatrick
133e5dd7070Spatrickdef GlobalVar : SubsetSubject<Var,
134e5dd7070Spatrick                             [{S->hasGlobalStorage()}], "global variables">;
135e5dd7070Spatrick
136*12c85518Srobertdef ExternalGlobalVar : SubsetSubject<Var,
137*12c85518Srobert                             [{S->hasGlobalStorage() &&
138*12c85518Srobert                               S->getStorageClass()!=StorageClass::SC_Static &&
139*12c85518Srobert                               !S->isLocalExternDecl()}],
140*12c85518Srobert                             "external global variables">;
141*12c85518Srobert
142e5dd7070Spatrickdef InlineFunction : SubsetSubject<Function,
143e5dd7070Spatrick                             [{S->isInlineSpecified()}], "inline functions">;
144e5dd7070Spatrick
145e5dd7070Spatrickdef FunctionTmpl
146e5dd7070Spatrick    : SubsetSubject<Function, [{S->getTemplatedKind() ==
147e5dd7070Spatrick                                 FunctionDecl::TK_FunctionTemplate}],
148e5dd7070Spatrick                    "function templates">;
149e5dd7070Spatrick
150*12c85518Srobertdef HLSLEntry
151*12c85518Srobert    : SubsetSubject<Function,
152*12c85518Srobert                    [{S->isExternallyVisible() && !isa<CXXMethodDecl>(S)}],
153*12c85518Srobert                    "global functions">;
154*12c85518Srobertdef HLSLBufferObj : SubsetSubject<HLSLBuffer,
155*12c85518Srobert                    [{isa<HLSLBufferDecl>(S)}],
156*12c85518Srobert                    "cbuffer/tbuffer">;
157*12c85518Srobert
158a9ac8606Spatrickdef ClassTmpl : SubsetSubject<CXXRecord, [{S->getDescribedClassTemplate()}],
159a9ac8606Spatrick                              "class templates">;
160a9ac8606Spatrick
161e5dd7070Spatrick// FIXME: this hack is needed because DeclNodes.td defines the base Decl node
162e5dd7070Spatrick// type to be a class, not a definition. This makes it impossible to create an
163e5dd7070Spatrick// attribute subject which accepts a Decl. Normally, this is not a problem,
164e5dd7070Spatrick// because the attribute can have no Subjects clause to accomplish this. But in
165e5dd7070Spatrick// the case of a SubsetSubject, there's no way to express it without this hack.
166e5dd7070Spatrickdef DeclBase : AttrSubject;
167e5dd7070Spatrickdef FunctionLike : SubsetSubject<DeclBase,
168e5dd7070Spatrick                                 [{S->getFunctionType(false) != nullptr}],
169e5dd7070Spatrick                                 "functions, function pointers">;
170e5dd7070Spatrick
171e5dd7070Spatrickdef OpenCLKernelFunction
172e5dd7070Spatrick    : SubsetSubject<Function, [{S->hasAttr<OpenCLKernelAttr>()}],
173e5dd7070Spatrick                    "kernel functions">;
174e5dd7070Spatrick
175e5dd7070Spatrick// HasFunctionProto is a more strict version of FunctionLike, so it should
176e5dd7070Spatrick// never be specified in a Subjects list along with FunctionLike (due to the
177e5dd7070Spatrick// inclusive nature of subject testing).
178e5dd7070Spatrickdef HasFunctionProto : SubsetSubject<DeclBase,
179e5dd7070Spatrick                                     [{(S->getFunctionType(true) != nullptr &&
180e5dd7070Spatrick                              isa<FunctionProtoType>(S->getFunctionType())) ||
181e5dd7070Spatrick                                       isa<ObjCMethodDecl>(S) ||
182e5dd7070Spatrick                                       isa<BlockDecl>(S)}],
183e5dd7070Spatrick                                     "non-K&R-style functions">;
184e5dd7070Spatrick
185e5dd7070Spatrick// A subject that matches the implicit object parameter of a non-static member
186e5dd7070Spatrick// function. Accepted as a function type attribute on the type of such a
187e5dd7070Spatrick// member function.
188e5dd7070Spatrick// FIXME: This does not actually ever match currently.
189e5dd7070Spatrickdef ImplicitObjectParameter
190e5dd7070Spatrick    : SubsetSubject<Function, [{static_cast<void>(S), false}],
191e5dd7070Spatrick                    "implicit object parameters">;
192e5dd7070Spatrick
193e5dd7070Spatrick// A single argument to an attribute
194e5dd7070Spatrickclass Argument<string name, bit optional, bit fake = 0> {
195e5dd7070Spatrick  string Name = name;
196e5dd7070Spatrick  bit Optional = optional;
197e5dd7070Spatrick
198e5dd7070Spatrick  /// A fake argument is used to store and serialize additional information
199e5dd7070Spatrick  /// in an attribute without actually changing its parsing or pretty-printing.
200e5dd7070Spatrick  bit Fake = fake;
201e5dd7070Spatrick}
202e5dd7070Spatrick
203e5dd7070Spatrickclass BoolArgument<string name, bit opt = 0, bit fake = 0> : Argument<name, opt,
204e5dd7070Spatrick                                                                      fake>;
205e5dd7070Spatrickclass IdentifierArgument<string name, bit opt = 0> : Argument<name, opt>;
206e5dd7070Spatrickclass IntArgument<string name, bit opt = 0> : Argument<name, opt>;
207e5dd7070Spatrickclass StringArgument<string name, bit opt = 0> : Argument<name, opt>;
208e5dd7070Spatrickclass ExprArgument<string name, bit opt = 0> : Argument<name, opt>;
209ec727ea7Spatrickclass DeclArgument<DeclNode kind, string name, bit opt = 0, bit fake = 0>
210ec727ea7Spatrick    : Argument<name, opt, fake> {
211ec727ea7Spatrick  DeclNode Kind = kind;
212ec727ea7Spatrick}
213ec727ea7Spatrick
214ec727ea7Spatrick// An argument of a OMPDeclareVariantAttr that represents the `match`
215ec727ea7Spatrick// clause of the declare variant by keeping the information (incl. nesting) in
216ec727ea7Spatrick// an OMPTraitInfo object.
217ec727ea7Spatrick//
218ec727ea7Spatrick// With some exceptions, the `match(<context-selector>)` clause looks roughly
219ec727ea7Spatrick// as follows:
220ec727ea7Spatrick//   context-selector := list<selector-set>
221ec727ea7Spatrick//       selector-set := <kind>={list<selector>}
222ec727ea7Spatrick//           selector := <kind>([score(<const-expr>):] list<trait>)
223ec727ea7Spatrick//              trait := <kind>
224ec727ea7Spatrick//
225ec727ea7Spatrick// The structure of an OMPTraitInfo object is a tree as defined below:
226ec727ea7Spatrick//
227ec727ea7Spatrick//   OMPTraitInfo     := {list<OMPTraitSet>}
228ec727ea7Spatrick//   OMPTraitSet      := {Kind, list<OMPTraitSelector>}
229ec727ea7Spatrick//   OMPTraitSelector := {Kind, Expr, list<OMPTraitProperty>}
230ec727ea7Spatrick//   OMPTraitProperty := {Kind}
231ec727ea7Spatrick//
232ec727ea7Spatrickclass OMPTraitInfoArgument<string name> : Argument<name, 0>;
233*12c85518Srobertclass VariadicOMPInteropInfoArgument<string name> : Argument<name, 0>;
234ec727ea7Spatrick
235e5dd7070Spatrickclass TypeArgument<string name, bit opt = 0> : Argument<name, opt>;
236e5dd7070Spatrickclass UnsignedArgument<string name, bit opt = 0> : Argument<name, opt>;
237e5dd7070Spatrickclass VariadicUnsignedArgument<string name> : Argument<name, 1>;
238e5dd7070Spatrickclass VariadicExprArgument<string name> : Argument<name, 1>;
239e5dd7070Spatrickclass VariadicStringArgument<string name> : Argument<name, 1>;
240e5dd7070Spatrickclass VariadicIdentifierArgument<string name> : Argument<name, 1>;
241e5dd7070Spatrick
242e5dd7070Spatrick// Like VariadicUnsignedArgument except values are ParamIdx.
243e5dd7070Spatrickclass VariadicParamIdxArgument<string name> : Argument<name, 1>;
244e5dd7070Spatrick
245e5dd7070Spatrick// A list of identifiers matching parameters or ParamIdx indices.
246e5dd7070Spatrickclass VariadicParamOrParamIdxArgument<string name> : Argument<name, 1>;
247e5dd7070Spatrick
248e5dd7070Spatrick// Like VariadicParamIdxArgument but for a single function parameter index.
249e5dd7070Spatrickclass ParamIdxArgument<string name, bit opt = 0> : Argument<name, opt>;
250e5dd7070Spatrick
251e5dd7070Spatrick// A version of the form major.minor[.subminor].
252e5dd7070Spatrickclass VersionArgument<string name, bit opt = 0> : Argument<name, opt>;
253e5dd7070Spatrick
254e5dd7070Spatrick// This one's a doozy, so it gets its own special type
255e5dd7070Spatrick// It can be an unsigned integer, or a type. Either can
256e5dd7070Spatrick// be dependent.
257e5dd7070Spatrickclass AlignedArgument<string name, bit opt = 0> : Argument<name, opt>;
258e5dd7070Spatrick
259e5dd7070Spatrick// A bool argument with a default value
260e5dd7070Spatrickclass DefaultBoolArgument<string name, bit default, bit fake = 0>
261e5dd7070Spatrick    : BoolArgument<name, 1, fake> {
262e5dd7070Spatrick  bit Default = default;
263e5dd7070Spatrick}
264e5dd7070Spatrick
265e5dd7070Spatrick// An integer argument with a default value
266e5dd7070Spatrickclass DefaultIntArgument<string name, int default> : IntArgument<name, 1> {
267e5dd7070Spatrick  int Default = default;
268e5dd7070Spatrick}
269e5dd7070Spatrick
270e5dd7070Spatrick// This argument is more complex, it includes the enumerator type name,
271e5dd7070Spatrick// a list of strings to accept, and a list of enumerators to map them to.
272e5dd7070Spatrickclass EnumArgument<string name, string type, list<string> values,
273e5dd7070Spatrick                   list<string> enums, bit opt = 0, bit fake = 0>
274e5dd7070Spatrick    : Argument<name, opt, fake> {
275e5dd7070Spatrick  string Type = type;
276e5dd7070Spatrick  list<string> Values = values;
277e5dd7070Spatrick  list<string> Enums = enums;
278e5dd7070Spatrick}
279e5dd7070Spatrick
280e5dd7070Spatrick// FIXME: There should be a VariadicArgument type that takes any other type
281e5dd7070Spatrick//        of argument and generates the appropriate type.
282e5dd7070Spatrickclass VariadicEnumArgument<string name, string type, list<string> values,
283e5dd7070Spatrick                           list<string> enums> : Argument<name, 1>  {
284e5dd7070Spatrick  string Type = type;
285e5dd7070Spatrick  list<string> Values = values;
286e5dd7070Spatrick  list<string> Enums = enums;
287e5dd7070Spatrick}
288e5dd7070Spatrick
289e5dd7070Spatrick// This handles one spelling of an attribute.
290e5dd7070Spatrickclass Spelling<string name, string variety> {
291e5dd7070Spatrick  string Name = name;
292e5dd7070Spatrick  string Variety = variety;
293e5dd7070Spatrick}
294e5dd7070Spatrick
295e5dd7070Spatrickclass GNU<string name> : Spelling<name, "GNU">;
296e5dd7070Spatrickclass Declspec<string name> : Spelling<name, "Declspec">;
297e5dd7070Spatrickclass Microsoft<string name> : Spelling<name, "Microsoft">;
298e5dd7070Spatrickclass CXX11<string namespace, string name, int version = 1>
299e5dd7070Spatrick    : Spelling<name, "CXX11"> {
300e5dd7070Spatrick  string Namespace = namespace;
301e5dd7070Spatrick  int Version = version;
302e5dd7070Spatrick}
303a9ac8606Spatrickclass C2x<string namespace, string name, int version = 1>
304a9ac8606Spatrick    : Spelling<name, "C2x"> {
305e5dd7070Spatrick  string Namespace = namespace;
306a9ac8606Spatrick  int Version = version;
307e5dd7070Spatrick}
308e5dd7070Spatrick
309e5dd7070Spatrickclass Keyword<string name> : Spelling<name, "Keyword">;
310e5dd7070Spatrickclass Pragma<string namespace, string name> : Spelling<name, "Pragma"> {
311e5dd7070Spatrick  string Namespace = namespace;
312e5dd7070Spatrick}
313e5dd7070Spatrick
314ec727ea7Spatrick// The GCC spelling implies GNU<name>, CXX11<"gnu", name>, and optionally,
315ec727ea7Spatrick// C2x<"gnu", name>. This spelling should be used for any GCC-compatible
316e5dd7070Spatrick// attributes.
317ec727ea7Spatrickclass GCC<string name, bit allowInC = 1> : Spelling<name, "GCC"> {
318ec727ea7Spatrick  bit AllowInC = allowInC;
319e5dd7070Spatrick}
320e5dd7070Spatrick
321e5dd7070Spatrick// The Clang spelling implies GNU<name>, CXX11<"clang", name>, and optionally,
322e5dd7070Spatrick// C2x<"clang", name>. This spelling should be used for any Clang-specific
323e5dd7070Spatrick// attributes.
324e5dd7070Spatrickclass Clang<string name, bit allowInC = 1> : Spelling<name, "Clang"> {
325e5dd7070Spatrick  bit AllowInC = allowInC;
326e5dd7070Spatrick}
327e5dd7070Spatrick
328*12c85518Srobert// HLSL Semantic spellings
329*12c85518Srobertclass HLSLSemantic<string name> : Spelling<name, "HLSLSemantic">;
330*12c85518Srobert
331e5dd7070Spatrickclass Accessor<string name, list<Spelling> spellings> {
332e5dd7070Spatrick  string Name = name;
333e5dd7070Spatrick  list<Spelling> Spellings = spellings;
334e5dd7070Spatrick}
335e5dd7070Spatrick
336e5dd7070Spatrickclass SubjectDiag<bit warn> {
337e5dd7070Spatrick  bit Warn = warn;
338e5dd7070Spatrick}
339e5dd7070Spatrickdef WarnDiag : SubjectDiag<1>;
340e5dd7070Spatrickdef ErrorDiag : SubjectDiag<0>;
341e5dd7070Spatrick
342e5dd7070Spatrickclass SubjectList<list<AttrSubject> subjects, SubjectDiag diag = WarnDiag,
343e5dd7070Spatrick                  string customDiag = ""> {
344e5dd7070Spatrick  list<AttrSubject> Subjects = subjects;
345e5dd7070Spatrick  SubjectDiag Diag = diag;
346e5dd7070Spatrick  string CustomDiag = customDiag;
347e5dd7070Spatrick}
348e5dd7070Spatrick
349e5dd7070Spatrickclass LangOpt<string name, code customCode = [{}]> {
350ec727ea7Spatrick  // The language option to test; ignored when custom code is supplied.
351e5dd7070Spatrick  string Name = name;
352e5dd7070Spatrick
353e5dd7070Spatrick  // A custom predicate, written as an expression evaluated in a context with
354e5dd7070Spatrick  // "LangOpts" bound.
355e5dd7070Spatrick  code CustomCode = customCode;
356e5dd7070Spatrick}
357e5dd7070Spatrickdef MicrosoftExt : LangOpt<"MicrosoftExt">;
358e5dd7070Spatrickdef Borland : LangOpt<"Borland">;
359e5dd7070Spatrickdef CUDA : LangOpt<"CUDA">;
360a9ac8606Spatrickdef HIP : LangOpt<"HIP">;
361e5dd7070Spatrickdef SYCL : LangOpt<"SYCLIsDevice">;
362ec727ea7Spatrickdef COnly : LangOpt<"", "!LangOpts.CPlusPlus">;
363e5dd7070Spatrickdef CPlusPlus : LangOpt<"CPlusPlus">;
364e5dd7070Spatrickdef OpenCL : LangOpt<"OpenCL">;
365e5dd7070Spatrickdef RenderScript : LangOpt<"RenderScript">;
366e5dd7070Spatrickdef ObjC : LangOpt<"ObjC">;
367e5dd7070Spatrickdef BlocksSupported : LangOpt<"Blocks">;
368e5dd7070Spatrickdef ObjCAutoRefCount : LangOpt<"ObjCAutoRefCount">;
369ec727ea7Spatrickdef ObjCNonFragileRuntime
370ec727ea7Spatrick    : LangOpt<"", "LangOpts.ObjCRuntime.allowsClassStubs()">;
371e5dd7070Spatrick
372*12c85518Srobertdef HLSL : LangOpt<"HLSL">;
373*12c85518Srobert
374e5dd7070Spatrick// Language option for CMSE extensions
375e5dd7070Spatrickdef Cmse : LangOpt<"Cmse">;
376e5dd7070Spatrick
377e5dd7070Spatrick// Defines targets for target-specific attributes. Empty lists are unchecked.
378e5dd7070Spatrickclass TargetSpec {
379e5dd7070Spatrick  // Specifies Architectures for which the target applies, based off the
380e5dd7070Spatrick  // ArchType enumeration in Triple.h.
381e5dd7070Spatrick  list<string> Arches = [];
382e5dd7070Spatrick  // Specifies Operating Systems for which the target applies, based off the
383e5dd7070Spatrick  // OSType enumeration in Triple.h
384e5dd7070Spatrick  list<string> OSes;
385e5dd7070Spatrick  // Specifies Object Formats for which the target applies, based off the
386e5dd7070Spatrick  // ObjectFormatType enumeration in Triple.h
387e5dd7070Spatrick  list<string> ObjectFormats;
388e5dd7070Spatrick  // A custom predicate, written as an expression evaluated in a context
389e5dd7070Spatrick  // with the following declarations in scope:
390e5dd7070Spatrick  //   const clang::TargetInfo &Target;
391e5dd7070Spatrick  //   const llvm::Triple &T = Target.getTriple();
392e5dd7070Spatrick  code CustomCode = [{}];
393e5dd7070Spatrick}
394e5dd7070Spatrick
395e5dd7070Spatrickclass TargetArch<list<string> arches> : TargetSpec {
396e5dd7070Spatrick  let Arches = arches;
397e5dd7070Spatrick}
398e5dd7070Spatrickdef TargetARM : TargetArch<["arm", "thumb", "armeb", "thumbeb"]>;
399ec727ea7Spatrickdef TargetAArch64 : TargetArch<["aarch64"]>;
400ec727ea7Spatrickdef TargetAnyArm : TargetArch<!listconcat(TargetARM.Arches, TargetAArch64.Arches)>;
401e5dd7070Spatrickdef TargetAVR : TargetArch<["avr"]>;
402e5dd7070Spatrickdef TargetBPF : TargetArch<["bpfel", "bpfeb"]>;
403e5dd7070Spatrickdef TargetMips32 : TargetArch<["mips", "mipsel"]>;
404e5dd7070Spatrickdef TargetAnyMips : TargetArch<["mips", "mipsel", "mips64", "mips64el"]>;
405e5dd7070Spatrickdef TargetMSP430 : TargetArch<["msp430"]>;
406a9ac8606Spatrickdef TargetM68k : TargetArch<["m68k"]>;
407e5dd7070Spatrickdef TargetRISCV : TargetArch<["riscv32", "riscv64"]>;
408e5dd7070Spatrickdef TargetX86 : TargetArch<["x86"]>;
409e5dd7070Spatrickdef TargetAnyX86 : TargetArch<["x86", "x86_64"]>;
410e5dd7070Spatrickdef TargetWebAssembly : TargetArch<["wasm32", "wasm64"]>;
411*12c85518Srobertdef TargetWindows : TargetSpec {
412*12c85518Srobert  let OSes = ["Win32"];
413*12c85518Srobert}
414a9ac8606Spatrickdef TargetHasDLLImportExport : TargetSpec {
415a9ac8606Spatrick  let CustomCode = [{ Target.getTriple().hasDLLImportExport() }];
416e5dd7070Spatrick}
417e5dd7070Spatrickdef TargetItaniumCXXABI : TargetSpec {
418e5dd7070Spatrick  let CustomCode = [{ Target.getCXXABI().isItaniumFamily() }];
419e5dd7070Spatrick}
420e5dd7070Spatrickdef TargetMicrosoftCXXABI : TargetArch<["x86", "x86_64", "arm", "thumb", "aarch64"]> {
421e5dd7070Spatrick  let CustomCode = [{ Target.getCXXABI().isMicrosoft() }];
422e5dd7070Spatrick}
423e5dd7070Spatrickdef TargetELF : TargetSpec {
424e5dd7070Spatrick  let ObjectFormats = ["ELF"];
425e5dd7070Spatrick}
426e5dd7070Spatrick
427a9ac8606Spatrickdef TargetSupportsInitPriority : TargetSpec {
428a9ac8606Spatrick  let CustomCode = [{ !Target.getTriple().isOSzOS() }];
429a9ac8606Spatrick}
430e5dd7070Spatrick// Attribute subject match rules that are used for #pragma clang attribute.
431e5dd7070Spatrick//
432e5dd7070Spatrick// A instance of AttrSubjectMatcherRule represents an individual match rule.
433e5dd7070Spatrick// An individual match rule can correspond to a number of different attribute
434e5dd7070Spatrick// subjects, e.g. "record" matching rule corresponds to the Record and
435e5dd7070Spatrick// CXXRecord attribute subjects.
436e5dd7070Spatrick//
437e5dd7070Spatrick// Match rules are used in the subject list of the #pragma clang attribute.
438e5dd7070Spatrick// Match rules can have sub-match rules that are instances of
439e5dd7070Spatrick// AttrSubjectMatcherSubRule. A sub-match rule can correspond to a number
440e5dd7070Spatrick// of different attribute subjects, and it can have a negated spelling as well.
441e5dd7070Spatrick// For example, "variable(unless(is_parameter))" matching rule corresponds to
442e5dd7070Spatrick// the NonParmVar attribute subject.
443e5dd7070Spatrickclass AttrSubjectMatcherSubRule<string name, list<AttrSubject> subjects,
444e5dd7070Spatrick                                bit negated = 0> {
445e5dd7070Spatrick  string Name = name;
446e5dd7070Spatrick  list<AttrSubject> Subjects = subjects;
447e5dd7070Spatrick  bit Negated = negated;
448e5dd7070Spatrick  // Lists language options, one of which is required to be true for the
449e5dd7070Spatrick  // attribute to be applicable. If empty, the language options are taken
450e5dd7070Spatrick  // from the parent matcher rule.
451e5dd7070Spatrick  list<LangOpt> LangOpts = [];
452e5dd7070Spatrick}
453e5dd7070Spatrickclass AttrSubjectMatcherRule<string name, list<AttrSubject> subjects,
454e5dd7070Spatrick                             list<AttrSubjectMatcherSubRule> subrules = []> {
455e5dd7070Spatrick  string Name = name;
456e5dd7070Spatrick  list<AttrSubject> Subjects = subjects;
457e5dd7070Spatrick  list<AttrSubjectMatcherSubRule> Constraints = subrules;
458e5dd7070Spatrick  // Lists language options, one of which is required to be true for the
459e5dd7070Spatrick  // attribute to be applicable. If empty, no language options are required.
460e5dd7070Spatrick  list<LangOpt> LangOpts = [];
461e5dd7070Spatrick}
462e5dd7070Spatrick
463e5dd7070Spatrick// function(is_member)
464e5dd7070Spatrickdef SubRuleForCXXMethod : AttrSubjectMatcherSubRule<"is_member", [CXXMethod]> {
465e5dd7070Spatrick  let LangOpts = [CPlusPlus];
466e5dd7070Spatrick}
467e5dd7070Spatrickdef SubjectMatcherForFunction : AttrSubjectMatcherRule<"function", [Function], [
468e5dd7070Spatrick  SubRuleForCXXMethod
469e5dd7070Spatrick]>;
470e5dd7070Spatrick// hasType is abstract, it should be used with one of the sub-rules.
471e5dd7070Spatrickdef SubjectMatcherForType : AttrSubjectMatcherRule<"hasType", [], [
472e5dd7070Spatrick  AttrSubjectMatcherSubRule<"functionType", [FunctionLike]>
473e5dd7070Spatrick
474e5dd7070Spatrick  // FIXME: There's a matcher ambiguity with objc methods and blocks since
475e5dd7070Spatrick  // functionType excludes them but functionProtoType includes them.
476e5dd7070Spatrick  // AttrSubjectMatcherSubRule<"functionProtoType", [HasFunctionProto]>
477e5dd7070Spatrick]>;
478e5dd7070Spatrickdef SubjectMatcherForTypedef : AttrSubjectMatcherRule<"type_alias",
479e5dd7070Spatrick                                                      [TypedefName]>;
480e5dd7070Spatrickdef SubjectMatcherForRecord : AttrSubjectMatcherRule<"record", [Record,
481e5dd7070Spatrick                                                                CXXRecord], [
482e5dd7070Spatrick  // unless(is_union)
483e5dd7070Spatrick  AttrSubjectMatcherSubRule<"is_union", [Struct], 1>
484e5dd7070Spatrick]>;
485e5dd7070Spatrickdef SubjectMatcherForEnum : AttrSubjectMatcherRule<"enum", [Enum]>;
486e5dd7070Spatrickdef SubjectMatcherForEnumConstant : AttrSubjectMatcherRule<"enum_constant",
487e5dd7070Spatrick                                                           [EnumConstant]>;
488e5dd7070Spatrickdef SubjectMatcherForVar : AttrSubjectMatcherRule<"variable", [Var], [
489e5dd7070Spatrick  AttrSubjectMatcherSubRule<"is_thread_local", [TLSVar]>,
490e5dd7070Spatrick  AttrSubjectMatcherSubRule<"is_global", [GlobalVar]>,
491ec727ea7Spatrick  AttrSubjectMatcherSubRule<"is_local", [LocalVar]>,
492e5dd7070Spatrick  AttrSubjectMatcherSubRule<"is_parameter", [ParmVar]>,
493e5dd7070Spatrick  // unless(is_parameter)
494e5dd7070Spatrick  AttrSubjectMatcherSubRule<"is_parameter", [NonParmVar], 1>
495e5dd7070Spatrick]>;
496e5dd7070Spatrickdef SubjectMatcherForField : AttrSubjectMatcherRule<"field", [Field]>;
497e5dd7070Spatrickdef SubjectMatcherForNamespace : AttrSubjectMatcherRule<"namespace",
498e5dd7070Spatrick                                                        [Namespace]> {
499e5dd7070Spatrick  let LangOpts = [CPlusPlus];
500e5dd7070Spatrick}
501e5dd7070Spatrickdef SubjectMatcherForObjCInterface : AttrSubjectMatcherRule<"objc_interface",
502e5dd7070Spatrick                                                            [ObjCInterface]> {
503e5dd7070Spatrick  let LangOpts = [ObjC];
504e5dd7070Spatrick}
505e5dd7070Spatrickdef SubjectMatcherForObjCProtocol : AttrSubjectMatcherRule<"objc_protocol",
506e5dd7070Spatrick                                                           [ObjCProtocol]> {
507e5dd7070Spatrick  let LangOpts = [ObjC];
508e5dd7070Spatrick}
509e5dd7070Spatrickdef SubjectMatcherForObjCCategory : AttrSubjectMatcherRule<"objc_category",
510e5dd7070Spatrick                                                           [ObjCCategory]> {
511e5dd7070Spatrick  let LangOpts = [ObjC];
512e5dd7070Spatrick}
513e5dd7070Spatrickdef SubjectMatcherForObjCImplementation :
514e5dd7070Spatrick    AttrSubjectMatcherRule<"objc_implementation", [ObjCImpl]> {
515e5dd7070Spatrick  let LangOpts = [ObjC];
516e5dd7070Spatrick}
517e5dd7070Spatrickdef SubjectMatcherForObjCMethod : AttrSubjectMatcherRule<"objc_method",
518e5dd7070Spatrick                                                         [ObjCMethod], [
519e5dd7070Spatrick  AttrSubjectMatcherSubRule<"is_instance", [ObjCInstanceMethod]>
520e5dd7070Spatrick]> {
521e5dd7070Spatrick  let LangOpts = [ObjC];
522e5dd7070Spatrick}
523e5dd7070Spatrickdef SubjectMatcherForObjCProperty : AttrSubjectMatcherRule<"objc_property",
524e5dd7070Spatrick                                                           [ObjCProperty]> {
525e5dd7070Spatrick  let LangOpts = [ObjC];
526e5dd7070Spatrick}
527e5dd7070Spatrickdef SubjectMatcherForBlock : AttrSubjectMatcherRule<"block", [Block]> {
528e5dd7070Spatrick  let LangOpts = [BlocksSupported];
529e5dd7070Spatrick}
530e5dd7070Spatrick
531e5dd7070Spatrick// Aggregate attribute subject match rules are abstract match rules that can't
532e5dd7070Spatrick// be used directly in #pragma clang attribute. Instead, users have to use
533e5dd7070Spatrick// subject match rules that correspond to attribute subjects that derive from
534e5dd7070Spatrick// the specified subject.
535e5dd7070Spatrickclass AttrSubjectMatcherAggregateRule<AttrSubject subject> {
536e5dd7070Spatrick  AttrSubject Subject = subject;
537e5dd7070Spatrick}
538e5dd7070Spatrick
539e5dd7070Spatrickdef SubjectMatcherForNamed : AttrSubjectMatcherAggregateRule<Named>;
540e5dd7070Spatrick
541e5dd7070Spatrickclass Attr {
542e5dd7070Spatrick  // The various ways in which an attribute can be spelled in source
543e5dd7070Spatrick  list<Spelling> Spellings;
544e5dd7070Spatrick  // The things to which an attribute can appertain
545e5dd7070Spatrick  SubjectList Subjects;
546e5dd7070Spatrick  // The arguments allowed on an attribute
547e5dd7070Spatrick  list<Argument> Args = [];
548e5dd7070Spatrick  // Accessors which should be generated for the attribute.
549e5dd7070Spatrick  list<Accessor> Accessors = [];
550e5dd7070Spatrick  // Set to true for attributes with arguments which require delayed parsing.
551e5dd7070Spatrick  bit LateParsed = 0;
552e5dd7070Spatrick  // Set to false to prevent an attribute from being propagated from a template
553e5dd7070Spatrick  // to the instantiation.
554e5dd7070Spatrick  bit Clone = 1;
555e5dd7070Spatrick  // Set to true for attributes which must be instantiated within templates
556e5dd7070Spatrick  bit TemplateDependent = 0;
557e5dd7070Spatrick  // Set to true for attributes that have a corresponding AST node.
558e5dd7070Spatrick  bit ASTNode = 1;
559e5dd7070Spatrick  // Set to true for attributes which have handler in Sema.
560e5dd7070Spatrick  bit SemaHandler = 1;
561ec727ea7Spatrick  // Set to true if this attribute doesn't need custom handling in Sema.
562ec727ea7Spatrick  bit SimpleHandler = 0;
563e5dd7070Spatrick  // Set to true for attributes that are completely ignored.
564e5dd7070Spatrick  bit Ignored = 0;
565e5dd7070Spatrick  // Set to true if the attribute's parsing does not match its semantic
566e5dd7070Spatrick  // content. Eg) It parses 3 args, but semantically takes 4 args.  Opts out of
567e5dd7070Spatrick  // common attribute error checking.
568e5dd7070Spatrick  bit HasCustomParsing = 0;
569e5dd7070Spatrick  // Set to true if all of the attribute's arguments should be parsed in an
570e5dd7070Spatrick  // unevaluated context.
571e5dd7070Spatrick  bit ParseArgumentsAsUnevaluated = 0;
572e5dd7070Spatrick  // Set to true if this attribute meaningful when applied to or inherited
573e5dd7070Spatrick  // in a class template definition.
574e5dd7070Spatrick  bit MeaningfulToClassTemplateDefinition = 0;
575e5dd7070Spatrick  // Set to true if this attribute can be used with '#pragma clang attribute'.
576e5dd7070Spatrick  // By default, an attribute is supported by the '#pragma clang attribute'
577e5dd7070Spatrick  // only when:
578e5dd7070Spatrick  // - It has a subject list whose subjects can be represented using subject
579e5dd7070Spatrick  //   match rules.
580e5dd7070Spatrick  // - It has GNU/CXX11 spelling and doesn't require delayed parsing.
581e5dd7070Spatrick  bit PragmaAttributeSupport;
582*12c85518Srobert  // Set to true if this attribute accepts parameter pack expansion expressions.
583*12c85518Srobert  bit AcceptsExprPack = 0;
584e5dd7070Spatrick  // Lists language options, one of which is required to be true for the
585e5dd7070Spatrick  // attribute to be applicable. If empty, no language options are required.
586e5dd7070Spatrick  list<LangOpt> LangOpts = [];
587e5dd7070Spatrick  // Any additional text that should be included verbatim in the class.
588e5dd7070Spatrick  // Note: Any additional data members will leak and should be constructed
589e5dd7070Spatrick  // externally on the ASTContext.
590e5dd7070Spatrick  code AdditionalMembers = [{}];
591e5dd7070Spatrick  // Any documentation that should be associated with the attribute. Since an
592e5dd7070Spatrick  // attribute may be documented under multiple categories, more than one
593e5dd7070Spatrick  // Documentation entry may be listed.
594e5dd7070Spatrick  list<Documentation> Documentation;
595e5dd7070Spatrick}
596e5dd7070Spatrick
597a9ac8606Spatrick/// Used to define a set of mutually exclusive attributes.
598a9ac8606Spatrickclass MutualExclusions<list<Attr> Ex> {
599a9ac8606Spatrick  list<Attr> Exclusions = Ex;
600a9ac8606Spatrick}
601a9ac8606Spatrick
602e5dd7070Spatrick/// A type attribute is not processed on a declaration or a statement.
603e5dd7070Spatrickclass TypeAttr : Attr;
604e5dd7070Spatrick
605e5dd7070Spatrick/// A stmt attribute is not processed on a declaration or a type.
606e5dd7070Spatrickclass StmtAttr : Attr;
607e5dd7070Spatrick
608e5dd7070Spatrick/// An inheritable attribute is inherited by later redeclarations.
609e5dd7070Spatrickclass InheritableAttr : Attr {
610e5dd7070Spatrick  // Set to true if this attribute can be duplicated on a subject when inheriting
611e5dd7070Spatrick  // attributes from prior declarations.
612e5dd7070Spatrick  bit InheritEvenIfAlreadyPresent = 0;
613e5dd7070Spatrick}
614e5dd7070Spatrick
615e5dd7070Spatrick/// Some attributes, like calling conventions, can appear in either the
616e5dd7070Spatrick/// declaration or the type position. These attributes are morally type
617e5dd7070Spatrick/// attributes, but have historically been written on declarations.
618e5dd7070Spatrickclass DeclOrTypeAttr : InheritableAttr;
619e5dd7070Spatrick
620a9ac8606Spatrick/// A attribute is either a declaration attribute or a statement attribute.
621a9ac8606Spatrickclass DeclOrStmtAttr : InheritableAttr;
622a9ac8606Spatrick
623*12c85518Srobert/// An attribute class for HLSL Annotations.
624*12c85518Srobertclass HLSLAnnotationAttr : InheritableAttr;
625*12c85518Srobert
626e5dd7070Spatrick/// A target-specific attribute.  This class is meant to be used as a mixin
627e5dd7070Spatrick/// with InheritableAttr or Attr depending on the attribute's needs.
628e5dd7070Spatrickclass TargetSpecificAttr<TargetSpec target> {
629e5dd7070Spatrick  TargetSpec Target = target;
630e5dd7070Spatrick  // Attributes are generally required to have unique spellings for their names
631e5dd7070Spatrick  // so that the parser can determine what kind of attribute it has parsed.
632e5dd7070Spatrick  // However, target-specific attributes are special in that the attribute only
633e5dd7070Spatrick  // "exists" for a given target. So two target-specific attributes can share
634e5dd7070Spatrick  // the same name when they exist in different targets. To support this, a
635e5dd7070Spatrick  // Kind can be explicitly specified for a target-specific attribute. This
636e5dd7070Spatrick  // corresponds to the ParsedAttr::AT_* enum that is generated and it
637e5dd7070Spatrick  // should contain a shared value between the attributes.
638e5dd7070Spatrick  //
639e5dd7070Spatrick  // Target-specific attributes which use this feature should ensure that the
640e5dd7070Spatrick  // spellings match exactly between the attributes, and if the arguments or
641e5dd7070Spatrick  // subjects differ, should specify HasCustomParsing = 1 and implement their
642e5dd7070Spatrick  // own parsing and semantic handling requirements as-needed.
643e5dd7070Spatrick  string ParseKind;
644e5dd7070Spatrick}
645e5dd7070Spatrick
646e5dd7070Spatrick/// An inheritable parameter attribute is inherited by later
647e5dd7070Spatrick/// redeclarations, even when it's written on a parameter.
648e5dd7070Spatrickclass InheritableParamAttr : InheritableAttr;
649e5dd7070Spatrick
650e5dd7070Spatrick/// An attribute which changes the ABI rules for a specific parameter.
651e5dd7070Spatrickclass ParameterABIAttr : InheritableParamAttr {
652e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
653e5dd7070Spatrick}
654e5dd7070Spatrick
655e5dd7070Spatrick/// An ignored attribute, which we parse but discard with no checking.
656e5dd7070Spatrickclass IgnoredAttr : Attr {
657e5dd7070Spatrick  let Ignored = 1;
658e5dd7070Spatrick  let ASTNode = 0;
659e5dd7070Spatrick  let SemaHandler = 0;
660*12c85518Srobert  let Documentation = [InternalOnly];
661e5dd7070Spatrick}
662e5dd7070Spatrick
663e5dd7070Spatrick//
664e5dd7070Spatrick// Attributes begin here
665e5dd7070Spatrick//
666e5dd7070Spatrick
667e5dd7070Spatrickdef AbiTag : Attr {
668ec727ea7Spatrick  let Spellings = [GCC<"abi_tag", /*AllowInC*/0>];
669e5dd7070Spatrick  let Args = [VariadicStringArgument<"Tags">];
670e5dd7070Spatrick  let Subjects = SubjectList<[Struct, Var, Function, Namespace], ErrorDiag>;
671e5dd7070Spatrick  let MeaningfulToClassTemplateDefinition = 1;
672e5dd7070Spatrick  let Documentation = [AbiTagsDocs];
673e5dd7070Spatrick}
674e5dd7070Spatrick
675e5dd7070Spatrickdef AddressSpace : TypeAttr {
676e5dd7070Spatrick  let Spellings = [Clang<"address_space">];
677e5dd7070Spatrick  let Args = [IntArgument<"AddressSpace">];
678e5dd7070Spatrick  let Documentation = [Undocumented];
679e5dd7070Spatrick}
680e5dd7070Spatrick
681e5dd7070Spatrickdef Alias : Attr {
682e5dd7070Spatrick  let Spellings = [GCC<"alias">];
683e5dd7070Spatrick  let Args = [StringArgument<"Aliasee">];
684e5dd7070Spatrick  let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag>;
685e5dd7070Spatrick  let Documentation = [Undocumented];
686e5dd7070Spatrick}
687e5dd7070Spatrick
688a9ac8606Spatrickdef BuiltinAlias : Attr {
689a9ac8606Spatrick  let Spellings = [CXX11<"clang", "builtin_alias">,
690a9ac8606Spatrick                   C2x<"clang", "builtin_alias">,
691a9ac8606Spatrick                   GNU<"clang_builtin_alias">];
692a9ac8606Spatrick  let Args = [IdentifierArgument<"BuiltinName">];
693a9ac8606Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
694a9ac8606Spatrick  let Documentation = [BuiltinAliasDocs];
695a9ac8606Spatrick}
696a9ac8606Spatrick
697ec727ea7Spatrickdef ArmBuiltinAlias : InheritableAttr, TargetSpecificAttr<TargetAnyArm> {
698ec727ea7Spatrick  let Spellings = [Clang<"__clang_arm_builtin_alias">];
699e5dd7070Spatrick  let Args = [IdentifierArgument<"BuiltinName">];
700e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
701ec727ea7Spatrick  let Documentation = [ArmBuiltinAliasDocs];
702e5dd7070Spatrick}
703e5dd7070Spatrick
704e5dd7070Spatrickdef Aligned : InheritableAttr {
705e5dd7070Spatrick  let Spellings = [GCC<"aligned">, Declspec<"align">, Keyword<"alignas">,
706e5dd7070Spatrick                   Keyword<"_Alignas">];
707e5dd7070Spatrick  let Args = [AlignedArgument<"Alignment", 1>];
708e5dd7070Spatrick  let Accessors = [Accessor<"isGNU", [GCC<"aligned">]>,
709e5dd7070Spatrick                   Accessor<"isC11", [Keyword<"_Alignas">]>,
710e5dd7070Spatrick                   Accessor<"isAlignas", [Keyword<"alignas">,
711e5dd7070Spatrick                                          Keyword<"_Alignas">]>,
712e5dd7070Spatrick                   Accessor<"isDeclspec",[Declspec<"align">]>];
713e5dd7070Spatrick  let Documentation = [Undocumented];
714e5dd7070Spatrick}
715e5dd7070Spatrick
716e5dd7070Spatrickdef AlignValue : Attr {
717e5dd7070Spatrick  let Spellings = [
718e5dd7070Spatrick    // Unfortunately, this is semantically an assertion, not a directive
719e5dd7070Spatrick    // (something else must ensure the alignment), so aligned_value is a
720e5dd7070Spatrick    // probably a better name. We might want to add an aligned_value spelling in
721e5dd7070Spatrick    // the future (and a corresponding C++ attribute), but this can be done
722e5dd7070Spatrick    // later once we decide if we also want them to have slightly-different
723e5dd7070Spatrick    // semantics than Intel's align_value.
724e5dd7070Spatrick    //
725e5dd7070Spatrick    // Does not get a [[]] spelling because the attribute is not exposed as such
726e5dd7070Spatrick    // by Intel.
727e5dd7070Spatrick    GNU<"align_value">
728e5dd7070Spatrick    // Intel's compiler on Windows also supports:
729e5dd7070Spatrick    // , Declspec<"align_value">
730e5dd7070Spatrick  ];
731e5dd7070Spatrick  let Args = [ExprArgument<"Alignment">];
732e5dd7070Spatrick  let Subjects = SubjectList<[Var, TypedefName]>;
733e5dd7070Spatrick  let Documentation = [AlignValueDocs];
734e5dd7070Spatrick}
735e5dd7070Spatrick
736e5dd7070Spatrickdef AlignMac68k : InheritableAttr {
737e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
738e5dd7070Spatrick  let Spellings = [];
739e5dd7070Spatrick  let SemaHandler = 0;
740*12c85518Srobert  let Documentation = [InternalOnly];
741e5dd7070Spatrick}
742e5dd7070Spatrick
743a9ac8606Spatrickdef AlignNatural : InheritableAttr {
744a9ac8606Spatrick  // This attribute has no spellings as it is only ever created implicitly.
745a9ac8606Spatrick  let Spellings = [];
746a9ac8606Spatrick  let SemaHandler = 0;
747*12c85518Srobert  let Documentation = [InternalOnly];
748a9ac8606Spatrick}
749a9ac8606Spatrick
750*12c85518Srobertdef AlwaysInline : DeclOrStmtAttr {
751*12c85518Srobert  let Spellings = [GCC<"always_inline">, CXX11<"clang", "always_inline">,
752*12c85518Srobert                   C2x<"clang", "always_inline">, Keyword<"__forceinline">];
753*12c85518Srobert  let Accessors = [Accessor<"isClangAlwaysInline", [CXX11<"clang", "always_inline">,
754*12c85518Srobert                                                    C2x<"clang", "always_inline">]>];
755*12c85518Srobert  let Subjects = SubjectList<[Function, Stmt], WarnDiag,
756*12c85518Srobert                             "functions and statements">;
757a9ac8606Spatrick  let Documentation = [AlwaysInlineDocs];
758e5dd7070Spatrick}
759e5dd7070Spatrick
760e5dd7070Spatrickdef Artificial : InheritableAttr {
761e5dd7070Spatrick  let Spellings = [GCC<"artificial">];
762ec727ea7Spatrick  let Subjects = SubjectList<[InlineFunction]>;
763e5dd7070Spatrick  let Documentation = [ArtificialDocs];
764ec727ea7Spatrick  let SimpleHandler = 1;
765e5dd7070Spatrick}
766e5dd7070Spatrick
767e5dd7070Spatrickdef XRayInstrument : InheritableAttr {
768e5dd7070Spatrick  let Spellings = [Clang<"xray_always_instrument">,
769e5dd7070Spatrick                   Clang<"xray_never_instrument">];
770e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod]>;
771e5dd7070Spatrick  let Accessors = [Accessor<"alwaysXRayInstrument",
772e5dd7070Spatrick                     [Clang<"xray_always_instrument">]>,
773e5dd7070Spatrick                   Accessor<"neverXRayInstrument",
774e5dd7070Spatrick                     [Clang<"xray_never_instrument">]>];
775e5dd7070Spatrick  let Documentation = [XRayDocs];
776ec727ea7Spatrick  let SimpleHandler = 1;
777e5dd7070Spatrick}
778e5dd7070Spatrick
779e5dd7070Spatrickdef XRayLogArgs : InheritableAttr {
780e5dd7070Spatrick  let Spellings = [Clang<"xray_log_args">];
781e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod]>;
782e5dd7070Spatrick  // This argument is a count not an index, so it has the same encoding (base
783e5dd7070Spatrick  // 1 including C++ implicit this parameter) at the source and LLVM levels of
784e5dd7070Spatrick  // representation, so ParamIdxArgument is inappropriate.  It is never used
785e5dd7070Spatrick  // at the AST level of representation, so it never needs to be adjusted not
786e5dd7070Spatrick  // to include any C++ implicit this parameter.  Thus, we just store it and
787e5dd7070Spatrick  // use it as an unsigned that never needs adjustment.
788e5dd7070Spatrick  let Args = [UnsignedArgument<"ArgumentCount">];
789e5dd7070Spatrick  let Documentation = [XRayDocs];
790e5dd7070Spatrick}
791e5dd7070Spatrick
792e5dd7070Spatrickdef PatchableFunctionEntry
793e5dd7070Spatrick    : InheritableAttr,
794a9ac8606Spatrick      TargetSpecificAttr<TargetArch<
795a9ac8606Spatrick          ["aarch64", "aarch64_be", "riscv32", "riscv64", "x86", "x86_64"]>> {
796e5dd7070Spatrick  let Spellings = [GCC<"patchable_function_entry">];
797e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod]>;
798e5dd7070Spatrick  let Args = [UnsignedArgument<"Count">, DefaultIntArgument<"Offset", 0>];
799e5dd7070Spatrick  let Documentation = [PatchableFunctionEntryDocs];
800e5dd7070Spatrick}
801e5dd7070Spatrick
802e5dd7070Spatrickdef TLSModel : InheritableAttr {
803e5dd7070Spatrick  let Spellings = [GCC<"tls_model">];
804e5dd7070Spatrick  let Subjects = SubjectList<[TLSVar], ErrorDiag>;
805e5dd7070Spatrick  let Args = [StringArgument<"Model">];
806e5dd7070Spatrick  let Documentation = [TLSModelDocs];
807e5dd7070Spatrick}
808e5dd7070Spatrick
809e5dd7070Spatrickdef AnalyzerNoReturn : InheritableAttr {
810e5dd7070Spatrick  // TODO: should this attribute be exposed with a [[]] spelling under the clang
811e5dd7070Spatrick  // vendor namespace, or should it use a vendor namespace specific to the
812e5dd7070Spatrick  // analyzer?
813e5dd7070Spatrick  let Spellings = [GNU<"analyzer_noreturn">];
814e5dd7070Spatrick  // TODO: Add subject list.
815e5dd7070Spatrick  let Documentation = [Undocumented];
816e5dd7070Spatrick}
817e5dd7070Spatrick
818e5dd7070Spatrickdef Annotate : InheritableParamAttr {
819e5dd7070Spatrick  let Spellings = [Clang<"annotate">];
820a9ac8606Spatrick  let Args = [StringArgument<"Annotation">, VariadicExprArgument<"Args">];
821e5dd7070Spatrick  // Ensure that the annotate attribute can be used with
822e5dd7070Spatrick  // '#pragma clang attribute' even though it has no subject list.
823a9ac8606Spatrick  let AdditionalMembers = [{
824a9ac8606Spatrick  static AnnotateAttr *Create(ASTContext &Ctx, llvm::StringRef Annotation, \
825a9ac8606Spatrick              const AttributeCommonInfo &CommonInfo) {
826a9ac8606Spatrick    return AnnotateAttr::Create(Ctx, Annotation, nullptr, 0, CommonInfo);
827a9ac8606Spatrick  }
828a9ac8606Spatrick  static AnnotateAttr *CreateImplicit(ASTContext &Ctx, llvm::StringRef Annotation, \
829a9ac8606Spatrick              const AttributeCommonInfo &CommonInfo = {SourceRange{}}) {
830a9ac8606Spatrick    return AnnotateAttr::CreateImplicit(Ctx, Annotation, nullptr, 0, CommonInfo);
831a9ac8606Spatrick  }
832a9ac8606Spatrick  }];
833e5dd7070Spatrick  let PragmaAttributeSupport = 1;
834*12c85518Srobert  let AcceptsExprPack = 1;
835e5dd7070Spatrick  let Documentation = [Undocumented];
836e5dd7070Spatrick}
837e5dd7070Spatrick
838*12c85518Srobertdef AnnotateType : TypeAttr {
839*12c85518Srobert  let Spellings = [CXX11<"clang", "annotate_type">, C2x<"clang", "annotate_type">];
840*12c85518Srobert  let Args = [StringArgument<"Annotation">, VariadicExprArgument<"Args">];
841*12c85518Srobert  let HasCustomParsing = 1;
842*12c85518Srobert  let AcceptsExprPack = 1;
843*12c85518Srobert  let Documentation = [AnnotateTypeDocs];
844*12c85518Srobert}
845*12c85518Srobert
846e5dd7070Spatrickdef ARMInterrupt : InheritableAttr, TargetSpecificAttr<TargetARM> {
847a9ac8606Spatrick  // NOTE: If you add any additional spellings, M68kInterrupt's,
848a9ac8606Spatrick  // MSP430Interrupt's, MipsInterrupt's and AnyX86Interrupt's spellings
849a9ac8606Spatrick  // must match.
850e5dd7070Spatrick  let Spellings = [GCC<"interrupt">];
851e5dd7070Spatrick  let Args = [EnumArgument<"Interrupt", "InterruptType",
852e5dd7070Spatrick                           ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", ""],
853e5dd7070Spatrick                           ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", "Generic"],
854e5dd7070Spatrick                           1>];
855e5dd7070Spatrick  let ParseKind = "Interrupt";
856e5dd7070Spatrick  let HasCustomParsing = 1;
857e5dd7070Spatrick  let Documentation = [ARMInterruptDocs];
858e5dd7070Spatrick}
859e5dd7070Spatrick
860e5dd7070Spatrickdef AVRInterrupt : InheritableAttr, TargetSpecificAttr<TargetAVR> {
861e5dd7070Spatrick  let Spellings = [GCC<"interrupt">];
862e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
863e5dd7070Spatrick  let ParseKind = "Interrupt";
864e5dd7070Spatrick  let Documentation = [AVRInterruptDocs];
865e5dd7070Spatrick}
866e5dd7070Spatrick
867e5dd7070Spatrickdef AVRSignal : InheritableAttr, TargetSpecificAttr<TargetAVR> {
868e5dd7070Spatrick  let Spellings = [GCC<"signal">];
869e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
870e5dd7070Spatrick  let Documentation = [AVRSignalDocs];
871e5dd7070Spatrick}
872e5dd7070Spatrick
873e5dd7070Spatrickdef AsmLabel : InheritableAttr {
874e5dd7070Spatrick  let Spellings = [Keyword<"asm">, Keyword<"__asm__">];
875e5dd7070Spatrick  let Args = [
876e5dd7070Spatrick    // Label specifies the mangled name for the decl.
877e5dd7070Spatrick    StringArgument<"Label">,
878e5dd7070Spatrick
879e5dd7070Spatrick    // IsLiteralLabel specifies whether the label is literal (i.e. suppresses
880e5dd7070Spatrick    // the global C symbol prefix) or not. If not, the mangle-suppression prefix
881e5dd7070Spatrick    // ('\01') is omitted from the decl name at the LLVM IR level.
882e5dd7070Spatrick    //
883e5dd7070Spatrick    // Non-literal labels are used by some external AST sources like LLDB.
884e5dd7070Spatrick    BoolArgument<"IsLiteralLabel", /*optional=*/0, /*fake=*/1>
885e5dd7070Spatrick  ];
886e5dd7070Spatrick  let SemaHandler = 0;
887e5dd7070Spatrick  let Documentation = [AsmLabelDocs];
888e5dd7070Spatrick  let AdditionalMembers =
889e5dd7070Spatrick[{
890e5dd7070Spatrickbool isEquivalent(AsmLabelAttr *Other) const {
891e5dd7070Spatrick  return getLabel() == Other->getLabel() && getIsLiteralLabel() == Other->getIsLiteralLabel();
892e5dd7070Spatrick}
893e5dd7070Spatrick}];
894e5dd7070Spatrick}
895e5dd7070Spatrick
896e5dd7070Spatrickdef Availability : InheritableAttr {
897e5dd7070Spatrick  let Spellings = [Clang<"availability">];
898e5dd7070Spatrick  let Args = [IdentifierArgument<"platform">, VersionArgument<"introduced">,
899e5dd7070Spatrick              VersionArgument<"deprecated">, VersionArgument<"obsoleted">,
900e5dd7070Spatrick              BoolArgument<"unavailable">, StringArgument<"message">,
901e5dd7070Spatrick              BoolArgument<"strict">, StringArgument<"replacement">,
902e5dd7070Spatrick              IntArgument<"priority">];
903e5dd7070Spatrick  let AdditionalMembers =
904e5dd7070Spatrick[{static llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) {
905e5dd7070Spatrick    return llvm::StringSwitch<llvm::StringRef>(Platform)
906e5dd7070Spatrick             .Case("android", "Android")
907*12c85518Srobert             .Case("fuchsia", "Fuchsia")
908e5dd7070Spatrick             .Case("ios", "iOS")
909e5dd7070Spatrick             .Case("macos", "macOS")
910e5dd7070Spatrick             .Case("tvos", "tvOS")
911e5dd7070Spatrick             .Case("watchos", "watchOS")
912*12c85518Srobert             .Case("driverkit", "DriverKit")
913e5dd7070Spatrick             .Case("ios_app_extension", "iOS (App Extension)")
914e5dd7070Spatrick             .Case("macos_app_extension", "macOS (App Extension)")
915e5dd7070Spatrick             .Case("tvos_app_extension", "tvOS (App Extension)")
916e5dd7070Spatrick             .Case("watchos_app_extension", "watchOS (App Extension)")
917a9ac8606Spatrick             .Case("maccatalyst", "macCatalyst")
918a9ac8606Spatrick             .Case("maccatalyst_app_extension", "macCatalyst (App Extension)")
919e5dd7070Spatrick             .Case("swift", "Swift")
920*12c85518Srobert             .Case("shadermodel", "HLSL ShaderModel")
921e5dd7070Spatrick             .Default(llvm::StringRef());
922e5dd7070Spatrick}
923e5dd7070Spatrickstatic llvm::StringRef getPlatformNameSourceSpelling(llvm::StringRef Platform) {
924e5dd7070Spatrick    return llvm::StringSwitch<llvm::StringRef>(Platform)
925e5dd7070Spatrick             .Case("ios", "iOS")
926e5dd7070Spatrick             .Case("macos", "macOS")
927e5dd7070Spatrick             .Case("tvos", "tvOS")
928e5dd7070Spatrick             .Case("watchos", "watchOS")
929e5dd7070Spatrick             .Case("ios_app_extension", "iOSApplicationExtension")
930e5dd7070Spatrick             .Case("macos_app_extension", "macOSApplicationExtension")
931e5dd7070Spatrick             .Case("tvos_app_extension", "tvOSApplicationExtension")
932e5dd7070Spatrick             .Case("watchos_app_extension", "watchOSApplicationExtension")
933a9ac8606Spatrick             .Case("maccatalyst", "macCatalyst")
934a9ac8606Spatrick             .Case("maccatalyst_app_extension", "macCatalystApplicationExtension")
935a9ac8606Spatrick             .Case("zos", "z/OS")
936*12c85518Srobert             .Case("shadermodel", "ShaderModel")
937e5dd7070Spatrick             .Default(Platform);
938e5dd7070Spatrick}
939e5dd7070Spatrickstatic llvm::StringRef canonicalizePlatformName(llvm::StringRef Platform) {
940e5dd7070Spatrick    return llvm::StringSwitch<llvm::StringRef>(Platform)
941e5dd7070Spatrick             .Case("iOS", "ios")
942e5dd7070Spatrick             .Case("macOS", "macos")
943e5dd7070Spatrick             .Case("tvOS", "tvos")
944e5dd7070Spatrick             .Case("watchOS", "watchos")
945e5dd7070Spatrick             .Case("iOSApplicationExtension", "ios_app_extension")
946e5dd7070Spatrick             .Case("macOSApplicationExtension", "macos_app_extension")
947e5dd7070Spatrick             .Case("tvOSApplicationExtension", "tvos_app_extension")
948e5dd7070Spatrick             .Case("watchOSApplicationExtension", "watchos_app_extension")
949a9ac8606Spatrick             .Case("macCatalyst", "maccatalyst")
950a9ac8606Spatrick             .Case("macCatalystApplicationExtension", "maccatalyst_app_extension")
951*12c85518Srobert             .Case("ShaderModel", "shadermodel")
952e5dd7070Spatrick             .Default(Platform);
953e5dd7070Spatrick} }];
954e5dd7070Spatrick  let HasCustomParsing = 1;
955e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
956e5dd7070Spatrick  let Subjects = SubjectList<[Named]>;
957e5dd7070Spatrick  let Documentation = [AvailabilityDocs];
958e5dd7070Spatrick}
959e5dd7070Spatrick
960e5dd7070Spatrickdef ExternalSourceSymbol : InheritableAttr {
961e5dd7070Spatrick  let Spellings = [Clang<"external_source_symbol">];
962e5dd7070Spatrick  let Args = [StringArgument<"language", 1>,
963e5dd7070Spatrick              StringArgument<"definedIn", 1>,
964e5dd7070Spatrick              BoolArgument<"generatedDeclaration", 1>];
965e5dd7070Spatrick  let HasCustomParsing = 1;
966e5dd7070Spatrick  let Subjects = SubjectList<[Named]>;
967e5dd7070Spatrick  let Documentation = [ExternalSourceSymbolDocs];
968e5dd7070Spatrick}
969e5dd7070Spatrick
970e5dd7070Spatrickdef Blocks : InheritableAttr {
971e5dd7070Spatrick  let Spellings = [Clang<"blocks">];
972e5dd7070Spatrick  let Args = [EnumArgument<"Type", "BlockType", ["byref"], ["ByRef"]>];
973e5dd7070Spatrick  let Documentation = [Undocumented];
974e5dd7070Spatrick}
975e5dd7070Spatrick
976e5dd7070Spatrickdef Bounded : IgnoredAttr {
977e5dd7070Spatrick  // Does not have a [[]] spelling because the attribute is ignored.
978e5dd7070Spatrick  let Spellings = [GNU<"bounded">];
979e5dd7070Spatrick}
980e5dd7070Spatrick
981e5dd7070Spatrickdef CarriesDependency : InheritableParamAttr {
982e5dd7070Spatrick  let Spellings = [GNU<"carries_dependency">,
983e5dd7070Spatrick                   CXX11<"","carries_dependency", 200809>];
984e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar, ObjCMethod, Function], ErrorDiag>;
985e5dd7070Spatrick  let Documentation = [CarriesDependencyDocs];
986e5dd7070Spatrick}
987e5dd7070Spatrick
988e5dd7070Spatrickdef CDecl : DeclOrTypeAttr {
989e5dd7070Spatrick  let Spellings = [GCC<"cdecl">, Keyword<"__cdecl">, Keyword<"_cdecl">];
990e5dd7070Spatrick//  let Subjects = [Function, ObjCMethod];
991e5dd7070Spatrick  let Documentation = [Undocumented];
992e5dd7070Spatrick}
993e5dd7070Spatrick
994e5dd7070Spatrick// cf_audited_transfer indicates that the given function has been
995e5dd7070Spatrick// audited and has been marked with the appropriate cf_consumed and
996e5dd7070Spatrick// cf_returns_retained attributes.  It is generally applied by
997e5dd7070Spatrick// '#pragma clang arc_cf_code_audited' rather than explicitly.
998e5dd7070Spatrickdef CFAuditedTransfer : InheritableAttr {
999e5dd7070Spatrick  let Spellings = [Clang<"cf_audited_transfer">];
1000e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1001e5dd7070Spatrick  let Documentation = [Undocumented];
1002a9ac8606Spatrick  let SimpleHandler = 1;
1003e5dd7070Spatrick}
1004e5dd7070Spatrick
1005e5dd7070Spatrick// cf_unknown_transfer is an explicit opt-out of cf_audited_transfer.
1006e5dd7070Spatrick// It indicates that the function has unknown or unautomatable
1007e5dd7070Spatrick// transfer semantics.
1008e5dd7070Spatrickdef CFUnknownTransfer : InheritableAttr {
1009e5dd7070Spatrick  let Spellings = [Clang<"cf_unknown_transfer">];
1010e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1011e5dd7070Spatrick  let Documentation = [Undocumented];
1012a9ac8606Spatrick  let SimpleHandler = 1;
1013e5dd7070Spatrick}
1014a9ac8606Spatrickdef : MutualExclusions<[CFAuditedTransfer, CFUnknownTransfer]>;
1015e5dd7070Spatrick
1016e5dd7070Spatrickdef CFReturnsRetained : InheritableAttr {
1017e5dd7070Spatrick  let Spellings = [Clang<"cf_returns_retained">];
1018e5dd7070Spatrick//  let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
1019e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
1020e5dd7070Spatrick}
1021e5dd7070Spatrick
1022e5dd7070Spatrickdef CFReturnsNotRetained : InheritableAttr {
1023e5dd7070Spatrick  let Spellings = [Clang<"cf_returns_not_retained">];
1024e5dd7070Spatrick//  let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
1025e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
1026e5dd7070Spatrick}
1027e5dd7070Spatrick
1028e5dd7070Spatrickdef CFConsumed : InheritableParamAttr {
1029e5dd7070Spatrick  let Spellings = [Clang<"cf_consumed">];
1030e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
1031e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
1032e5dd7070Spatrick}
1033e5dd7070Spatrick
1034e5dd7070Spatrick// OSObject-based attributes.
1035e5dd7070Spatrickdef OSConsumed : InheritableParamAttr {
1036e5dd7070Spatrick  let Spellings = [Clang<"os_consumed">];
1037e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
1038e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
1039e5dd7070Spatrick}
1040e5dd7070Spatrick
1041e5dd7070Spatrickdef OSReturnsRetained : InheritableAttr {
1042e5dd7070Spatrick  let Spellings = [Clang<"os_returns_retained">];
1043e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod, ObjCProperty, ParmVar]>;
1044e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
1045e5dd7070Spatrick}
1046e5dd7070Spatrick
1047e5dd7070Spatrickdef OSReturnsNotRetained : InheritableAttr {
1048e5dd7070Spatrick  let Spellings = [Clang<"os_returns_not_retained">];
1049e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod, ObjCProperty, ParmVar]>;
1050e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
1051e5dd7070Spatrick}
1052e5dd7070Spatrick
1053e5dd7070Spatrickdef OSReturnsRetainedOnZero : InheritableAttr {
1054e5dd7070Spatrick  let Spellings = [Clang<"os_returns_retained_on_zero">];
1055e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
1056e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
1057e5dd7070Spatrick}
1058e5dd7070Spatrick
1059e5dd7070Spatrickdef OSReturnsRetainedOnNonZero : InheritableAttr {
1060e5dd7070Spatrick  let Spellings = [Clang<"os_returns_retained_on_non_zero">];
1061e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
1062e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
1063e5dd7070Spatrick}
1064e5dd7070Spatrick
1065e5dd7070Spatrickdef OSConsumesThis : InheritableAttr {
1066e5dd7070Spatrick  let Spellings = [Clang<"os_consumes_this">];
1067e5dd7070Spatrick  let Subjects = SubjectList<[NonStaticCXXMethod]>;
1068e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
1069ec727ea7Spatrick  let SimpleHandler = 1;
1070e5dd7070Spatrick}
1071e5dd7070Spatrick
1072e5dd7070Spatrickdef Cleanup : InheritableAttr {
1073e5dd7070Spatrick  let Spellings = [GCC<"cleanup">];
1074ec727ea7Spatrick  let Args = [DeclArgument<Function, "FunctionDecl">];
1075e5dd7070Spatrick  let Subjects = SubjectList<[LocalVar]>;
1076e5dd7070Spatrick  let Documentation = [Undocumented];
1077e5dd7070Spatrick}
1078e5dd7070Spatrick
1079ec727ea7Spatrickdef CmseNSEntry : InheritableAttr, TargetSpecificAttr<TargetARM> {
1080ec727ea7Spatrick  let Spellings = [GNU<"cmse_nonsecure_entry">];
1081ec727ea7Spatrick  let Subjects = SubjectList<[Function]>;
1082ec727ea7Spatrick  let LangOpts = [Cmse];
1083ec727ea7Spatrick  let Documentation = [ArmCmseNSEntryDocs];
1084ec727ea7Spatrick}
1085ec727ea7Spatrick
1086ec727ea7Spatrickdef CmseNSCall : TypeAttr, TargetSpecificAttr<TargetARM> {
1087ec727ea7Spatrick  let Spellings = [GNU<"cmse_nonsecure_call">];
1088ec727ea7Spatrick  let LangOpts = [Cmse];
1089ec727ea7Spatrick  let Documentation = [ArmCmseNSCallDocs];
1090ec727ea7Spatrick}
1091ec727ea7Spatrick
1092e5dd7070Spatrickdef Cold : InheritableAttr {
1093e5dd7070Spatrick  let Spellings = [GCC<"cold">];
1094e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1095*12c85518Srobert  let Documentation = [ColdFunctionEntryDocs];
1096a9ac8606Spatrick  let SimpleHandler = 1;
1097e5dd7070Spatrick}
1098e5dd7070Spatrick
1099e5dd7070Spatrickdef Common : InheritableAttr {
1100e5dd7070Spatrick  let Spellings = [GCC<"common">];
1101e5dd7070Spatrick  let Subjects = SubjectList<[Var]>;
1102e5dd7070Spatrick  let Documentation = [Undocumented];
1103e5dd7070Spatrick}
1104e5dd7070Spatrick
1105e5dd7070Spatrickdef Const : InheritableAttr {
1106e5dd7070Spatrick  let Spellings = [GCC<"const">, GCC<"__const">];
1107e5dd7070Spatrick  let Documentation = [Undocumented];
1108ec727ea7Spatrick  let SimpleHandler = 1;
1109e5dd7070Spatrick}
1110e5dd7070Spatrick
1111e5dd7070Spatrickdef ConstInit : InheritableAttr {
1112e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it requires the
1113e5dd7070Spatrick  // CPlusPlus language option.
1114e5dd7070Spatrick  let Spellings = [Keyword<"constinit">,
1115e5dd7070Spatrick                   Clang<"require_constant_initialization", 0>];
1116e5dd7070Spatrick  let Subjects = SubjectList<[GlobalVar], ErrorDiag>;
1117e5dd7070Spatrick  let Accessors = [Accessor<"isConstinit", [Keyword<"constinit">]>];
1118e5dd7070Spatrick  let Documentation = [ConstInitDocs];
1119e5dd7070Spatrick  let LangOpts = [CPlusPlus];
1120ec727ea7Spatrick  let SimpleHandler = 1;
1121e5dd7070Spatrick}
1122e5dd7070Spatrick
1123e5dd7070Spatrickdef Constructor : InheritableAttr {
1124e5dd7070Spatrick  let Spellings = [GCC<"constructor">];
1125e5dd7070Spatrick  let Args = [DefaultIntArgument<"Priority", 65535>];
1126e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1127e5dd7070Spatrick  let Documentation = [Undocumented];
1128e5dd7070Spatrick}
1129e5dd7070Spatrick
1130e5dd7070Spatrickdef CPUSpecific : InheritableAttr {
1131e5dd7070Spatrick  let Spellings = [Clang<"cpu_specific">, Declspec<"cpu_specific">];
1132e5dd7070Spatrick  let Args = [VariadicIdentifierArgument<"Cpus">];
1133e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1134e5dd7070Spatrick  let Documentation = [CPUSpecificCPUDispatchDocs];
1135e5dd7070Spatrick  let AdditionalMembers = [{
1136e5dd7070Spatrick    IdentifierInfo *getCPUName(unsigned Index) const {
1137e5dd7070Spatrick      return *(cpus_begin() + Index);
1138e5dd7070Spatrick    }
1139e5dd7070Spatrick  }];
1140e5dd7070Spatrick}
1141e5dd7070Spatrick
1142e5dd7070Spatrickdef CPUDispatch : InheritableAttr {
1143e5dd7070Spatrick  let Spellings = [Clang<"cpu_dispatch">, Declspec<"cpu_dispatch">];
1144e5dd7070Spatrick  let Args = [VariadicIdentifierArgument<"Cpus">];
1145e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1146e5dd7070Spatrick  let Documentation = [CPUSpecificCPUDispatchDocs];
1147e5dd7070Spatrick}
1148e5dd7070Spatrick
1149e5dd7070Spatrick// CUDA attributes are spelled __attribute__((attr)) or __declspec(__attr__),
1150e5dd7070Spatrick// and they do not receive a [[]] spelling.
1151e5dd7070Spatrickdef CUDAConstant : InheritableAttr {
1152e5dd7070Spatrick  let Spellings = [GNU<"constant">, Declspec<"__constant__">];
1153e5dd7070Spatrick  let Subjects = SubjectList<[Var]>;
1154e5dd7070Spatrick  let LangOpts = [CUDA];
1155e5dd7070Spatrick  let Documentation = [Undocumented];
1156e5dd7070Spatrick}
1157e5dd7070Spatrick
1158e5dd7070Spatrickdef CUDACudartBuiltin : IgnoredAttr {
1159e5dd7070Spatrick  let Spellings = [GNU<"cudart_builtin">, Declspec<"__cudart_builtin__">];
1160e5dd7070Spatrick  let LangOpts = [CUDA];
1161e5dd7070Spatrick}
1162e5dd7070Spatrick
1163e5dd7070Spatrickdef CUDADevice : InheritableAttr {
1164e5dd7070Spatrick  let Spellings = [GNU<"device">, Declspec<"__device__">];
1165e5dd7070Spatrick  let Subjects = SubjectList<[Function, Var]>;
1166e5dd7070Spatrick  let LangOpts = [CUDA];
1167e5dd7070Spatrick  let Documentation = [Undocumented];
1168e5dd7070Spatrick}
1169e5dd7070Spatrick
1170e5dd7070Spatrickdef CUDADeviceBuiltin : IgnoredAttr {
1171e5dd7070Spatrick  let Spellings = [GNU<"device_builtin">, Declspec<"__device_builtin__">];
1172e5dd7070Spatrick  let LangOpts = [CUDA];
1173e5dd7070Spatrick}
1174e5dd7070Spatrick
1175ec727ea7Spatrickdef CUDADeviceBuiltinSurfaceType : InheritableAttr {
1176e5dd7070Spatrick  let Spellings = [GNU<"device_builtin_surface_type">,
1177e5dd7070Spatrick                   Declspec<"__device_builtin_surface_type__">];
1178e5dd7070Spatrick  let LangOpts = [CUDA];
1179ec727ea7Spatrick  let Subjects = SubjectList<[CXXRecord]>;
1180ec727ea7Spatrick  let Documentation = [CUDADeviceBuiltinSurfaceTypeDocs];
1181a9ac8606Spatrick  let MeaningfulToClassTemplateDefinition = 1;
1182a9ac8606Spatrick  let SimpleHandler = 1;
1183e5dd7070Spatrick}
1184e5dd7070Spatrick
1185ec727ea7Spatrickdef CUDADeviceBuiltinTextureType : InheritableAttr {
1186e5dd7070Spatrick  let Spellings = [GNU<"device_builtin_texture_type">,
1187e5dd7070Spatrick                   Declspec<"__device_builtin_texture_type__">];
1188e5dd7070Spatrick  let LangOpts = [CUDA];
1189ec727ea7Spatrick  let Subjects = SubjectList<[CXXRecord]>;
1190ec727ea7Spatrick  let Documentation = [CUDADeviceBuiltinTextureTypeDocs];
1191a9ac8606Spatrick  let MeaningfulToClassTemplateDefinition = 1;
1192a9ac8606Spatrick  let SimpleHandler = 1;
1193e5dd7070Spatrick}
1194a9ac8606Spatrickdef : MutualExclusions<[CUDADeviceBuiltinSurfaceType,
1195a9ac8606Spatrick                        CUDADeviceBuiltinTextureType]>;
1196e5dd7070Spatrick
1197e5dd7070Spatrickdef CUDAGlobal : InheritableAttr {
1198e5dd7070Spatrick  let Spellings = [GNU<"global">, Declspec<"__global__">];
1199e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1200e5dd7070Spatrick  let LangOpts = [CUDA];
1201e5dd7070Spatrick  let Documentation = [Undocumented];
1202e5dd7070Spatrick}
1203a9ac8606Spatrickdef : MutualExclusions<[CUDADevice, CUDAGlobal]>;
1204e5dd7070Spatrick
1205e5dd7070Spatrickdef CUDAHost : InheritableAttr {
1206e5dd7070Spatrick  let Spellings = [GNU<"host">, Declspec<"__host__">];
1207e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1208e5dd7070Spatrick  let LangOpts = [CUDA];
1209e5dd7070Spatrick  let Documentation = [Undocumented];
1210a9ac8606Spatrick  let SimpleHandler = 1;
1211a9ac8606Spatrick}
1212a9ac8606Spatrickdef : MutualExclusions<[CUDAGlobal, CUDAHost]>;
1213a9ac8606Spatrick
1214a9ac8606Spatrickdef HIPManaged : InheritableAttr {
1215a9ac8606Spatrick  let Spellings = [GNU<"managed">, Declspec<"__managed__">];
1216a9ac8606Spatrick  let Subjects = SubjectList<[Var]>;
1217a9ac8606Spatrick  let LangOpts = [HIP];
1218a9ac8606Spatrick  let Documentation = [HIPManagedAttrDocs];
1219e5dd7070Spatrick}
1220e5dd7070Spatrick
1221e5dd7070Spatrickdef CUDAInvalidTarget : InheritableAttr {
1222e5dd7070Spatrick  let Spellings = [];
1223e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1224e5dd7070Spatrick  let LangOpts = [CUDA];
1225*12c85518Srobert  let Documentation = [InternalOnly];
1226e5dd7070Spatrick}
1227e5dd7070Spatrick
1228e5dd7070Spatrickdef CUDALaunchBounds : InheritableAttr {
1229e5dd7070Spatrick  let Spellings = [GNU<"launch_bounds">, Declspec<"__launch_bounds__">];
1230e5dd7070Spatrick  let Args = [ExprArgument<"MaxThreads">, ExprArgument<"MinBlocks", 1>];
1231e5dd7070Spatrick  let LangOpts = [CUDA];
1232e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod, FunctionLike]>;
1233e5dd7070Spatrick  // An AST node is created for this attribute, but is not used by other parts
1234e5dd7070Spatrick  // of the compiler. However, this node needs to exist in the AST because
1235e5dd7070Spatrick  // non-LLVM backends may be relying on the attribute's presence.
1236e5dd7070Spatrick  let Documentation = [Undocumented];
1237e5dd7070Spatrick}
1238e5dd7070Spatrick
1239e5dd7070Spatrickdef CUDAShared : InheritableAttr {
1240e5dd7070Spatrick  let Spellings = [GNU<"shared">, Declspec<"__shared__">];
1241e5dd7070Spatrick  let Subjects = SubjectList<[Var]>;
1242e5dd7070Spatrick  let LangOpts = [CUDA];
1243e5dd7070Spatrick  let Documentation = [Undocumented];
1244e5dd7070Spatrick}
1245a9ac8606Spatrickdef : MutualExclusions<[CUDAConstant, CUDAShared, HIPManaged]>;
1246e5dd7070Spatrick
1247e5dd7070Spatrickdef SYCLKernel : InheritableAttr {
1248e5dd7070Spatrick  let Spellings = [Clang<"sycl_kernel">];
1249e5dd7070Spatrick  let Subjects = SubjectList<[FunctionTmpl]>;
1250e5dd7070Spatrick  let LangOpts = [SYCL];
1251e5dd7070Spatrick  let Documentation = [SYCLKernelDocs];
1252e5dd7070Spatrick}
1253e5dd7070Spatrick
1254*12c85518Srobertdef SYCLSpecialClass: InheritableAttr {
1255*12c85518Srobert  let Spellings = [Clang<"sycl_special_class">];
1256*12c85518Srobert  let Subjects = SubjectList<[CXXRecord]>;
1257*12c85518Srobert  let LangOpts = [SYCL];
1258*12c85518Srobert  let Documentation = [SYCLSpecialClassDocs];
1259*12c85518Srobert}
1260*12c85518Srobert
1261e5dd7070Spatrickdef C11NoReturn : InheritableAttr {
1262e5dd7070Spatrick  let Spellings = [Keyword<"_Noreturn">];
1263e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1264e5dd7070Spatrick  let SemaHandler = 0;
1265e5dd7070Spatrick  let Documentation = [C11NoReturnDocs];
1266e5dd7070Spatrick}
1267e5dd7070Spatrick
1268e5dd7070Spatrickdef CXX11NoReturn : InheritableAttr {
1269*12c85518Srobert  let Spellings = [CXX11<"", "noreturn", 200809>,
1270*12c85518Srobert                   C2x<"", "noreturn", 202202>, C2x<"", "_Noreturn", 202202>];
1271e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1272e5dd7070Spatrick  let Documentation = [CXX11NoReturnDocs];
1273e5dd7070Spatrick}
1274e5dd7070Spatrick
1275e5dd7070Spatrick// Similar to CUDA, OpenCL attributes do not receive a [[]] spelling because
1276e5dd7070Spatrick// the specification does not expose them with one currently.
1277e5dd7070Spatrickdef OpenCLKernel : InheritableAttr {
1278e5dd7070Spatrick  let Spellings = [Keyword<"__kernel">, Keyword<"kernel">];
1279e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1280e5dd7070Spatrick  let Documentation = [Undocumented];
1281ec727ea7Spatrick  let SimpleHandler = 1;
1282e5dd7070Spatrick}
1283e5dd7070Spatrick
1284a9ac8606Spatrickdef OpenCLUnrollHint : StmtAttr {
1285e5dd7070Spatrick  let Spellings = [GNU<"opencl_unroll_hint">];
1286a9ac8606Spatrick  let Subjects = SubjectList<[ForStmt, CXXForRangeStmt, WhileStmt, DoStmt],
1287a9ac8606Spatrick                             ErrorDiag, "'for', 'while', and 'do' statements">;
1288a9ac8606Spatrick  let Args = [UnsignedArgument<"UnrollHint", /*opt*/1>];
1289e5dd7070Spatrick  let Documentation = [OpenCLUnrollHintDocs];
1290e5dd7070Spatrick}
1291e5dd7070Spatrick
1292e5dd7070Spatrickdef OpenCLIntelReqdSubGroupSize: InheritableAttr {
1293e5dd7070Spatrick  let Spellings = [GNU<"intel_reqd_sub_group_size">];
1294e5dd7070Spatrick  let Args = [UnsignedArgument<"SubGroupSize">];
1295e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1296e5dd7070Spatrick  let Documentation = [OpenCLIntelReqdSubGroupSizeDocs];
1297e5dd7070Spatrick}
1298e5dd7070Spatrick
1299e5dd7070Spatrick// This attribute is both a type attribute, and a declaration attribute (for
1300e5dd7070Spatrick// parameter variables).
1301e5dd7070Spatrickdef OpenCLAccess : Attr {
1302e5dd7070Spatrick  let Spellings = [Keyword<"__read_only">, Keyword<"read_only">,
1303e5dd7070Spatrick                   Keyword<"__write_only">, Keyword<"write_only">,
1304e5dd7070Spatrick                   Keyword<"__read_write">, Keyword<"read_write">];
1305e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar, TypedefName], ErrorDiag>;
1306e5dd7070Spatrick  let Accessors = [Accessor<"isReadOnly", [Keyword<"__read_only">,
1307e5dd7070Spatrick                                           Keyword<"read_only">]>,
1308e5dd7070Spatrick                   Accessor<"isReadWrite", [Keyword<"__read_write">,
1309e5dd7070Spatrick                                            Keyword<"read_write">]>,
1310e5dd7070Spatrick                   Accessor<"isWriteOnly", [Keyword<"__write_only">,
1311e5dd7070Spatrick                                            Keyword<"write_only">]>];
1312e5dd7070Spatrick  let Documentation = [OpenCLAccessDocs];
1313e5dd7070Spatrick}
1314e5dd7070Spatrick
1315e5dd7070Spatrickdef OpenCLPrivateAddressSpace : TypeAttr {
1316e5dd7070Spatrick  let Spellings = [Keyword<"__private">, Keyword<"private">, Clang<"opencl_private">];
1317e5dd7070Spatrick  let Documentation = [OpenCLAddressSpacePrivateDocs];
1318e5dd7070Spatrick}
1319e5dd7070Spatrick
1320e5dd7070Spatrickdef OpenCLGlobalAddressSpace : TypeAttr {
1321e5dd7070Spatrick  let Spellings = [Keyword<"__global">, Keyword<"global">, Clang<"opencl_global">];
1322e5dd7070Spatrick  let Documentation = [OpenCLAddressSpaceGlobalDocs];
1323e5dd7070Spatrick}
1324e5dd7070Spatrick
1325a9ac8606Spatrickdef OpenCLGlobalDeviceAddressSpace : TypeAttr {
1326a9ac8606Spatrick  let Spellings = [Clang<"opencl_global_device">];
1327a9ac8606Spatrick  let Documentation = [OpenCLAddressSpaceGlobalExtDocs];
1328a9ac8606Spatrick}
1329a9ac8606Spatrick
1330a9ac8606Spatrickdef OpenCLGlobalHostAddressSpace : TypeAttr {
1331a9ac8606Spatrick  let Spellings = [Clang<"opencl_global_host">];
1332a9ac8606Spatrick  let Documentation = [OpenCLAddressSpaceGlobalExtDocs];
1333a9ac8606Spatrick}
1334a9ac8606Spatrick
1335e5dd7070Spatrickdef OpenCLLocalAddressSpace : TypeAttr {
1336e5dd7070Spatrick  let Spellings = [Keyword<"__local">, Keyword<"local">, Clang<"opencl_local">];
1337e5dd7070Spatrick  let Documentation = [OpenCLAddressSpaceLocalDocs];
1338e5dd7070Spatrick}
1339e5dd7070Spatrick
1340e5dd7070Spatrickdef OpenCLConstantAddressSpace : TypeAttr {
1341e5dd7070Spatrick  let Spellings = [Keyword<"__constant">, Keyword<"constant">, Clang<"opencl_constant">];
1342e5dd7070Spatrick  let Documentation = [OpenCLAddressSpaceConstantDocs];
1343e5dd7070Spatrick}
1344e5dd7070Spatrick
1345e5dd7070Spatrickdef OpenCLGenericAddressSpace : TypeAttr {
1346e5dd7070Spatrick  let Spellings = [Keyword<"__generic">, Keyword<"generic">, Clang<"opencl_generic">];
1347e5dd7070Spatrick  let Documentation = [OpenCLAddressSpaceGenericDocs];
1348e5dd7070Spatrick}
1349e5dd7070Spatrick
1350e5dd7070Spatrickdef OpenCLNoSVM : Attr {
1351e5dd7070Spatrick  let Spellings = [GNU<"nosvm">];
1352e5dd7070Spatrick  let Subjects = SubjectList<[Var]>;
1353e5dd7070Spatrick  let Documentation = [OpenCLNoSVMDocs];
1354e5dd7070Spatrick  let LangOpts = [OpenCL];
1355e5dd7070Spatrick  let ASTNode = 0;
1356e5dd7070Spatrick}
1357e5dd7070Spatrick
1358e5dd7070Spatrickdef RenderScriptKernel : Attr {
1359e5dd7070Spatrick  let Spellings = [GNU<"kernel">];
1360e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1361e5dd7070Spatrick  let Documentation = [RenderScriptKernelAttributeDocs];
1362e5dd7070Spatrick  let LangOpts = [RenderScript];
1363ec727ea7Spatrick  let SimpleHandler = 1;
1364e5dd7070Spatrick}
1365e5dd7070Spatrick
1366e5dd7070Spatrickdef Deprecated : InheritableAttr {
1367e5dd7070Spatrick  let Spellings = [GCC<"deprecated">, Declspec<"deprecated">,
1368a9ac8606Spatrick                   CXX11<"","deprecated", 201309>,
1369a9ac8606Spatrick                   C2x<"", "deprecated", 201904>];
1370e5dd7070Spatrick  let Args = [StringArgument<"Message", 1>,
1371e5dd7070Spatrick              // An optional string argument that enables us to provide a
1372e5dd7070Spatrick              // Fix-It.
1373e5dd7070Spatrick              StringArgument<"Replacement", 1>];
1374e5dd7070Spatrick  let MeaningfulToClassTemplateDefinition = 1;
1375e5dd7070Spatrick  let Documentation = [DeprecatedDocs];
1376e5dd7070Spatrick}
1377e5dd7070Spatrick
1378e5dd7070Spatrickdef Destructor : InheritableAttr {
1379e5dd7070Spatrick  let Spellings = [GCC<"destructor">];
1380e5dd7070Spatrick  let Args = [DefaultIntArgument<"Priority", 65535>];
1381e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1382e5dd7070Spatrick  let Documentation = [Undocumented];
1383e5dd7070Spatrick}
1384e5dd7070Spatrick
1385e5dd7070Spatrickdef EmptyBases : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
1386e5dd7070Spatrick  let Spellings = [Declspec<"empty_bases">];
1387e5dd7070Spatrick  let Subjects = SubjectList<[CXXRecord]>;
1388e5dd7070Spatrick  let Documentation = [EmptyBasesDocs];
1389ec727ea7Spatrick  let SimpleHandler = 1;
1390e5dd7070Spatrick}
1391e5dd7070Spatrick
1392e5dd7070Spatrickdef AllocSize : InheritableAttr {
1393e5dd7070Spatrick  let Spellings = [GCC<"alloc_size">];
1394a9ac8606Spatrick  let Subjects = SubjectList<[HasFunctionProto]>;
1395e5dd7070Spatrick  let Args = [ParamIdxArgument<"ElemSizeParam">,
1396e5dd7070Spatrick              ParamIdxArgument<"NumElemsParam", /*opt*/ 1>];
1397e5dd7070Spatrick  let TemplateDependent = 1;
1398e5dd7070Spatrick  let Documentation = [AllocSizeDocs];
1399e5dd7070Spatrick}
1400e5dd7070Spatrick
1401e5dd7070Spatrickdef EnableIf : InheritableAttr {
1402e5dd7070Spatrick  // Does not have a [[]] spelling because this attribute requires the ability
1403e5dd7070Spatrick  // to parse function arguments but the attribute is not written in the type
1404e5dd7070Spatrick  // position.
1405e5dd7070Spatrick  let Spellings = [GNU<"enable_if">];
1406e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1407e5dd7070Spatrick  let Args = [ExprArgument<"Cond">, StringArgument<"Message">];
1408e5dd7070Spatrick  let TemplateDependent = 1;
1409e5dd7070Spatrick  let Documentation = [EnableIfDocs];
1410e5dd7070Spatrick}
1411e5dd7070Spatrick
1412e5dd7070Spatrickdef ExtVectorType : Attr {
1413e5dd7070Spatrick  // This is an OpenCL-related attribute and does not receive a [[]] spelling.
1414e5dd7070Spatrick  let Spellings = [GNU<"ext_vector_type">];
1415e5dd7070Spatrick  // FIXME: This subject list is wrong; this is a type attribute.
1416e5dd7070Spatrick  let Subjects = SubjectList<[TypedefName], ErrorDiag>;
1417e5dd7070Spatrick  let Args = [ExprArgument<"NumElements">];
1418e5dd7070Spatrick  let ASTNode = 0;
1419e5dd7070Spatrick  let Documentation = [Undocumented];
1420e5dd7070Spatrick  // This is a type attribute with an incorrect subject list, so should not be
1421e5dd7070Spatrick  // permitted by #pragma clang attribute.
1422e5dd7070Spatrick  let PragmaAttributeSupport = 0;
1423e5dd7070Spatrick}
1424e5dd7070Spatrick
1425e5dd7070Spatrickdef FallThrough : StmtAttr {
1426a9ac8606Spatrick  let Spellings = [CXX11<"", "fallthrough", 201603>,
1427*12c85518Srobert                   C2x<"", "fallthrough", 201910>,
1428e5dd7070Spatrick                   CXX11<"clang", "fallthrough">, GCC<"fallthrough">];
1429a9ac8606Spatrick  // The attribute only applies to a NullStmt, but we have special fix-it
1430a9ac8606Spatrick  // behavior if applied to a case label.
1431a9ac8606Spatrick  let Subjects = SubjectList<[NullStmt, SwitchCase], ErrorDiag,
1432a9ac8606Spatrick                             "empty statements">;
1433e5dd7070Spatrick  let Documentation = [FallthroughDocs];
1434e5dd7070Spatrick}
1435e5dd7070Spatrick
1436a9ac8606Spatrickdef Likely : StmtAttr {
1437a9ac8606Spatrick  let Spellings = [CXX11<"", "likely", 201803>, C2x<"clang", "likely">];
1438a9ac8606Spatrick  let Documentation = [LikelihoodDocs];
1439a9ac8606Spatrick}
1440a9ac8606Spatrick
1441a9ac8606Spatrickdef Unlikely : StmtAttr {
1442a9ac8606Spatrick  let Spellings = [CXX11<"", "unlikely", 201803>, C2x<"clang", "unlikely">];
1443a9ac8606Spatrick  let Documentation = [LikelihoodDocs];
1444a9ac8606Spatrick}
1445a9ac8606Spatrickdef : MutualExclusions<[Likely, Unlikely]>;
1446a9ac8606Spatrick
1447a9ac8606Spatrickdef NoMerge : DeclOrStmtAttr {
1448ec727ea7Spatrick  let Spellings = [Clang<"nomerge">];
1449ec727ea7Spatrick  let Documentation = [NoMergeDocs];
1450a9ac8606Spatrick  let Subjects = SubjectList<[Function, Stmt], ErrorDiag,
1451a9ac8606Spatrick                             "functions and statements">;
1452a9ac8606Spatrick  let SimpleHandler = 1;
1453a9ac8606Spatrick}
1454a9ac8606Spatrick
1455a9ac8606Spatrickdef MustTail : StmtAttr {
1456a9ac8606Spatrick  let Spellings = [Clang<"musttail">];
1457a9ac8606Spatrick  let Documentation = [MustTailDocs];
1458a9ac8606Spatrick  let Subjects = SubjectList<[ReturnStmt], ErrorDiag, "return statements">;
1459ec727ea7Spatrick}
1460ec727ea7Spatrick
1461e5dd7070Spatrickdef FastCall : DeclOrTypeAttr {
1462e5dd7070Spatrick  let Spellings = [GCC<"fastcall">, Keyword<"__fastcall">,
1463e5dd7070Spatrick                   Keyword<"_fastcall">];
1464e5dd7070Spatrick//  let Subjects = [Function, ObjCMethod];
1465e5dd7070Spatrick  let Documentation = [FastCallDocs];
1466e5dd7070Spatrick}
1467e5dd7070Spatrick
1468e5dd7070Spatrickdef RegCall : DeclOrTypeAttr {
1469e5dd7070Spatrick  let Spellings = [GCC<"regcall">, Keyword<"__regcall">];
1470e5dd7070Spatrick  let Documentation = [RegCallDocs];
1471e5dd7070Spatrick}
1472e5dd7070Spatrick
1473e5dd7070Spatrickdef Final : InheritableAttr {
1474e5dd7070Spatrick  let Spellings = [Keyword<"final">, Keyword<"sealed">];
1475e5dd7070Spatrick  let Accessors = [Accessor<"isSpelledAsSealed", [Keyword<"sealed">]>];
1476e5dd7070Spatrick  let SemaHandler = 0;
1477*12c85518Srobert  // Omitted from docs, since this is language syntax, not an attribute, as far
1478*12c85518Srobert  // as users are concerned.
1479*12c85518Srobert  let Documentation = [InternalOnly];
1480e5dd7070Spatrick}
1481e5dd7070Spatrick
1482e5dd7070Spatrickdef MinSize : InheritableAttr {
1483e5dd7070Spatrick  let Spellings = [Clang<"minsize">];
1484e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>;
1485*12c85518Srobert  let Documentation = [MinSizeDocs];
1486e5dd7070Spatrick}
1487e5dd7070Spatrick
1488e5dd7070Spatrickdef FlagEnum : InheritableAttr {
1489e5dd7070Spatrick  let Spellings = [Clang<"flag_enum">];
1490e5dd7070Spatrick  let Subjects = SubjectList<[Enum]>;
1491e5dd7070Spatrick  let Documentation = [FlagEnumDocs];
1492ec727ea7Spatrick  let SimpleHandler = 1;
1493e5dd7070Spatrick}
1494e5dd7070Spatrick
1495e5dd7070Spatrickdef EnumExtensibility : InheritableAttr {
1496e5dd7070Spatrick  let Spellings = [Clang<"enum_extensibility">];
1497e5dd7070Spatrick  let Subjects = SubjectList<[Enum]>;
1498e5dd7070Spatrick  let Args = [EnumArgument<"Extensibility", "Kind",
1499e5dd7070Spatrick              ["closed", "open"], ["Closed", "Open"]>];
1500e5dd7070Spatrick  let Documentation = [EnumExtensibilityDocs];
1501e5dd7070Spatrick}
1502e5dd7070Spatrick
1503e5dd7070Spatrickdef Flatten : InheritableAttr {
1504e5dd7070Spatrick  let Spellings = [GCC<"flatten">];
1505e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1506e5dd7070Spatrick  let Documentation = [FlattenDocs];
1507ec727ea7Spatrick  let SimpleHandler = 1;
1508e5dd7070Spatrick}
1509e5dd7070Spatrick
1510e5dd7070Spatrickdef Format : InheritableAttr {
1511e5dd7070Spatrick  let Spellings = [GCC<"format">];
1512e5dd7070Spatrick  let Args = [IdentifierArgument<"Type">, IntArgument<"FormatIdx">,
1513e5dd7070Spatrick              IntArgument<"FirstArg">];
1514e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod, Block, HasFunctionProto]>;
1515e5dd7070Spatrick  let Documentation = [FormatDocs];
1516e5dd7070Spatrick}
1517e5dd7070Spatrick
1518e5dd7070Spatrickdef FormatArg : InheritableAttr {
1519e5dd7070Spatrick  let Spellings = [GCC<"format_arg">];
1520e5dd7070Spatrick  let Args = [ParamIdxArgument<"FormatIdx">];
1521e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod, HasFunctionProto]>;
1522e5dd7070Spatrick  let Documentation = [Undocumented];
1523e5dd7070Spatrick}
1524e5dd7070Spatrick
1525e5dd7070Spatrickdef Callback : InheritableAttr {
1526e5dd7070Spatrick  let Spellings = [Clang<"callback">];
1527e5dd7070Spatrick  let Args = [VariadicParamOrParamIdxArgument<"Encoding">];
1528e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1529e5dd7070Spatrick  let Documentation = [CallbackDocs];
1530e5dd7070Spatrick}
1531e5dd7070Spatrick
1532e5dd7070Spatrickdef GNUInline : InheritableAttr {
1533e5dd7070Spatrick  let Spellings = [GCC<"gnu_inline">];
1534e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1535e5dd7070Spatrick  let Documentation = [GnuInlineDocs];
1536e5dd7070Spatrick}
1537e5dd7070Spatrick
1538e5dd7070Spatrickdef Hot : InheritableAttr {
1539e5dd7070Spatrick  let Spellings = [GCC<"hot">];
1540e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1541*12c85518Srobert  let Documentation = [HotFunctionEntryDocs];
1542a9ac8606Spatrick  let SimpleHandler = 1;
1543e5dd7070Spatrick}
1544a9ac8606Spatrickdef : MutualExclusions<[Hot, Cold]>;
1545e5dd7070Spatrick
1546e5dd7070Spatrickdef IBAction : InheritableAttr {
1547e5dd7070Spatrick  let Spellings = [Clang<"ibaction">];
1548e5dd7070Spatrick  let Subjects = SubjectList<[ObjCInstanceMethod]>;
1549e5dd7070Spatrick  // An AST node is created for this attribute, but is not used by other parts
1550e5dd7070Spatrick  // of the compiler. However, this node needs to exist in the AST because
1551e5dd7070Spatrick  // external tools rely on it.
1552e5dd7070Spatrick  let Documentation = [Undocumented];
1553ec727ea7Spatrick  let SimpleHandler = 1;
1554e5dd7070Spatrick}
1555e5dd7070Spatrick
1556e5dd7070Spatrickdef IBOutlet : InheritableAttr {
1557e5dd7070Spatrick  let Spellings = [Clang<"iboutlet">];
1558e5dd7070Spatrick//  let Subjects = [ObjCIvar, ObjCProperty];
1559e5dd7070Spatrick  let Documentation = [Undocumented];
1560e5dd7070Spatrick}
1561e5dd7070Spatrick
1562e5dd7070Spatrickdef IBOutletCollection : InheritableAttr {
1563e5dd7070Spatrick  let Spellings = [Clang<"iboutletcollection">];
1564e5dd7070Spatrick  let Args = [TypeArgument<"Interface", 1>];
1565e5dd7070Spatrick//  let Subjects = [ObjCIvar, ObjCProperty];
1566e5dd7070Spatrick  let Documentation = [Undocumented];
1567e5dd7070Spatrick}
1568e5dd7070Spatrick
1569e5dd7070Spatrickdef IFunc : Attr, TargetSpecificAttr<TargetELF> {
1570e5dd7070Spatrick  let Spellings = [GCC<"ifunc">];
1571e5dd7070Spatrick  let Args = [StringArgument<"Resolver">];
1572e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1573e5dd7070Spatrick  let Documentation = [IFuncDocs];
1574e5dd7070Spatrick}
1575e5dd7070Spatrick
1576e5dd7070Spatrickdef Restrict : InheritableAttr {
1577e5dd7070Spatrick  let Spellings = [Declspec<"restrict">, GCC<"malloc">];
1578e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1579a9ac8606Spatrick  let Documentation = [RestrictDocs];
1580e5dd7070Spatrick}
1581e5dd7070Spatrick
1582e5dd7070Spatrickdef LayoutVersion : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
1583e5dd7070Spatrick  let Spellings = [Declspec<"layout_version">];
1584e5dd7070Spatrick  let Args = [UnsignedArgument<"Version">];
1585e5dd7070Spatrick  let Subjects = SubjectList<[CXXRecord]>;
1586e5dd7070Spatrick  let Documentation = [LayoutVersionDocs];
1587e5dd7070Spatrick}
1588e5dd7070Spatrick
1589a9ac8606Spatrickdef Leaf : InheritableAttr {
1590a9ac8606Spatrick  let Spellings = [GCC<"leaf">];
1591a9ac8606Spatrick  let Subjects = SubjectList<[Function]>;
1592a9ac8606Spatrick  let Documentation = [LeafDocs];
1593a9ac8606Spatrick  let SimpleHandler = 1;
1594a9ac8606Spatrick}
1595a9ac8606Spatrick
1596e5dd7070Spatrickdef LifetimeBound : DeclOrTypeAttr {
1597e5dd7070Spatrick  let Spellings = [Clang<"lifetimebound", 0>];
1598e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar, ImplicitObjectParameter], ErrorDiag>;
1599e5dd7070Spatrick  let Documentation = [LifetimeBoundDocs];
1600e5dd7070Spatrick  let LangOpts = [CPlusPlus];
1601ec727ea7Spatrick  let SimpleHandler = 1;
1602e5dd7070Spatrick}
1603e5dd7070Spatrick
1604e5dd7070Spatrickdef TrivialABI : InheritableAttr {
1605e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it requires the
1606e5dd7070Spatrick  // CPlusPlus language option.
1607e5dd7070Spatrick  let Spellings = [Clang<"trivial_abi", 0>];
1608e5dd7070Spatrick  let Subjects = SubjectList<[CXXRecord]>;
1609e5dd7070Spatrick  let Documentation = [TrivialABIDocs];
1610e5dd7070Spatrick  let LangOpts = [CPlusPlus];
1611ec727ea7Spatrick  let SimpleHandler = 1;
1612e5dd7070Spatrick}
1613e5dd7070Spatrick
1614e5dd7070Spatrickdef MaxFieldAlignment : InheritableAttr {
1615e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
1616e5dd7070Spatrick  let Spellings = [];
1617e5dd7070Spatrick  let Args = [UnsignedArgument<"Alignment">];
1618e5dd7070Spatrick  let SemaHandler = 0;
1619*12c85518Srobert  let Documentation = [InternalOnly];
1620e5dd7070Spatrick}
1621e5dd7070Spatrick
1622e5dd7070Spatrickdef MayAlias : InheritableAttr {
1623e5dd7070Spatrick  // FIXME: this is a type attribute in GCC, but a declaration attribute here.
1624e5dd7070Spatrick  let Spellings = [GCC<"may_alias">];
1625e5dd7070Spatrick  let Documentation = [Undocumented];
1626ec727ea7Spatrick  let SimpleHandler = 1;
1627e5dd7070Spatrick}
1628e5dd7070Spatrick
1629e5dd7070Spatrickdef MIGServerRoutine : InheritableAttr {
1630e5dd7070Spatrick  let Spellings = [Clang<"mig_server_routine">];
1631e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod, Block]>;
1632e5dd7070Spatrick  let Documentation = [MIGConventionDocs];
1633e5dd7070Spatrick}
1634e5dd7070Spatrick
1635e5dd7070Spatrickdef MSABI : DeclOrTypeAttr {
1636e5dd7070Spatrick  let Spellings = [GCC<"ms_abi">];
1637e5dd7070Spatrick//  let Subjects = [Function, ObjCMethod];
1638e5dd7070Spatrick  let Documentation = [MSABIDocs];
1639e5dd7070Spatrick}
1640e5dd7070Spatrick
1641e5dd7070Spatrickdef MSP430Interrupt : InheritableAttr, TargetSpecificAttr<TargetMSP430> {
1642a9ac8606Spatrick  // NOTE: If you add any additional spellings, ARMInterrupt's, M68kInterrupt's,
1643a9ac8606Spatrick  // MipsInterrupt's and AnyX86Interrupt's spellings must match.
1644e5dd7070Spatrick  let Spellings = [GCC<"interrupt">];
1645e5dd7070Spatrick  let Args = [UnsignedArgument<"Number">];
1646e5dd7070Spatrick  let ParseKind = "Interrupt";
1647e5dd7070Spatrick  let HasCustomParsing = 1;
1648e5dd7070Spatrick  let Documentation = [Undocumented];
1649e5dd7070Spatrick}
1650e5dd7070Spatrick
1651e5dd7070Spatrickdef Mips16 : InheritableAttr, TargetSpecificAttr<TargetMips32> {
1652e5dd7070Spatrick  let Spellings = [GCC<"mips16">];
1653e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1654e5dd7070Spatrick  let Documentation = [Undocumented];
1655a9ac8606Spatrick  let SimpleHandler = 1;
1656e5dd7070Spatrick}
1657e5dd7070Spatrick
1658e5dd7070Spatrickdef MipsInterrupt : InheritableAttr, TargetSpecificAttr<TargetMips32> {
1659e5dd7070Spatrick  // NOTE: If you add any additional spellings, ARMInterrupt's,
1660a9ac8606Spatrick  // M68kInterrupt's, MSP430Interrupt's and AnyX86Interrupt's spellings
1661a9ac8606Spatrick  // must match.
1662e5dd7070Spatrick  let Spellings = [GCC<"interrupt">];
1663e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1664e5dd7070Spatrick  let Args = [EnumArgument<"Interrupt", "InterruptType",
1665e5dd7070Spatrick                           ["vector=sw0", "vector=sw1", "vector=hw0",
1666e5dd7070Spatrick                            "vector=hw1", "vector=hw2", "vector=hw3",
1667e5dd7070Spatrick                            "vector=hw4", "vector=hw5", "eic", ""],
1668e5dd7070Spatrick                           ["sw0", "sw1", "hw0", "hw1", "hw2", "hw3",
1669e5dd7070Spatrick                            "hw4", "hw5", "eic", "eic"]
1670e5dd7070Spatrick                           >];
1671e5dd7070Spatrick  let ParseKind = "Interrupt";
1672e5dd7070Spatrick  let Documentation = [MipsInterruptDocs];
1673e5dd7070Spatrick}
1674a9ac8606Spatrickdef : MutualExclusions<[Mips16, MipsInterrupt]>;
1675e5dd7070Spatrick
1676e5dd7070Spatrickdef MicroMips : InheritableAttr, TargetSpecificAttr<TargetMips32> {
1677e5dd7070Spatrick  let Spellings = [GCC<"micromips">];
1678e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1679e5dd7070Spatrick  let Documentation = [MicroMipsDocs];
1680a9ac8606Spatrick  let SimpleHandler = 1;
1681e5dd7070Spatrick}
1682a9ac8606Spatrickdef : MutualExclusions<[Mips16, MicroMips]>;
1683e5dd7070Spatrick
1684e5dd7070Spatrickdef MipsLongCall : InheritableAttr, TargetSpecificAttr<TargetAnyMips> {
1685e5dd7070Spatrick  let Spellings = [GCC<"long_call">, GCC<"far">];
1686e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1687e5dd7070Spatrick  let Documentation = [MipsLongCallStyleDocs];
1688a9ac8606Spatrick  let SimpleHandler = 1;
1689e5dd7070Spatrick}
1690e5dd7070Spatrick
1691e5dd7070Spatrickdef MipsShortCall : InheritableAttr, TargetSpecificAttr<TargetAnyMips> {
1692e5dd7070Spatrick  let Spellings = [GCC<"short_call">, GCC<"near">];
1693e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1694e5dd7070Spatrick  let Documentation = [MipsShortCallStyleDocs];
1695a9ac8606Spatrick  let SimpleHandler = 1;
1696a9ac8606Spatrick}
1697a9ac8606Spatrickdef : MutualExclusions<[MipsLongCall, MipsShortCall]>;
1698a9ac8606Spatrick
1699a9ac8606Spatrickdef M68kInterrupt : InheritableAttr, TargetSpecificAttr<TargetM68k> {
1700a9ac8606Spatrick  // NOTE: If you add any additional spellings, ARMInterrupt's, MipsInterrupt's
1701a9ac8606Spatrick  // MSP430Interrupt's and AnyX86Interrupt's spellings must match.
1702a9ac8606Spatrick  let Spellings = [GNU<"interrupt">];
1703a9ac8606Spatrick  let Args = [UnsignedArgument<"Number">];
1704a9ac8606Spatrick  let ParseKind = "Interrupt";
1705a9ac8606Spatrick  let HasCustomParsing = 1;
1706a9ac8606Spatrick  let Documentation = [Undocumented];
1707e5dd7070Spatrick}
1708e5dd7070Spatrick
1709e5dd7070Spatrickdef Mode : Attr {
1710e5dd7070Spatrick  let Spellings = [GCC<"mode">];
1711e5dd7070Spatrick  let Subjects = SubjectList<[Var, Enum, TypedefName, Field], ErrorDiag>;
1712e5dd7070Spatrick  let Args = [IdentifierArgument<"Mode">];
1713e5dd7070Spatrick  let Documentation = [Undocumented];
1714e5dd7070Spatrick  // This is notionally a type attribute, which #pragma clang attribute
1715e5dd7070Spatrick  // generally does not support.
1716e5dd7070Spatrick  let PragmaAttributeSupport = 0;
1717e5dd7070Spatrick}
1718e5dd7070Spatrick
1719e5dd7070Spatrickdef Naked : InheritableAttr {
1720e5dd7070Spatrick  let Spellings = [GCC<"naked">, Declspec<"naked">];
1721e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1722e5dd7070Spatrick  let Documentation = [Undocumented];
1723e5dd7070Spatrick}
1724e5dd7070Spatrick
1725e5dd7070Spatrickdef NeonPolyVectorType : TypeAttr {
1726e5dd7070Spatrick  let Spellings = [Clang<"neon_polyvector_type">];
1727e5dd7070Spatrick  let Args = [IntArgument<"NumElements">];
1728e5dd7070Spatrick  let Documentation = [Undocumented];
1729e5dd7070Spatrick  // Represented as VectorType instead.
1730e5dd7070Spatrick  let ASTNode = 0;
1731e5dd7070Spatrick}
1732e5dd7070Spatrick
1733e5dd7070Spatrickdef NeonVectorType : TypeAttr {
1734e5dd7070Spatrick  let Spellings = [Clang<"neon_vector_type">];
1735e5dd7070Spatrick  let Args = [IntArgument<"NumElements">];
1736e5dd7070Spatrick  let Documentation = [Undocumented];
1737e5dd7070Spatrick  // Represented as VectorType instead.
1738e5dd7070Spatrick  let ASTNode = 0;
1739e5dd7070Spatrick}
1740e5dd7070Spatrick
1741a9ac8606Spatrickdef ArmSveVectorBits : TypeAttr {
1742a9ac8606Spatrick  let Spellings = [GNU<"arm_sve_vector_bits">];
1743a9ac8606Spatrick  let Subjects = SubjectList<[TypedefName], ErrorDiag>;
1744a9ac8606Spatrick  let Args = [UnsignedArgument<"NumBits">];
1745a9ac8606Spatrick  let Documentation = [ArmSveVectorBitsDocs];
1746a9ac8606Spatrick  let PragmaAttributeSupport = 0;
1747a9ac8606Spatrick  // Represented as VectorType instead.
1748a9ac8606Spatrick  let ASTNode = 0;
1749a9ac8606Spatrick}
1750a9ac8606Spatrick
1751ec727ea7Spatrickdef ArmMveStrictPolymorphism : TypeAttr, TargetSpecificAttr<TargetARM> {
1752ec727ea7Spatrick  let Spellings = [Clang<"__clang_arm_mve_strict_polymorphism">];
1753ec727ea7Spatrick  let Documentation = [ArmMveStrictPolymorphismDocs];
1754ec727ea7Spatrick}
1755ec727ea7Spatrick
1756e5dd7070Spatrickdef NoUniqueAddress : InheritableAttr, TargetSpecificAttr<TargetItaniumCXXABI> {
1757e5dd7070Spatrick  let Spellings = [CXX11<"", "no_unique_address", 201803>];
1758e5dd7070Spatrick  let Subjects = SubjectList<[NonBitField], ErrorDiag>;
1759e5dd7070Spatrick  let Documentation = [NoUniqueAddressDocs];
1760ec727ea7Spatrick  let SimpleHandler = 1;
1761e5dd7070Spatrick}
1762e5dd7070Spatrick
1763e5dd7070Spatrickdef ReturnsTwice : InheritableAttr {
1764e5dd7070Spatrick  let Spellings = [GCC<"returns_twice">];
1765e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1766e5dd7070Spatrick  let Documentation = [Undocumented];
1767ec727ea7Spatrick  let SimpleHandler = 1;
1768e5dd7070Spatrick}
1769e5dd7070Spatrick
1770e5dd7070Spatrickdef DisableTailCalls : InheritableAttr {
1771e5dd7070Spatrick  let Spellings = [Clang<"disable_tail_calls">];
1772e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod]>;
1773e5dd7070Spatrick  let Documentation = [DisableTailCallsDocs];
1774a9ac8606Spatrick  let SimpleHandler = 1;
1775e5dd7070Spatrick}
1776a9ac8606Spatrickdef : MutualExclusions<[Naked, DisableTailCalls]>;
1777e5dd7070Spatrick
1778e5dd7070Spatrickdef NoAlias : InheritableAttr {
1779e5dd7070Spatrick  let Spellings = [Declspec<"noalias">];
1780e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1781e5dd7070Spatrick  let Documentation = [NoAliasDocs];
1782ec727ea7Spatrick  let SimpleHandler = 1;
1783e5dd7070Spatrick}
1784e5dd7070Spatrick
1785e5dd7070Spatrickdef NoCommon : InheritableAttr {
1786e5dd7070Spatrick  let Spellings = [GCC<"nocommon">];
1787e5dd7070Spatrick  let Subjects = SubjectList<[Var]>;
1788e5dd7070Spatrick  let Documentation = [Undocumented];
1789ec727ea7Spatrick  let SimpleHandler = 1;
1790e5dd7070Spatrick}
1791e5dd7070Spatrick
1792e5dd7070Spatrickdef NoDebug : InheritableAttr {
1793e5dd7070Spatrick  let Spellings = [GCC<"nodebug">];
1794e5dd7070Spatrick  let Subjects = SubjectList<[TypedefName, FunctionLike, ObjCMethod, NonParmVar]>;
1795e5dd7070Spatrick  let Documentation = [NoDebugDocs];
1796e5dd7070Spatrick}
1797e5dd7070Spatrick
1798a9ac8606Spatrickdef StandaloneDebug : InheritableAttr {
1799a9ac8606Spatrick  let Spellings = [Clang<"standalone_debug", /*allowInC =*/0>];
1800a9ac8606Spatrick  let Subjects = SubjectList<[CXXRecord]>;
1801a9ac8606Spatrick  let Documentation = [StandaloneDebugDocs];
1802a9ac8606Spatrick  let SimpleHandler = 1;
1803a9ac8606Spatrick  let LangOpts = [CPlusPlus];
1804a9ac8606Spatrick}
1805a9ac8606Spatrick
1806e5dd7070Spatrickdef NoDuplicate : InheritableAttr {
1807e5dd7070Spatrick  let Spellings = [Clang<"noduplicate">];
1808e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1809e5dd7070Spatrick  let Documentation = [NoDuplicateDocs];
1810ec727ea7Spatrick  let SimpleHandler = 1;
1811e5dd7070Spatrick}
1812e5dd7070Spatrick
1813e5dd7070Spatrickdef Convergent : InheritableAttr {
1814e5dd7070Spatrick  let Spellings = [Clang<"convergent">];
1815e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1816e5dd7070Spatrick  let Documentation = [ConvergentDocs];
1817ec727ea7Spatrick  let SimpleHandler = 1;
1818e5dd7070Spatrick}
1819e5dd7070Spatrick
1820*12c85518Srobertdef NoInline : DeclOrStmtAttr {
1821*12c85518Srobert  let Spellings = [Keyword<"__noinline__">, GCC<"noinline">,
1822*12c85518Srobert                   CXX11<"clang", "noinline">, C2x<"clang", "noinline">,
1823*12c85518Srobert                   Declspec<"noinline">];
1824*12c85518Srobert  let Accessors = [Accessor<"isClangNoInline", [CXX11<"clang", "noinline">,
1825*12c85518Srobert                                                C2x<"clang", "noinline">]>];
1826*12c85518Srobert  let Documentation = [NoInlineDocs];
1827*12c85518Srobert  let Subjects = SubjectList<[Function, Stmt], WarnDiag,
1828*12c85518Srobert                             "functions and statements">;
1829ec727ea7Spatrick  let SimpleHandler = 1;
1830e5dd7070Spatrick}
1831e5dd7070Spatrick
1832e5dd7070Spatrickdef NoMips16 : InheritableAttr, TargetSpecificAttr<TargetMips32> {
1833e5dd7070Spatrick  let Spellings = [GCC<"nomips16">];
1834e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1835e5dd7070Spatrick  let Documentation = [Undocumented];
1836ec727ea7Spatrick  let SimpleHandler = 1;
1837e5dd7070Spatrick}
1838e5dd7070Spatrick
1839e5dd7070Spatrickdef NoMicroMips : InheritableAttr, TargetSpecificAttr<TargetMips32> {
1840e5dd7070Spatrick  let Spellings = [GCC<"nomicromips">];
1841e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1842e5dd7070Spatrick  let Documentation = [MicroMipsDocs];
1843ec727ea7Spatrick  let SimpleHandler = 1;
1844e5dd7070Spatrick}
1845e5dd7070Spatrick
1846e5dd7070Spatrickdef RISCVInterrupt : InheritableAttr, TargetSpecificAttr<TargetRISCV> {
1847e5dd7070Spatrick  let Spellings = [GCC<"interrupt">];
1848e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
1849e5dd7070Spatrick  let Args = [EnumArgument<"Interrupt", "InterruptType",
1850e5dd7070Spatrick                           ["user", "supervisor", "machine"],
1851e5dd7070Spatrick                           ["user", "supervisor", "machine"],
1852e5dd7070Spatrick                           1>];
1853e5dd7070Spatrick  let ParseKind = "Interrupt";
1854e5dd7070Spatrick  let Documentation = [RISCVInterruptDocs];
1855e5dd7070Spatrick}
1856e5dd7070Spatrick
1857e5dd7070Spatrick// This is not a TargetSpecificAttr so that is silently accepted and
1858e5dd7070Spatrick// ignored on other targets as encouraged by the OpenCL spec.
1859e5dd7070Spatrick//
1860e5dd7070Spatrick// See OpenCL 1.2 6.11.5: "It is our intention that a particular
1861e5dd7070Spatrick// implementation of OpenCL be free to ignore all attributes and the
1862e5dd7070Spatrick// resulting executable binary will produce the same result."
1863e5dd7070Spatrick//
1864e5dd7070Spatrick// However, only AMD GPU targets will emit the corresponding IR
1865e5dd7070Spatrick// attribute.
1866e5dd7070Spatrick//
1867e5dd7070Spatrick// FIXME: This provides a sub-optimal error message if you attempt to
1868e5dd7070Spatrick// use this in CUDA, since CUDA does not use the same terminology.
1869e5dd7070Spatrick//
1870e5dd7070Spatrick// FIXME: SubjectList should be for OpenCLKernelFunction, but is not to
1871e5dd7070Spatrick// workaround needing to see kernel attribute before others to know if
1872e5dd7070Spatrick// this should be rejected on non-kernels.
1873e5dd7070Spatrick
1874e5dd7070Spatrickdef AMDGPUFlatWorkGroupSize : InheritableAttr {
1875e5dd7070Spatrick  let Spellings = [Clang<"amdgpu_flat_work_group_size", 0>];
1876e5dd7070Spatrick  let Args = [ExprArgument<"Min">, ExprArgument<"Max">];
1877e5dd7070Spatrick  let Documentation = [AMDGPUFlatWorkGroupSizeDocs];
1878e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag, "kernel functions">;
1879e5dd7070Spatrick}
1880e5dd7070Spatrick
1881e5dd7070Spatrickdef AMDGPUWavesPerEU : InheritableAttr {
1882e5dd7070Spatrick  let Spellings = [Clang<"amdgpu_waves_per_eu", 0>];
1883e5dd7070Spatrick  let Args = [ExprArgument<"Min">, ExprArgument<"Max", 1>];
1884e5dd7070Spatrick  let Documentation = [AMDGPUWavesPerEUDocs];
1885e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag, "kernel functions">;
1886e5dd7070Spatrick}
1887e5dd7070Spatrick
1888e5dd7070Spatrickdef AMDGPUNumSGPR : InheritableAttr {
1889e5dd7070Spatrick  let Spellings = [Clang<"amdgpu_num_sgpr", 0>];
1890e5dd7070Spatrick  let Args = [UnsignedArgument<"NumSGPR">];
1891e5dd7070Spatrick  let Documentation = [AMDGPUNumSGPRNumVGPRDocs];
1892e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag, "kernel functions">;
1893e5dd7070Spatrick}
1894e5dd7070Spatrick
1895e5dd7070Spatrickdef AMDGPUNumVGPR : InheritableAttr {
1896e5dd7070Spatrick  let Spellings = [Clang<"amdgpu_num_vgpr", 0>];
1897e5dd7070Spatrick  let Args = [UnsignedArgument<"NumVGPR">];
1898e5dd7070Spatrick  let Documentation = [AMDGPUNumSGPRNumVGPRDocs];
1899e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag, "kernel functions">;
1900e5dd7070Spatrick}
1901e5dd7070Spatrick
1902*12c85518Srobertdef AMDGPUKernelCall : DeclOrTypeAttr {
1903*12c85518Srobert  let Spellings = [Clang<"amdgpu_kernel">];
1904*12c85518Srobert  let Documentation = [Undocumented];
1905*12c85518Srobert}
1906*12c85518Srobert
1907e5dd7070Spatrickdef BPFPreserveAccessIndex : InheritableAttr,
1908e5dd7070Spatrick                             TargetSpecificAttr<TargetBPF>  {
1909e5dd7070Spatrick  let Spellings = [Clang<"preserve_access_index">];
1910e5dd7070Spatrick  let Subjects = SubjectList<[Record], ErrorDiag>;
1911e5dd7070Spatrick  let Documentation = [BPFPreserveAccessIndexDocs];
1912e5dd7070Spatrick  let LangOpts = [COnly];
1913e5dd7070Spatrick}
1914e5dd7070Spatrick
1915*12c85518Srobertdef BTFDeclTag : InheritableAttr {
1916*12c85518Srobert  let Spellings = [Clang<"btf_decl_tag">];
1917*12c85518Srobert  let Args = [StringArgument<"BTFDeclTag">];
1918*12c85518Srobert  let Subjects = SubjectList<[Var, Function, Record, Field, TypedefName],
1919*12c85518Srobert                             ErrorDiag>;
1920*12c85518Srobert  let Documentation = [BTFDeclTagDocs];
1921*12c85518Srobert  let LangOpts = [COnly];
1922*12c85518Srobert}
1923*12c85518Srobert
1924*12c85518Srobertdef BTFTypeTag : TypeAttr {
1925*12c85518Srobert  let Spellings = [Clang<"btf_type_tag">];
1926*12c85518Srobert  let Args = [StringArgument<"BTFTypeTag">];
1927*12c85518Srobert  let Documentation = [BTFTypeTagDocs];
1928*12c85518Srobert  let LangOpts = [COnly];
1929*12c85518Srobert}
1930*12c85518Srobert
1931e5dd7070Spatrickdef WebAssemblyExportName : InheritableAttr,
1932e5dd7070Spatrick                            TargetSpecificAttr<TargetWebAssembly> {
1933e5dd7070Spatrick  let Spellings = [Clang<"export_name">];
1934e5dd7070Spatrick  let Args = [StringArgument<"ExportName">];
1935e5dd7070Spatrick  let Documentation = [WebAssemblyExportNameDocs];
1936e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1937e5dd7070Spatrick}
1938e5dd7070Spatrick
1939e5dd7070Spatrickdef WebAssemblyImportModule : InheritableAttr,
1940e5dd7070Spatrick                              TargetSpecificAttr<TargetWebAssembly> {
1941e5dd7070Spatrick  let Spellings = [Clang<"import_module">];
1942e5dd7070Spatrick  let Args = [StringArgument<"ImportModule">];
1943e5dd7070Spatrick  let Documentation = [WebAssemblyImportModuleDocs];
1944e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1945e5dd7070Spatrick}
1946e5dd7070Spatrick
1947e5dd7070Spatrickdef WebAssemblyImportName : InheritableAttr,
1948e5dd7070Spatrick                            TargetSpecificAttr<TargetWebAssembly> {
1949e5dd7070Spatrick  let Spellings = [Clang<"import_name">];
1950e5dd7070Spatrick  let Args = [StringArgument<"ImportName">];
1951e5dd7070Spatrick  let Documentation = [WebAssemblyImportNameDocs];
1952e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1953e5dd7070Spatrick}
1954e5dd7070Spatrick
1955e5dd7070Spatrickdef NoSplitStack : InheritableAttr {
1956e5dd7070Spatrick  let Spellings = [GCC<"no_split_stack">];
1957e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
1958e5dd7070Spatrick  let Documentation = [NoSplitStackDocs];
1959ec727ea7Spatrick  let SimpleHandler = 1;
1960e5dd7070Spatrick}
1961e5dd7070Spatrick
1962e5dd7070Spatrickdef NonNull : InheritableParamAttr {
1963e5dd7070Spatrick  let Spellings = [GCC<"nonnull">];
1964e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod, HasFunctionProto, ParmVar], WarnDiag,
1965e5dd7070Spatrick                             "functions, methods, and parameters">;
1966e5dd7070Spatrick  let Args = [VariadicParamIdxArgument<"Args">];
1967e5dd7070Spatrick  let AdditionalMembers = [{
1968e5dd7070Spatrick    bool isNonNull(unsigned IdxAST) const {
1969e5dd7070Spatrick      if (!args_size())
1970e5dd7070Spatrick        return true;
1971*12c85518Srobert      return llvm::any_of(args(), [=](const ParamIdx &Idx) {
1972*12c85518Srobert        return Idx.getASTIndex() == IdxAST;
1973*12c85518Srobert      });
1974e5dd7070Spatrick    }
1975e5dd7070Spatrick  }];
1976e5dd7070Spatrick  // FIXME: We should merge duplicates into a single nonnull attribute.
1977e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
1978e5dd7070Spatrick  let Documentation = [NonNullDocs];
1979e5dd7070Spatrick}
1980e5dd7070Spatrick
1981e5dd7070Spatrickdef ReturnsNonNull : InheritableAttr {
1982e5dd7070Spatrick  let Spellings = [GCC<"returns_nonnull">];
1983e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod, Function]>;
1984e5dd7070Spatrick  let Documentation = [ReturnsNonNullDocs];
1985e5dd7070Spatrick}
1986e5dd7070Spatrick
1987a9ac8606Spatrickdef CalledOnce : Attr {
1988a9ac8606Spatrick  let Spellings = [Clang<"called_once">];
1989a9ac8606Spatrick  let Subjects = SubjectList<[ParmVar]>;
1990a9ac8606Spatrick  let LangOpts = [ObjC];
1991a9ac8606Spatrick  let Documentation = [CalledOnceDocs];
1992a9ac8606Spatrick}
1993a9ac8606Spatrick
1994e5dd7070Spatrick// pass_object_size(N) indicates that the parameter should have
1995e5dd7070Spatrick// __builtin_object_size with Type=N evaluated on the parameter at the callsite.
1996e5dd7070Spatrickdef PassObjectSize : InheritableParamAttr {
1997e5dd7070Spatrick  let Spellings = [Clang<"pass_object_size">,
1998e5dd7070Spatrick                   Clang<"pass_dynamic_object_size">];
1999e5dd7070Spatrick  let Accessors = [Accessor<"isDynamic", [Clang<"pass_dynamic_object_size">]>];
2000e5dd7070Spatrick  let Args = [IntArgument<"Type">];
2001e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
2002e5dd7070Spatrick  let Documentation = [PassObjectSizeDocs];
2003e5dd7070Spatrick}
2004e5dd7070Spatrick
2005e5dd7070Spatrick// Nullability type attributes.
2006e5dd7070Spatrickdef TypeNonNull : TypeAttr {
2007e5dd7070Spatrick  let Spellings = [Keyword<"_Nonnull">];
2008e5dd7070Spatrick  let Documentation = [TypeNonNullDocs];
2009e5dd7070Spatrick}
2010e5dd7070Spatrick
2011e5dd7070Spatrickdef TypeNullable : TypeAttr {
2012e5dd7070Spatrick  let Spellings = [Keyword<"_Nullable">];
2013e5dd7070Spatrick  let Documentation = [TypeNullableDocs];
2014e5dd7070Spatrick}
2015e5dd7070Spatrick
2016a9ac8606Spatrickdef TypeNullableResult : TypeAttr {
2017a9ac8606Spatrick  let Spellings = [Keyword<"_Nullable_result">];
2018a9ac8606Spatrick  let Documentation = [TypeNullableResultDocs];
2019a9ac8606Spatrick}
2020a9ac8606Spatrick
2021e5dd7070Spatrickdef TypeNullUnspecified : TypeAttr {
2022e5dd7070Spatrick  let Spellings = [Keyword<"_Null_unspecified">];
2023e5dd7070Spatrick  let Documentation = [TypeNullUnspecifiedDocs];
2024e5dd7070Spatrick}
2025e5dd7070Spatrick
2026e5dd7070Spatrick// This is a marker used to indicate that an __unsafe_unretained qualifier was
2027e5dd7070Spatrick// ignored because ARC is not enabled. The usual representation for this
2028e5dd7070Spatrick// qualifier is as an ObjCOwnership attribute with Kind == "none".
2029e5dd7070Spatrickdef ObjCInertUnsafeUnretained : TypeAttr {
2030e5dd7070Spatrick  let Spellings = [Keyword<"__unsafe_unretained">];
2031*12c85518Srobert  let Documentation = [InternalOnly];
2032e5dd7070Spatrick}
2033e5dd7070Spatrick
2034e5dd7070Spatrickdef ObjCKindOf : TypeAttr {
2035e5dd7070Spatrick  let Spellings = [Keyword<"__kindof">];
2036e5dd7070Spatrick  let Documentation = [Undocumented];
2037e5dd7070Spatrick}
2038e5dd7070Spatrick
2039e5dd7070Spatrickdef NoEscape : Attr {
2040e5dd7070Spatrick  let Spellings = [Clang<"noescape">];
2041e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
2042e5dd7070Spatrick  let Documentation = [NoEscapeDocs];
2043e5dd7070Spatrick}
2044e5dd7070Spatrick
2045*12c85518Srobertdef MaybeUndef : InheritableAttr {
2046*12c85518Srobert  let Spellings = [Clang<"maybe_undef">];
2047*12c85518Srobert  let Subjects = SubjectList<[ParmVar]>;
2048*12c85518Srobert  let Documentation = [MaybeUndefDocs];
2049*12c85518Srobert  let SimpleHandler = 1;
2050*12c85518Srobert}
2051*12c85518Srobert
2052e5dd7070Spatrickdef AssumeAligned : InheritableAttr {
2053e5dd7070Spatrick  let Spellings = [GCC<"assume_aligned">];
2054e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod, Function]>;
2055e5dd7070Spatrick  let Args = [ExprArgument<"Alignment">, ExprArgument<"Offset", 1>];
2056e5dd7070Spatrick  let Documentation = [AssumeAlignedDocs];
2057e5dd7070Spatrick}
2058e5dd7070Spatrick
2059e5dd7070Spatrickdef AllocAlign : InheritableAttr {
2060e5dd7070Spatrick  let Spellings = [GCC<"alloc_align">];
2061e5dd7070Spatrick  let Subjects = SubjectList<[HasFunctionProto]>;
2062e5dd7070Spatrick  let Args = [ParamIdxArgument<"ParamIndex">];
2063e5dd7070Spatrick  let Documentation = [AllocAlignDocs];
2064e5dd7070Spatrick}
2065e5dd7070Spatrick
2066e5dd7070Spatrickdef NoReturn : InheritableAttr {
2067e5dd7070Spatrick  let Spellings = [GCC<"noreturn">, Declspec<"noreturn">];
2068e5dd7070Spatrick  // FIXME: Does GCC allow this on the function instead?
2069e5dd7070Spatrick  let Documentation = [Undocumented];
2070e5dd7070Spatrick}
2071e5dd7070Spatrick
2072e5dd7070Spatrickdef NoInstrumentFunction : InheritableAttr {
2073e5dd7070Spatrick  let Spellings = [GCC<"no_instrument_function">];
2074*12c85518Srobert  let Subjects = SubjectList<[Function, ObjCMethod]>;
2075e5dd7070Spatrick  let Documentation = [Undocumented];
2076ec727ea7Spatrick  let SimpleHandler = 1;
2077e5dd7070Spatrick}
2078e5dd7070Spatrick
2079a9ac8606Spatrickdef NoProfileFunction : InheritableAttr {
2080a9ac8606Spatrick  let Spellings = [GCC<"no_profile_instrument_function">];
2081a9ac8606Spatrick  let Subjects = SubjectList<[Function]>;
2082a9ac8606Spatrick  let Documentation = [NoProfileInstrumentFunctionDocs];
2083a9ac8606Spatrick  let SimpleHandler = 1;
2084a9ac8606Spatrick}
2085a9ac8606Spatrick
2086e5dd7070Spatrickdef NotTailCalled : InheritableAttr {
2087e5dd7070Spatrick  let Spellings = [Clang<"not_tail_called">];
2088e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
2089e5dd7070Spatrick  let Documentation = [NotTailCalledDocs];
2090a9ac8606Spatrick  let SimpleHandler = 1;
2091e5dd7070Spatrick}
2092a9ac8606Spatrickdef : MutualExclusions<[AlwaysInline, NotTailCalled]>;
2093e5dd7070Spatrick
2094e5dd7070Spatrickdef NoStackProtector : InheritableAttr {
2095*12c85518Srobert  let Spellings = [Clang<"no_stack_protector">, Declspec<"safebuffers">];
2096e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
2097e5dd7070Spatrick  let Documentation = [NoStackProtectorDocs];
2098ec727ea7Spatrick  let SimpleHandler = 1;
2099e5dd7070Spatrick}
2100e5dd7070Spatrick
2101*12c85518Srobertdef StrictGuardStackCheck : InheritableAttr {
2102*12c85518Srobert  let Spellings = [Declspec<"strict_gs_check">];
2103*12c85518Srobert  let Subjects = SubjectList<[Function]>;
2104*12c85518Srobert  let Documentation = [StrictGuardStackCheckDocs];
2105*12c85518Srobert  let SimpleHandler = 1;
2106*12c85518Srobert}
2107*12c85518Srobert
2108e5dd7070Spatrickdef NoThrow : InheritableAttr {
2109e5dd7070Spatrick  let Spellings = [GCC<"nothrow">, Declspec<"nothrow">];
2110e5dd7070Spatrick  let Subjects = SubjectList<[FunctionLike]>;
2111e5dd7070Spatrick  let Documentation = [NoThrowDocs];
2112e5dd7070Spatrick}
2113e5dd7070Spatrick
2114*12c85518Srobertdef NoUwtable : InheritableAttr {
2115*12c85518Srobert  let Spellings = [Clang<"nouwtable">];
2116*12c85518Srobert  let Subjects = SubjectList<[FunctionLike]>;
2117*12c85518Srobert  let Documentation = [NoUwtableDocs];
2118*12c85518Srobert  let SimpleHandler = 1;
2119*12c85518Srobert}
2120*12c85518Srobert
2121e5dd7070Spatrickdef NvWeak : IgnoredAttr {
2122e5dd7070Spatrick  // No Declspec spelling of this attribute; the CUDA headers use
2123e5dd7070Spatrick  // __attribute__((nv_weak)) unconditionally. Does not receive an [[]]
2124e5dd7070Spatrick  // spelling because it is a CUDA attribute.
2125e5dd7070Spatrick  let Spellings = [GNU<"nv_weak">];
2126e5dd7070Spatrick  let LangOpts = [CUDA];
2127e5dd7070Spatrick}
2128e5dd7070Spatrick
2129e5dd7070Spatrickdef ObjCBridge : InheritableAttr {
2130e5dd7070Spatrick  let Spellings = [Clang<"objc_bridge">];
2131e5dd7070Spatrick  let Subjects = SubjectList<[Record, TypedefName], ErrorDiag>;
2132e5dd7070Spatrick  let Args = [IdentifierArgument<"BridgedType">];
2133e5dd7070Spatrick  let Documentation = [Undocumented];
2134e5dd7070Spatrick}
2135e5dd7070Spatrick
2136e5dd7070Spatrickdef ObjCBridgeMutable : InheritableAttr {
2137e5dd7070Spatrick  let Spellings = [Clang<"objc_bridge_mutable">];
2138e5dd7070Spatrick  let Subjects = SubjectList<[Record], ErrorDiag>;
2139e5dd7070Spatrick  let Args = [IdentifierArgument<"BridgedType">];
2140e5dd7070Spatrick  let Documentation = [Undocumented];
2141e5dd7070Spatrick}
2142e5dd7070Spatrick
2143e5dd7070Spatrickdef ObjCBridgeRelated : InheritableAttr {
2144e5dd7070Spatrick  let Spellings = [Clang<"objc_bridge_related">];
2145e5dd7070Spatrick  let Subjects = SubjectList<[Record], ErrorDiag>;
2146e5dd7070Spatrick  let Args = [IdentifierArgument<"RelatedClass">,
2147e5dd7070Spatrick          IdentifierArgument<"ClassMethod">,
2148e5dd7070Spatrick          IdentifierArgument<"InstanceMethod">];
2149e5dd7070Spatrick  let HasCustomParsing = 1;
2150e5dd7070Spatrick  let Documentation = [Undocumented];
2151e5dd7070Spatrick}
2152e5dd7070Spatrick
2153a9ac8606Spatrickdef NSErrorDomain : InheritableAttr {
2154a9ac8606Spatrick  let Spellings = [GNU<"ns_error_domain">];
2155a9ac8606Spatrick  let Subjects = SubjectList<[Enum], ErrorDiag>;
2156a9ac8606Spatrick  let Args = [DeclArgument<Var, "ErrorDomain">];
2157a9ac8606Spatrick  let Documentation = [NSErrorDomainDocs];
2158a9ac8606Spatrick}
2159a9ac8606Spatrick
2160e5dd7070Spatrickdef NSReturnsRetained : DeclOrTypeAttr {
2161e5dd7070Spatrick  let Spellings = [Clang<"ns_returns_retained">];
2162e5dd7070Spatrick//  let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
2163e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
2164e5dd7070Spatrick}
2165e5dd7070Spatrick
2166e5dd7070Spatrickdef NSReturnsNotRetained : InheritableAttr {
2167e5dd7070Spatrick  let Spellings = [Clang<"ns_returns_not_retained">];
2168e5dd7070Spatrick//  let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
2169e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
2170e5dd7070Spatrick}
2171e5dd7070Spatrick
2172e5dd7070Spatrickdef NSReturnsAutoreleased : InheritableAttr {
2173e5dd7070Spatrick  let Spellings = [Clang<"ns_returns_autoreleased">];
2174e5dd7070Spatrick//  let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
2175e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
2176e5dd7070Spatrick}
2177e5dd7070Spatrick
2178e5dd7070Spatrickdef NSConsumesSelf : InheritableAttr {
2179e5dd7070Spatrick  let Spellings = [Clang<"ns_consumes_self">];
2180e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod]>;
2181e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
2182ec727ea7Spatrick  let SimpleHandler = 1;
2183e5dd7070Spatrick}
2184e5dd7070Spatrick
2185e5dd7070Spatrickdef NSConsumed : InheritableParamAttr {
2186e5dd7070Spatrick  let Spellings = [Clang<"ns_consumed">];
2187e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
2188e5dd7070Spatrick  let Documentation = [RetainBehaviorDocs];
2189e5dd7070Spatrick}
2190e5dd7070Spatrick
2191e5dd7070Spatrickdef ObjCException : InheritableAttr {
2192e5dd7070Spatrick  let Spellings = [Clang<"objc_exception">];
2193e5dd7070Spatrick  let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
2194e5dd7070Spatrick  let Documentation = [Undocumented];
2195ec727ea7Spatrick  let SimpleHandler = 1;
2196e5dd7070Spatrick}
2197e5dd7070Spatrick
2198e5dd7070Spatrickdef ObjCMethodFamily : InheritableAttr {
2199e5dd7070Spatrick  let Spellings = [Clang<"objc_method_family">];
2200e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod], ErrorDiag>;
2201e5dd7070Spatrick  let Args = [EnumArgument<"Family", "FamilyKind",
2202e5dd7070Spatrick               ["none", "alloc", "copy", "init", "mutableCopy", "new"],
2203e5dd7070Spatrick               ["OMF_None", "OMF_alloc", "OMF_copy", "OMF_init",
2204e5dd7070Spatrick                "OMF_mutableCopy", "OMF_new"]>];
2205e5dd7070Spatrick  let Documentation = [ObjCMethodFamilyDocs];
2206e5dd7070Spatrick}
2207e5dd7070Spatrick
2208e5dd7070Spatrickdef ObjCNSObject : InheritableAttr {
2209e5dd7070Spatrick  let Spellings = [Clang<"NSObject">];
2210e5dd7070Spatrick  let Documentation = [Undocumented];
2211e5dd7070Spatrick}
2212e5dd7070Spatrick
2213e5dd7070Spatrickdef ObjCIndependentClass : InheritableAttr {
2214e5dd7070Spatrick  let Spellings = [Clang<"objc_independent_class">];
2215e5dd7070Spatrick  let Documentation = [Undocumented];
2216e5dd7070Spatrick}
2217e5dd7070Spatrick
2218e5dd7070Spatrickdef ObjCPreciseLifetime : InheritableAttr {
2219e5dd7070Spatrick  let Spellings = [Clang<"objc_precise_lifetime">];
2220e5dd7070Spatrick  let Subjects = SubjectList<[Var], ErrorDiag>;
2221e5dd7070Spatrick  let Documentation = [Undocumented];
2222e5dd7070Spatrick}
2223e5dd7070Spatrick
2224e5dd7070Spatrickdef ObjCReturnsInnerPointer : InheritableAttr {
2225e5dd7070Spatrick  let Spellings = [Clang<"objc_returns_inner_pointer">];
2226e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod, ObjCProperty], ErrorDiag>;
2227e5dd7070Spatrick  let Documentation = [Undocumented];
2228e5dd7070Spatrick}
2229e5dd7070Spatrick
2230e5dd7070Spatrickdef ObjCRequiresSuper : InheritableAttr {
2231e5dd7070Spatrick  let Spellings = [Clang<"objc_requires_super">];
2232e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod], ErrorDiag>;
2233e5dd7070Spatrick  let Documentation = [ObjCRequiresSuperDocs];
2234e5dd7070Spatrick}
2235e5dd7070Spatrick
2236e5dd7070Spatrickdef ObjCRootClass : InheritableAttr {
2237e5dd7070Spatrick  let Spellings = [Clang<"objc_root_class">];
2238e5dd7070Spatrick  let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
2239e5dd7070Spatrick  let Documentation = [Undocumented];
2240ec727ea7Spatrick  let SimpleHandler = 1;
2241e5dd7070Spatrick}
2242e5dd7070Spatrick
2243e5dd7070Spatrickdef ObjCNonLazyClass : Attr {
2244e5dd7070Spatrick  let Spellings = [Clang<"objc_nonlazy_class">];
2245e5dd7070Spatrick  let Subjects = SubjectList<[ObjCInterface, ObjCImpl], ErrorDiag>;
2246e5dd7070Spatrick  let LangOpts = [ObjC];
2247e5dd7070Spatrick  let Documentation = [ObjCNonLazyClassDocs];
2248ec727ea7Spatrick  let SimpleHandler = 1;
2249e5dd7070Spatrick}
2250e5dd7070Spatrick
2251e5dd7070Spatrickdef ObjCSubclassingRestricted : InheritableAttr {
2252e5dd7070Spatrick  let Spellings = [Clang<"objc_subclassing_restricted">];
2253e5dd7070Spatrick  let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
2254e5dd7070Spatrick  let Documentation = [ObjCSubclassingRestrictedDocs];
2255ec727ea7Spatrick  let SimpleHandler = 1;
2256e5dd7070Spatrick}
2257e5dd7070Spatrick
2258e5dd7070Spatrickdef ObjCExplicitProtocolImpl : InheritableAttr {
2259e5dd7070Spatrick  let Spellings = [Clang<"objc_protocol_requires_explicit_implementation">];
2260e5dd7070Spatrick  let Subjects = SubjectList<[ObjCProtocol], ErrorDiag>;
2261e5dd7070Spatrick  let Documentation = [Undocumented];
2262e5dd7070Spatrick}
2263e5dd7070Spatrick
2264e5dd7070Spatrickdef ObjCDesignatedInitializer : Attr {
2265e5dd7070Spatrick  let Spellings = [Clang<"objc_designated_initializer">];
2266e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod], ErrorDiag>;
2267e5dd7070Spatrick  let Documentation = [Undocumented];
2268e5dd7070Spatrick}
2269e5dd7070Spatrick
2270e5dd7070Spatrickdef ObjCDirect : Attr {
2271e5dd7070Spatrick  let Spellings = [Clang<"objc_direct">];
2272e5dd7070Spatrick  let Subjects = SubjectList<[ObjCMethod], ErrorDiag>;
2273e5dd7070Spatrick  let LangOpts = [ObjC];
2274e5dd7070Spatrick  let Documentation = [ObjCDirectDocs];
2275e5dd7070Spatrick}
2276e5dd7070Spatrick
2277e5dd7070Spatrickdef ObjCDirectMembers : Attr {
2278e5dd7070Spatrick  let Spellings = [Clang<"objc_direct_members">];
2279ec727ea7Spatrick  let Subjects = SubjectList<[ObjCImpl, ObjCInterface, ObjCCategory], ErrorDiag>;
2280e5dd7070Spatrick  let LangOpts = [ObjC];
2281e5dd7070Spatrick  let Documentation = [ObjCDirectMembersDocs];
2282e5dd7070Spatrick}
2283e5dd7070Spatrick
2284a9ac8606Spatrickdef ObjCNonRuntimeProtocol : Attr {
2285a9ac8606Spatrick  let Spellings = [Clang<"objc_non_runtime_protocol">];
2286a9ac8606Spatrick  let Subjects = SubjectList<[ObjCProtocol], ErrorDiag>;
2287a9ac8606Spatrick  let LangOpts = [ObjC];
2288a9ac8606Spatrick  let Documentation = [ObjCNonRuntimeProtocolDocs];
2289a9ac8606Spatrick  let SimpleHandler = 1;
2290a9ac8606Spatrick}
2291a9ac8606Spatrick
2292e5dd7070Spatrickdef ObjCRuntimeName : Attr {
2293e5dd7070Spatrick  let Spellings = [Clang<"objc_runtime_name">];
2294e5dd7070Spatrick  let Subjects = SubjectList<[ObjCInterface, ObjCProtocol], ErrorDiag>;
2295e5dd7070Spatrick  let Args = [StringArgument<"MetadataName">];
2296e5dd7070Spatrick  let Documentation = [ObjCRuntimeNameDocs];
2297e5dd7070Spatrick}
2298e5dd7070Spatrick
2299e5dd7070Spatrickdef ObjCRuntimeVisible : Attr {
2300e5dd7070Spatrick  let Spellings = [Clang<"objc_runtime_visible">];
2301e5dd7070Spatrick  let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
2302e5dd7070Spatrick  let Documentation = [ObjCRuntimeVisibleDocs];
2303ec727ea7Spatrick  let SimpleHandler = 1;
2304e5dd7070Spatrick}
2305e5dd7070Spatrick
2306e5dd7070Spatrickdef ObjCClassStub : Attr {
2307e5dd7070Spatrick  let Spellings = [Clang<"objc_class_stub">];
2308e5dd7070Spatrick  let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
2309e5dd7070Spatrick  let Documentation = [ObjCClassStubDocs];
2310e5dd7070Spatrick  let LangOpts = [ObjCNonFragileRuntime];
2311ec727ea7Spatrick  let SimpleHandler = 1;
2312e5dd7070Spatrick}
2313e5dd7070Spatrick
2314e5dd7070Spatrickdef ObjCBoxable : Attr {
2315e5dd7070Spatrick  let Spellings = [Clang<"objc_boxable">];
2316e5dd7070Spatrick  let Subjects = SubjectList<[Record], ErrorDiag>;
2317e5dd7070Spatrick  let Documentation = [ObjCBoxableDocs];
2318e5dd7070Spatrick}
2319e5dd7070Spatrick
2320e5dd7070Spatrickdef OptimizeNone : InheritableAttr {
2321e5dd7070Spatrick  let Spellings = [Clang<"optnone">];
2322e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod]>;
2323e5dd7070Spatrick  let Documentation = [OptnoneDocs];
2324e5dd7070Spatrick}
2325e5dd7070Spatrick
2326e5dd7070Spatrickdef Overloadable : Attr {
2327e5dd7070Spatrick  let Spellings = [Clang<"overloadable">];
2328e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
2329e5dd7070Spatrick  let Documentation = [OverloadableDocs];
2330ec727ea7Spatrick  let SimpleHandler = 1;
2331e5dd7070Spatrick}
2332e5dd7070Spatrick
2333e5dd7070Spatrickdef Override : InheritableAttr {
2334e5dd7070Spatrick  let Spellings = [Keyword<"override">];
2335e5dd7070Spatrick  let SemaHandler = 0;
2336*12c85518Srobert  // Omitted from docs, since this is language syntax, not an attribute, as far
2337*12c85518Srobert  // as users are concerned.
2338*12c85518Srobert  let Documentation = [InternalOnly];
2339e5dd7070Spatrick}
2340e5dd7070Spatrick
2341e5dd7070Spatrickdef Ownership : InheritableAttr {
2342e5dd7070Spatrick  let Spellings = [Clang<"ownership_holds">, Clang<"ownership_returns">,
2343e5dd7070Spatrick                   Clang<"ownership_takes">];
2344e5dd7070Spatrick  let Accessors = [Accessor<"isHolds", [Clang<"ownership_holds">]>,
2345e5dd7070Spatrick                   Accessor<"isReturns", [Clang<"ownership_returns">]>,
2346e5dd7070Spatrick                   Accessor<"isTakes", [Clang<"ownership_takes">]>];
2347e5dd7070Spatrick  let AdditionalMembers = [{
2348e5dd7070Spatrick    enum OwnershipKind { Holds, Returns, Takes };
2349e5dd7070Spatrick    OwnershipKind getOwnKind() const {
2350e5dd7070Spatrick      return isHolds() ? Holds :
2351e5dd7070Spatrick             isTakes() ? Takes :
2352e5dd7070Spatrick             Returns;
2353e5dd7070Spatrick    }
2354e5dd7070Spatrick  }];
2355e5dd7070Spatrick  let Args = [IdentifierArgument<"Module">,
2356e5dd7070Spatrick              VariadicParamIdxArgument<"Args">];
2357e5dd7070Spatrick  let Subjects = SubjectList<[HasFunctionProto]>;
2358e5dd7070Spatrick  let Documentation = [Undocumented];
2359e5dd7070Spatrick}
2360e5dd7070Spatrick
2361e5dd7070Spatrickdef Packed : InheritableAttr {
2362e5dd7070Spatrick  let Spellings = [GCC<"packed">];
2363e5dd7070Spatrick//  let Subjects = [Tag, Field];
2364e5dd7070Spatrick  let Documentation = [Undocumented];
2365e5dd7070Spatrick}
2366e5dd7070Spatrick
2367e5dd7070Spatrickdef IntelOclBicc : DeclOrTypeAttr {
2368e5dd7070Spatrick  let Spellings = [Clang<"intel_ocl_bicc", 0>];
2369e5dd7070Spatrick//  let Subjects = [Function, ObjCMethod];
2370e5dd7070Spatrick  let Documentation = [Undocumented];
2371e5dd7070Spatrick}
2372e5dd7070Spatrick
2373e5dd7070Spatrickdef Pcs : DeclOrTypeAttr {
2374e5dd7070Spatrick  let Spellings = [GCC<"pcs">];
2375e5dd7070Spatrick  let Args = [EnumArgument<"PCS", "PCSType",
2376e5dd7070Spatrick                           ["aapcs", "aapcs-vfp"],
2377e5dd7070Spatrick                           ["AAPCS", "AAPCS_VFP"]>];
2378e5dd7070Spatrick//  let Subjects = [Function, ObjCMethod];
2379e5dd7070Spatrick  let Documentation = [PcsDocs];
2380e5dd7070Spatrick}
2381e5dd7070Spatrick
2382e5dd7070Spatrickdef AArch64VectorPcs: DeclOrTypeAttr {
2383e5dd7070Spatrick  let Spellings = [Clang<"aarch64_vector_pcs">];
2384e5dd7070Spatrick  let Documentation = [AArch64VectorPcsDocs];
2385e5dd7070Spatrick}
2386e5dd7070Spatrick
2387*12c85518Srobertdef AArch64SVEPcs: DeclOrTypeAttr {
2388*12c85518Srobert  let Spellings = [Clang<"aarch64_sve_pcs">];
2389*12c85518Srobert  let Documentation = [AArch64SVEPcsDocs];
2390*12c85518Srobert}
2391*12c85518Srobert
2392e5dd7070Spatrickdef Pure : InheritableAttr {
2393e5dd7070Spatrick  let Spellings = [GCC<"pure">];
2394e5dd7070Spatrick  let Documentation = [Undocumented];
2395ec727ea7Spatrick  let SimpleHandler = 1;
2396e5dd7070Spatrick}
2397e5dd7070Spatrick
2398e5dd7070Spatrickdef Regparm : TypeAttr {
2399e5dd7070Spatrick  let Spellings = [GCC<"regparm">];
2400e5dd7070Spatrick  let Args = [UnsignedArgument<"NumParams">];
2401e5dd7070Spatrick  let Documentation = [RegparmDocs];
2402e5dd7070Spatrick  // Represented as part of the enclosing function type.
2403e5dd7070Spatrick  let ASTNode = 0;
2404e5dd7070Spatrick}
2405e5dd7070Spatrick
2406a9ac8606Spatrickdef SwiftAsyncName : InheritableAttr {
2407a9ac8606Spatrick  let Spellings = [GNU<"swift_async_name">];
2408a9ac8606Spatrick  let Args = [StringArgument<"Name">];
2409a9ac8606Spatrick  let Subjects = SubjectList<[ObjCMethod, Function], ErrorDiag>;
2410a9ac8606Spatrick  let Documentation = [SwiftAsyncNameDocs];
2411a9ac8606Spatrick}
2412a9ac8606Spatrick
2413a9ac8606Spatrickdef SwiftAttr : InheritableAttr {
2414a9ac8606Spatrick  let Spellings = [GNU<"swift_attr">];
2415a9ac8606Spatrick  let Args = [StringArgument<"Attribute">];
2416a9ac8606Spatrick  let Documentation = [SwiftAttrDocs];
2417*12c85518Srobert  let PragmaAttributeSupport = 1;
2418a9ac8606Spatrick}
2419a9ac8606Spatrick
2420a9ac8606Spatrickdef SwiftBridge : InheritableAttr {
2421a9ac8606Spatrick  let Spellings = [GNU<"swift_bridge">];
2422a9ac8606Spatrick  let Args = [StringArgument<"SwiftType">];
2423a9ac8606Spatrick  let Subjects = SubjectList<[Tag, TypedefName, ObjCInterface, ObjCProtocol],
2424a9ac8606Spatrick                             ErrorDiag>;
2425a9ac8606Spatrick  let Documentation = [SwiftBridgeDocs];
2426a9ac8606Spatrick}
2427a9ac8606Spatrick
2428a9ac8606Spatrickdef SwiftBridgedTypedef : InheritableAttr {
2429a9ac8606Spatrick  let Spellings = [GNU<"swift_bridged_typedef">];
2430a9ac8606Spatrick  let Subjects = SubjectList<[TypedefName], ErrorDiag>;
2431a9ac8606Spatrick  let Documentation = [SwiftBridgedTypedefDocs];
2432a9ac8606Spatrick  let SimpleHandler = 1;
2433a9ac8606Spatrick}
2434a9ac8606Spatrick
2435a9ac8606Spatrickdef SwiftObjCMembers : Attr {
2436a9ac8606Spatrick  let Spellings = [GNU<"swift_objc_members">];
2437a9ac8606Spatrick  let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
2438a9ac8606Spatrick  let Documentation = [SwiftObjCMembersDocs];
2439a9ac8606Spatrick  let SimpleHandler = 1;
2440a9ac8606Spatrick}
2441a9ac8606Spatrick
2442a9ac8606Spatrickdef SwiftError : InheritableAttr {
2443a9ac8606Spatrick  let Spellings = [GNU<"swift_error">];
2444a9ac8606Spatrick  let Args = [
2445a9ac8606Spatrick      EnumArgument<"Convention", "ConventionKind",
2446a9ac8606Spatrick                   ["none", "nonnull_error", "null_result", "zero_result", "nonzero_result"],
2447a9ac8606Spatrick                   ["None", "NonNullError", "NullResult", "ZeroResult", "NonZeroResult"]>
2448a9ac8606Spatrick  ];
2449a9ac8606Spatrick  let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>;
2450a9ac8606Spatrick  let Documentation = [SwiftErrorDocs];
2451a9ac8606Spatrick}
2452a9ac8606Spatrick
2453a9ac8606Spatrickdef SwiftName : InheritableAttr {
2454a9ac8606Spatrick  let Spellings = [GNU<"swift_name">];
2455a9ac8606Spatrick  let Args = [StringArgument<"Name">];
2456a9ac8606Spatrick  let Documentation = [SwiftNameDocs];
2457a9ac8606Spatrick}
2458a9ac8606Spatrick
2459a9ac8606Spatrickdef SwiftNewType : InheritableAttr {
2460a9ac8606Spatrick  let Spellings = [GNU<"swift_newtype">, GNU<"swift_wrapper">];
2461a9ac8606Spatrick  let Args = [EnumArgument<"NewtypeKind", "NewtypeKind",
2462a9ac8606Spatrick                           ["struct", "enum"], ["NK_Struct", "NK_Enum"]>];
2463a9ac8606Spatrick  let Subjects = SubjectList<[TypedefName], ErrorDiag>;
2464a9ac8606Spatrick  let Documentation = [SwiftNewTypeDocs];
2465a9ac8606Spatrick  let HasCustomParsing = 1;
2466a9ac8606Spatrick}
2467a9ac8606Spatrick
2468a9ac8606Spatrickdef SwiftPrivate : InheritableAttr {
2469a9ac8606Spatrick  let Spellings = [GNU<"swift_private">];
2470a9ac8606Spatrick  let Documentation = [SwiftPrivateDocs];
2471a9ac8606Spatrick  let SimpleHandler = 1;
2472a9ac8606Spatrick}
2473a9ac8606Spatrick
2474e5dd7070Spatrickdef NoDeref : TypeAttr {
2475e5dd7070Spatrick  let Spellings = [Clang<"noderef">];
2476e5dd7070Spatrick  let Documentation = [NoDerefDocs];
2477e5dd7070Spatrick}
2478e5dd7070Spatrick
2479e5dd7070Spatrickdef ReqdWorkGroupSize : InheritableAttr {
2480e5dd7070Spatrick  // Does not have a [[]] spelling because it is an OpenCL-related attribute.
2481e5dd7070Spatrick  let Spellings = [GNU<"reqd_work_group_size">];
2482e5dd7070Spatrick  let Args = [UnsignedArgument<"XDim">, UnsignedArgument<"YDim">,
2483e5dd7070Spatrick              UnsignedArgument<"ZDim">];
2484e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
2485e5dd7070Spatrick  let Documentation = [Undocumented];
2486e5dd7070Spatrick}
2487e5dd7070Spatrick
2488e5dd7070Spatrickdef WorkGroupSizeHint :  InheritableAttr {
2489e5dd7070Spatrick  // Does not have a [[]] spelling because it is an OpenCL-related attribute.
2490e5dd7070Spatrick  let Spellings = [GNU<"work_group_size_hint">];
2491e5dd7070Spatrick  let Args = [UnsignedArgument<"XDim">,
2492e5dd7070Spatrick              UnsignedArgument<"YDim">,
2493e5dd7070Spatrick              UnsignedArgument<"ZDim">];
2494e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
2495e5dd7070Spatrick  let Documentation = [Undocumented];
2496e5dd7070Spatrick}
2497e5dd7070Spatrick
2498a9ac8606Spatrickdef InitPriority : InheritableAttr, TargetSpecificAttr<TargetSupportsInitPriority> {
2499ec727ea7Spatrick  let Spellings = [GCC<"init_priority", /*AllowInC*/0>];
2500e5dd7070Spatrick  let Args = [UnsignedArgument<"Priority">];
2501e5dd7070Spatrick  let Subjects = SubjectList<[Var], ErrorDiag>;
2502ec727ea7Spatrick  let Documentation = [InitPriorityDocs];
2503e5dd7070Spatrick}
2504e5dd7070Spatrick
2505e5dd7070Spatrickdef Section : InheritableAttr {
2506e5dd7070Spatrick  let Spellings = [GCC<"section">, Declspec<"allocate">];
2507e5dd7070Spatrick  let Args = [StringArgument<"Name">];
2508e5dd7070Spatrick  let Subjects =
2509e5dd7070Spatrick      SubjectList<[ Function, GlobalVar, ObjCMethod, ObjCProperty ], ErrorDiag>;
2510e5dd7070Spatrick  let Documentation = [SectionDocs];
2511e5dd7070Spatrick}
2512e5dd7070Spatrick
2513e5dd7070Spatrick// This is used for `__declspec(code_seg("segname"))`, but not for
2514e5dd7070Spatrick// `#pragma code_seg("segname")`.
2515e5dd7070Spatrickdef CodeSeg : InheritableAttr {
2516e5dd7070Spatrick  let Spellings = [Declspec<"code_seg">];
2517e5dd7070Spatrick  let Args = [StringArgument<"Name">];
2518e5dd7070Spatrick  let Subjects = SubjectList<[Function, CXXRecord], ErrorDiag>;
2519e5dd7070Spatrick  let Documentation = [CodeSegDocs];
2520e5dd7070Spatrick}
2521e5dd7070Spatrick
2522e5dd7070Spatrickdef PragmaClangBSSSection : InheritableAttr {
2523e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
2524e5dd7070Spatrick  let Spellings = [];
2525e5dd7070Spatrick  let Args = [StringArgument<"Name">];
2526e5dd7070Spatrick  let Subjects = SubjectList<[GlobalVar], ErrorDiag>;
2527*12c85518Srobert  let Documentation = [InternalOnly];
2528e5dd7070Spatrick}
2529e5dd7070Spatrick
2530e5dd7070Spatrickdef PragmaClangDataSection : InheritableAttr {
2531e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
2532e5dd7070Spatrick  let Spellings = [];
2533e5dd7070Spatrick  let Args = [StringArgument<"Name">];
2534e5dd7070Spatrick  let Subjects = SubjectList<[GlobalVar], ErrorDiag>;
2535*12c85518Srobert  let Documentation = [InternalOnly];
2536e5dd7070Spatrick}
2537e5dd7070Spatrick
2538e5dd7070Spatrickdef PragmaClangRodataSection : InheritableAttr {
2539e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
2540e5dd7070Spatrick  let Spellings = [];
2541e5dd7070Spatrick  let Args = [StringArgument<"Name">];
2542e5dd7070Spatrick  let Subjects = SubjectList<[GlobalVar], ErrorDiag>;
2543*12c85518Srobert  let Documentation = [InternalOnly];
2544e5dd7070Spatrick}
2545e5dd7070Spatrick
2546e5dd7070Spatrickdef PragmaClangRelroSection : InheritableAttr {
2547e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
2548e5dd7070Spatrick  let Spellings = [];
2549e5dd7070Spatrick  let Args = [StringArgument<"Name">];
2550e5dd7070Spatrick  let Subjects = SubjectList<[GlobalVar], ErrorDiag>;
2551*12c85518Srobert  let Documentation = [InternalOnly];
2552e5dd7070Spatrick}
2553e5dd7070Spatrick
2554a9ac8606Spatrickdef StrictFP : InheritableAttr {
2555a9ac8606Spatrick  // This attribute has no spellings as it is only ever created implicitly.
2556a9ac8606Spatrick  // Function uses strict floating point operations.
2557a9ac8606Spatrick  let Spellings = [];
2558a9ac8606Spatrick  let Subjects = SubjectList<[Function]>;
2559*12c85518Srobert  let Documentation = [InternalOnly];
2560a9ac8606Spatrick}
2561a9ac8606Spatrick
2562e5dd7070Spatrickdef PragmaClangTextSection : InheritableAttr {
2563e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
2564e5dd7070Spatrick  let Spellings = [];
2565e5dd7070Spatrick  let Args = [StringArgument<"Name">];
2566e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
2567*12c85518Srobert  let Documentation = [InternalOnly];
2568e5dd7070Spatrick}
2569e5dd7070Spatrick
2570e5dd7070Spatrickdef Sentinel : InheritableAttr {
2571e5dd7070Spatrick  let Spellings = [GCC<"sentinel">];
2572e5dd7070Spatrick  let Args = [DefaultIntArgument<"Sentinel", 0>,
2573e5dd7070Spatrick              DefaultIntArgument<"NullPos", 0>];
2574e5dd7070Spatrick//  let Subjects = SubjectList<[Function, ObjCMethod, Block, Var]>;
2575e5dd7070Spatrick  let Documentation = [Undocumented];
2576e5dd7070Spatrick}
2577e5dd7070Spatrick
2578e5dd7070Spatrickdef StdCall : DeclOrTypeAttr {
2579e5dd7070Spatrick  let Spellings = [GCC<"stdcall">, Keyword<"__stdcall">, Keyword<"_stdcall">];
2580e5dd7070Spatrick//  let Subjects = [Function, ObjCMethod];
2581e5dd7070Spatrick  let Documentation = [StdCallDocs];
2582e5dd7070Spatrick}
2583e5dd7070Spatrick
2584e5dd7070Spatrickdef SwiftCall : DeclOrTypeAttr {
2585e5dd7070Spatrick  let Spellings = [Clang<"swiftcall">];
2586e5dd7070Spatrick//  let Subjects = SubjectList<[Function]>;
2587e5dd7070Spatrick  let Documentation = [SwiftCallDocs];
2588e5dd7070Spatrick}
2589e5dd7070Spatrick
2590a9ac8606Spatrickdef SwiftAsyncCall : DeclOrTypeAttr {
2591a9ac8606Spatrick  let Spellings = [Clang<"swiftasynccall">];
2592a9ac8606Spatrick  let Documentation = [SwiftAsyncCallDocs];
2593a9ac8606Spatrick}
2594a9ac8606Spatrick
2595e5dd7070Spatrickdef SwiftContext : ParameterABIAttr {
2596e5dd7070Spatrick  let Spellings = [Clang<"swift_context">];
2597e5dd7070Spatrick  let Documentation = [SwiftContextDocs];
2598e5dd7070Spatrick}
2599e5dd7070Spatrick
2600a9ac8606Spatrickdef SwiftAsyncContext : ParameterABIAttr {
2601a9ac8606Spatrick  let Spellings = [Clang<"swift_async_context">];
2602a9ac8606Spatrick  let Documentation = [SwiftAsyncContextDocs];
2603a9ac8606Spatrick}
2604a9ac8606Spatrick
2605e5dd7070Spatrickdef SwiftErrorResult : ParameterABIAttr {
2606e5dd7070Spatrick  let Spellings = [Clang<"swift_error_result">];
2607e5dd7070Spatrick  let Documentation = [SwiftErrorResultDocs];
2608e5dd7070Spatrick}
2609e5dd7070Spatrick
2610e5dd7070Spatrickdef SwiftIndirectResult : ParameterABIAttr {
2611e5dd7070Spatrick  let Spellings = [Clang<"swift_indirect_result">];
2612e5dd7070Spatrick  let Documentation = [SwiftIndirectResultDocs];
2613e5dd7070Spatrick}
2614e5dd7070Spatrick
2615a9ac8606Spatrickdef SwiftAsync : InheritableAttr {
2616a9ac8606Spatrick  let Spellings = [Clang<"swift_async">];
2617a9ac8606Spatrick  let Subjects = SubjectList<[Function, ObjCMethod]>;
2618a9ac8606Spatrick  let Args = [EnumArgument<"Kind", "Kind",
2619a9ac8606Spatrick                ["none", "swift_private", "not_swift_private"],
2620a9ac8606Spatrick                ["None", "SwiftPrivate", "NotSwiftPrivate"]>,
2621a9ac8606Spatrick              ParamIdxArgument<"CompletionHandlerIndex", /*opt=*/1>];
2622a9ac8606Spatrick  let Documentation = [SwiftAsyncDocs];
2623a9ac8606Spatrick}
2624a9ac8606Spatrick
2625a9ac8606Spatrickdef SwiftAsyncError : InheritableAttr {
2626a9ac8606Spatrick  let Spellings = [Clang<"swift_async_error">];
2627a9ac8606Spatrick  let Subjects = SubjectList<[Function, ObjCMethod]>;
2628a9ac8606Spatrick  let Args = [EnumArgument<"Convention", "ConventionKind",
2629a9ac8606Spatrick              ["none", "nonnull_error", "zero_argument", "nonzero_argument"],
2630a9ac8606Spatrick              ["None", "NonNullError", "ZeroArgument", "NonZeroArgument"]>,
2631a9ac8606Spatrick              UnsignedArgument<"HandlerParamIdx", /*opt=*/1>];
2632a9ac8606Spatrick  let Documentation = [SwiftAsyncErrorDocs];
2633a9ac8606Spatrick}
2634a9ac8606Spatrick
2635e5dd7070Spatrickdef Suppress : StmtAttr {
2636e5dd7070Spatrick  let Spellings = [CXX11<"gsl", "suppress">];
2637e5dd7070Spatrick  let Args = [VariadicStringArgument<"DiagnosticIdentifiers">];
2638e5dd7070Spatrick  let Documentation = [SuppressDocs];
2639e5dd7070Spatrick}
2640e5dd7070Spatrick
2641e5dd7070Spatrickdef SysVABI : DeclOrTypeAttr {
2642e5dd7070Spatrick  let Spellings = [GCC<"sysv_abi">];
2643e5dd7070Spatrick//  let Subjects = [Function, ObjCMethod];
2644e5dd7070Spatrick  let Documentation = [Undocumented];
2645e5dd7070Spatrick}
2646e5dd7070Spatrick
2647e5dd7070Spatrickdef ThisCall : DeclOrTypeAttr {
2648e5dd7070Spatrick  let Spellings = [GCC<"thiscall">, Keyword<"__thiscall">,
2649e5dd7070Spatrick                   Keyword<"_thiscall">];
2650e5dd7070Spatrick//  let Subjects = [Function, ObjCMethod];
2651e5dd7070Spatrick  let Documentation = [ThisCallDocs];
2652e5dd7070Spatrick}
2653e5dd7070Spatrick
2654e5dd7070Spatrickdef VectorCall : DeclOrTypeAttr {
2655e5dd7070Spatrick  let Spellings = [Clang<"vectorcall">, Keyword<"__vectorcall">,
2656e5dd7070Spatrick                   Keyword<"_vectorcall">];
2657e5dd7070Spatrick//  let Subjects = [Function, ObjCMethod];
2658e5dd7070Spatrick  let Documentation = [VectorCallDocs];
2659e5dd7070Spatrick}
2660e5dd7070Spatrick
2661*12c85518Srobertdef ZeroCallUsedRegs : InheritableAttr {
2662*12c85518Srobert  let Spellings = [GCC<"zero_call_used_regs">];
2663*12c85518Srobert  let Subjects = SubjectList<[Function], ErrorDiag>;
2664*12c85518Srobert  let Args = [
2665*12c85518Srobert    EnumArgument<"ZeroCallUsedRegs", "ZeroCallUsedRegsKind",
2666*12c85518Srobert                 ["skip", "used-gpr-arg", "used-gpr", "used-arg", "used",
2667*12c85518Srobert                  "all-gpr-arg", "all-gpr", "all-arg", "all"],
2668*12c85518Srobert                 ["Skip", "UsedGPRArg", "UsedGPR", "UsedArg", "Used",
2669*12c85518Srobert                  "AllGPRArg", "AllGPR", "AllArg", "All"]>
2670*12c85518Srobert  ];
2671*12c85518Srobert  let Documentation = [ZeroCallUsedRegsDocs];
2672*12c85518Srobert}
2673*12c85518Srobert
2674e5dd7070Spatrickdef Pascal : DeclOrTypeAttr {
2675e5dd7070Spatrick  let Spellings = [Clang<"pascal">, Keyword<"__pascal">, Keyword<"_pascal">];
2676e5dd7070Spatrick//  let Subjects = [Function, ObjCMethod];
2677e5dd7070Spatrick  let Documentation = [Undocumented];
2678e5dd7070Spatrick}
2679e5dd7070Spatrick
2680a9ac8606Spatrickdef PreferredName : InheritableAttr {
2681a9ac8606Spatrick  let Spellings = [Clang<"preferred_name", /*AllowInC*/0>];
2682a9ac8606Spatrick  let Subjects = SubjectList<[ClassTmpl]>;
2683a9ac8606Spatrick  let Args = [TypeArgument<"TypedefType">];
2684a9ac8606Spatrick  let Documentation = [PreferredNameDocs];
2685a9ac8606Spatrick  let InheritEvenIfAlreadyPresent = 1;
2686a9ac8606Spatrick  let MeaningfulToClassTemplateDefinition = 1;
2687a9ac8606Spatrick  let TemplateDependent = 1;
2688a9ac8606Spatrick}
2689a9ac8606Spatrick
2690e5dd7070Spatrickdef PreserveMost : DeclOrTypeAttr {
2691e5dd7070Spatrick  let Spellings = [Clang<"preserve_most">];
2692e5dd7070Spatrick  let Documentation = [PreserveMostDocs];
2693e5dd7070Spatrick}
2694e5dd7070Spatrick
2695e5dd7070Spatrickdef PreserveAll : DeclOrTypeAttr {
2696e5dd7070Spatrick  let Spellings = [Clang<"preserve_all">];
2697e5dd7070Spatrick  let Documentation = [PreserveAllDocs];
2698e5dd7070Spatrick}
2699e5dd7070Spatrick
2700e5dd7070Spatrickdef Target : InheritableAttr {
2701e5dd7070Spatrick  let Spellings = [GCC<"target">];
2702e5dd7070Spatrick  let Args = [StringArgument<"featuresStr">];
2703e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
2704e5dd7070Spatrick  let Documentation = [TargetDocs];
2705e5dd7070Spatrick  let AdditionalMembers = [{
2706e5dd7070Spatrick    StringRef getArchitecture() const {
2707e5dd7070Spatrick      StringRef Features = getFeaturesStr();
2708e5dd7070Spatrick      if (Features == "default") return {};
2709e5dd7070Spatrick
2710e5dd7070Spatrick      SmallVector<StringRef, 1> AttrFeatures;
2711e5dd7070Spatrick      Features.split(AttrFeatures, ",");
2712e5dd7070Spatrick
2713e5dd7070Spatrick      for (auto &Feature : AttrFeatures) {
2714e5dd7070Spatrick        Feature = Feature.trim();
2715e5dd7070Spatrick        if (Feature.startswith("arch="))
2716e5dd7070Spatrick          return Feature.drop_front(sizeof("arch=") - 1);
2717e5dd7070Spatrick      }
2718e5dd7070Spatrick      return "";
2719e5dd7070Spatrick    }
2720e5dd7070Spatrick
2721e5dd7070Spatrick    // Gets the list of features as simple string-refs with no +/- or 'no-'.
2722e5dd7070Spatrick    // Only adds the items to 'Out' that are additions.
2723e5dd7070Spatrick    void getAddedFeatures(llvm::SmallVectorImpl<StringRef> &Out) const {
2724e5dd7070Spatrick      StringRef Features = getFeaturesStr();
2725e5dd7070Spatrick      if (Features == "default") return;
2726e5dd7070Spatrick
2727e5dd7070Spatrick      SmallVector<StringRef, 1> AttrFeatures;
2728e5dd7070Spatrick      Features.split(AttrFeatures, ",");
2729e5dd7070Spatrick
2730e5dd7070Spatrick      for (auto &Feature : AttrFeatures) {
2731e5dd7070Spatrick        Feature = Feature.trim();
2732e5dd7070Spatrick
2733e5dd7070Spatrick        if (!Feature.startswith("no-") && !Feature.startswith("arch=") &&
2734e5dd7070Spatrick            !Feature.startswith("fpmath=") && !Feature.startswith("tune="))
2735e5dd7070Spatrick          Out.push_back(Feature);
2736e5dd7070Spatrick      }
2737e5dd7070Spatrick    }
2738e5dd7070Spatrick
2739e5dd7070Spatrick    bool isDefaultVersion() const { return getFeaturesStr() == "default"; }
2740*12c85518Srobert  }];
2741*12c85518Srobert}
2742e5dd7070Spatrick
2743*12c85518Srobertdef TargetVersion : InheritableAttr {
2744*12c85518Srobert  let Spellings = [GCC<"target_version">];
2745*12c85518Srobert  let Args = [StringArgument<"NamesStr">];
2746*12c85518Srobert  let Subjects = SubjectList<[Function], ErrorDiag>;
2747*12c85518Srobert  let Documentation = [TargetVersionDocs];
2748*12c85518Srobert  let AdditionalMembers = [{
2749*12c85518Srobert    StringRef getName() const { return getNamesStr().trim(); }
2750*12c85518Srobert    bool isDefaultVersion() const {
2751*12c85518Srobert      return getName() == "default";
2752*12c85518Srobert    }
2753*12c85518Srobert    void getFeatures(llvm::SmallVectorImpl<StringRef> &Out) const {
2754*12c85518Srobert      if (isDefaultVersion()) return;
2755*12c85518Srobert      StringRef Features = getName();
2756e5dd7070Spatrick
2757*12c85518Srobert      SmallVector<StringRef, 8> AttrFeatures;
2758*12c85518Srobert      Features.split(AttrFeatures, "+");
2759*12c85518Srobert
2760e5dd7070Spatrick      for (auto &Feature : AttrFeatures) {
2761e5dd7070Spatrick        Feature = Feature.trim();
2762*12c85518Srobert        Out.push_back(Feature);
2763e5dd7070Spatrick      }
2764e5dd7070Spatrick    }
2765e5dd7070Spatrick  }];
2766e5dd7070Spatrick}
2767e5dd7070Spatrick
2768*12c85518Srobertdef TargetClones : InheritableAttr {
2769*12c85518Srobert  let Spellings = [GCC<"target_clones">];
2770*12c85518Srobert  let Args = [VariadicStringArgument<"featuresStrs">];
2771*12c85518Srobert  let Documentation = [TargetClonesDocs];
2772*12c85518Srobert  let Subjects = SubjectList<[Function], ErrorDiag>;
2773*12c85518Srobert  let AdditionalMembers = [{
2774*12c85518Srobert    StringRef getFeatureStr(unsigned Index) const {
2775*12c85518Srobert      return *(featuresStrs_begin() + Index);
2776*12c85518Srobert    }
2777*12c85518Srobert    // Given an index into the 'featuresStrs' sequence, compute a unique
2778*12c85518Srobert    // ID to be used with function name mangling for the associated variant.
2779*12c85518Srobert    // This mapping is necessary due to a requirement that the mangling ID
2780*12c85518Srobert    // used for the "default" variant be the largest mangling ID in the
2781*12c85518Srobert    // variant set. Duplicate variants present in 'featuresStrs' are also
2782*12c85518Srobert    // assigned their own unique ID (the mapping is bijective).
2783*12c85518Srobert    unsigned getMangledIndex(unsigned Index) const {
2784*12c85518Srobert      if (getFeatureStr(Index) == "default")
2785*12c85518Srobert        return std::count_if(featuresStrs_begin(), featuresStrs_end(),
2786*12c85518Srobert                              [](StringRef S) { return S != "default"; });
2787*12c85518Srobert
2788*12c85518Srobert      return std::count_if(featuresStrs_begin(), featuresStrs_begin() + Index,
2789*12c85518Srobert                           [](StringRef S) { return S != "default"; });
2790*12c85518Srobert    }
2791*12c85518Srobert
2792*12c85518Srobert    // Given an index into the 'featuresStrs' sequence, determine if the
2793*12c85518Srobert    // index corresponds to the first instance of the named variant. This
2794*12c85518Srobert    // is used to skip over duplicate variant instances when iterating over
2795*12c85518Srobert    // 'featuresStrs'.
2796*12c85518Srobert    bool isFirstOfVersion(unsigned Index) const {
2797*12c85518Srobert      StringRef FeatureStr(getFeatureStr(Index));
2798*12c85518Srobert      return 0 == std::count_if(
2799*12c85518Srobert                      featuresStrs_begin(), featuresStrs_begin() + Index,
2800*12c85518Srobert                      [FeatureStr](StringRef S) { return S == FeatureStr; });
2801*12c85518Srobert
2802*12c85518Srobert    }
2803*12c85518Srobert  }];
2804*12c85518Srobert}
2805*12c85518Srobert
2806*12c85518Srobertdef : MutualExclusions<[TargetClones, TargetVersion, Target, CPUDispatch, CPUSpecific]>;
2807*12c85518Srobert
2808e5dd7070Spatrickdef MinVectorWidth : InheritableAttr {
2809e5dd7070Spatrick  let Spellings = [Clang<"min_vector_width">];
2810e5dd7070Spatrick  let Args = [UnsignedArgument<"VectorWidth">];
2811e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
2812e5dd7070Spatrick  let Documentation = [MinVectorWidthDocs];
2813e5dd7070Spatrick}
2814e5dd7070Spatrick
2815e5dd7070Spatrickdef TransparentUnion : InheritableAttr {
2816e5dd7070Spatrick  let Spellings = [GCC<"transparent_union">];
2817e5dd7070Spatrick//  let Subjects = SubjectList<[Record, TypedefName]>;
2818e5dd7070Spatrick  let Documentation = [TransparentUnionDocs];
2819e5dd7070Spatrick  let LangOpts = [COnly];
2820e5dd7070Spatrick}
2821e5dd7070Spatrick
2822e5dd7070Spatrickdef Unavailable : InheritableAttr {
2823e5dd7070Spatrick  let Spellings = [Clang<"unavailable">];
2824e5dd7070Spatrick  let Args = [StringArgument<"Message", 1>,
2825e5dd7070Spatrick              EnumArgument<"ImplicitReason", "ImplicitReason",
2826e5dd7070Spatrick                ["", "", "", ""],
2827e5dd7070Spatrick                ["IR_None",
2828e5dd7070Spatrick                 "IR_ARCForbiddenType",
2829e5dd7070Spatrick                 "IR_ForbiddenWeak",
2830e5dd7070Spatrick                 "IR_ARCForbiddenConversion",
2831e5dd7070Spatrick                 "IR_ARCInitReturnsUnrelated",
2832e5dd7070Spatrick                 "IR_ARCFieldWithOwnership"], 1, /*fake*/ 1>];
2833e5dd7070Spatrick  let Documentation = [Undocumented];
2834e5dd7070Spatrick}
2835e5dd7070Spatrick
2836e5dd7070Spatrickdef DiagnoseIf : InheritableAttr {
2837e5dd7070Spatrick  // Does not have a [[]] spelling because this attribute requires the ability
2838e5dd7070Spatrick  // to parse function arguments but the attribute is not written in the type
2839e5dd7070Spatrick  // position.
2840e5dd7070Spatrick  let Spellings = [GNU<"diagnose_if">];
2841e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod, ObjCProperty]>;
2842e5dd7070Spatrick  let Args = [ExprArgument<"Cond">, StringArgument<"Message">,
2843e5dd7070Spatrick              EnumArgument<"DiagnosticType",
2844e5dd7070Spatrick                           "DiagnosticType",
2845e5dd7070Spatrick                           ["error", "warning"],
2846e5dd7070Spatrick                           ["DT_Error", "DT_Warning"]>,
2847e5dd7070Spatrick              BoolArgument<"ArgDependent", 0, /*fake*/ 1>,
2848ec727ea7Spatrick              DeclArgument<Named, "Parent", 0, /*fake*/ 1>];
2849e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
2850e5dd7070Spatrick  let LateParsed = 1;
2851e5dd7070Spatrick  let AdditionalMembers = [{
2852e5dd7070Spatrick    bool isError() const { return diagnosticType == DT_Error; }
2853e5dd7070Spatrick    bool isWarning() const { return diagnosticType == DT_Warning; }
2854e5dd7070Spatrick  }];
2855e5dd7070Spatrick  let TemplateDependent = 1;
2856e5dd7070Spatrick  let Documentation = [DiagnoseIfDocs];
2857e5dd7070Spatrick}
2858e5dd7070Spatrick
2859e5dd7070Spatrickdef ArcWeakrefUnavailable : InheritableAttr {
2860e5dd7070Spatrick  let Spellings = [Clang<"objc_arc_weak_reference_unavailable">];
2861e5dd7070Spatrick  let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
2862e5dd7070Spatrick  let Documentation = [Undocumented];
2863ec727ea7Spatrick  let SimpleHandler = 1;
2864e5dd7070Spatrick}
2865e5dd7070Spatrick
2866e5dd7070Spatrickdef ObjCGC : TypeAttr {
2867e5dd7070Spatrick  let Spellings = [Clang<"objc_gc">];
2868e5dd7070Spatrick  let Args = [IdentifierArgument<"Kind">];
2869e5dd7070Spatrick  let Documentation = [Undocumented];
2870e5dd7070Spatrick}
2871e5dd7070Spatrick
2872e5dd7070Spatrickdef ObjCOwnership : DeclOrTypeAttr {
2873e5dd7070Spatrick  let Spellings = [Clang<"objc_ownership">];
2874e5dd7070Spatrick  let Args = [IdentifierArgument<"Kind">];
2875e5dd7070Spatrick  let Documentation = [Undocumented];
2876e5dd7070Spatrick}
2877e5dd7070Spatrick
2878e5dd7070Spatrickdef ObjCRequiresPropertyDefs : InheritableAttr {
2879e5dd7070Spatrick  let Spellings = [Clang<"objc_requires_property_definitions">];
2880e5dd7070Spatrick  let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
2881e5dd7070Spatrick  let Documentation = [Undocumented];
2882ec727ea7Spatrick  let SimpleHandler = 1;
2883e5dd7070Spatrick}
2884e5dd7070Spatrick
2885e5dd7070Spatrickdef Unused : InheritableAttr {
2886e5dd7070Spatrick  let Spellings = [CXX11<"", "maybe_unused", 201603>, GCC<"unused">,
2887*12c85518Srobert                   C2x<"", "maybe_unused", 202106>];
2888e5dd7070Spatrick  let Subjects = SubjectList<[Var, ObjCIvar, Type, Enum, EnumConstant, Label,
2889e5dd7070Spatrick                              Field, ObjCMethod, FunctionLike]>;
2890e5dd7070Spatrick  let Documentation = [WarnMaybeUnusedDocs];
2891e5dd7070Spatrick}
2892e5dd7070Spatrick
2893e5dd7070Spatrickdef Used : InheritableAttr {
2894e5dd7070Spatrick  let Spellings = [GCC<"used">];
2895e5dd7070Spatrick  let Subjects = SubjectList<[NonLocalVar, Function, ObjCMethod]>;
2896a9ac8606Spatrick  let Documentation = [UsedDocs];
2897a9ac8606Spatrick  let SimpleHandler = 1;
2898a9ac8606Spatrick}
2899a9ac8606Spatrick
2900a9ac8606Spatrickdef Retain : InheritableAttr {
2901a9ac8606Spatrick  let Spellings = [GCC<"retain">];
2902a9ac8606Spatrick  let Subjects = SubjectList<[NonLocalVar, Function, ObjCMethod]>;
2903a9ac8606Spatrick  let Documentation = [RetainDocs];
2904ec727ea7Spatrick  let SimpleHandler = 1;
2905e5dd7070Spatrick}
2906e5dd7070Spatrick
2907e5dd7070Spatrickdef Uuid : InheritableAttr {
2908e5dd7070Spatrick  let Spellings = [Declspec<"uuid">, Microsoft<"uuid">];
2909ec727ea7Spatrick  let Args = [StringArgument<"Guid">,
2910ec727ea7Spatrick              DeclArgument<MSGuid, "GuidDecl", 0, /*fake=*/1>];
2911e5dd7070Spatrick  let Subjects = SubjectList<[Record, Enum]>;
2912e5dd7070Spatrick  // FIXME: Allow expressing logical AND for LangOpts. Our condition should be:
2913e5dd7070Spatrick  // CPlusPlus && (MicrosoftExt || Borland)
2914e5dd7070Spatrick  let LangOpts = [MicrosoftExt, Borland];
2915e5dd7070Spatrick  let Documentation = [Undocumented];
2916e5dd7070Spatrick}
2917e5dd7070Spatrick
2918e5dd7070Spatrickdef VectorSize : TypeAttr {
2919e5dd7070Spatrick  let Spellings = [GCC<"vector_size">];
2920e5dd7070Spatrick  let Args = [ExprArgument<"NumBytes">];
2921e5dd7070Spatrick  let Documentation = [Undocumented];
2922e5dd7070Spatrick  // Represented as VectorType instead.
2923e5dd7070Spatrick  let ASTNode = 0;
2924e5dd7070Spatrick}
2925e5dd7070Spatrick
2926e5dd7070Spatrickdef VecTypeHint : InheritableAttr {
2927e5dd7070Spatrick  // Does not have a [[]] spelling because it is an OpenCL-related attribute.
2928e5dd7070Spatrick  let Spellings = [GNU<"vec_type_hint">];
2929e5dd7070Spatrick  let Args = [TypeArgument<"TypeHint">];
2930e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
2931e5dd7070Spatrick  let Documentation = [Undocumented];
2932e5dd7070Spatrick}
2933e5dd7070Spatrick
2934ec727ea7Spatrickdef MatrixType : TypeAttr {
2935ec727ea7Spatrick  let Spellings = [Clang<"matrix_type">];
2936ec727ea7Spatrick  let Subjects = SubjectList<[TypedefName], ErrorDiag>;
2937ec727ea7Spatrick  let Args = [ExprArgument<"NumRows">, ExprArgument<"NumColumns">];
2938ec727ea7Spatrick  let Documentation = [Undocumented];
2939ec727ea7Spatrick  let ASTNode = 0;
2940ec727ea7Spatrick  let PragmaAttributeSupport = 0;
2941ec727ea7Spatrick}
2942ec727ea7Spatrick
2943e5dd7070Spatrickdef Visibility : InheritableAttr {
2944e5dd7070Spatrick  let Clone = 0;
2945e5dd7070Spatrick  let Spellings = [GCC<"visibility">];
2946e5dd7070Spatrick  let Args = [EnumArgument<"Visibility", "VisibilityType",
2947e5dd7070Spatrick                           ["default", "hidden", "internal", "protected"],
2948e5dd7070Spatrick                           ["Default", "Hidden", "Hidden", "Protected"]>];
2949e5dd7070Spatrick  let MeaningfulToClassTemplateDefinition = 1;
2950e5dd7070Spatrick  let Documentation = [Undocumented];
2951e5dd7070Spatrick}
2952e5dd7070Spatrick
2953e5dd7070Spatrickdef TypeVisibility : InheritableAttr {
2954e5dd7070Spatrick  let Clone = 0;
2955e5dd7070Spatrick  let Spellings = [Clang<"type_visibility">];
2956e5dd7070Spatrick  let Args = [EnumArgument<"Visibility", "VisibilityType",
2957e5dd7070Spatrick                           ["default", "hidden", "internal", "protected"],
2958e5dd7070Spatrick                           ["Default", "Hidden", "Hidden", "Protected"]>];
2959e5dd7070Spatrick//  let Subjects = [Tag, ObjCInterface, Namespace];
2960e5dd7070Spatrick  let Documentation = [Undocumented];
2961e5dd7070Spatrick}
2962e5dd7070Spatrick
2963e5dd7070Spatrickdef VecReturn : InheritableAttr {
2964e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it only appertains
2965e5dd7070Spatrick  // to C++ struct/class/union.
2966e5dd7070Spatrick  // FIXME: should this attribute have a CPlusPlus language option?
2967e5dd7070Spatrick  let Spellings = [Clang<"vecreturn", 0>];
2968e5dd7070Spatrick  let Subjects = SubjectList<[CXXRecord], ErrorDiag>;
2969e5dd7070Spatrick  let Documentation = [Undocumented];
2970e5dd7070Spatrick}
2971e5dd7070Spatrick
2972e5dd7070Spatrickdef WarnUnused : InheritableAttr {
2973e5dd7070Spatrick  let Spellings = [GCC<"warn_unused">];
2974e5dd7070Spatrick  let Subjects = SubjectList<[Record]>;
2975e5dd7070Spatrick  let Documentation = [Undocumented];
2976ec727ea7Spatrick  let SimpleHandler = 1;
2977e5dd7070Spatrick}
2978e5dd7070Spatrick
2979e5dd7070Spatrickdef WarnUnusedResult : InheritableAttr {
2980a9ac8606Spatrick  let Spellings = [CXX11<"", "nodiscard", 201907>,
2981*12c85518Srobert                   C2x<"", "nodiscard", 202003>,
2982e5dd7070Spatrick                   CXX11<"clang", "warn_unused_result">,
2983e5dd7070Spatrick                   GCC<"warn_unused_result">];
2984*12c85518Srobert  let Subjects = SubjectList<[ObjCMethod, Enum, Record, FunctionLike, TypedefName]>;
2985e5dd7070Spatrick  let Args = [StringArgument<"Message", 1>];
2986e5dd7070Spatrick  let Documentation = [WarnUnusedResultsDocs];
2987e5dd7070Spatrick  let AdditionalMembers = [{
2988e5dd7070Spatrick    // Check whether this the C++11 nodiscard version, even in non C++11
2989e5dd7070Spatrick    // spellings.
2990e5dd7070Spatrick    bool IsCXX11NoDiscard() const {
2991e5dd7070Spatrick      return this->getSemanticSpelling() == CXX11_nodiscard;
2992e5dd7070Spatrick    }
2993e5dd7070Spatrick  }];
2994e5dd7070Spatrick}
2995e5dd7070Spatrick
2996e5dd7070Spatrickdef Weak : InheritableAttr {
2997e5dd7070Spatrick  let Spellings = [GCC<"weak">];
2998e5dd7070Spatrick  let Subjects = SubjectList<[Var, Function, CXXRecord]>;
2999*12c85518Srobert  let Documentation = [WeakDocs];
3000ec727ea7Spatrick  let SimpleHandler = 1;
3001e5dd7070Spatrick}
3002e5dd7070Spatrick
3003e5dd7070Spatrickdef WeakImport : InheritableAttr {
3004e5dd7070Spatrick  let Spellings = [Clang<"weak_import">];
3005e5dd7070Spatrick  let Documentation = [Undocumented];
3006e5dd7070Spatrick}
3007e5dd7070Spatrick
3008e5dd7070Spatrickdef WeakRef : InheritableAttr {
3009e5dd7070Spatrick  let Spellings = [GCC<"weakref">];
3010e5dd7070Spatrick  // A WeakRef that has an argument is treated as being an AliasAttr
3011e5dd7070Spatrick  let Args = [StringArgument<"Aliasee", 1>];
3012e5dd7070Spatrick  let Subjects = SubjectList<[Var, Function], ErrorDiag>;
3013e5dd7070Spatrick  let Documentation = [Undocumented];
3014e5dd7070Spatrick}
3015e5dd7070Spatrick
3016e5dd7070Spatrickdef LTOVisibilityPublic : InheritableAttr {
3017e5dd7070Spatrick  let Spellings = [Clang<"lto_visibility_public">];
3018e5dd7070Spatrick  let Subjects = SubjectList<[Record]>;
3019e5dd7070Spatrick  let Documentation = [LTOVisibilityDocs];
3020ec727ea7Spatrick  let SimpleHandler = 1;
3021e5dd7070Spatrick}
3022e5dd7070Spatrick
3023e5dd7070Spatrickdef AnyX86Interrupt : InheritableAttr, TargetSpecificAttr<TargetAnyX86> {
3024e5dd7070Spatrick  // NOTE: If you add any additional spellings, ARMInterrupt's,
3025a9ac8606Spatrick  // M68kInterrupt's, MSP430Interrupt's and MipsInterrupt's spellings must match.
3026e5dd7070Spatrick  let Spellings = [GCC<"interrupt">];
3027e5dd7070Spatrick  let Subjects = SubjectList<[HasFunctionProto]>;
3028e5dd7070Spatrick  let ParseKind = "Interrupt";
3029e5dd7070Spatrick  let HasCustomParsing = 1;
3030e5dd7070Spatrick  let Documentation = [Undocumented];
3031e5dd7070Spatrick}
3032e5dd7070Spatrick
3033e5dd7070Spatrickdef AnyX86NoCallerSavedRegisters : InheritableAttr,
3034e5dd7070Spatrick                                   TargetSpecificAttr<TargetAnyX86> {
3035e5dd7070Spatrick  let Spellings = [GCC<"no_caller_saved_registers">];
3036e5dd7070Spatrick  let Documentation = [AnyX86NoCallerSavedRegistersDocs];
3037ec727ea7Spatrick  let SimpleHandler = 1;
3038e5dd7070Spatrick}
3039e5dd7070Spatrick
3040e5dd7070Spatrickdef AnyX86NoCfCheck : DeclOrTypeAttr, TargetSpecificAttr<TargetAnyX86>{
3041e5dd7070Spatrick  let Spellings = [GCC<"nocf_check">];
3042e5dd7070Spatrick  let Subjects = SubjectList<[FunctionLike]>;
3043e5dd7070Spatrick  let Documentation = [AnyX86NoCfCheckDocs];
3044e5dd7070Spatrick}
3045e5dd7070Spatrick
3046e5dd7070Spatrickdef X86ForceAlignArgPointer : InheritableAttr, TargetSpecificAttr<TargetAnyX86> {
3047e5dd7070Spatrick  let Spellings = [GCC<"force_align_arg_pointer">];
3048e5dd7070Spatrick  // Technically, this appertains to a FunctionDecl, but the target-specific
3049e5dd7070Spatrick  // code silently allows anything function-like (such as typedefs or function
3050e5dd7070Spatrick  // pointers), but does not apply the attribute to them.
3051e5dd7070Spatrick  let Documentation = [X86ForceAlignArgPointerDocs];
3052e5dd7070Spatrick}
3053e5dd7070Spatrick
3054e5dd7070Spatrickdef NoSanitize : InheritableAttr {
3055e5dd7070Spatrick  let Spellings = [Clang<"no_sanitize">];
3056e5dd7070Spatrick  let Args = [VariadicStringArgument<"Sanitizers">];
3057e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod, GlobalVar], ErrorDiag>;
3058e5dd7070Spatrick  let Documentation = [NoSanitizeDocs];
3059e5dd7070Spatrick  let AdditionalMembers = [{
3060e5dd7070Spatrick    SanitizerMask getMask() const {
3061e5dd7070Spatrick      SanitizerMask Mask;
3062e5dd7070Spatrick      for (auto SanitizerName : sanitizers()) {
3063e5dd7070Spatrick        SanitizerMask ParsedMask =
3064e5dd7070Spatrick            parseSanitizerValue(SanitizerName, /*AllowGroups=*/true);
3065e5dd7070Spatrick        Mask |= expandSanitizerGroups(ParsedMask);
3066e5dd7070Spatrick      }
3067e5dd7070Spatrick      return Mask;
3068e5dd7070Spatrick    }
3069a9ac8606Spatrick
3070a9ac8606Spatrick    bool hasCoverage() const {
3071a9ac8606Spatrick      return llvm::is_contained(sanitizers(), "coverage");
3072a9ac8606Spatrick    }
3073e5dd7070Spatrick  }];
3074e5dd7070Spatrick}
3075e5dd7070Spatrick
3076e5dd7070Spatrick// Attributes to disable a specific sanitizer. No new sanitizers should be added
3077e5dd7070Spatrick// to this list; the no_sanitize attribute should be extended instead.
3078e5dd7070Spatrickdef NoSanitizeSpecific : InheritableAttr {
3079e5dd7070Spatrick  let Spellings = [GCC<"no_address_safety_analysis">,
3080e5dd7070Spatrick                   GCC<"no_sanitize_address">,
3081e5dd7070Spatrick                   GCC<"no_sanitize_thread">,
3082e5dd7070Spatrick                   Clang<"no_sanitize_memory">];
3083e5dd7070Spatrick  let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag>;
3084e5dd7070Spatrick  let Documentation = [NoSanitizeAddressDocs, NoSanitizeThreadDocs,
3085e5dd7070Spatrick                       NoSanitizeMemoryDocs];
3086e5dd7070Spatrick  let ASTNode = 0;
3087e5dd7070Spatrick}
3088e5dd7070Spatrick
3089*12c85518Srobertdef DisableSanitizerInstrumentation : InheritableAttr {
3090*12c85518Srobert  let Spellings = [Clang<"disable_sanitizer_instrumentation">];
3091*12c85518Srobert  let Subjects = SubjectList<[Function, ObjCMethod, GlobalVar]>;
3092*12c85518Srobert  let Documentation = [DisableSanitizerInstrumentationDocs];
3093*12c85518Srobert  let SimpleHandler = 1;
3094*12c85518Srobert}
3095*12c85518Srobert
3096e5dd7070Spatrickdef CFICanonicalJumpTable : InheritableAttr {
3097e5dd7070Spatrick  let Spellings = [Clang<"cfi_canonical_jump_table">];
3098e5dd7070Spatrick  let Subjects = SubjectList<[Function], ErrorDiag>;
3099e5dd7070Spatrick  let Documentation = [CFICanonicalJumpTableDocs];
3100ec727ea7Spatrick  let SimpleHandler = 1;
3101e5dd7070Spatrick}
3102e5dd7070Spatrick
3103e5dd7070Spatrick// C/C++ Thread safety attributes (e.g. for deadlock, data race checking)
3104e5dd7070Spatrick// Not all of these attributes will be given a [[]] spelling. The attributes
3105e5dd7070Spatrick// which require access to function parameter names cannot use the [[]] spelling
3106e5dd7070Spatrick// because they are not written in the type position. Some attributes are given
3107e5dd7070Spatrick// an updated captability-based name and the older name will only be supported
3108e5dd7070Spatrick// under the GNU-style spelling.
3109e5dd7070Spatrickdef GuardedVar : InheritableAttr {
3110e5dd7070Spatrick  let Spellings = [Clang<"guarded_var", 0>];
3111e5dd7070Spatrick  let Subjects = SubjectList<[Field, SharedVar]>;
3112e5dd7070Spatrick  let Documentation = [Undocumented];
3113ec727ea7Spatrick  let SimpleHandler = 1;
3114e5dd7070Spatrick}
3115e5dd7070Spatrick
3116e5dd7070Spatrickdef PtGuardedVar : InheritableAttr {
3117e5dd7070Spatrick  let Spellings = [Clang<"pt_guarded_var", 0>];
3118e5dd7070Spatrick  let Subjects = SubjectList<[Field, SharedVar]>;
3119e5dd7070Spatrick  let Documentation = [Undocumented];
3120e5dd7070Spatrick}
3121e5dd7070Spatrick
3122e5dd7070Spatrickdef Lockable : InheritableAttr {
3123e5dd7070Spatrick  let Spellings = [GNU<"lockable">];
3124e5dd7070Spatrick  let Subjects = SubjectList<[Record]>;
3125e5dd7070Spatrick  let Documentation = [Undocumented];
3126e5dd7070Spatrick  let ASTNode = 0;  // Replaced by Capability
3127e5dd7070Spatrick}
3128e5dd7070Spatrick
3129e5dd7070Spatrickdef ScopedLockable : InheritableAttr {
3130e5dd7070Spatrick  let Spellings = [Clang<"scoped_lockable", 0>];
3131e5dd7070Spatrick  let Subjects = SubjectList<[Record]>;
3132e5dd7070Spatrick  let Documentation = [Undocumented];
3133ec727ea7Spatrick  let SimpleHandler = 1;
3134e5dd7070Spatrick}
3135e5dd7070Spatrick
3136e5dd7070Spatrickdef Capability : InheritableAttr {
3137e5dd7070Spatrick  let Spellings = [Clang<"capability", 0>, Clang<"shared_capability", 0>];
3138e5dd7070Spatrick  let Subjects = SubjectList<[Record, TypedefName], ErrorDiag>;
3139e5dd7070Spatrick  let Args = [StringArgument<"Name">];
3140e5dd7070Spatrick  let Accessors = [Accessor<"isShared",
3141e5dd7070Spatrick                    [Clang<"shared_capability", 0>]>];
3142e5dd7070Spatrick  let Documentation = [Undocumented];
3143e5dd7070Spatrick}
3144e5dd7070Spatrick
3145e5dd7070Spatrickdef AssertCapability : InheritableAttr {
3146e5dd7070Spatrick  let Spellings = [Clang<"assert_capability", 0>,
3147e5dd7070Spatrick                   Clang<"assert_shared_capability", 0>];
3148e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3149e5dd7070Spatrick  let LateParsed = 1;
3150e5dd7070Spatrick  let TemplateDependent = 1;
3151e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3152e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3153e5dd7070Spatrick  let Args = [VariadicExprArgument<"Args">];
3154e5dd7070Spatrick  let Accessors = [Accessor<"isShared",
3155e5dd7070Spatrick                    [Clang<"assert_shared_capability", 0>]>];
3156e5dd7070Spatrick  let Documentation = [AssertCapabilityDocs];
3157e5dd7070Spatrick}
3158e5dd7070Spatrick
3159e5dd7070Spatrickdef AcquireCapability : InheritableAttr {
3160e5dd7070Spatrick  let Spellings = [Clang<"acquire_capability", 0>,
3161e5dd7070Spatrick                   Clang<"acquire_shared_capability", 0>,
3162e5dd7070Spatrick                   GNU<"exclusive_lock_function">,
3163e5dd7070Spatrick                   GNU<"shared_lock_function">];
3164e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3165e5dd7070Spatrick  let LateParsed = 1;
3166e5dd7070Spatrick  let TemplateDependent = 1;
3167e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3168e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3169e5dd7070Spatrick  let Args = [VariadicExprArgument<"Args">];
3170e5dd7070Spatrick  let Accessors = [Accessor<"isShared",
3171e5dd7070Spatrick                    [Clang<"acquire_shared_capability", 0>,
3172e5dd7070Spatrick                     GNU<"shared_lock_function">]>];
3173e5dd7070Spatrick  let Documentation = [AcquireCapabilityDocs];
3174e5dd7070Spatrick}
3175e5dd7070Spatrick
3176e5dd7070Spatrickdef TryAcquireCapability : InheritableAttr {
3177e5dd7070Spatrick  let Spellings = [Clang<"try_acquire_capability", 0>,
3178e5dd7070Spatrick                   Clang<"try_acquire_shared_capability", 0>];
3179e5dd7070Spatrick  let Subjects = SubjectList<[Function],
3180e5dd7070Spatrick                             ErrorDiag>;
3181e5dd7070Spatrick  let LateParsed = 1;
3182e5dd7070Spatrick  let TemplateDependent = 1;
3183e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3184e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3185e5dd7070Spatrick  let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
3186e5dd7070Spatrick  let Accessors = [Accessor<"isShared",
3187e5dd7070Spatrick                    [Clang<"try_acquire_shared_capability", 0>]>];
3188e5dd7070Spatrick  let Documentation = [TryAcquireCapabilityDocs];
3189e5dd7070Spatrick}
3190e5dd7070Spatrick
3191e5dd7070Spatrickdef ReleaseCapability : InheritableAttr {
3192e5dd7070Spatrick  let Spellings = [Clang<"release_capability", 0>,
3193e5dd7070Spatrick                   Clang<"release_shared_capability", 0>,
3194e5dd7070Spatrick                   Clang<"release_generic_capability", 0>,
3195e5dd7070Spatrick                   Clang<"unlock_function", 0>];
3196e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3197e5dd7070Spatrick  let LateParsed = 1;
3198e5dd7070Spatrick  let TemplateDependent = 1;
3199e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3200e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3201e5dd7070Spatrick  let Args = [VariadicExprArgument<"Args">];
3202e5dd7070Spatrick  let Accessors = [Accessor<"isShared",
3203e5dd7070Spatrick                    [Clang<"release_shared_capability", 0>]>,
3204e5dd7070Spatrick                   Accessor<"isGeneric",
3205e5dd7070Spatrick                     [Clang<"release_generic_capability", 0>,
3206e5dd7070Spatrick                      Clang<"unlock_function", 0>]>];
3207e5dd7070Spatrick  let Documentation = [ReleaseCapabilityDocs];
3208e5dd7070Spatrick}
3209e5dd7070Spatrick
3210e5dd7070Spatrickdef RequiresCapability : InheritableAttr {
3211e5dd7070Spatrick  let Spellings = [Clang<"requires_capability", 0>,
3212e5dd7070Spatrick                   Clang<"exclusive_locks_required", 0>,
3213e5dd7070Spatrick                   Clang<"requires_shared_capability", 0>,
3214e5dd7070Spatrick                   Clang<"shared_locks_required", 0>];
3215e5dd7070Spatrick  let Args = [VariadicExprArgument<"Args">];
3216e5dd7070Spatrick  let LateParsed = 1;
3217e5dd7070Spatrick  let TemplateDependent = 1;
3218e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3219e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3220e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3221e5dd7070Spatrick  let Accessors = [Accessor<"isShared", [Clang<"requires_shared_capability", 0>,
3222e5dd7070Spatrick                                         Clang<"shared_locks_required", 0>]>];
3223e5dd7070Spatrick  let Documentation = [Undocumented];
3224e5dd7070Spatrick}
3225e5dd7070Spatrick
3226e5dd7070Spatrickdef NoThreadSafetyAnalysis : InheritableAttr {
3227e5dd7070Spatrick  let Spellings = [Clang<"no_thread_safety_analysis">];
3228e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3229e5dd7070Spatrick  let Documentation = [Undocumented];
3230ec727ea7Spatrick  let SimpleHandler = 1;
3231e5dd7070Spatrick}
3232e5dd7070Spatrick
3233e5dd7070Spatrickdef GuardedBy : InheritableAttr {
3234e5dd7070Spatrick  let Spellings = [GNU<"guarded_by">];
3235e5dd7070Spatrick  let Args = [ExprArgument<"Arg">];
3236e5dd7070Spatrick  let LateParsed = 1;
3237e5dd7070Spatrick  let TemplateDependent = 1;
3238e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3239e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3240e5dd7070Spatrick  let Subjects = SubjectList<[Field, SharedVar]>;
3241e5dd7070Spatrick  let Documentation = [Undocumented];
3242e5dd7070Spatrick}
3243e5dd7070Spatrick
3244e5dd7070Spatrickdef PtGuardedBy : InheritableAttr {
3245e5dd7070Spatrick  let Spellings = [GNU<"pt_guarded_by">];
3246e5dd7070Spatrick  let Args = [ExprArgument<"Arg">];
3247e5dd7070Spatrick  let LateParsed = 1;
3248e5dd7070Spatrick  let TemplateDependent = 1;
3249e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3250e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3251e5dd7070Spatrick  let Subjects = SubjectList<[Field, SharedVar]>;
3252e5dd7070Spatrick  let Documentation = [Undocumented];
3253e5dd7070Spatrick}
3254e5dd7070Spatrick
3255e5dd7070Spatrickdef AcquiredAfter : InheritableAttr {
3256e5dd7070Spatrick  let Spellings = [GNU<"acquired_after">];
3257e5dd7070Spatrick  let Args = [VariadicExprArgument<"Args">];
3258e5dd7070Spatrick  let LateParsed = 1;
3259e5dd7070Spatrick  let TemplateDependent = 1;
3260e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3261e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3262e5dd7070Spatrick  let Subjects = SubjectList<[Field, SharedVar]>;
3263e5dd7070Spatrick  let Documentation = [Undocumented];
3264e5dd7070Spatrick}
3265e5dd7070Spatrick
3266e5dd7070Spatrickdef AcquiredBefore : InheritableAttr {
3267e5dd7070Spatrick  let Spellings = [GNU<"acquired_before">];
3268e5dd7070Spatrick  let Args = [VariadicExprArgument<"Args">];
3269e5dd7070Spatrick  let LateParsed = 1;
3270e5dd7070Spatrick  let TemplateDependent = 1;
3271e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3272e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3273e5dd7070Spatrick  let Subjects = SubjectList<[Field, SharedVar]>;
3274e5dd7070Spatrick  let Documentation = [Undocumented];
3275e5dd7070Spatrick}
3276e5dd7070Spatrick
3277e5dd7070Spatrickdef AssertExclusiveLock : InheritableAttr {
3278e5dd7070Spatrick  let Spellings = [GNU<"assert_exclusive_lock">];
3279e5dd7070Spatrick  let Args = [VariadicExprArgument<"Args">];
3280e5dd7070Spatrick  let LateParsed = 1;
3281e5dd7070Spatrick  let TemplateDependent = 1;
3282e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3283e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3284e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3285e5dd7070Spatrick  let Documentation = [Undocumented];
3286e5dd7070Spatrick}
3287e5dd7070Spatrick
3288e5dd7070Spatrickdef AssertSharedLock : InheritableAttr {
3289e5dd7070Spatrick  let Spellings = [GNU<"assert_shared_lock">];
3290e5dd7070Spatrick  let Args = [VariadicExprArgument<"Args">];
3291e5dd7070Spatrick  let LateParsed = 1;
3292e5dd7070Spatrick  let TemplateDependent = 1;
3293e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3294e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3295e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3296e5dd7070Spatrick  let Documentation = [Undocumented];
3297e5dd7070Spatrick}
3298e5dd7070Spatrick
3299e5dd7070Spatrick// The first argument is an integer or boolean value specifying the return value
3300e5dd7070Spatrick// of a successful lock acquisition.
3301e5dd7070Spatrickdef ExclusiveTrylockFunction : InheritableAttr {
3302e5dd7070Spatrick  let Spellings = [GNU<"exclusive_trylock_function">];
3303e5dd7070Spatrick  let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
3304e5dd7070Spatrick  let LateParsed = 1;
3305e5dd7070Spatrick  let TemplateDependent = 1;
3306e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3307e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3308e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3309e5dd7070Spatrick  let Documentation = [Undocumented];
3310e5dd7070Spatrick}
3311e5dd7070Spatrick
3312e5dd7070Spatrick// The first argument is an integer or boolean value specifying the return value
3313e5dd7070Spatrick// of a successful lock acquisition.
3314e5dd7070Spatrickdef SharedTrylockFunction : InheritableAttr {
3315e5dd7070Spatrick  let Spellings = [GNU<"shared_trylock_function">];
3316e5dd7070Spatrick  let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
3317e5dd7070Spatrick  let LateParsed = 1;
3318e5dd7070Spatrick  let TemplateDependent = 1;
3319e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3320e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3321e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3322e5dd7070Spatrick  let Documentation = [Undocumented];
3323e5dd7070Spatrick}
3324e5dd7070Spatrick
3325e5dd7070Spatrickdef LockReturned : InheritableAttr {
3326e5dd7070Spatrick  let Spellings = [GNU<"lock_returned">];
3327e5dd7070Spatrick  let Args = [ExprArgument<"Arg">];
3328e5dd7070Spatrick  let LateParsed = 1;
3329e5dd7070Spatrick  let TemplateDependent = 1;
3330e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3331e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3332e5dd7070Spatrick  let Documentation = [Undocumented];
3333e5dd7070Spatrick}
3334e5dd7070Spatrick
3335e5dd7070Spatrickdef LocksExcluded : InheritableAttr {
3336e5dd7070Spatrick  let Spellings = [GNU<"locks_excluded">];
3337e5dd7070Spatrick  let Args = [VariadicExprArgument<"Args">];
3338e5dd7070Spatrick  let LateParsed = 1;
3339e5dd7070Spatrick  let TemplateDependent = 1;
3340e5dd7070Spatrick  let ParseArgumentsAsUnevaluated = 1;
3341e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3342e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3343e5dd7070Spatrick  let Documentation = [Undocumented];
3344e5dd7070Spatrick}
3345e5dd7070Spatrick
3346e5dd7070Spatrick// C/C++ consumed attributes.
3347e5dd7070Spatrick
3348e5dd7070Spatrickdef Consumable : InheritableAttr {
3349e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it only appertains
3350e5dd7070Spatrick  // to C++ struct/class/union.
3351e5dd7070Spatrick  // FIXME: should this attribute have a CPlusPlus language option?
3352e5dd7070Spatrick  let Spellings = [Clang<"consumable", 0>];
3353e5dd7070Spatrick  let Subjects = SubjectList<[CXXRecord]>;
3354e5dd7070Spatrick  let Args = [EnumArgument<"DefaultState", "ConsumedState",
3355e5dd7070Spatrick                           ["unknown", "consumed", "unconsumed"],
3356e5dd7070Spatrick                           ["Unknown", "Consumed", "Unconsumed"]>];
3357e5dd7070Spatrick  let Documentation = [ConsumableDocs];
3358e5dd7070Spatrick}
3359e5dd7070Spatrick
3360e5dd7070Spatrickdef ConsumableAutoCast : InheritableAttr {
3361e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it only appertains
3362e5dd7070Spatrick  // to C++ struct/class/union.
3363e5dd7070Spatrick  // FIXME: should this attribute have a CPlusPlus language option?
3364e5dd7070Spatrick  let Spellings = [Clang<"consumable_auto_cast_state", 0>];
3365e5dd7070Spatrick  let Subjects = SubjectList<[CXXRecord]>;
3366e5dd7070Spatrick  let Documentation = [Undocumented];
3367ec727ea7Spatrick  let SimpleHandler = 1;
3368e5dd7070Spatrick}
3369e5dd7070Spatrick
3370e5dd7070Spatrickdef ConsumableSetOnRead : InheritableAttr {
3371e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it only appertains
3372e5dd7070Spatrick  // to C++ struct/class/union.
3373e5dd7070Spatrick  // FIXME: should this attribute have a CPlusPlus language option?
3374e5dd7070Spatrick  let Spellings = [Clang<"consumable_set_state_on_read", 0>];
3375e5dd7070Spatrick  let Subjects = SubjectList<[CXXRecord]>;
3376e5dd7070Spatrick  let Documentation = [Undocumented];
3377ec727ea7Spatrick  let SimpleHandler = 1;
3378e5dd7070Spatrick}
3379e5dd7070Spatrick
3380e5dd7070Spatrickdef CallableWhen : InheritableAttr {
3381e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it only appertains
3382e5dd7070Spatrick  // to C++ function (but doesn't require it to be a member function).
3383e5dd7070Spatrick  // FIXME: should this attribute have a CPlusPlus language option?
3384e5dd7070Spatrick  let Spellings = [Clang<"callable_when", 0>];
3385e5dd7070Spatrick  let Subjects = SubjectList<[CXXMethod]>;
3386e5dd7070Spatrick  let Args = [VariadicEnumArgument<"CallableStates", "ConsumedState",
3387e5dd7070Spatrick                                   ["unknown", "consumed", "unconsumed"],
3388e5dd7070Spatrick                                   ["Unknown", "Consumed", "Unconsumed"]>];
3389e5dd7070Spatrick  let Documentation = [CallableWhenDocs];
3390e5dd7070Spatrick}
3391e5dd7070Spatrick
3392e5dd7070Spatrickdef ParamTypestate : InheritableAttr {
3393e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it only appertains
3394e5dd7070Spatrick  // to a parameter whose type is a consumable C++ class.
3395e5dd7070Spatrick  // FIXME: should this attribute have a CPlusPlus language option?
3396e5dd7070Spatrick  let Spellings = [Clang<"param_typestate", 0>];
3397e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
3398e5dd7070Spatrick  let Args = [EnumArgument<"ParamState", "ConsumedState",
3399e5dd7070Spatrick                           ["unknown", "consumed", "unconsumed"],
3400e5dd7070Spatrick                           ["Unknown", "Consumed", "Unconsumed"]>];
3401e5dd7070Spatrick  let Documentation = [ParamTypestateDocs];
3402e5dd7070Spatrick}
3403e5dd7070Spatrick
3404e5dd7070Spatrickdef ReturnTypestate : InheritableAttr {
3405e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it only appertains
3406e5dd7070Spatrick  // to a parameter or function return type that is a consumable C++ class.
3407e5dd7070Spatrick  // FIXME: should this attribute have a CPlusPlus language option?
3408e5dd7070Spatrick  let Spellings = [Clang<"return_typestate", 0>];
3409e5dd7070Spatrick  let Subjects = SubjectList<[Function, ParmVar]>;
3410e5dd7070Spatrick  let Args = [EnumArgument<"State", "ConsumedState",
3411e5dd7070Spatrick                           ["unknown", "consumed", "unconsumed"],
3412e5dd7070Spatrick                           ["Unknown", "Consumed", "Unconsumed"]>];
3413e5dd7070Spatrick  let Documentation = [ReturnTypestateDocs];
3414e5dd7070Spatrick}
3415e5dd7070Spatrick
3416e5dd7070Spatrickdef SetTypestate : InheritableAttr {
3417e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it only appertains
3418e5dd7070Spatrick  // to C++ function (but doesn't require it to be a member function).
3419e5dd7070Spatrick  // FIXME: should this attribute have a CPlusPlus language option?
3420e5dd7070Spatrick  let Spellings = [Clang<"set_typestate", 0>];
3421e5dd7070Spatrick  let Subjects = SubjectList<[CXXMethod]>;
3422e5dd7070Spatrick  let Args = [EnumArgument<"NewState", "ConsumedState",
3423e5dd7070Spatrick                           ["unknown", "consumed", "unconsumed"],
3424e5dd7070Spatrick                           ["Unknown", "Consumed", "Unconsumed"]>];
3425e5dd7070Spatrick  let Documentation = [SetTypestateDocs];
3426e5dd7070Spatrick}
3427e5dd7070Spatrick
3428e5dd7070Spatrickdef TestTypestate : InheritableAttr {
3429e5dd7070Spatrick  // This attribute does not have a C [[]] spelling because it only appertains
3430e5dd7070Spatrick  // to C++ function (but doesn't require it to be a member function).
3431e5dd7070Spatrick  // FIXME: should this attribute have a CPlusPlus language option?
3432e5dd7070Spatrick  let Spellings = [Clang<"test_typestate", 0>];
3433e5dd7070Spatrick  let Subjects = SubjectList<[CXXMethod]>;
3434e5dd7070Spatrick  let Args = [EnumArgument<"TestState", "ConsumedState",
3435e5dd7070Spatrick                           ["consumed", "unconsumed"],
3436e5dd7070Spatrick                           ["Consumed", "Unconsumed"]>];
3437e5dd7070Spatrick  let Documentation = [TestTypestateDocs];
3438e5dd7070Spatrick}
3439e5dd7070Spatrick
3440e5dd7070Spatrick// Type safety attributes for `void *' pointers and type tags.
3441e5dd7070Spatrick
3442e5dd7070Spatrickdef ArgumentWithTypeTag : InheritableAttr {
3443e5dd7070Spatrick  let Spellings = [Clang<"argument_with_type_tag">,
3444e5dd7070Spatrick                   Clang<"pointer_with_type_tag">];
3445e5dd7070Spatrick  let Subjects = SubjectList<[HasFunctionProto], ErrorDiag>;
3446e5dd7070Spatrick  let Args = [IdentifierArgument<"ArgumentKind">,
3447e5dd7070Spatrick              ParamIdxArgument<"ArgumentIdx">,
3448e5dd7070Spatrick              ParamIdxArgument<"TypeTagIdx">,
3449e5dd7070Spatrick              BoolArgument<"IsPointer", /*opt*/0, /*fake*/1>];
3450e5dd7070Spatrick  let Documentation = [ArgumentWithTypeTagDocs, PointerWithTypeTagDocs];
3451e5dd7070Spatrick}
3452e5dd7070Spatrick
3453e5dd7070Spatrickdef TypeTagForDatatype : InheritableAttr {
3454e5dd7070Spatrick  let Spellings = [Clang<"type_tag_for_datatype">];
3455e5dd7070Spatrick  let Args = [IdentifierArgument<"ArgumentKind">,
3456e5dd7070Spatrick              TypeArgument<"MatchingCType">,
3457e5dd7070Spatrick              BoolArgument<"LayoutCompatible">,
3458e5dd7070Spatrick              BoolArgument<"MustBeNull">];
3459e5dd7070Spatrick//  let Subjects = SubjectList<[Var], ErrorDiag>;
3460e5dd7070Spatrick  let HasCustomParsing = 1;
3461e5dd7070Spatrick  let Documentation = [TypeTagForDatatypeDocs];
3462e5dd7070Spatrick}
3463e5dd7070Spatrick
3464e5dd7070Spatrickdef Owner : InheritableAttr {
3465e5dd7070Spatrick  let Spellings = [CXX11<"gsl", "Owner">];
3466e5dd7070Spatrick  let Subjects = SubjectList<[Struct]>;
3467e5dd7070Spatrick  let Args = [TypeArgument<"DerefType", /*opt=*/1>];
3468e5dd7070Spatrick  let Documentation = [LifetimeOwnerDocs];
3469e5dd7070Spatrick}
3470e5dd7070Spatrick
3471e5dd7070Spatrickdef Pointer : InheritableAttr {
3472e5dd7070Spatrick  let Spellings = [CXX11<"gsl", "Pointer">];
3473e5dd7070Spatrick  let Subjects = SubjectList<[Struct]>;
3474e5dd7070Spatrick  let Args = [TypeArgument<"DerefType", /*opt=*/1>];
3475e5dd7070Spatrick  let Documentation = [LifetimePointerDocs];
3476e5dd7070Spatrick}
3477a9ac8606Spatrickdef : MutualExclusions<[Owner, Pointer]>;
3478e5dd7070Spatrick
3479e5dd7070Spatrick// Microsoft-related attributes
3480e5dd7070Spatrick
3481e5dd7070Spatrickdef MSNoVTable : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
3482e5dd7070Spatrick  let Spellings = [Declspec<"novtable">];
3483e5dd7070Spatrick  let Subjects = SubjectList<[CXXRecord]>;
3484e5dd7070Spatrick  let Documentation = [MSNoVTableDocs];
3485ec727ea7Spatrick  let SimpleHandler = 1;
3486e5dd7070Spatrick}
3487e5dd7070Spatrick
3488e5dd7070Spatrickdef : IgnoredAttr {
3489e5dd7070Spatrick  let Spellings = [Declspec<"property">];
3490e5dd7070Spatrick}
3491e5dd7070Spatrick
3492e5dd7070Spatrickdef MSAllocator : InheritableAttr {
3493e5dd7070Spatrick  let Spellings = [Declspec<"allocator">];
3494e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3495e5dd7070Spatrick  let Documentation = [MSAllocatorDocs];
3496e5dd7070Spatrick}
3497e5dd7070Spatrick
3498*12c85518Srobertdef CFGuard : InheritableAttr, TargetSpecificAttr<TargetWindows> {
3499e5dd7070Spatrick  // Currently only the __declspec(guard(nocf)) modifier is supported. In future
3500e5dd7070Spatrick  // we might also want to support __declspec(guard(suppress)).
3501*12c85518Srobert  let Spellings = [Declspec<"guard">, Clang<"guard">];
3502e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3503e5dd7070Spatrick  let Args = [EnumArgument<"Guard", "GuardArg", ["nocf"], ["nocf"]>];
3504e5dd7070Spatrick  let Documentation = [CFGuardDocs];
3505e5dd7070Spatrick}
3506e5dd7070Spatrick
3507e5dd7070Spatrickdef MSStruct : InheritableAttr {
3508e5dd7070Spatrick  let Spellings = [GCC<"ms_struct">];
3509e5dd7070Spatrick  let Subjects = SubjectList<[Record]>;
3510e5dd7070Spatrick  let Documentation = [Undocumented];
3511ec727ea7Spatrick  let SimpleHandler = 1;
3512e5dd7070Spatrick}
3513e5dd7070Spatrick
3514a9ac8606Spatrickdef DLLExport : InheritableAttr, TargetSpecificAttr<TargetHasDLLImportExport> {
3515e5dd7070Spatrick  let Spellings = [Declspec<"dllexport">, GCC<"dllexport">];
3516e5dd7070Spatrick  let Subjects = SubjectList<[Function, Var, CXXRecord, ObjCInterface]>;
3517e5dd7070Spatrick  let Documentation = [DLLExportDocs];
3518e5dd7070Spatrick}
3519e5dd7070Spatrick
3520a9ac8606Spatrickdef DLLExportStaticLocal : InheritableAttr, TargetSpecificAttr<TargetHasDLLImportExport> {
3521e5dd7070Spatrick  // This attribute is used internally only when -fno-dllexport-inlines is
3522a9ac8606Spatrick  // passed. This attribute is added to inline functions of a class having the
3523a9ac8606Spatrick  // dllexport attribute. If the function has static local variables, this
3524a9ac8606Spatrick  // attribute is used to determine whether the variables are exported or not. If
3525a9ac8606Spatrick  // the function has local static variables, the function is dllexported too.
3526e5dd7070Spatrick  let Spellings = [];
3527e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3528*12c85518Srobert  let Documentation = [InternalOnly];
3529e5dd7070Spatrick}
3530e5dd7070Spatrick
3531a9ac8606Spatrickdef DLLImport : InheritableAttr, TargetSpecificAttr<TargetHasDLLImportExport> {
3532e5dd7070Spatrick  let Spellings = [Declspec<"dllimport">, GCC<"dllimport">];
3533e5dd7070Spatrick  let Subjects = SubjectList<[Function, Var, CXXRecord, ObjCInterface]>;
3534e5dd7070Spatrick  let Documentation = [DLLImportDocs];
3535e5dd7070Spatrick
3536e5dd7070Spatrick
3537e5dd7070Spatrick  let AdditionalMembers = [{
3538e5dd7070Spatrickprivate:
3539e5dd7070Spatrick  bool PropagatedToBaseTemplate = false;
3540e5dd7070Spatrick
3541e5dd7070Spatrickpublic:
3542e5dd7070Spatrick  void setPropagatedToBaseTemplate() { PropagatedToBaseTemplate = true; }
3543e5dd7070Spatrick  bool wasPropagatedToBaseTemplate() { return PropagatedToBaseTemplate; }
3544e5dd7070Spatrick  }];
3545e5dd7070Spatrick}
3546e5dd7070Spatrick
3547a9ac8606Spatrickdef DLLImportStaticLocal : InheritableAttr, TargetSpecificAttr<TargetHasDLLImportExport> {
3548e5dd7070Spatrick  // This attribute is used internally only when -fno-dllexport-inlines is
3549a9ac8606Spatrick  // passed. This attribute is added to inline functions of a class having the
3550a9ac8606Spatrick  // dllimport attribute. If the function has static local variables, this
3551a9ac8606Spatrick  // attribute is used to determine whether the variables are imported or not.
3552e5dd7070Spatrick  let Spellings = [];
3553e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3554*12c85518Srobert  let Documentation = [InternalOnly];
3555e5dd7070Spatrick}
3556e5dd7070Spatrick
3557e5dd7070Spatrickdef SelectAny : InheritableAttr {
3558e5dd7070Spatrick  let Spellings = [Declspec<"selectany">, GCC<"selectany">];
3559e5dd7070Spatrick  let Documentation = [SelectAnyDocs];
3560ec727ea7Spatrick  let SimpleHandler = 1;
3561e5dd7070Spatrick}
3562e5dd7070Spatrick
3563e5dd7070Spatrickdef Thread : Attr {
3564e5dd7070Spatrick  let Spellings = [Declspec<"thread">];
3565e5dd7070Spatrick  let LangOpts = [MicrosoftExt];
3566e5dd7070Spatrick  let Documentation = [ThreadDocs];
3567e5dd7070Spatrick  let Subjects = SubjectList<[Var]>;
3568e5dd7070Spatrick}
3569e5dd7070Spatrick
3570e5dd7070Spatrickdef Win64 : IgnoredAttr {
3571e5dd7070Spatrick  let Spellings = [Keyword<"__w64">];
3572e5dd7070Spatrick  let LangOpts = [MicrosoftExt];
3573e5dd7070Spatrick}
3574e5dd7070Spatrick
3575e5dd7070Spatrickdef Ptr32 : TypeAttr {
3576e5dd7070Spatrick  let Spellings = [Keyword<"__ptr32">];
3577e5dd7070Spatrick  let Documentation = [Ptr32Docs];
3578e5dd7070Spatrick}
3579e5dd7070Spatrick
3580e5dd7070Spatrickdef Ptr64 : TypeAttr {
3581e5dd7070Spatrick  let Spellings = [Keyword<"__ptr64">];
3582e5dd7070Spatrick  let Documentation = [Ptr64Docs];
3583e5dd7070Spatrick}
3584e5dd7070Spatrick
3585e5dd7070Spatrickdef SPtr : TypeAttr {
3586e5dd7070Spatrick  let Spellings = [Keyword<"__sptr">];
3587e5dd7070Spatrick  let Documentation = [SPtrDocs];
3588e5dd7070Spatrick}
3589e5dd7070Spatrick
3590e5dd7070Spatrickdef UPtr : TypeAttr {
3591e5dd7070Spatrick  let Spellings = [Keyword<"__uptr">];
3592e5dd7070Spatrick  let Documentation = [UPtrDocs];
3593e5dd7070Spatrick}
3594e5dd7070Spatrick
3595e5dd7070Spatrickdef MSInheritance : InheritableAttr {
3596e5dd7070Spatrick  let LangOpts = [MicrosoftExt];
3597e5dd7070Spatrick  let Args = [DefaultBoolArgument<"BestCase", /*default*/1, /*fake*/1>];
3598e5dd7070Spatrick  let Spellings = [Keyword<"__single_inheritance">,
3599e5dd7070Spatrick                   Keyword<"__multiple_inheritance">,
3600e5dd7070Spatrick                   Keyword<"__virtual_inheritance">,
3601e5dd7070Spatrick                   Keyword<"__unspecified_inheritance">];
3602e5dd7070Spatrick  let AdditionalMembers = [{
3603e5dd7070Spatrick  MSInheritanceModel getInheritanceModel() const {
3604e5dd7070Spatrick    // The spelling enum should agree with MSInheritanceModel.
3605e5dd7070Spatrick    return MSInheritanceModel(getSemanticSpelling());
3606e5dd7070Spatrick  }
3607e5dd7070Spatrick  }];
3608e5dd7070Spatrick  let Documentation = [MSInheritanceDocs];
3609e5dd7070Spatrick}
3610e5dd7070Spatrick
3611e5dd7070Spatrickdef MSVtorDisp : InheritableAttr {
3612e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
3613e5dd7070Spatrick  let Spellings = [];
3614e5dd7070Spatrick  let Args = [UnsignedArgument<"vdm">];
3615e5dd7070Spatrick  let SemaHandler = 0;
3616e5dd7070Spatrick
3617e5dd7070Spatrick  let AdditionalMembers = [{
3618e5dd7070Spatrick  MSVtorDispMode getVtorDispMode() const { return MSVtorDispMode(vdm); }
3619e5dd7070Spatrick  }];
3620*12c85518Srobert  let Documentation = [InternalOnly];
3621e5dd7070Spatrick}
3622e5dd7070Spatrick
3623e5dd7070Spatrickdef InitSeg : Attr {
3624e5dd7070Spatrick  let Spellings = [Pragma<"", "init_seg">];
3625e5dd7070Spatrick  let Args = [StringArgument<"Section">];
3626e5dd7070Spatrick  let SemaHandler = 0;
3627e5dd7070Spatrick  let Documentation = [InitSegDocs];
3628e5dd7070Spatrick  let AdditionalMembers = [{
3629e5dd7070Spatrick  void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
3630e5dd7070Spatrick    OS << " (" << getSection() << ')';
3631e5dd7070Spatrick  }
3632e5dd7070Spatrick  }];
3633e5dd7070Spatrick}
3634e5dd7070Spatrick
3635e5dd7070Spatrickdef LoopHint : Attr {
3636e5dd7070Spatrick  /// #pragma clang loop <option> directive
3637e5dd7070Spatrick  /// vectorize: vectorizes loop operations if State == Enable.
3638e5dd7070Spatrick  /// vectorize_width: vectorize loop operations with width 'Value'.
3639e5dd7070Spatrick  /// interleave: interleave multiple loop iterations if State == Enable.
3640e5dd7070Spatrick  /// interleave_count: interleaves 'Value' loop iterations.
3641e5dd7070Spatrick  /// unroll: fully unroll loop if State == Enable.
3642e5dd7070Spatrick  /// unroll_count: unrolls loop 'Value' times.
3643e5dd7070Spatrick  /// unroll_and_jam: attempt to unroll and jam loop if State == Enable.
3644e5dd7070Spatrick  /// unroll_and_jam_count: unroll and jams loop 'Value' times.
3645e5dd7070Spatrick  /// distribute: attempt to distribute loop if State == Enable.
3646e5dd7070Spatrick  /// pipeline: disable pipelining loop if State == Disable.
3647e5dd7070Spatrick  /// pipeline_initiation_interval: create loop schedule with initiation interval equal to 'Value'.
3648e5dd7070Spatrick
3649e5dd7070Spatrick  /// #pragma unroll <argument> directive
3650e5dd7070Spatrick  /// <no arg>: fully unrolls loop.
3651e5dd7070Spatrick  /// boolean: fully unrolls loop if State == Enable.
3652e5dd7070Spatrick  /// expression: unrolls loop 'Value' times.
3653e5dd7070Spatrick
3654e5dd7070Spatrick  let Spellings = [Pragma<"clang", "loop">, Pragma<"", "unroll">,
3655e5dd7070Spatrick                   Pragma<"", "nounroll">, Pragma<"", "unroll_and_jam">,
3656e5dd7070Spatrick                   Pragma<"", "nounroll_and_jam">];
3657e5dd7070Spatrick
3658e5dd7070Spatrick  /// State of the loop optimization specified by the spelling.
3659e5dd7070Spatrick  let Args = [EnumArgument<"Option", "OptionType",
3660e5dd7070Spatrick                          ["vectorize", "vectorize_width", "interleave", "interleave_count",
3661e5dd7070Spatrick                           "unroll", "unroll_count", "unroll_and_jam", "unroll_and_jam_count",
3662e5dd7070Spatrick                           "pipeline", "pipeline_initiation_interval", "distribute",
3663e5dd7070Spatrick                           "vectorize_predicate"],
3664e5dd7070Spatrick                          ["Vectorize", "VectorizeWidth", "Interleave", "InterleaveCount",
3665e5dd7070Spatrick                           "Unroll", "UnrollCount", "UnrollAndJam", "UnrollAndJamCount",
3666e5dd7070Spatrick                           "PipelineDisabled", "PipelineInitiationInterval", "Distribute",
3667e5dd7070Spatrick                           "VectorizePredicate"]>,
3668e5dd7070Spatrick              EnumArgument<"State", "LoopHintState",
3669a9ac8606Spatrick                           ["enable", "disable", "numeric", "fixed_width",
3670a9ac8606Spatrick                            "scalable_width", "assume_safety", "full"],
3671a9ac8606Spatrick                           ["Enable", "Disable", "Numeric", "FixedWidth",
3672a9ac8606Spatrick                            "ScalableWidth", "AssumeSafety", "Full"]>,
3673e5dd7070Spatrick              ExprArgument<"Value">];
3674e5dd7070Spatrick
3675e5dd7070Spatrick  let AdditionalMembers = [{
3676e5dd7070Spatrick  static const char *getOptionName(int Option) {
3677e5dd7070Spatrick    switch(Option) {
3678e5dd7070Spatrick    case Vectorize: return "vectorize";
3679e5dd7070Spatrick    case VectorizeWidth: return "vectorize_width";
3680e5dd7070Spatrick    case Interleave: return "interleave";
3681e5dd7070Spatrick    case InterleaveCount: return "interleave_count";
3682e5dd7070Spatrick    case Unroll: return "unroll";
3683e5dd7070Spatrick    case UnrollCount: return "unroll_count";
3684e5dd7070Spatrick    case UnrollAndJam: return "unroll_and_jam";
3685e5dd7070Spatrick    case UnrollAndJamCount: return "unroll_and_jam_count";
3686e5dd7070Spatrick    case PipelineDisabled: return "pipeline";
3687e5dd7070Spatrick    case PipelineInitiationInterval: return "pipeline_initiation_interval";
3688e5dd7070Spatrick    case Distribute: return "distribute";
3689e5dd7070Spatrick    case VectorizePredicate: return "vectorize_predicate";
3690e5dd7070Spatrick    }
3691e5dd7070Spatrick    llvm_unreachable("Unhandled LoopHint option.");
3692e5dd7070Spatrick  }
3693e5dd7070Spatrick
3694ec727ea7Spatrick  void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const;
3695e5dd7070Spatrick
3696e5dd7070Spatrick  // Return a string containing the loop hint argument including the
3697e5dd7070Spatrick  // enclosing parentheses.
3698ec727ea7Spatrick  std::string getValueString(const PrintingPolicy &Policy) const;
3699e5dd7070Spatrick
3700e5dd7070Spatrick  // Return a string suitable for identifying this attribute in diagnostics.
3701ec727ea7Spatrick  std::string getDiagnosticName(const PrintingPolicy &Policy) const;
3702e5dd7070Spatrick  }];
3703e5dd7070Spatrick
3704e5dd7070Spatrick  let Documentation = [LoopHintDocs, UnrollHintDocs];
3705a9ac8606Spatrick  let HasCustomParsing = 1;
3706e5dd7070Spatrick}
3707e5dd7070Spatrick
3708e5dd7070Spatrickdef CapturedRecord : InheritableAttr {
3709e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
3710e5dd7070Spatrick  let Spellings = [];
3711e5dd7070Spatrick  let SemaHandler = 0;
3712*12c85518Srobert  let Documentation = [InternalOnly];
3713e5dd7070Spatrick}
3714e5dd7070Spatrick
3715e5dd7070Spatrickdef OMPThreadPrivateDecl : InheritableAttr {
3716e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
3717e5dd7070Spatrick  let Spellings = [];
3718e5dd7070Spatrick  let SemaHandler = 0;
3719*12c85518Srobert  let Documentation = [InternalOnly];
3720e5dd7070Spatrick}
3721e5dd7070Spatrick
3722e5dd7070Spatrickdef OMPCaptureNoInit : InheritableAttr {
3723e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
3724e5dd7070Spatrick  let Spellings = [];
3725e5dd7070Spatrick  let SemaHandler = 0;
3726*12c85518Srobert  let Documentation = [InternalOnly];
3727e5dd7070Spatrick}
3728e5dd7070Spatrick
3729e5dd7070Spatrickdef OMPCaptureKind : Attr {
3730e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
3731e5dd7070Spatrick  let Spellings = [];
3732e5dd7070Spatrick  let SemaHandler = 0;
3733ec727ea7Spatrick  let Args = [UnsignedArgument<"CaptureKindVal">];
3734*12c85518Srobert  let Documentation = [InternalOnly];
3735ec727ea7Spatrick  let AdditionalMembers = [{
3736ec727ea7Spatrick    llvm::omp::Clause getCaptureKind() const {
3737ec727ea7Spatrick      return static_cast<llvm::omp::Clause>(getCaptureKindVal());
3738ec727ea7Spatrick    }
3739ec727ea7Spatrick  }];
3740e5dd7070Spatrick}
3741e5dd7070Spatrick
3742e5dd7070Spatrickdef OMPReferencedVar : Attr {
3743e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
3744e5dd7070Spatrick  let Spellings = [];
3745e5dd7070Spatrick  let SemaHandler = 0;
3746e5dd7070Spatrick  let Args = [ExprArgument<"Ref">];
3747*12c85518Srobert  let Documentation = [InternalOnly];
3748e5dd7070Spatrick}
3749e5dd7070Spatrick
3750e5dd7070Spatrickdef OMPDeclareSimdDecl : Attr {
3751e5dd7070Spatrick  let Spellings = [Pragma<"omp", "declare simd">];
3752e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3753e5dd7070Spatrick  let SemaHandler = 0;
3754e5dd7070Spatrick  let HasCustomParsing = 1;
3755e5dd7070Spatrick  let Documentation = [OMPDeclareSimdDocs];
3756e5dd7070Spatrick  let Args = [
3757e5dd7070Spatrick    EnumArgument<"BranchState", "BranchStateTy",
3758e5dd7070Spatrick                 [ "", "inbranch", "notinbranch" ],
3759e5dd7070Spatrick                 [ "BS_Undefined", "BS_Inbranch", "BS_Notinbranch" ]>,
3760e5dd7070Spatrick    ExprArgument<"Simdlen">, VariadicExprArgument<"Uniforms">,
3761e5dd7070Spatrick    VariadicExprArgument<"Aligneds">, VariadicExprArgument<"Alignments">,
3762e5dd7070Spatrick    VariadicExprArgument<"Linears">, VariadicUnsignedArgument<"Modifiers">,
3763e5dd7070Spatrick    VariadicExprArgument<"Steps">
3764e5dd7070Spatrick  ];
3765e5dd7070Spatrick  let AdditionalMembers = [{
3766e5dd7070Spatrick    void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy)
3767ec727ea7Spatrick        const;
3768e5dd7070Spatrick  }];
3769e5dd7070Spatrick}
3770e5dd7070Spatrick
3771e5dd7070Spatrickdef OMPDeclareTargetDecl : InheritableAttr {
3772e5dd7070Spatrick  let Spellings = [Pragma<"omp", "declare target">];
3773e5dd7070Spatrick  let SemaHandler = 0;
3774e5dd7070Spatrick  let Subjects = SubjectList<[Function, SharedVar]>;
3775e5dd7070Spatrick  let Documentation = [OMPDeclareTargetDocs];
3776e5dd7070Spatrick  let Args = [
3777e5dd7070Spatrick    EnumArgument<"MapType", "MapTypeTy",
3778*12c85518Srobert                 [ "to", "enter", "link" ],
3779*12c85518Srobert                 [ "MT_To", "MT_Enter", "MT_Link" ]>,
3780e5dd7070Spatrick    EnumArgument<"DevType", "DevTypeTy",
3781e5dd7070Spatrick                 [ "host", "nohost", "any" ],
3782a9ac8606Spatrick                 [ "DT_Host", "DT_NoHost", "DT_Any" ]>,
3783*12c85518Srobert    ExprArgument<"IndirectExpr">,
3784*12c85518Srobert    BoolArgument<"Indirect">,
3785a9ac8606Spatrick    UnsignedArgument<"Level">
3786e5dd7070Spatrick  ];
3787e5dd7070Spatrick  let AdditionalMembers = [{
3788ec727ea7Spatrick    void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const;
3789*12c85518Srobert    static std::optional<MapTypeTy>
3790ec727ea7Spatrick    isDeclareTargetDeclaration(const ValueDecl *VD);
3791*12c85518Srobert    static std::optional<OMPDeclareTargetDeclAttr*> getActiveAttr(const ValueDecl *VD);
3792*12c85518Srobert    static std::optional<DevTypeTy> getDeviceType(const ValueDecl *VD);
3793*12c85518Srobert    static std::optional<SourceLocation> getLocation(const ValueDecl *VD);
3794e5dd7070Spatrick  }];
3795e5dd7070Spatrick}
3796e5dd7070Spatrick
3797e5dd7070Spatrickdef OMPAllocateDecl : InheritableAttr {
3798e5dd7070Spatrick  // This attribute has no spellings as it is only ever created implicitly.
3799e5dd7070Spatrick  let Spellings = [];
3800e5dd7070Spatrick  let SemaHandler = 0;
3801e5dd7070Spatrick  let Args = [
3802e5dd7070Spatrick    EnumArgument<"AllocatorType", "AllocatorTypeTy",
3803e5dd7070Spatrick                 [
3804ec727ea7Spatrick                   "omp_null_allocator", "omp_default_mem_alloc",
3805ec727ea7Spatrick                   "omp_large_cap_mem_alloc", "omp_const_mem_alloc",
3806ec727ea7Spatrick                   "omp_high_bw_mem_alloc", "omp_low_lat_mem_alloc",
3807ec727ea7Spatrick                   "omp_cgroup_mem_alloc", "omp_pteam_mem_alloc",
3808ec727ea7Spatrick                   "omp_thread_mem_alloc", ""
3809e5dd7070Spatrick                 ],
3810e5dd7070Spatrick                 [
3811ec727ea7Spatrick                   "OMPNullMemAlloc", "OMPDefaultMemAlloc",
3812ec727ea7Spatrick                   "OMPLargeCapMemAlloc", "OMPConstMemAlloc",
3813ec727ea7Spatrick                   "OMPHighBWMemAlloc", "OMPLowLatMemAlloc",
3814e5dd7070Spatrick                   "OMPCGroupMemAlloc", "OMPPTeamMemAlloc", "OMPThreadMemAlloc",
3815e5dd7070Spatrick                   "OMPUserDefinedMemAlloc"
3816e5dd7070Spatrick                 ]>,
3817*12c85518Srobert    ExprArgument<"Allocator">,
3818*12c85518Srobert    ExprArgument<"Alignment">
3819e5dd7070Spatrick  ];
3820*12c85518Srobert  let Documentation = [InternalOnly];
3821e5dd7070Spatrick}
3822e5dd7070Spatrick
3823e5dd7070Spatrickdef OMPDeclareVariant : InheritableAttr {
3824e5dd7070Spatrick  let Spellings = [Pragma<"omp", "declare variant">];
3825e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3826e5dd7070Spatrick  let SemaHandler = 0;
3827e5dd7070Spatrick  let HasCustomParsing = 1;
3828e5dd7070Spatrick  let InheritEvenIfAlreadyPresent = 1;
3829e5dd7070Spatrick  let Documentation = [OMPDeclareVariantDocs];
3830e5dd7070Spatrick  let Args = [
3831e5dd7070Spatrick    ExprArgument<"VariantFuncRef">,
3832ec727ea7Spatrick    OMPTraitInfoArgument<"TraitInfos">,
3833*12c85518Srobert    VariadicExprArgument<"AdjustArgsNothing">,
3834*12c85518Srobert    VariadicExprArgument<"AdjustArgsNeedDevicePtr">,
3835*12c85518Srobert    VariadicOMPInteropInfoArgument<"AppendArgs">,
3836e5dd7070Spatrick  ];
3837e5dd7070Spatrick  let AdditionalMembers = [{
3838ec727ea7Spatrick    OMPTraitInfo &getTraitInfo() { return *traitInfos; }
3839e5dd7070Spatrick    void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy)
3840ec727ea7Spatrick        const;
3841*12c85518Srobert    static StringRef getInteropTypeString(const OMPInteropInfo *I) {
3842*12c85518Srobert      if (I->IsTarget && I->IsTargetSync)
3843*12c85518Srobert        return "target,targetsync";
3844*12c85518Srobert      if (I->IsTarget)
3845*12c85518Srobert        return "target";
3846*12c85518Srobert      return "targetsync";
3847*12c85518Srobert    }
3848e5dd7070Spatrick  }];
3849e5dd7070Spatrick}
3850e5dd7070Spatrick
3851a9ac8606Spatrickdef Assumption : InheritableAttr {
3852a9ac8606Spatrick  let Spellings = [Clang<"assume">];
3853a9ac8606Spatrick  let Subjects = SubjectList<[Function, ObjCMethod]>;
3854a9ac8606Spatrick  let InheritEvenIfAlreadyPresent = 1;
3855a9ac8606Spatrick  let Documentation = [AssumptionDocs];
3856a9ac8606Spatrick  let Args = [StringArgument<"Assumption">];
3857a9ac8606Spatrick}
3858a9ac8606Spatrick
3859e5dd7070Spatrickdef InternalLinkage : InheritableAttr {
3860e5dd7070Spatrick  let Spellings = [Clang<"internal_linkage">];
3861e5dd7070Spatrick  let Subjects = SubjectList<[Var, Function, CXXRecord]>;
3862e5dd7070Spatrick  let Documentation = [InternalLinkageDocs];
3863e5dd7070Spatrick}
3864a9ac8606Spatrickdef : MutualExclusions<[Common, InternalLinkage]>;
3865e5dd7070Spatrick
3866e5dd7070Spatrickdef ExcludeFromExplicitInstantiation : InheritableAttr {
3867e5dd7070Spatrick  let Spellings = [Clang<"exclude_from_explicit_instantiation">];
3868e5dd7070Spatrick  let Subjects = SubjectList<[Var, Function, CXXRecord]>;
3869e5dd7070Spatrick  let Documentation = [ExcludeFromExplicitInstantiationDocs];
3870e5dd7070Spatrick  let MeaningfulToClassTemplateDefinition = 1;
3871ec727ea7Spatrick  let SimpleHandler = 1;
3872e5dd7070Spatrick}
3873e5dd7070Spatrick
3874e5dd7070Spatrickdef Reinitializes : InheritableAttr {
3875e5dd7070Spatrick  let Spellings = [Clang<"reinitializes", 0>];
3876e5dd7070Spatrick  let Subjects = SubjectList<[NonStaticNonConstCXXMethod], ErrorDiag>;
3877e5dd7070Spatrick  let Documentation = [ReinitializesDocs];
3878ec727ea7Spatrick  let SimpleHandler = 1;
3879e5dd7070Spatrick}
3880e5dd7070Spatrick
3881e5dd7070Spatrickdef NoDestroy : InheritableAttr {
3882e5dd7070Spatrick  let Spellings = [Clang<"no_destroy", 0>];
3883e5dd7070Spatrick  let Subjects = SubjectList<[Var]>;
3884e5dd7070Spatrick  let Documentation = [NoDestroyDocs];
3885e5dd7070Spatrick}
3886e5dd7070Spatrick
3887e5dd7070Spatrickdef AlwaysDestroy : InheritableAttr {
3888e5dd7070Spatrick  let Spellings = [Clang<"always_destroy", 0>];
3889e5dd7070Spatrick  let Subjects = SubjectList<[Var]>;
3890e5dd7070Spatrick  let Documentation = [AlwaysDestroyDocs];
3891e5dd7070Spatrick}
3892a9ac8606Spatrickdef : MutualExclusions<[NoDestroy, AlwaysDestroy]>;
3893e5dd7070Spatrick
3894e5dd7070Spatrickdef SpeculativeLoadHardening : InheritableAttr {
3895e5dd7070Spatrick  let Spellings = [Clang<"speculative_load_hardening">];
3896e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>;
3897e5dd7070Spatrick  let Documentation = [SpeculativeLoadHardeningDocs];
3898a9ac8606Spatrick  let SimpleHandler = 1;
3899e5dd7070Spatrick}
3900e5dd7070Spatrick
3901e5dd7070Spatrickdef NoSpeculativeLoadHardening : InheritableAttr {
3902e5dd7070Spatrick  let Spellings = [Clang<"no_speculative_load_hardening">];
3903e5dd7070Spatrick  let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>;
3904e5dd7070Spatrick  let Documentation = [NoSpeculativeLoadHardeningDocs];
3905a9ac8606Spatrick  let SimpleHandler = 1;
3906e5dd7070Spatrick}
3907a9ac8606Spatrickdef : MutualExclusions<[SpeculativeLoadHardening, NoSpeculativeLoadHardening]>;
3908e5dd7070Spatrick
3909e5dd7070Spatrickdef Uninitialized : InheritableAttr {
3910e5dd7070Spatrick  let Spellings = [Clang<"uninitialized", 0>];
3911e5dd7070Spatrick  let Subjects = SubjectList<[LocalVar]>;
3912ec727ea7Spatrick  let PragmaAttributeSupport = 1;
3913e5dd7070Spatrick  let Documentation = [UninitializedDocs];
3914e5dd7070Spatrick}
3915e5dd7070Spatrick
3916ec727ea7Spatrickdef LoaderUninitialized : Attr {
3917ec727ea7Spatrick  let Spellings = [Clang<"loader_uninitialized">];
3918ec727ea7Spatrick  let Subjects = SubjectList<[GlobalVar]>;
3919ec727ea7Spatrick  let Documentation = [LoaderUninitializedDocs];
3920a9ac8606Spatrick  let SimpleHandler = 1;
3921ec727ea7Spatrick}
3922ec727ea7Spatrick
3923e5dd7070Spatrickdef ObjCExternallyRetained : InheritableAttr {
3924e5dd7070Spatrick  let LangOpts = [ObjCAutoRefCount];
3925e5dd7070Spatrick  let Spellings = [Clang<"objc_externally_retained">];
3926e5dd7070Spatrick  let Subjects = SubjectList<[NonParmVar, Function, Block, ObjCMethod]>;
3927e5dd7070Spatrick  let Documentation = [ObjCExternallyRetainedDocs];
3928e5dd7070Spatrick}
3929e5dd7070Spatrick
3930e5dd7070Spatrickdef NoBuiltin : Attr {
3931e5dd7070Spatrick  let Spellings = [Clang<"no_builtin">];
3932e5dd7070Spatrick  let Args = [VariadicStringArgument<"BuiltinNames">];
3933e5dd7070Spatrick  let Subjects = SubjectList<[Function]>;
3934e5dd7070Spatrick  let Documentation = [NoBuiltinDocs];
3935e5dd7070Spatrick}
3936e5dd7070Spatrick
3937a9ac8606Spatrickdef UsingIfExists : InheritableAttr {
3938a9ac8606Spatrick  let Spellings = [Clang<"using_if_exists", 0>];
3939a9ac8606Spatrick  let Subjects = SubjectList<[Using,
3940a9ac8606Spatrick                              UnresolvedUsingTypename,
3941a9ac8606Spatrick                              UnresolvedUsingValue], ErrorDiag>;
3942a9ac8606Spatrick  let Documentation = [UsingIfExistsDocs];
3943a9ac8606Spatrick}
3944a9ac8606Spatrick
3945e5dd7070Spatrick// FIXME: This attribute is not inheritable, it will not be propagated to
3946e5dd7070Spatrick// redecls. [[clang::lifetimebound]] has the same problems. This should be
3947e5dd7070Spatrick// fixed in TableGen (by probably adding a new inheritable flag).
3948e5dd7070Spatrickdef AcquireHandle : DeclOrTypeAttr {
3949e5dd7070Spatrick  let Spellings = [Clang<"acquire_handle">];
3950e5dd7070Spatrick  let Args = [StringArgument<"HandleType">];
3951e5dd7070Spatrick  let Subjects = SubjectList<[Function, TypedefName, ParmVar]>;
3952e5dd7070Spatrick  let Documentation = [AcquireHandleDocs];
3953e5dd7070Spatrick}
3954e5dd7070Spatrick
3955e5dd7070Spatrickdef UseHandle : InheritableParamAttr {
3956e5dd7070Spatrick  let Spellings = [Clang<"use_handle">];
3957e5dd7070Spatrick  let Args = [StringArgument<"HandleType">];
3958e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
3959e5dd7070Spatrick  let Documentation = [UseHandleDocs];
3960e5dd7070Spatrick}
3961e5dd7070Spatrick
3962e5dd7070Spatrickdef ReleaseHandle : InheritableParamAttr {
3963e5dd7070Spatrick  let Spellings = [Clang<"release_handle">];
3964e5dd7070Spatrick  let Args = [StringArgument<"HandleType">];
3965e5dd7070Spatrick  let Subjects = SubjectList<[ParmVar]>;
3966e5dd7070Spatrick  let Documentation = [ReleaseHandleDocs];
3967e5dd7070Spatrick}
3968ec727ea7Spatrick
3969*12c85518Srobertdef DiagnoseAsBuiltin : InheritableAttr {
3970*12c85518Srobert  let Spellings = [Clang<"diagnose_as_builtin">];
3971*12c85518Srobert  let Args = [DeclArgument<Function, "Function">,
3972*12c85518Srobert              VariadicUnsignedArgument<"ArgIndices">];
3973*12c85518Srobert  let Subjects = SubjectList<[Function]>;
3974*12c85518Srobert  let Documentation = [DiagnoseAsBuiltinDocs];
3975*12c85518Srobert}
3976*12c85518Srobert
3977ec727ea7Spatrickdef Builtin : InheritableAttr {
3978ec727ea7Spatrick  let Spellings = [];
3979ec727ea7Spatrick  let Args = [UnsignedArgument<"ID">];
3980ec727ea7Spatrick  let Subjects = SubjectList<[Function]>;
3981ec727ea7Spatrick  let SemaHandler = 0;
3982*12c85518Srobert  let Documentation = [InternalOnly];
3983ec727ea7Spatrick}
3984a9ac8606Spatrick
3985a9ac8606Spatrickdef EnforceTCB : InheritableAttr {
3986a9ac8606Spatrick  let Spellings = [Clang<"enforce_tcb">];
3987*12c85518Srobert  let Subjects = SubjectList<[Function, ObjCMethod]>;
3988a9ac8606Spatrick  let Args = [StringArgument<"TCBName">];
3989a9ac8606Spatrick  let Documentation = [EnforceTCBDocs];
3990a9ac8606Spatrick  bit InheritEvenIfAlreadyPresent = 1;
3991a9ac8606Spatrick}
3992a9ac8606Spatrick
3993a9ac8606Spatrickdef EnforceTCBLeaf : InheritableAttr {
3994a9ac8606Spatrick  let Spellings = [Clang<"enforce_tcb_leaf">];
3995*12c85518Srobert  let Subjects = SubjectList<[Function, ObjCMethod]>;
3996a9ac8606Spatrick  let Args = [StringArgument<"TCBName">];
3997a9ac8606Spatrick  let Documentation = [EnforceTCBLeafDocs];
3998a9ac8606Spatrick  bit InheritEvenIfAlreadyPresent = 1;
3999a9ac8606Spatrick}
4000*12c85518Srobert
4001*12c85518Srobertdef Error : InheritableAttr {
4002*12c85518Srobert  let Spellings = [GCC<"error">, GCC<"warning">];
4003*12c85518Srobert  let Accessors = [Accessor<"isError", [GCC<"error">]>,
4004*12c85518Srobert                   Accessor<"isWarning", [GCC<"warning">]>];
4005*12c85518Srobert  let Args = [StringArgument<"UserDiagnostic">];
4006*12c85518Srobert  let Subjects = SubjectList<[Function], ErrorDiag>;
4007*12c85518Srobert  let Documentation = [ErrorAttrDocs];
4008*12c85518Srobert}
4009*12c85518Srobert
4010*12c85518Srobertdef HLSLNumThreads: InheritableAttr {
4011*12c85518Srobert  let Spellings = [Microsoft<"numthreads">];
4012*12c85518Srobert  let Args = [IntArgument<"X">, IntArgument<"Y">, IntArgument<"Z">];
4013*12c85518Srobert  let Subjects = SubjectList<[HLSLEntry]>;
4014*12c85518Srobert  let LangOpts = [HLSL];
4015*12c85518Srobert  let Documentation = [NumThreadsDocs];
4016*12c85518Srobert}
4017*12c85518Srobert
4018*12c85518Srobertdef HLSLSV_GroupIndex: HLSLAnnotationAttr {
4019*12c85518Srobert  let Spellings = [HLSLSemantic<"SV_GroupIndex">];
4020*12c85518Srobert  let Subjects = SubjectList<[ParmVar, GlobalVar]>;
4021*12c85518Srobert  let LangOpts = [HLSL];
4022*12c85518Srobert  let Documentation = [HLSLSV_GroupIndexDocs];
4023*12c85518Srobert}
4024*12c85518Srobert
4025*12c85518Srobertdef HLSLResourceBinding: InheritableAttr {
4026*12c85518Srobert  let Spellings = [HLSLSemantic<"register">];
4027*12c85518Srobert  let Subjects = SubjectList<[HLSLBufferObj, ExternalGlobalVar]>;
4028*12c85518Srobert  let LangOpts = [HLSL];
4029*12c85518Srobert  let Args = [StringArgument<"Slot">, StringArgument<"Space", 1>];
4030*12c85518Srobert  let Documentation = [HLSLResourceBindingDocs];
4031*12c85518Srobert}
4032*12c85518Srobert
4033*12c85518Srobertdef HLSLSV_DispatchThreadID: HLSLAnnotationAttr {
4034*12c85518Srobert  let Spellings = [HLSLSemantic<"SV_DispatchThreadID">];
4035*12c85518Srobert  let Subjects = SubjectList<[ParmVar, Field]>;
4036*12c85518Srobert  let LangOpts = [HLSL];
4037*12c85518Srobert  let Documentation = [HLSLSV_DispatchThreadIDDocs];
4038*12c85518Srobert}
4039*12c85518Srobert
4040*12c85518Srobertdef HLSLShader : InheritableAttr {
4041*12c85518Srobert  let Spellings = [Microsoft<"shader">];
4042*12c85518Srobert  let Subjects = SubjectList<[HLSLEntry]>;
4043*12c85518Srobert  let LangOpts = [HLSL];
4044*12c85518Srobert  // NOTE:
4045*12c85518Srobert  // order for the enum should match order in llvm::Triple::EnvironmentType.
4046*12c85518Srobert  // ShaderType will be converted to llvm::Triple::EnvironmentType like
4047*12c85518Srobert  //   (llvm::Triple::EnvironmentType)((uint32_t)ShaderType +
4048*12c85518Srobert  //      (uint32_t)llvm::Triple::EnvironmentType::Pixel).
4049*12c85518Srobert  // This will avoid update code for convert when new shader type is added.
4050*12c85518Srobert  let Args = [
4051*12c85518Srobert    EnumArgument<"Type", "ShaderType",
4052*12c85518Srobert                 [
4053*12c85518Srobert                   "pixel", "vertex", "geometry", "hull", "domain", "compute",
4054*12c85518Srobert                   "library", "raygeneration", "intersection", "anyHit",
4055*12c85518Srobert                   "closestHit", "miss", "callable", "mesh", "amplification"
4056*12c85518Srobert                 ],
4057*12c85518Srobert                 [
4058*12c85518Srobert                   "Pixel", "Vertex", "Geometry", "Hull", "Domain", "Compute",
4059*12c85518Srobert                   "Library", "RayGeneration", "Intersection", "AnyHit",
4060*12c85518Srobert                   "ClosestHit", "Miss", "Callable", "Mesh", "Amplification"
4061*12c85518Srobert                 ]>
4062*12c85518Srobert  ];
4063*12c85518Srobert  let Documentation = [HLSLSV_ShaderTypeAttrDocs];
4064*12c85518Srobert}
4065*12c85518Srobert
4066*12c85518Srobertdef HLSLResource : InheritableAttr {
4067*12c85518Srobert  let Spellings = [];
4068*12c85518Srobert  let Subjects = SubjectList<[Struct]>;
4069*12c85518Srobert  let LangOpts = [HLSL];
4070*12c85518Srobert  let Args = [EnumArgument<"ResourceType", "ResourceClass",
4071*12c85518Srobert                           ["SRV", "UAV", "CBuffer", "Sampler"],
4072*12c85518Srobert                           ["SRV", "UAV", "CBuffer", "Sampler"]
4073*12c85518Srobert                           >,
4074*12c85518Srobert              EnumArgument<"ResourceShape", "ResourceKind",
4075*12c85518Srobert                           ["Texture1D", "Texture2D", "Texture2DMS",
4076*12c85518Srobert                            "Texture3D", "TextureCube", "Texture1DArray",
4077*12c85518Srobert                            "Texture2DArray", "Texture2DMSArray",
4078*12c85518Srobert                            "TextureCubeArray", "TypedBuffer", "RawBuffer",
4079*12c85518Srobert                            "StructuredBuffer", "CBufferKind", "SamplerKind",
4080*12c85518Srobert                            "TBuffer", "RTAccelerationStructure", "FeedbackTexture2D",
4081*12c85518Srobert                            "FeedbackTexture2DArray"],
4082*12c85518Srobert                           ["Texture1D", "Texture2D", "Texture2DMS",
4083*12c85518Srobert                            "Texture3D", "TextureCube", "Texture1DArray",
4084*12c85518Srobert                            "Texture2DArray", "Texture2DMSArray",
4085*12c85518Srobert                            "TextureCubeArray", "TypedBuffer", "RawBuffer",
4086*12c85518Srobert                            "StructuredBuffer", "CBufferKind", "SamplerKind",
4087*12c85518Srobert                            "TBuffer", "RTAccelerationStructure", "FeedbackTexture2D",
4088*12c85518Srobert                            "FeedbackTexture2DArray"]
4089*12c85518Srobert                            >
4090*12c85518Srobert              ];
4091*12c85518Srobert  let Documentation = [InternalOnly];
4092*12c85518Srobert}
4093*12c85518Srobert
4094*12c85518Srobertdef HLSLGroupSharedAddressSpace : TypeAttr {
4095*12c85518Srobert  let Spellings = [Keyword<"groupshared">];
4096*12c85518Srobert  let Subjects = SubjectList<[Var]>;
4097*12c85518Srobert  let Documentation = [HLSLGroupSharedAddressSpaceDocs];
4098*12c85518Srobert}
4099*12c85518Srobert
4100*12c85518Srobertdef RandomizeLayout : InheritableAttr {
4101*12c85518Srobert  let Spellings = [GCC<"randomize_layout">];
4102*12c85518Srobert  let Subjects = SubjectList<[Record]>;
4103*12c85518Srobert  let Documentation = [ClangRandomizeLayoutDocs];
4104*12c85518Srobert  let LangOpts = [COnly];
4105*12c85518Srobert}
4106*12c85518Srobert
4107*12c85518Srobertdef NoRandomizeLayout : InheritableAttr {
4108*12c85518Srobert  let Spellings = [GCC<"no_randomize_layout">];
4109*12c85518Srobert  let Subjects = SubjectList<[Record]>;
4110*12c85518Srobert  let Documentation = [ClangRandomizeLayoutDocs];
4111*12c85518Srobert  let LangOpts = [COnly];
4112*12c85518Srobert}
4113*12c85518Srobertdef : MutualExclusions<[RandomizeLayout, NoRandomizeLayout]>;
4114*12c85518Srobert
4115*12c85518Srobertdef FunctionReturnThunks : InheritableAttr,
4116*12c85518Srobert    TargetSpecificAttr<TargetAnyX86> {
4117*12c85518Srobert  let Spellings = [GCC<"function_return">];
4118*12c85518Srobert  let Args = [EnumArgument<"ThunkType", "Kind",
4119*12c85518Srobert    ["keep", "thunk-extern"],
4120*12c85518Srobert    ["Keep", "Extern"]
4121*12c85518Srobert  >];
4122*12c85518Srobert  let Subjects = SubjectList<[Function]>;
4123*12c85518Srobert  let Documentation = [FunctionReturnThunksDocs];
4124*12c85518Srobert}
4125*12c85518Srobertdef ReadOnlyPlacement : InheritableAttr {
4126*12c85518Srobert  let Spellings = [Clang<"enforce_read_only_placement">];
4127*12c85518Srobert  let Subjects = SubjectList<[Record]>;
4128*12c85518Srobert  let Documentation = [ReadOnlyPlacementDocs];
4129*12c85518Srobert}
4130