1263508Sdim//==--- Attr.td - attribute definitions -----------------------------------===//
2263508Sdim//
3263508Sdim//                     The LLVM Compiler Infrastructure
4263508Sdim//
5263508Sdim// This file is distributed under the University of Illinois Open Source
6263508Sdim// License. See LICENSE.TXT for details.
7263508Sdim//
8263508Sdim//===----------------------------------------------------------------------===//
9210008Srdivacky
10210008Srdivacky// An attribute's subject is whatever it appertains to. In this file, it is
11210008Srdivacky// more accurately a list of things that an attribute can appertain to. All
12210008Srdivacky// Decls and Stmts are possibly AttrSubjects (even though the syntax may not
13210008Srdivacky// allow attributes on a given Decl or Stmt).
14210008Srdivackyclass AttrSubject;
15210008Srdivacky
16210008Srdivackyinclude "clang/Basic/DeclNodes.td"
17210008Srdivackyinclude "clang/Basic/StmtNodes.td"
18210008Srdivacky
19210008Srdivacky// A subset-subject is an AttrSubject constrained to operate only on some subset
20210008Srdivacky// of that subject.
21210008Srdivacky//
22210008Srdivacky// The description is used in output messages to specify what the subject
23210008Srdivacky// represents. FIXME: Deal with translation issues.
24210008Srdivacky//
25210008Srdivacky// The code fragment is a boolean expression that will confirm that the subject
26210008Srdivacky// meets the requirements; the subject will have the name S, and will have the
27210008Srdivacky// type specified by the base. It should be a simple boolean expression.
28210008Srdivackyclass SubsetSubject<AttrSubject base, string description, code check>
29210008Srdivacky    : AttrSubject {
30210008Srdivacky  AttrSubject Base = base;
31210008Srdivacky  string Description = description;
32210008Srdivacky  code CheckCode = check;
33210008Srdivacky}
34210008Srdivacky
35249423Sdim// This is the type of a variable which C++11 allows alignas(...) to appertain
36249423Sdim// to.
37210008Srdivackydef NormalVar : SubsetSubject<Var, "non-register, non-parameter variable",
38210008Srdivacky                              [{S->getStorageClass() != VarDecl::Register &&
39212904Sdim                                S->getKind() != Decl::ImplicitParam &&
40212904Sdim                                S->getKind() != Decl::ParmVar &&
41210008Srdivacky                                S->getKind() != Decl::NonTypeTemplateParm}]>;
42210008Srdivackydef NonBitField : SubsetSubject<Field, "non-bit field",
43210008Srdivacky                                [{!S->isBitField()}]>;
44210008Srdivacky
45210008Srdivacky// A single argument to an attribute
46263508Sdimclass Argument<string name, bit optional> {
47210008Srdivacky  string Name = name;
48263508Sdim  bit Optional = optional;
49210008Srdivacky}
50210008Srdivacky
51263508Sdimclass BoolArgument<string name, bit opt = 0> : Argument<name, opt>;
52263508Sdimclass IdentifierArgument<string name, bit opt = 0> : Argument<name, opt>;
53263508Sdimclass IntArgument<string name, bit opt = 0> : Argument<name, opt>;
54263508Sdimclass StringArgument<string name, bit opt = 0> : Argument<name, opt>;
55263508Sdimclass ExprArgument<string name, bit opt = 0> : Argument<name, opt>;
56263508Sdimclass FunctionArgument<string name, bit opt = 0> : Argument<name, opt>;
57263508Sdimclass TypeArgument<string name, bit opt = 0> : Argument<name, opt>;
58263508Sdimclass UnsignedArgument<string name, bit opt = 0> : Argument<name, opt>;
59263508Sdimclass SourceLocArgument<string name, bit opt = 0> : Argument<name, opt>;
60263508Sdimclass VariadicUnsignedArgument<string name> : Argument<name, 1>;
61263508Sdimclass VariadicExprArgument<string name> : Argument<name, 1>;
62210008Srdivacky
63221345Sdim// A version of the form major.minor[.subminor].
64263508Sdimclass VersionArgument<string name, bit opt = 0> : Argument<name, opt>;
65221345Sdim
66212904Sdim// This one's a doozy, so it gets its own special type
67212904Sdim// It can be an unsigned integer, or a type. Either can
68212904Sdim// be dependent.
69263508Sdimclass AlignedArgument<string name, bit opt = 0> : Argument<name, opt>;
70212904Sdim
71210008Srdivacky// An integer argument with a default value
72263508Sdimclass DefaultIntArgument<string name, int default> : IntArgument<name, 1> {
73210008Srdivacky  int Default = default;
74210008Srdivacky}
75210008Srdivacky
76212904Sdim// This argument is more complex, it includes the enumerator type name,
77212904Sdim// a list of strings to accept, and a list of enumerators to map them to.
78212904Sdimclass EnumArgument<string name, string type, list<string> values,
79263508Sdim                   list<string> enums, bit opt = 0> : Argument<name, opt> {
80212904Sdim  string Type = type;
81212904Sdim  list<string> Values = values;
82212904Sdim  list<string> Enums = enums;
83210008Srdivacky}
84210008Srdivacky
85263508Sdim// FIXME: There should be a VariadicArgument type that takes any other type
86263508Sdim//        of argument and generates the appropriate type.
87263508Sdimclass VariadicEnumArgument<string name, string type, list<string> values,
88263508Sdim                           list<string> enums> : Argument<name, 1>  {
89263508Sdim  string Type = type;
90263508Sdim  list<string> Values = values;
91263508Sdim  list<string> Enums = enums;
92263508Sdim}
93263508Sdim
94239462Sdim// This handles one spelling of an attribute.
95239462Sdimclass Spelling<string name, string variety> {
96239462Sdim  string Name = name;
97239462Sdim  string Variety = variety;
98239462Sdim}
99239462Sdim
100239462Sdimclass GNU<string name> : Spelling<name, "GNU">;
101239462Sdimclass Declspec<string name> : Spelling<name, "Declspec">;
102239462Sdimclass CXX11<string namespace, string name> : Spelling<name, "CXX11"> {
103239462Sdim  string Namespace = namespace;
104239462Sdim}
105249423Sdimclass Keyword<string name> : Spelling<name, "Keyword">;
106239462Sdim
107249423Sdimclass Accessor<string name, list<Spelling> spellings> {
108249423Sdim  string Name = name;
109249423Sdim  list<Spelling> Spellings = spellings;
110249423Sdim}
111249423Sdim
112210008Srdivackyclass Attr {
113210008Srdivacky  // The various ways in which an attribute can be spelled in source
114239462Sdim  list<Spelling> Spellings;
115210008Srdivacky  // The things to which an attribute can appertain
116210008Srdivacky  list<AttrSubject> Subjects;
117210008Srdivacky  // The arguments allowed on an attribute
118210008Srdivacky  list<Argument> Args = [];
119249423Sdim  // Accessors which should be generated for the attribute.
120249423Sdim  list<Accessor> Accessors = [];
121249423Sdim  // Set to true for attributes with arguments which require delayed parsing.
122249423Sdim  bit LateParsed = 0;
123239462Sdim  // Set to false to prevent an attribute from being propagated from a template
124239462Sdim  // to the instantiation.
125239462Sdim  bit Clone = 1;
126234353Sdim  // Set to true for attributes which must be instantiated within templates
127234353Sdim  bit TemplateDependent = 0;
128239462Sdim  // Set to true for attributes that have a corresponding AST node.
129239462Sdim  bit ASTNode = 1;
130234353Sdim  // Set to true for attributes which have handler in Sema.
131234353Sdim  bit SemaHandler = 1;
132239462Sdim  // Set to true for attributes that are completely ignored.
133239462Sdim  bit Ignored = 0;
134239462Sdim  // Set to true if each of the spellings is a distinct attribute.
135239462Sdim  bit DistinctSpellings = 0;
136263508Sdim  // Set to true if the attribute's parsing does not match its semantic
137263508Sdim  // content. Eg) It parses 3 args, but semantically takes 4 args.  Opts out of
138263508Sdim  // common attribute error checking.
139263508Sdim  bit HasCustomParsing = 0;
140249423Sdim  // Any additional text that should be included verbatim in the class.
141212904Sdim  code AdditionalMembers = [{}];
142210008Srdivacky}
143210008Srdivacky
144263508Sdim/// A type attribute is not processed on a declaration or a statement.
145263508Sdimclass TypeAttr : Attr {
146263508Sdim  let ASTNode = 0;
147263508Sdim}
148263508Sdim
149221345Sdim/// An inheritable attribute is inherited by later redeclarations.
150218893Sdimclass InheritableAttr : Attr;
151218893Sdim
152263508Sdim/// A target-specific attribute that is meant to be processed via
153263508Sdim/// TargetAttributesSema::ProcessDeclAttribute.  This class is meant to be used
154263508Sdim/// as a mixin with InheritableAttr or Attr depending on the attribute's needs.
155263508Sdimclass TargetSpecificAttr;
156263508Sdim
157221345Sdim/// An inheritable parameter attribute is inherited by later
158221345Sdim/// redeclarations, even when it's written on a parameter.
159221345Sdimclass InheritableParamAttr : InheritableAttr;
160221345Sdim
161249423Sdim/// An ignored attribute, which we parse but discard with no checking.
162249423Sdimclass IgnoredAttr : Attr {
163249423Sdim  let Ignored = 1;
164249423Sdim  let ASTNode = 0;
165249423Sdim  let SemaHandler = 0;
166249423Sdim}
167249423Sdim
168210008Srdivacky//
169210008Srdivacky// Attributes begin here
170210008Srdivacky//
171210008Srdivacky
172263508Sdimdef AddressSpace : TypeAttr {
173239462Sdim  let Spellings = [GNU<"address_space">];
174239462Sdim  let Args = [IntArgument<"AddressSpace">];
175239462Sdim}
176239462Sdim
177263508Sdimdef Alias : Attr {
178249423Sdim  let Spellings = [GNU<"alias">, CXX11<"gnu", "alias">];
179212904Sdim  let Args = [StringArgument<"Aliasee">];
180210008Srdivacky}
181210008Srdivacky
182218893Sdimdef Aligned : InheritableAttr {
183249423Sdim  let Spellings = [GNU<"aligned">, Declspec<"align">, CXX11<"gnu", "aligned">,
184249423Sdim                   Keyword<"alignas">, Keyword<"_Alignas">];
185210008Srdivacky  let Subjects = [NonBitField, NormalVar, Tag];
186263508Sdim  let Args = [AlignedArgument<"Alignment", 1>];
187249423Sdim  let Accessors = [Accessor<"isGNU", [GNU<"aligned">, CXX11<"gnu","aligned">]>,
188249423Sdim                   Accessor<"isC11", [Keyword<"_Alignas">]>,
189249423Sdim                   Accessor<"isAlignas", [Keyword<"alignas">,
190249423Sdim                                          Keyword<"_Alignas">]>,
191249423Sdim                   Accessor<"isDeclspec",[Declspec<"align">]>];
192210008Srdivacky}
193210008Srdivacky
194218893Sdimdef AlignMac68k : InheritableAttr {
195210008Srdivacky  let Spellings = [];
196234353Sdim  let SemaHandler = 0;
197210008Srdivacky}
198210008Srdivacky
199263508Sdimdef AllocSize : InheritableAttr {
200249423Sdim  let Spellings = [GNU<"alloc_size">, CXX11<"gnu", "alloc_size">];
201239462Sdim  let Args = [VariadicUnsignedArgument<"Args">];
202239462Sdim}
203239462Sdim
204218893Sdimdef AlwaysInline : InheritableAttr {
205249423Sdim  let Spellings = [GNU<"always_inline">, CXX11<"gnu", "always_inline">];
206210008Srdivacky}
207210008Srdivacky
208239462Sdimdef TLSModel : InheritableAttr {
209249423Sdim  let Spellings = [GNU<"tls_model">, CXX11<"gnu", "tls_model">];
210239462Sdim  let Subjects = [Var];
211239462Sdim  let Args = [StringArgument<"Model">];
212239462Sdim}
213239462Sdim
214218893Sdimdef AnalyzerNoReturn : InheritableAttr {
215239462Sdim  let Spellings = [GNU<"analyzer_noreturn">];
216210008Srdivacky}
217210008Srdivacky
218226633Sdimdef Annotate : InheritableParamAttr {
219239462Sdim  let Spellings = [GNU<"annotate">];
220210008Srdivacky  let Args = [StringArgument<"Annotation">];
221210008Srdivacky}
222210008Srdivacky
223263508Sdimdef ARMInterrupt : InheritableAttr, TargetSpecificAttr {
224263508Sdim  let Spellings = [GNU<"interrupt">];
225263508Sdim  let Args = [EnumArgument<"Interrupt", "InterruptType",
226263508Sdim                           ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", ""],
227263508Sdim                           ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", "Generic"],
228263508Sdim                           1>];
229263508Sdim}
230263508Sdim
231218893Sdimdef AsmLabel : InheritableAttr {
232210008Srdivacky  let Spellings = [];
233210008Srdivacky  let Args = [StringArgument<"Label">];
234234353Sdim  let SemaHandler = 0;
235210008Srdivacky}
236210008Srdivacky
237221345Sdimdef Availability : InheritableAttr {
238239462Sdim  let Spellings = [GNU<"availability">];
239221345Sdim  let Args = [IdentifierArgument<"platform">, VersionArgument<"introduced">,
240221345Sdim              VersionArgument<"deprecated">, VersionArgument<"obsoleted">,
241234353Sdim              BoolArgument<"unavailable">, StringArgument<"message">];
242221345Sdim  let AdditionalMembers =
243221345Sdim[{static llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) {
244221345Sdim    return llvm::StringSwitch<llvm::StringRef>(Platform)
245221345Sdim             .Case("ios", "iOS")
246243830Sdim             .Case("macosx", "OS X")
247221345Sdim             .Default(llvm::StringRef());
248221345Sdim} }];
249263508Sdim  let HasCustomParsing = 1;
250221345Sdim}
251221345Sdim
252218893Sdimdef Blocks : InheritableAttr {
253239462Sdim  let Spellings = [GNU<"blocks">];
254212904Sdim  let Args = [EnumArgument<"Type", "BlockType", ["byref"], ["ByRef"]>];
255210008Srdivacky}
256210008Srdivacky
257249423Sdimdef Bounded : IgnoredAttr {
258239462Sdim  let Spellings = [GNU<"bounded">];
259239462Sdim}
260239462Sdim
261221345Sdimdef CarriesDependency : InheritableParamAttr {
262239462Sdim  let Spellings = [GNU<"carries_dependency">, CXX11<"","carries_dependency">,
263239462Sdim                   CXX11<"std","carries_dependency">];
264210008Srdivacky  let Subjects = [ParmVar, Function];
265210008Srdivacky}
266210008Srdivacky
267218893Sdimdef CDecl : InheritableAttr {
268249423Sdim  let Spellings = [GNU<"cdecl">, CXX11<"gnu", "cdecl">, Keyword<"__cdecl">,
269249423Sdim                   Keyword<"_cdecl">];
270210008Srdivacky}
271210008Srdivacky
272226633Sdim// cf_audited_transfer indicates that the given function has been
273226633Sdim// audited and has been marked with the appropriate cf_consumed and
274226633Sdim// cf_returns_retained attributes.  It is generally applied by
275226633Sdim// '#pragma clang arc_cf_code_audited' rather than explicitly.
276226633Sdimdef CFAuditedTransfer : InheritableAttr {
277239462Sdim  let Spellings = [GNU<"cf_audited_transfer">];
278226633Sdim  let Subjects = [Function];
279226633Sdim}
280226633Sdim
281226633Sdim// cf_unknown_transfer is an explicit opt-out of cf_audited_transfer.
282226633Sdim// It indicates that the function has unknown or unautomatable
283226633Sdim// transfer semantics.
284226633Sdimdef CFUnknownTransfer : InheritableAttr {
285239462Sdim  let Spellings = [GNU<"cf_unknown_transfer">];
286226633Sdim  let Subjects = [Function];
287226633Sdim}
288226633Sdim
289218893Sdimdef CFReturnsRetained : InheritableAttr {
290239462Sdim  let Spellings = [GNU<"cf_returns_retained">];
291218893Sdim  let Subjects = [ObjCMethod, Function];
292210008Srdivacky}
293210008Srdivacky
294218893Sdimdef CFReturnsNotRetained : InheritableAttr {
295239462Sdim  let Spellings = [GNU<"cf_returns_not_retained">];
296218893Sdim  let Subjects = [ObjCMethod, Function];
297210008Srdivacky}
298210008Srdivacky
299221345Sdimdef CFConsumed : InheritableParamAttr {
300239462Sdim  let Spellings = [GNU<"cf_consumed">];
301218893Sdim  let Subjects = [ParmVar];
302218893Sdim}
303218893Sdim
304218893Sdimdef Cleanup : InheritableAttr {
305249423Sdim  let Spellings = [GNU<"cleanup">, CXX11<"gnu", "cleanup">];
306210008Srdivacky  let Args = [FunctionArgument<"FunctionDecl">];
307210008Srdivacky}
308210008Srdivacky
309239462Sdimdef Cold : InheritableAttr {
310249423Sdim  let Spellings = [GNU<"cold">, CXX11<"gnu", "cold">];
311239462Sdim}
312239462Sdim
313218893Sdimdef Common : InheritableAttr {
314249423Sdim  let Spellings = [GNU<"common">, CXX11<"gnu", "common">];
315218893Sdim}
316218893Sdim
317218893Sdimdef Const : InheritableAttr {
318263508Sdim  let Spellings = [GNU<"const">, GNU<"__const">,
319263508Sdim                   CXX11<"gnu", "const">, CXX11<"gnu", "__const">];
320210008Srdivacky}
321210008Srdivacky
322218893Sdimdef Constructor : InheritableAttr {
323249423Sdim  let Spellings = [GNU<"constructor">, CXX11<"gnu", "constructor">];
324263508Sdim  let Args = [IntArgument<"Priority", 1>];
325210008Srdivacky}
326210008Srdivacky
327218893Sdimdef CUDAConstant : InheritableAttr {
328239462Sdim  let Spellings = [GNU<"constant">];
329218893Sdim}
330218893Sdim
331239462Sdimdef CUDADevice : InheritableAttr {
332239462Sdim  let Spellings = [GNU<"device">];
333218893Sdim}
334218893Sdim
335218893Sdimdef CUDAGlobal : InheritableAttr {
336239462Sdim  let Spellings = [GNU<"global">];
337218893Sdim}
338218893Sdim
339239462Sdimdef CUDAHost : InheritableAttr {
340239462Sdim  let Spellings = [GNU<"host">];
341218893Sdim}
342218893Sdim
343218893Sdimdef CUDALaunchBounds : InheritableAttr {
344239462Sdim  let Spellings = [GNU<"launch_bounds">];
345218893Sdim  let Args = [IntArgument<"MaxThreads">, DefaultIntArgument<"MinBlocks", 0>];
346218893Sdim}
347218893Sdim
348218893Sdimdef CUDAShared : InheritableAttr {
349239462Sdim  let Spellings = [GNU<"shared">];
350218893Sdim}
351218893Sdim
352249423Sdimdef C11NoReturn : InheritableAttr {
353249423Sdim  let Spellings = [Keyword<"_Noreturn">];
354249423Sdim  let Subjects = [Function];
355249423Sdim  let SemaHandler = 0;
356249423Sdim}
357249423Sdim
358249423Sdimdef CXX11NoReturn : InheritableAttr {
359249423Sdim  let Spellings = [CXX11<"","noreturn">, CXX11<"std","noreturn">];
360249423Sdim  let Subjects = [Function];
361249423Sdim}
362249423Sdim
363263508Sdimdef OpenCLKernel : InheritableAttr {
364249423Sdim  let Spellings = [Keyword<"__kernel">, Keyword<"kernel">];
365218893Sdim}
366218893Sdim
367239462Sdimdef OpenCLImageAccess : Attr {
368239462Sdim  let Spellings = [GNU<"opencl_image_access">];
369239462Sdim  let Args = [IntArgument<"Access">];
370239462Sdim}
371239462Sdim
372218893Sdimdef Deprecated : InheritableAttr {
373263508Sdim  let Spellings = [GNU<"deprecated">,
374263508Sdim                   CXX11<"gnu", "deprecated">, CXX11<"","deprecated">];
375263508Sdim  let Args = [StringArgument<"Message", 1>];
376210008Srdivacky}
377210008Srdivacky
378218893Sdimdef Destructor : InheritableAttr {
379249423Sdim  let Spellings = [GNU<"destructor">, CXX11<"gnu", "destructor">];
380263508Sdim  let Args = [IntArgument<"Priority", 1>];
381210008Srdivacky}
382210008Srdivacky
383239462Sdimdef ExtVectorType : Attr {
384239462Sdim  let Spellings = [GNU<"ext_vector_type">];
385239462Sdim  let Args = [ExprArgument<"NumElements">];
386239462Sdim  let ASTNode = 0;
387210008Srdivacky}
388210008Srdivacky
389239462Sdimdef FallThrough : Attr {
390249423Sdim  let Spellings = [CXX11<"clang", "fallthrough">];
391239462Sdim  let Subjects = [NullStmt];
392210008Srdivacky}
393210008Srdivacky
394218893Sdimdef FastCall : InheritableAttr {
395249423Sdim  let Spellings = [GNU<"fastcall">, CXX11<"gnu", "fastcall">,
396249423Sdim                   Keyword<"__fastcall">, Keyword<"_fastcall">];
397210008Srdivacky}
398210008Srdivacky
399239462Sdimdef Final : InheritableAttr {
400263508Sdim  let Spellings = [Keyword<"final">, Keyword<"sealed">];
401263508Sdim  let Accessors = [Accessor<"isSpelledAsSealed", [Keyword<"sealed">]>];
402234353Sdim  let SemaHandler = 0;
403210008Srdivacky}
404210008Srdivacky
405243830Sdimdef MinSize : InheritableAttr {
406243830Sdim  let Spellings = [GNU<"minsize">];
407243830Sdim  let Subjects = [Function];
408243830Sdim}
409243830Sdim
410218893Sdimdef Format : InheritableAttr {
411249423Sdim  let Spellings = [GNU<"format">, CXX11<"gnu", "format">];
412263508Sdim  let Args = [IdentifierArgument<"Type">, IntArgument<"FormatIdx">,
413210008Srdivacky              IntArgument<"FirstArg">];
414210008Srdivacky}
415210008Srdivacky
416218893Sdimdef FormatArg : InheritableAttr {
417249423Sdim  let Spellings = [GNU<"format_arg">, CXX11<"gnu", "format_arg">];
418210008Srdivacky  let Args = [IntArgument<"FormatIdx">];
419210008Srdivacky}
420210008Srdivacky
421218893Sdimdef GNUInline : InheritableAttr {
422249423Sdim  let Spellings = [GNU<"gnu_inline">, CXX11<"gnu", "gnu_inline">];
423210008Srdivacky}
424210008Srdivacky
425239462Sdimdef Hot : InheritableAttr {
426249423Sdim  let Spellings = [GNU<"hot">, CXX11<"gnu", "hot">];
427239462Sdim}
428239462Sdim
429218893Sdimdef IBAction : InheritableAttr {
430239462Sdim  let Spellings = [GNU<"ibaction">];
431210008Srdivacky}
432210008Srdivacky
433218893Sdimdef IBOutlet : InheritableAttr {
434239462Sdim  let Spellings = [GNU<"iboutlet">];
435210008Srdivacky}
436210008Srdivacky
437218893Sdimdef IBOutletCollection : InheritableAttr {
438239462Sdim  let Spellings = [GNU<"iboutletcollection">];
439263508Sdim  let Args = [TypeArgument<"Interface", 1>];
440210008Srdivacky}
441210008Srdivacky
442218893Sdimdef Malloc : InheritableAttr {
443249423Sdim  let Spellings = [GNU<"malloc">, CXX11<"gnu", "malloc">];
444210008Srdivacky}
445210008Srdivacky
446218893Sdimdef MaxFieldAlignment : InheritableAttr {
447210008Srdivacky  let Spellings = [];
448212904Sdim  let Args = [UnsignedArgument<"Alignment">];
449234353Sdim  let SemaHandler = 0;
450210008Srdivacky}
451210008Srdivacky
452218893Sdimdef MayAlias : InheritableAttr {
453249423Sdim  let Spellings = [GNU<"may_alias">, CXX11<"gnu", "may_alias">];
454218893Sdim}
455218893Sdim
456256030Sdimdef MSABI : InheritableAttr {
457256030Sdim  let Spellings = [GNU<"ms_abi">, CXX11<"gnu", "ms_abi">];
458256030Sdim}
459256030Sdim
460263508Sdimdef MSP430Interrupt : InheritableAttr, TargetSpecificAttr {
461210008Srdivacky  let Spellings = [];
462212904Sdim  let Args = [UnsignedArgument<"Number">];
463234353Sdim  let SemaHandler = 0;
464210008Srdivacky}
465210008Srdivacky
466263508Sdimdef Mips16 : InheritableAttr, TargetSpecificAttr {
467249423Sdim  let Spellings = [GNU<"mips16">, CXX11<"gnu", "mips16">];
468249423Sdim  let Subjects = [Function];
469249423Sdim}
470249423Sdim
471239462Sdimdef Mode : Attr {
472249423Sdim  let Spellings = [GNU<"mode">, CXX11<"gnu", "mode">];
473239462Sdim  let Args = [IdentifierArgument<"Mode">];
474239462Sdim}
475239462Sdim
476218893Sdimdef Naked : InheritableAttr {
477249423Sdim  let Spellings = [GNU<"naked">, CXX11<"gnu", "naked">];
478218893Sdim}
479218893Sdim
480263508Sdimdef NeonPolyVectorType : TypeAttr {
481239462Sdim  let Spellings = [GNU<"neon_polyvector_type">];
482239462Sdim  let Args = [IntArgument<"NumElements">];
483239462Sdim}
484239462Sdim
485263508Sdimdef NeonVectorType : TypeAttr {
486239462Sdim  let Spellings = [GNU<"neon_vector_type">];
487239462Sdim  let Args = [IntArgument<"NumElements">];
488239462Sdim}
489239462Sdim
490226633Sdimdef ReturnsTwice : InheritableAttr {
491249423Sdim  let Spellings = [GNU<"returns_twice">, CXX11<"gnu", "returns_twice">];
492226633Sdim}
493226633Sdim
494218893Sdimdef NoCommon : InheritableAttr {
495249423Sdim  let Spellings = [GNU<"nocommon">, CXX11<"gnu", "nocommon">];
496218893Sdim}
497218893Sdim
498218893Sdimdef NoDebug : InheritableAttr {
499239462Sdim  let Spellings = [GNU<"nodebug">];
500210008Srdivacky}
501210008Srdivacky
502218893Sdimdef NoInline : InheritableAttr {
503249423Sdim  let Spellings = [GNU<"noinline">, CXX11<"gnu", "noinline">];
504210008Srdivacky}
505210008Srdivacky
506263508Sdimdef NoMips16 : InheritableAttr, TargetSpecificAttr {
507249423Sdim  let Spellings = [GNU<"nomips16">, CXX11<"gnu", "nomips16">];
508249423Sdim  let Subjects = [Function];
509249423Sdim}
510249423Sdim
511218893Sdimdef NonNull : InheritableAttr {
512249423Sdim  let Spellings = [GNU<"nonnull">, CXX11<"gnu", "nonnull">];
513212904Sdim  let Args = [VariadicUnsignedArgument<"Args">];
514212904Sdim  let AdditionalMembers =
515212904Sdim[{bool isNonNull(unsigned idx) const {
516212904Sdim    for (args_iterator i = args_begin(), e = args_end();
517212904Sdim         i != e; ++i)
518212904Sdim      if (*i == idx)
519212904Sdim        return true;
520212904Sdim    return false;
521212904Sdim  } }];
522210008Srdivacky}
523210008Srdivacky
524218893Sdimdef NoReturn : InheritableAttr {
525249423Sdim  let Spellings = [GNU<"noreturn">, CXX11<"gnu", "noreturn">];
526210008Srdivacky  // FIXME: Does GCC allow this on the function instead?
527210008Srdivacky  let Subjects = [Function];
528210008Srdivacky}
529210008Srdivacky
530218893Sdimdef NoInstrumentFunction : InheritableAttr {
531249423Sdim  let Spellings = [GNU<"no_instrument_function">,
532249423Sdim                   CXX11<"gnu", "no_instrument_function">];
533210008Srdivacky  let Subjects = [Function];
534210008Srdivacky}
535210008Srdivacky
536218893Sdimdef NoThrow : InheritableAttr {
537249423Sdim  let Spellings = [GNU<"nothrow">, CXX11<"gnu", "nothrow">];
538210008Srdivacky}
539210008Srdivacky
540226633Sdimdef NSBridged : InheritableAttr {
541239462Sdim  let Spellings = [GNU<"ns_bridged">];
542226633Sdim  let Subjects = [Record];
543263508Sdim  let Args = [IdentifierArgument<"BridgedType", 1>];
544226633Sdim}
545226633Sdim
546263508Sdimdef ObjCBridge : InheritableAttr {
547263508Sdim  let Spellings = [GNU<"objc_bridge">];
548263508Sdim  let Subjects = [Record];
549263508Sdim  let Args = [IdentifierArgument<"BridgedType", 1>];
550263508Sdim}
551263508Sdim
552218893Sdimdef NSReturnsRetained : InheritableAttr {
553239462Sdim  let Spellings = [GNU<"ns_returns_retained">];
554218893Sdim  let Subjects = [ObjCMethod, Function];
555210008Srdivacky}
556210008Srdivacky
557218893Sdimdef NSReturnsNotRetained : InheritableAttr {
558239462Sdim  let Spellings = [GNU<"ns_returns_not_retained">];
559218893Sdim  let Subjects = [ObjCMethod, Function];
560210008Srdivacky}
561210008Srdivacky
562218893Sdimdef NSReturnsAutoreleased : InheritableAttr {
563239462Sdim  let Spellings = [GNU<"ns_returns_autoreleased">];
564218893Sdim  let Subjects = [ObjCMethod, Function];
565210008Srdivacky}
566210008Srdivacky
567218893Sdimdef NSConsumesSelf : InheritableAttr {
568239462Sdim  let Spellings = [GNU<"ns_consumes_self">];
569218893Sdim  let Subjects = [ObjCMethod];
570210008Srdivacky}
571210008Srdivacky
572221345Sdimdef NSConsumed : InheritableParamAttr {
573239462Sdim  let Spellings = [GNU<"ns_consumed">];
574218893Sdim  let Subjects = [ParmVar];
575210008Srdivacky}
576210008Srdivacky
577218893Sdimdef ObjCException : InheritableAttr {
578239462Sdim  let Spellings = [GNU<"objc_exception">];
579218893Sdim}
580218893Sdim
581221345Sdimdef ObjCMethodFamily : InheritableAttr {
582239462Sdim  let Spellings = [GNU<"objc_method_family">];
583221345Sdim  let Subjects = [ObjCMethod];
584221345Sdim  let Args = [EnumArgument<"Family", "FamilyKind",
585221345Sdim               ["none", "alloc", "copy", "init", "mutableCopy", "new"],
586221345Sdim               ["OMF_None", "OMF_alloc", "OMF_copy", "OMF_init",
587221345Sdim                "OMF_mutableCopy", "OMF_new"]>];
588221345Sdim}
589221345Sdim
590218893Sdimdef ObjCNSObject : InheritableAttr {
591239462Sdim  let Spellings = [GNU<"NSObject">];
592218893Sdim}
593218893Sdim
594263508Sdimdef ObjCPreciseLifetime : InheritableAttr {
595239462Sdim  let Spellings = [GNU<"objc_precise_lifetime">];
596224145Sdim  let Subjects = [Var];
597224145Sdim}
598224145Sdim
599263508Sdimdef ObjCReturnsInnerPointer : InheritableAttr {
600239462Sdim  let Spellings = [GNU<"objc_returns_inner_pointer">];
601263508Sdim  let Subjects = [ObjCMethod, ObjCProperty];
602226633Sdim}
603226633Sdim
604243830Sdimdef ObjCRequiresSuper : InheritableAttr {
605243830Sdim  let Spellings = [GNU<"objc_requires_super">];
606243830Sdim  let Subjects = [ObjCMethod];
607243830Sdim}
608243830Sdim
609263508Sdimdef ObjCRootClass : InheritableAttr {
610239462Sdim  let Spellings = [GNU<"objc_root_class">];
611234353Sdim  let Subjects = [ObjCInterface];
612234353Sdim}
613234353Sdim
614210008Srdivackydef Overloadable : Attr {
615239462Sdim  let Spellings = [GNU<"overloadable">];
616210008Srdivacky}
617210008Srdivacky
618218893Sdimdef Override : InheritableAttr { 
619218893Sdim  let Spellings = [];
620234353Sdim  let SemaHandler = 0;
621218893Sdim}
622218893Sdim
623218893Sdimdef Ownership : InheritableAttr {
624239462Sdim  let Spellings = [GNU<"ownership_holds">, GNU<"ownership_returns">,
625239462Sdim                   GNU<"ownership_takes">];
626239462Sdim  let DistinctSpellings = 1;
627212904Sdim  let Args = [EnumArgument<"OwnKind", "OwnershipKind",
628212904Sdim                    ["ownership_holds", "ownership_returns", "ownership_takes"],
629212904Sdim                    ["Holds", "Returns", "Takes"]>,
630212904Sdim              StringArgument<"Module">, VariadicUnsignedArgument<"Args">];
631263508Sdim  let HasCustomParsing = 1;
632212904Sdim}
633212904Sdim
634218893Sdimdef Packed : InheritableAttr {
635249423Sdim  let Spellings = [GNU<"packed">, CXX11<"gnu", "packed">];
636210008Srdivacky}
637210008Srdivacky
638243830Sdimdef PnaclCall : InheritableAttr {
639243830Sdim  let Spellings = [GNU<"pnaclcall">];
640243830Sdim}
641243830Sdim
642249423Sdimdef IntelOclBicc : InheritableAttr {
643249423Sdim  let Spellings = [GNU<"intel_ocl_bicc">];
644249423Sdim}
645249423Sdim
646221345Sdimdef Pcs : InheritableAttr {
647249423Sdim  let Spellings = [GNU<"pcs">, CXX11<"gnu", "pcs">];
648221345Sdim  let Args = [EnumArgument<"PCS", "PCSType",
649221345Sdim                           ["aapcs", "aapcs-vfp"],
650221345Sdim                           ["AAPCS", "AAPCS_VFP"]>];
651221345Sdim}
652221345Sdim
653218893Sdimdef Pure : InheritableAttr {
654249423Sdim  let Spellings = [GNU<"pure">, CXX11<"gnu", "pure">];
655210008Srdivacky}
656210008Srdivacky
657218893Sdimdef Regparm : InheritableAttr {
658249423Sdim  let Spellings = [GNU<"regparm">, CXX11<"gnu", "regparm">];
659212904Sdim  let Args = [UnsignedArgument<"NumParams">];
660210008Srdivacky}
661210008Srdivacky
662218893Sdimdef ReqdWorkGroupSize : InheritableAttr {
663239462Sdim  let Spellings = [GNU<"reqd_work_group_size">];
664212904Sdim  let Args = [UnsignedArgument<"XDim">, UnsignedArgument<"YDim">,
665212904Sdim              UnsignedArgument<"ZDim">];
666210008Srdivacky}
667210008Srdivacky
668239462Sdimdef WorkGroupSizeHint :  InheritableAttr {
669239462Sdim  let Spellings = [GNU<"work_group_size_hint">];
670239462Sdim  let Args = [UnsignedArgument<"XDim">, 
671239462Sdim              UnsignedArgument<"YDim">,
672239462Sdim              UnsignedArgument<"ZDim">];
673239462Sdim}
674239462Sdim
675218893Sdimdef InitPriority : InheritableAttr {
676239462Sdim  let Spellings = [GNU<"init_priority">];
677212904Sdim  let Args = [UnsignedArgument<"Priority">];
678210008Srdivacky}
679210008Srdivacky
680218893Sdimdef Section : InheritableAttr {
681249423Sdim  let Spellings = [GNU<"section">, CXX11<"gnu", "section">];
682210008Srdivacky  let Args = [StringArgument<"Name">];
683210008Srdivacky}
684210008Srdivacky
685218893Sdimdef Sentinel : InheritableAttr {
686249423Sdim  let Spellings = [GNU<"sentinel">, CXX11<"gnu", "sentinel">];
687212904Sdim  let Args = [DefaultIntArgument<"Sentinel", 0>,
688212904Sdim              DefaultIntArgument<"NullPos", 0>];
689210008Srdivacky}
690210008Srdivacky
691218893Sdimdef StdCall : InheritableAttr {
692249423Sdim  let Spellings = [GNU<"stdcall">, CXX11<"gnu", "stdcall">,
693249423Sdim                   Keyword<"__stdcall">, Keyword<"_stdcall">];
694210008Srdivacky}
695210008Srdivacky
696256030Sdimdef SysVABI : InheritableAttr {
697256030Sdim  let Spellings = [GNU<"sysv_abi">, CXX11<"gnu", "sysv_abi">];
698256030Sdim}
699256030Sdim
700218893Sdimdef ThisCall : InheritableAttr {
701249423Sdim  let Spellings = [GNU<"thiscall">, CXX11<"gnu", "thiscall">,
702249423Sdim                   Keyword<"__thiscall">, Keyword<"_thiscall">];
703210008Srdivacky}
704210008Srdivacky
705218893Sdimdef Pascal : InheritableAttr {
706249423Sdim  let Spellings = [GNU<"pascal">, Keyword<"__pascal">, Keyword<"_pascal">];
707212904Sdim}
708212904Sdim
709218893Sdimdef TransparentUnion : InheritableAttr {
710249423Sdim  let Spellings = [GNU<"transparent_union">, CXX11<"gnu", "transparent_union">];
711210008Srdivacky}
712210008Srdivacky
713218893Sdimdef Unavailable : InheritableAttr {
714239462Sdim  let Spellings = [GNU<"unavailable">];
715263508Sdim  let Args = [StringArgument<"Message", 1>];
716210008Srdivacky}
717210008Srdivacky
718224145Sdimdef ArcWeakrefUnavailable : InheritableAttr {
719239462Sdim  let Spellings = [GNU<"objc_arc_weak_reference_unavailable">];
720234353Sdim  let Subjects = [ObjCInterface];
721224145Sdim}
722224145Sdim
723263508Sdimdef ObjCGC : TypeAttr {
724239462Sdim  let Spellings = [GNU<"objc_gc">];
725239462Sdim  let Args = [IdentifierArgument<"Kind">];
726239462Sdim}
727239462Sdim
728263508Sdimdef ObjCOwnership : InheritableAttr {
729239462Sdim  let Spellings = [GNU<"objc_ownership">];
730239462Sdim  let Args = [IdentifierArgument<"Kind">];
731239462Sdim  let ASTNode = 0;
732239462Sdim}
733239462Sdim
734234353Sdimdef ObjCRequiresPropertyDefs : InheritableAttr {
735239462Sdim  let Spellings = [GNU<"objc_requires_property_definitions">];
736234353Sdim  let Subjects = [ObjCInterface];
737234353Sdim}
738234353Sdim
739218893Sdimdef Unused : InheritableAttr {
740249423Sdim  let Spellings = [GNU<"unused">, CXX11<"gnu", "unused">];
741210008Srdivacky}
742210008Srdivacky
743218893Sdimdef Used : InheritableAttr {
744249423Sdim  let Spellings = [GNU<"used">, CXX11<"gnu", "used">];
745210008Srdivacky}
746210008Srdivacky
747218893Sdimdef Uuid : InheritableAttr {
748239462Sdim  let Spellings = [GNU<"uuid">];
749218893Sdim  let Args = [StringArgument<"Guid">];
750218893Sdim  let Subjects = [CXXRecord];
751218893Sdim}
752218893Sdim
753263508Sdimdef VectorSize : TypeAttr {
754249423Sdim  let Spellings = [GNU<"vector_size">, CXX11<"gnu", "vector_size">];
755239462Sdim  let Args = [ExprArgument<"NumBytes">];
756239462Sdim}
757239462Sdim
758249423Sdimdef VecTypeHint : InheritableAttr {
759239462Sdim  let Spellings = [GNU<"vec_type_hint">];
760263508Sdim  let Args = [TypeArgument<"TypeHint">];
761239462Sdim}
762239462Sdim
763218893Sdimdef Visibility : InheritableAttr {
764239462Sdim  let Clone = 0;
765249423Sdim  let Spellings = [GNU<"visibility">, CXX11<"gnu", "visibility">];
766212904Sdim  let Args = [EnumArgument<"Visibility", "VisibilityType",
767212904Sdim                           ["default", "hidden", "internal", "protected"],
768212904Sdim                           ["Default", "Hidden", "Hidden", "Protected"]>];
769210008Srdivacky}
770210008Srdivacky
771249423Sdimdef TypeVisibility : InheritableAttr {
772249423Sdim  let Clone = 0;
773249423Sdim  let Spellings = [GNU<"type_visibility">, CXX11<"clang", "type_visibility">];
774249423Sdim  let Args = [EnumArgument<"Visibility", "VisibilityType",
775249423Sdim                           ["default", "hidden", "internal", "protected"],
776249423Sdim                           ["Default", "Hidden", "Hidden", "Protected"]>];
777249423Sdim}
778249423Sdim
779218893Sdimdef VecReturn : InheritableAttr {
780239462Sdim  let Spellings = [GNU<"vecreturn">];
781212904Sdim  let Subjects = [CXXRecord];
782212904Sdim}
783212904Sdim
784263508Sdimdef WarnUnused : InheritableAttr {
785263508Sdim  let Spellings = [GNU<"warn_unused">];
786263508Sdim  let Subjects = [Record];
787263508Sdim}
788263508Sdim
789218893Sdimdef WarnUnusedResult : InheritableAttr {
790249423Sdim  let Spellings = [GNU<"warn_unused_result">,
791249423Sdim                   CXX11<"clang", "warn_unused_result">,
792249423Sdim                   CXX11<"gnu", "warn_unused_result">];
793210008Srdivacky}
794210008Srdivacky
795218893Sdimdef Weak : InheritableAttr {
796249423Sdim  let Spellings = [GNU<"weak">, CXX11<"gnu", "weak">];
797210008Srdivacky}
798210008Srdivacky
799218893Sdimdef WeakImport : InheritableAttr {
800239462Sdim  let Spellings = [GNU<"weak_import">];
801210008Srdivacky}
802210008Srdivacky
803218893Sdimdef WeakRef : InheritableAttr {
804249423Sdim  let Spellings = [GNU<"weakref">, CXX11<"gnu", "weakref">];
805263508Sdim  // A WeakRef that has an argument is treated as being an AliasAttr
806263508Sdim  let Args = [StringArgument<"Aliasee", 1>];
807210008Srdivacky}
808210008Srdivacky
809263508Sdimdef X86ForceAlignArgPointer : InheritableAttr, TargetSpecificAttr {
810210008Srdivacky  let Spellings = [];
811210008Srdivacky}
812226633Sdim
813249423Sdim// Attribute to disable AddressSanitizer (or equivalent) checks.
814249423Sdimdef NoSanitizeAddress : InheritableAttr {
815249423Sdim  let Spellings = [GNU<"no_address_safety_analysis">,
816263508Sdim                   GNU<"no_sanitize_address">,
817263508Sdim                   CXX11<"gnu", "no_address_safety_analysis">,
818263508Sdim                   CXX11<"gnu", "no_sanitize_address">];
819234353Sdim}
820226633Sdim
821249423Sdim// Attribute to disable ThreadSanitizer checks.
822249423Sdimdef NoSanitizeThread : InheritableAttr {
823249423Sdim  let Spellings = [GNU<"no_sanitize_thread">];
824249423Sdim}
825249423Sdim
826249423Sdim// Attribute to disable MemorySanitizer checks.
827249423Sdimdef NoSanitizeMemory : InheritableAttr {
828249423Sdim  let Spellings = [GNU<"no_sanitize_memory">];
829249423Sdim}
830249423Sdim
831226633Sdim// C/C++ Thread safety attributes (e.g. for deadlock, data race checking)
832226633Sdim
833226633Sdimdef GuardedVar : InheritableAttr {
834239462Sdim  let Spellings = [GNU<"guarded_var">];
835226633Sdim}
836226633Sdim
837226633Sdimdef PtGuardedVar : InheritableAttr {
838239462Sdim  let Spellings = [GNU<"pt_guarded_var">];
839226633Sdim}
840226633Sdim
841226633Sdimdef Lockable : InheritableAttr {
842239462Sdim  let Spellings = [GNU<"lockable">];
843226633Sdim}
844226633Sdim
845226633Sdimdef ScopedLockable : InheritableAttr {
846239462Sdim  let Spellings = [GNU<"scoped_lockable">];
847226633Sdim}
848226633Sdim
849226633Sdimdef NoThreadSafetyAnalysis : InheritableAttr {
850239462Sdim  let Spellings = [GNU<"no_thread_safety_analysis">];
851226633Sdim}
852226633Sdim
853226633Sdimdef GuardedBy : InheritableAttr {
854239462Sdim  let Spellings = [GNU<"guarded_by">];
855226633Sdim  let Args = [ExprArgument<"Arg">];
856226633Sdim  let LateParsed = 1;
857234353Sdim  let TemplateDependent = 1;
858226633Sdim}
859226633Sdim
860226633Sdimdef PtGuardedBy : InheritableAttr {
861239462Sdim  let Spellings = [GNU<"pt_guarded_by">];
862226633Sdim  let Args = [ExprArgument<"Arg">];
863226633Sdim  let LateParsed = 1;
864234353Sdim  let TemplateDependent = 1;
865226633Sdim}
866226633Sdim
867226633Sdimdef AcquiredAfter : InheritableAttr {
868239462Sdim  let Spellings = [GNU<"acquired_after">];
869226633Sdim  let Args = [VariadicExprArgument<"Args">];
870226633Sdim  let LateParsed = 1;
871234353Sdim  let TemplateDependent = 1;
872226633Sdim}
873226633Sdim
874226633Sdimdef AcquiredBefore : InheritableAttr {
875239462Sdim  let Spellings = [GNU<"acquired_before">];
876226633Sdim  let Args = [VariadicExprArgument<"Args">];
877226633Sdim  let LateParsed = 1;
878234353Sdim  let TemplateDependent = 1;
879226633Sdim}
880226633Sdim
881226633Sdimdef ExclusiveLockFunction : InheritableAttr {
882239462Sdim  let Spellings = [GNU<"exclusive_lock_function">];
883226633Sdim  let Args = [VariadicExprArgument<"Args">];
884226633Sdim  let LateParsed = 1;
885234353Sdim  let TemplateDependent = 1;
886226633Sdim}
887226633Sdim
888226633Sdimdef SharedLockFunction : InheritableAttr {
889239462Sdim  let Spellings = [GNU<"shared_lock_function">];
890226633Sdim  let Args = [VariadicExprArgument<"Args">];
891226633Sdim  let LateParsed = 1;
892234353Sdim  let TemplateDependent = 1;
893226633Sdim}
894226633Sdim
895263508Sdimdef AssertExclusiveLock : InheritableAttr {
896263508Sdim  let Spellings = [GNU<"assert_exclusive_lock">];
897263508Sdim  let Args = [VariadicExprArgument<"Args">];
898263508Sdim  let LateParsed = 1;
899263508Sdim  let TemplateDependent = 1;
900263508Sdim}
901263508Sdim
902263508Sdimdef AssertSharedLock : InheritableAttr {
903263508Sdim  let Spellings = [GNU<"assert_shared_lock">];
904263508Sdim  let Args = [VariadicExprArgument<"Args">];
905263508Sdim  let LateParsed = 1;
906263508Sdim  let TemplateDependent = 1;
907263508Sdim}
908263508Sdim
909226633Sdim// The first argument is an integer or boolean value specifying the return value
910226633Sdim// of a successful lock acquisition.
911226633Sdimdef ExclusiveTrylockFunction : InheritableAttr {
912239462Sdim  let Spellings = [GNU<"exclusive_trylock_function">];
913226633Sdim  let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
914226633Sdim  let LateParsed = 1;
915234353Sdim  let TemplateDependent = 1;
916226633Sdim}
917226633Sdim
918226633Sdim// The first argument is an integer or boolean value specifying the return value
919226633Sdim// of a successful lock acquisition.
920226633Sdimdef SharedTrylockFunction : InheritableAttr {
921239462Sdim  let Spellings = [GNU<"shared_trylock_function">];
922226633Sdim  let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
923226633Sdim  let LateParsed = 1;
924234353Sdim  let TemplateDependent = 1;
925226633Sdim}
926226633Sdim
927226633Sdimdef UnlockFunction : InheritableAttr {
928239462Sdim  let Spellings = [GNU<"unlock_function">];
929226633Sdim  let Args = [VariadicExprArgument<"Args">];
930226633Sdim  let LateParsed = 1;
931234353Sdim  let TemplateDependent = 1;
932226633Sdim}
933226633Sdim
934226633Sdimdef LockReturned : InheritableAttr {
935239462Sdim  let Spellings = [GNU<"lock_returned">];
936226633Sdim  let Args = [ExprArgument<"Arg">];
937226633Sdim  let LateParsed = 1;
938234353Sdim  let TemplateDependent = 1;
939226633Sdim}
940226633Sdim
941226633Sdimdef LocksExcluded : InheritableAttr {
942239462Sdim  let Spellings = [GNU<"locks_excluded">];
943226633Sdim  let Args = [VariadicExprArgument<"Args">];
944226633Sdim  let LateParsed = 1;
945234353Sdim  let TemplateDependent = 1;
946226633Sdim}
947226633Sdim
948226633Sdimdef ExclusiveLocksRequired : InheritableAttr {
949239462Sdim  let Spellings = [GNU<"exclusive_locks_required">];
950226633Sdim  let Args = [VariadicExprArgument<"Args">];
951226633Sdim  let LateParsed = 1;
952234353Sdim  let TemplateDependent = 1;
953226633Sdim}
954226633Sdim
955226633Sdimdef SharedLocksRequired : InheritableAttr {
956239462Sdim  let Spellings = [GNU<"shared_locks_required">];
957226633Sdim  let Args = [VariadicExprArgument<"Args">];
958226633Sdim  let LateParsed = 1;
959234353Sdim  let TemplateDependent = 1;
960226633Sdim}
961239462Sdim
962263508Sdim// C/C++ consumed attributes.
963263508Sdim
964263508Sdimdef Consumable : InheritableAttr {
965263508Sdim  let Spellings = [GNU<"consumable">];
966263508Sdim  let Subjects = [CXXRecord];
967263508Sdim  let Args = [EnumArgument<"DefaultState", "ConsumedState",
968263508Sdim                           ["unknown", "consumed", "unconsumed"],
969263508Sdim                           ["Unknown", "Consumed", "Unconsumed"]>];
970263508Sdim}
971263508Sdim
972263508Sdimdef CallableWhen : InheritableAttr {
973263508Sdim  let Spellings = [GNU<"callable_when">];
974263508Sdim  let Subjects = [CXXMethod];
975263508Sdim  let Args = [VariadicEnumArgument<"CallableState", "ConsumedState",
976263508Sdim                                   ["unknown", "consumed", "unconsumed"],
977263508Sdim                                   ["Unknown", "Consumed", "Unconsumed"]>];
978263508Sdim}
979263508Sdim
980263508Sdimdef ParamTypestate : InheritableAttr {
981263508Sdim  let Spellings = [GNU<"param_typestate">];
982263508Sdim  let Subjects = [ParmVar];
983263508Sdim  let Args = [EnumArgument<"ParamState", "ConsumedState",
984263508Sdim                           ["unknown", "consumed", "unconsumed"],
985263508Sdim                           ["Unknown", "Consumed", "Unconsumed"]>];
986263508Sdim}
987263508Sdim
988263508Sdimdef ReturnTypestate : InheritableAttr {
989263508Sdim  let Spellings = [GNU<"return_typestate">];
990263508Sdim  let Subjects = [Function, ParmVar];
991263508Sdim  let Args = [EnumArgument<"State", "ConsumedState",
992263508Sdim                           ["unknown", "consumed", "unconsumed"],
993263508Sdim                           ["Unknown", "Consumed", "Unconsumed"]>];
994263508Sdim}
995263508Sdim
996263508Sdimdef SetTypestate : InheritableAttr {
997263508Sdim  let Spellings = [GNU<"set_typestate">];
998263508Sdim  let Subjects = [CXXMethod];
999263508Sdim  let Args = [EnumArgument<"NewState", "ConsumedState",
1000263508Sdim                           ["unknown", "consumed", "unconsumed"],
1001263508Sdim                           ["Unknown", "Consumed", "Unconsumed"]>];
1002263508Sdim}
1003263508Sdim
1004263508Sdimdef TestTypestate : InheritableAttr {
1005263508Sdim  let Spellings = [GNU<"test_typestate">];
1006263508Sdim  let Subjects = [CXXMethod];
1007263508Sdim  let Args = [EnumArgument<"TestState", "ConsumedState",
1008263508Sdim                           ["consumed", "unconsumed"],
1009263508Sdim                           ["Consumed", "Unconsumed"]>];
1010263508Sdim}
1011263508Sdim
1012239462Sdim// Type safety attributes for `void *' pointers and type tags.
1013239462Sdim
1014239462Sdimdef ArgumentWithTypeTag : InheritableAttr {
1015239462Sdim  let Spellings = [GNU<"argument_with_type_tag">,
1016239462Sdim                   GNU<"pointer_with_type_tag">];
1017239462Sdim  let Args = [IdentifierArgument<"ArgumentKind">,
1018239462Sdim              UnsignedArgument<"ArgumentIdx">,
1019239462Sdim              UnsignedArgument<"TypeTagIdx">,
1020239462Sdim              BoolArgument<"IsPointer">];
1021239462Sdim  let Subjects = [Function];
1022263508Sdim  let HasCustomParsing = 1;
1023239462Sdim}
1024239462Sdim
1025239462Sdimdef TypeTagForDatatype : InheritableAttr {
1026239462Sdim  let Spellings = [GNU<"type_tag_for_datatype">];
1027239462Sdim  let Args = [IdentifierArgument<"ArgumentKind">,
1028239462Sdim              TypeArgument<"MatchingCType">,
1029239462Sdim              BoolArgument<"LayoutCompatible">,
1030239462Sdim              BoolArgument<"MustBeNull">];
1031239462Sdim  let Subjects = [Var];
1032263508Sdim  let HasCustomParsing = 1;
1033239462Sdim}
1034239462Sdim
1035239462Sdim// Microsoft-related attributes
1036239462Sdim
1037263508Sdimdef MsProperty : IgnoredAttr {
1038251662Sdim  let Spellings = [Declspec<"property">];
1039251662Sdim}
1040251662Sdim
1041239462Sdimdef MsStruct : InheritableAttr {
1042239462Sdim  let Spellings = [Declspec<"ms_struct">];
1043239462Sdim}
1044239462Sdim
1045263508Sdimdef DLLExport : InheritableAttr, TargetSpecificAttr {
1046239462Sdim  let Spellings = [Declspec<"dllexport">];
1047239462Sdim}
1048239462Sdim
1049263508Sdimdef DLLImport : InheritableAttr, TargetSpecificAttr {
1050239462Sdim  let Spellings = [Declspec<"dllimport">];
1051239462Sdim}
1052239462Sdim
1053239462Sdimdef ForceInline : InheritableAttr {
1054249423Sdim  let Spellings = [Keyword<"__forceinline">];
1055239462Sdim}
1056239462Sdim
1057263508Sdimdef SelectAny : InheritableAttr {
1058263508Sdim  let Spellings = [Declspec<"selectany">];
1059263508Sdim}
1060263508Sdim
1061239462Sdimdef Win64 : InheritableAttr {
1062249423Sdim  let Spellings = [Keyword<"__w64">];
1063239462Sdim}
1064239462Sdim
1065263508Sdimdef Ptr32 : TypeAttr {
1066249423Sdim  let Spellings = [Keyword<"__ptr32">];
1067239462Sdim}
1068239462Sdim
1069263508Sdimdef Ptr64 : TypeAttr {
1070249423Sdim  let Spellings = [Keyword<"__ptr64">];
1071239462Sdim}
1072239462Sdim
1073263508Sdimdef SPtr : TypeAttr {
1074263508Sdim  let Spellings = [Keyword<"__sptr">];
1075263508Sdim}
1076263508Sdim
1077263508Sdimdef UPtr : TypeAttr {
1078263508Sdim  let Spellings = [Keyword<"__uptr">];
1079263508Sdim}
1080263508Sdim
1081249423Sdimclass MSInheritanceAttr : InheritableAttr;
1082249423Sdim
1083249423Sdimdef SingleInheritance : MSInheritanceAttr {
1084249423Sdim  let Spellings = [Keyword<"__single_inheritance">];
1085239462Sdim}
1086239462Sdim
1087249423Sdimdef MultipleInheritance : MSInheritanceAttr {
1088249423Sdim  let Spellings = [Keyword<"__multiple_inheritance">];
1089239462Sdim}
1090239462Sdim
1091249423Sdimdef VirtualInheritance : MSInheritanceAttr {
1092249423Sdim  let Spellings = [Keyword<"__virtual_inheritance">];
1093239462Sdim}
1094249423Sdim
1095249423Sdim// This attribute doesn't have any spellings, but we can apply it implicitly to
1096249423Sdim// incomplete types that lack any of the other attributes.
1097249423Sdimdef UnspecifiedInheritance : MSInheritanceAttr {
1098249423Sdim  let Spellings = [];
1099249423Sdim}
1100249423Sdim
1101249423Sdimdef Unaligned : IgnoredAttr {
1102249423Sdim  let Spellings = [Keyword<"__unaligned">];
1103249423Sdim}
1104