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