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