Home | History | Annotate | Download | only in Basic
      1 //==--- Attr.td - attribute definitions -----------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // The documentation is organized by category. Attributes can have category-
     11 // specific documentation that is collated within the larger document.
     12 class DocumentationCategory<string name> {
     13   string Name = name;
     14   code Content = [{}];
     15 }
     16 def DocCatFunction : DocumentationCategory<"Function Attributes">;
     17 def DocCatVariable : DocumentationCategory<"Variable Attributes">;
     18 def DocCatType : DocumentationCategory<"Type Attributes">;
     19 def DocCatStmt : DocumentationCategory<"Statement Attributes">;
     20 // Attributes listed under the Undocumented category do not generate any public
     21 // documentation. Ideally, this category should be used for internal-only
     22 // attributes which contain no spellings.
     23 def DocCatUndocumented : DocumentationCategory<"Undocumented">;
     24 
     25 class DocDeprecated<string replacement = ""> {
     26   // If the Replacement field is empty, no replacement will be listed with the
     27   // documentation. Otherwise, the documentation will specify the attribute has
     28   // been superseded by this replacement.
     29   string Replacement = replacement;
     30 }
     31 
     32 // Specifies the documentation to be associated with the given category.
     33 class Documentation {
     34   DocumentationCategory Category;
     35   code Content;
     36 
     37   // If the heading is empty, one may be picked automatically. If the attribute
     38   // only has one spelling, no heading is required as the attribute's sole
     39   // spelling is sufficient. If all spellings are semantically common, the
     40   // heading will be the semantic spelling. If the spellings are not
     41   // semantically common and no heading is provided, an error will be emitted.
     42   string Heading = "";
     43 
     44   // When set, specifies that the attribute is deprecated and can optionally
     45   // specify a replacement attribute.
     46   DocDeprecated Deprecated;
     47 }
     48 
     49 // Specifies that the attribute is explicitly undocumented. This can be a
     50 // helpful placeholder for the attribute while working on the implementation,
     51 // but should not be used once feature work has been completed.
     52 def Undocumented : Documentation {
     53   let Category = DocCatUndocumented;
     54 }
     55 
     56 include "clang/Basic/AttrDocs.td"
     57 
     58 // An attribute's subject is whatever it appertains to. In this file, it is
     59 // more accurately a list of things that an attribute can appertain to. All
     60 // Decls and Stmts are possibly AttrSubjects (even though the syntax may not
     61 // allow attributes on a given Decl or Stmt).
     62 class AttrSubject;
     63 
     64 include "clang/Basic/DeclNodes.td"
     65 include "clang/Basic/StmtNodes.td"
     66 
     67 // A subset-subject is an AttrSubject constrained to operate only on some subset
     68 // of that subject.
     69 //
     70 // The code fragment is a boolean expression that will confirm that the subject
     71 // meets the requirements; the subject will have the name S, and will have the
     72 // type specified by the base. It should be a simple boolean expression.
     73 class SubsetSubject<AttrSubject base, code check> : AttrSubject {
     74   AttrSubject Base = base;
     75   code CheckCode = check;
     76 }
     77 
     78 // This is the type of a variable which C++11 allows alignas(...) to appertain
     79 // to.
     80 def NormalVar : SubsetSubject<Var,
     81                               [{S->getStorageClass() != VarDecl::Register &&
     82                                 S->getKind() != Decl::ImplicitParam &&
     83                                 S->getKind() != Decl::ParmVar &&
     84                                 S->getKind() != Decl::NonTypeTemplateParm}]>;
     85 def NonParmVar : SubsetSubject<Var,
     86                                [{S->getKind() != Decl::ParmVar}]>;
     87 def NonBitField : SubsetSubject<Field,
     88                                 [{!S->isBitField()}]>;
     89 
     90 def ObjCInstanceMethod : SubsetSubject<ObjCMethod,
     91                                        [{S->isInstanceMethod()}]>;
     92 
     93 def ObjCInterfaceDeclInitMethod : SubsetSubject<ObjCMethod,
     94                                [{S->getMethodFamily() == OMF_init &&
     95                                  (isa<ObjCInterfaceDecl>(S->getDeclContext()) ||
     96                                   (isa<ObjCCategoryDecl>(S->getDeclContext()) &&
     97             cast<ObjCCategoryDecl>(S->getDeclContext())->IsClassExtension()))}]>;
     98 
     99 def Struct : SubsetSubject<Record,
    100                            [{!S->isUnion()}]>;
    101 
    102 def TLSVar : SubsetSubject<Var,
    103                            [{S->getTLSKind() != 0}]>;
    104 
    105 def SharedVar : SubsetSubject<Var,
    106                               [{S->hasGlobalStorage() && !S->getTLSKind()}]>;
    107 
    108 def GlobalVar : SubsetSubject<Var,
    109                              [{S->hasGlobalStorage()}]>;
    110 
    111 // FIXME: this hack is needed because DeclNodes.td defines the base Decl node
    112 // type to be a class, not a definition. This makes it impossible to create an
    113 // attribute subject which accepts a Decl. Normally, this is not a problem,
    114 // because the attribute can have no Subjects clause to accomplish this. But in
    115 // the case of a SubsetSubject, there's no way to express it without this hack.
    116 def DeclBase : AttrSubject;
    117 def FunctionLike : SubsetSubject<DeclBase,
    118                                   [{S->getFunctionType(false) != nullptr}]>;
    119 
    120 def OpenCLKernelFunction : SubsetSubject<Function, [{
    121   S->hasAttr<OpenCLKernelAttr>()
    122 }]>;
    123 
    124 // HasFunctionProto is a more strict version of FunctionLike, so it should
    125 // never be specified in a Subjects list along with FunctionLike (due to the
    126 // inclusive nature of subject testing).
    127 def HasFunctionProto : SubsetSubject<DeclBase,
    128                                      [{(S->getFunctionType(true) != nullptr &&
    129                               isa<FunctionProtoType>(S->getFunctionType())) ||
    130                                        isa<ObjCMethodDecl>(S) ||
    131                                        isa<BlockDecl>(S)}]>;
    132 
    133 // A single argument to an attribute
    134 class Argument<string name, bit optional, bit fake = 0> {
    135   string Name = name;
    136   bit Optional = optional;
    137 
    138   /// A fake argument is used to store and serialize additional information
    139   /// in an attribute without actually changing its parsing or pretty-printing.
    140   bit Fake = fake;
    141 }
    142 
    143 class BoolArgument<string name, bit opt = 0> : Argument<name, opt>;
    144 class IdentifierArgument<string name, bit opt = 0> : Argument<name, opt>;
    145 class IntArgument<string name, bit opt = 0> : Argument<name, opt>;
    146 class StringArgument<string name, bit opt = 0> : Argument<name, opt>;
    147 class ExprArgument<string name, bit opt = 0> : Argument<name, opt>;
    148 class FunctionArgument<string name, bit opt = 0> : Argument<name, opt>;
    149 class TypeArgument<string name, bit opt = 0> : Argument<name, opt>;
    150 class UnsignedArgument<string name, bit opt = 0> : Argument<name, opt>;
    151 class VariadicUnsignedArgument<string name> : Argument<name, 1>;
    152 class VariadicExprArgument<string name> : Argument<name, 1>;
    153 class VariadicStringArgument<string name> : Argument<name, 1>;
    154 
    155 // A version of the form major.minor[.subminor].
    156 class VersionArgument<string name, bit opt = 0> : Argument<name, opt>;
    157 
    158 // This one's a doozy, so it gets its own special type
    159 // It can be an unsigned integer, or a type. Either can
    160 // be dependent.
    161 class AlignedArgument<string name, bit opt = 0> : Argument<name, opt>;
    162 
    163 // A bool argument with a default value
    164 class DefaultBoolArgument<string name, bit default> : BoolArgument<name, 1> {
    165   bit Default = default;
    166 }
    167 
    168 // An integer argument with a default value
    169 class DefaultIntArgument<string name, int default> : IntArgument<name, 1> {
    170   int Default = default;
    171 }
    172 
    173 // This argument is more complex, it includes the enumerator type name,
    174 // a list of strings to accept, and a list of enumerators to map them to.
    175 class EnumArgument<string name, string type, list<string> values,
    176                    list<string> enums, bit opt = 0, bit fake = 0>
    177     : Argument<name, opt, fake> {
    178   string Type = type;
    179   list<string> Values = values;
    180   list<string> Enums = enums;
    181 }
    182 
    183 // FIXME: There should be a VariadicArgument type that takes any other type
    184 //        of argument and generates the appropriate type.
    185 class VariadicEnumArgument<string name, string type, list<string> values,
    186                            list<string> enums> : Argument<name, 1>  {
    187   string Type = type;
    188   list<string> Values = values;
    189   list<string> Enums = enums;
    190 }
    191 
    192 // This handles one spelling of an attribute.
    193 class Spelling<string name, string variety> {
    194   string Name = name;
    195   string Variety = variety;
    196   bit KnownToGCC;
    197 }
    198 
    199 class GNU<string name> : Spelling<name, "GNU">;
    200 class Declspec<string name> : Spelling<name, "Declspec">;
    201 class CXX11<string namespace, string name, int version = 1>
    202     : Spelling<name, "CXX11"> {
    203   string Namespace = namespace;
    204   int Version = version;
    205 }
    206 class Keyword<string name> : Spelling<name, "Keyword">;
    207 class Pragma<string namespace, string name> : Spelling<name, "Pragma"> {
    208   string Namespace = namespace;
    209 }
    210 
    211 // The GCC spelling implies GNU<name, "GNU"> and CXX11<"gnu", name> and also
    212 // sets KnownToGCC to 1. This spelling should be used for any GCC-compatible
    213 // attributes.
    214 class GCC<string name> : Spelling<name, "GCC"> {
    215   let KnownToGCC = 1;
    216 }
    217 
    218 class Accessor<string name, list<Spelling> spellings> {
    219   string Name = name;
    220   list<Spelling> Spellings = spellings;
    221 }
    222 
    223 class SubjectDiag<bit warn> {
    224   bit Warn = warn;
    225 }
    226 def WarnDiag : SubjectDiag<1>;
    227 def ErrorDiag : SubjectDiag<0>;
    228 
    229 class SubjectList<list<AttrSubject> subjects, SubjectDiag diag = WarnDiag,
    230                   string customDiag = ""> {
    231   list<AttrSubject> Subjects = subjects;
    232   SubjectDiag Diag = diag;
    233   string CustomDiag = customDiag;
    234 }
    235 
    236 class LangOpt<string name, bit negated = 0> {
    237   string Name = name;
    238   bit Negated = negated;
    239 }
    240 def MicrosoftExt : LangOpt<"MicrosoftExt">;
    241 def Borland : LangOpt<"Borland">;
    242 def CUDA : LangOpt<"CUDA">;
    243 def COnly : LangOpt<"CPlusPlus", 1>;
    244 def OpenCL : LangOpt<"OpenCL">;
    245 def RenderScript : LangOpt<"RenderScript">;
    246 
    247 // Defines targets for target-specific attributes. The list of strings should
    248 // specify architectures for which the target applies, based off the ArchType
    249 // enumeration in Triple.h.
    250 class TargetArch<list<string> arches> {
    251   list<string> Arches = arches;
    252   list<string> OSes;
    253   list<string> CXXABIs;
    254 }
    255 def TargetARM : TargetArch<["arm", "thumb"]>;
    256 def TargetMips : TargetArch<["mips", "mipsel"]>;
    257 def TargetMSP430 : TargetArch<["msp430"]>;
    258 def TargetX86 : TargetArch<["x86"]>;
    259 def TargetAnyX86 : TargetArch<["x86", "x86_64"]>;
    260 def TargetWindows : TargetArch<["x86", "x86_64", "arm", "thumb"]> {
    261   let OSes = ["Win32"];
    262 }
    263 def TargetMicrosoftCXXABI : TargetArch<["x86", "x86_64", "arm", "thumb"]> {
    264   let CXXABIs = ["Microsoft"];
    265 }
    266 
    267 class Attr {
    268   // The various ways in which an attribute can be spelled in source
    269   list<Spelling> Spellings;
    270   // The things to which an attribute can appertain
    271   SubjectList Subjects;
    272   // The arguments allowed on an attribute
    273   list<Argument> Args = [];
    274   // Accessors which should be generated for the attribute.
    275   list<Accessor> Accessors = [];
    276   // Set to true for attributes with arguments which require delayed parsing.
    277   bit LateParsed = 0;
    278   // Set to false to prevent an attribute from being propagated from a template
    279   // to the instantiation.
    280   bit Clone = 1;
    281   // Set to true for attributes which must be instantiated within templates
    282   bit TemplateDependent = 0;
    283   // Set to true for attributes that have a corresponding AST node.
    284   bit ASTNode = 1;
    285   // Set to true for attributes which have handler in Sema.
    286   bit SemaHandler = 1;
    287   // Set to true for attributes that are completely ignored.
    288   bit Ignored = 0;
    289   // Set to true if the attribute's parsing does not match its semantic
    290   // content. Eg) It parses 3 args, but semantically takes 4 args.  Opts out of
    291   // common attribute error checking.
    292   bit HasCustomParsing = 0;
    293   // Set to true if all of the attribute's arguments should be parsed in an
    294   // unevaluated context.
    295   bit ParseArgumentsAsUnevaluated = 0;
    296   // Set to true if this attribute can be duplicated on a subject when merging
    297   // attributes. By default, attributes are not merged.
    298   bit DuplicatesAllowedWhileMerging = 0;
    299   // Lists language options, one of which is required to be true for the
    300   // attribute to be applicable. If empty, no language options are required.
    301   list<LangOpt> LangOpts = [];
    302   // Any additional text that should be included verbatim in the class.
    303   // Note: Any additional data members will leak and should be constructed
    304   // externally on the ASTContext.
    305   code AdditionalMembers = [{}];
    306   // Any documentation that should be associated with the attribute. Since an
    307   // attribute may be documented under multiple categories, more than one
    308   // Documentation entry may be listed.
    309   list<Documentation> Documentation;
    310 }
    311 
    312 /// A type attribute is not processed on a declaration or a statement.
    313 class TypeAttr : Attr {
    314   // By default, type attributes do not get an AST node.
    315   let ASTNode = 0;
    316 }
    317 
    318 /// A stmt attribute is not processed on a declaration or a type.
    319 class StmtAttr : Attr;
    320 
    321 /// An inheritable attribute is inherited by later redeclarations.
    322 class InheritableAttr : Attr;
    323 
    324 /// A target-specific attribute.  This class is meant to be used as a mixin
    325 /// with InheritableAttr or Attr depending on the attribute's needs.
    326 class TargetSpecificAttr<TargetArch target> {
    327   TargetArch Target = target;
    328   // Attributes are generally required to have unique spellings for their names
    329   // so that the parser can determine what kind of attribute it has parsed.
    330   // However, target-specific attributes are special in that the attribute only
    331   // "exists" for a given target. So two target-specific attributes can share
    332   // the same name when they exist in different targets. To support this, a
    333   // Kind can be explicitly specified for a target-specific attribute. This
    334   // corresponds to the AttributeList::AT_* enum that is generated and it
    335   // should contain a shared value between the attributes.
    336   //
    337   // Target-specific attributes which use this feature should ensure that the
    338   // spellings match exactly betweeen the attributes, and if the arguments or
    339   // subjects differ, should specify HasCustomParsing = 1 and implement their
    340   // own parsing and semantic handling requirements as-needed.
    341   string ParseKind;
    342 }
    343 
    344 /// An inheritable parameter attribute is inherited by later
    345 /// redeclarations, even when it's written on a parameter.
    346 class InheritableParamAttr : InheritableAttr;
    347 
    348 /// An attribute which changes the ABI rules for a specific parameter.
    349 class ParameterABIAttr : InheritableParamAttr {
    350   let Subjects = SubjectList<[ParmVar]>;
    351 }
    352 
    353 /// An ignored attribute, which we parse but discard with no checking.
    354 class IgnoredAttr : Attr {
    355   let Ignored = 1;
    356   let ASTNode = 0;
    357   let SemaHandler = 0;
    358   let Documentation = [Undocumented];
    359 }
    360 
    361 //
    362 // Attributes begin here
    363 //
    364 
    365 def AbiTag : Attr {
    366   let Spellings = [GCC<"abi_tag">];
    367   let Args = [VariadicStringArgument<"Tags">];
    368   let Subjects = SubjectList<[Struct, Var, Function, Namespace], ErrorDiag,
    369       "ExpectedStructClassVariableFunctionOrInlineNamespace">;
    370   let Documentation = [AbiTagsDocs];
    371 }
    372 
    373 def AddressSpace : TypeAttr {
    374   let Spellings = [GNU<"address_space">];
    375   let Args = [IntArgument<"AddressSpace">];
    376   let Documentation = [Undocumented];
    377 }
    378 
    379 def Alias : Attr {
    380   let Spellings = [GCC<"alias">];
    381   let Args = [StringArgument<"Aliasee">];
    382   let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag,
    383                              "ExpectedFunctionGlobalVarMethodOrProperty">;
    384   let Documentation = [Undocumented];
    385 }
    386 
    387 def Aligned : InheritableAttr {
    388   let Spellings = [GCC<"aligned">, Declspec<"align">, Keyword<"alignas">,
    389                    Keyword<"_Alignas">];
    390 //  let Subjects = SubjectList<[NonBitField, NormalVar, Tag]>;
    391   let Args = [AlignedArgument<"Alignment", 1>];
    392   let Accessors = [Accessor<"isGNU", [GCC<"aligned">]>,
    393                    Accessor<"isC11", [Keyword<"_Alignas">]>,
    394                    Accessor<"isAlignas", [Keyword<"alignas">,
    395                                           Keyword<"_Alignas">]>,
    396                    Accessor<"isDeclspec",[Declspec<"align">]>];
    397   let Documentation = [Undocumented];
    398 }
    399 
    400 def AlignValue : Attr {
    401   let Spellings = [
    402     // Unfortunately, this is semantically an assertion, not a directive
    403     // (something else must ensure the alignment), so aligned_value is a
    404     // probably a better name. We might want to add an aligned_value spelling in
    405     // the future (and a corresponding C++ attribute), but this can be done
    406     // later once we decide if we also want them to have slightly-different
    407     // semantics than Intel's align_value.
    408     GNU<"align_value">
    409     // Intel's compiler on Windows also supports:
    410     // , Declspec<"align_value">
    411   ];
    412   let Args = [ExprArgument<"Alignment">];
    413   let Subjects = SubjectList<[Var, TypedefName], WarnDiag,
    414                              "ExpectedVariableOrTypedef">;
    415   let Documentation = [AlignValueDocs];
    416 }
    417 
    418 def AlignMac68k : InheritableAttr {
    419   // This attribute has no spellings as it is only ever created implicitly.
    420   let Spellings = [];
    421   let SemaHandler = 0;
    422   let Documentation = [Undocumented];
    423 }
    424 
    425 def AlwaysInline : InheritableAttr {
    426   let Spellings = [GCC<"always_inline">, Keyword<"__forceinline">];
    427   let Subjects = SubjectList<[Function]>;
    428   let Documentation = [Undocumented];
    429 }
    430 
    431 def XRayInstrument : InheritableAttr {
    432   let Spellings = [GNU<"xray_always_instrument">,
    433                    CXX11<"clang", "xray_always_instrument">,
    434                    GNU<"xray_never_instrument">,
    435                    CXX11<"clang", "xray_never_instrument">];
    436   let Subjects = SubjectList<[CXXMethod, ObjCMethod, Function], WarnDiag,
    437                               "ExpectedFunctionOrMethod">;
    438   let Accessors = [Accessor<"alwaysXRayInstrument",
    439                      [GNU<"xray_always_instrument">,
    440                       CXX11<"clang", "xray_always_instrument">]>,
    441                    Accessor<"neverXRayInstrument",
    442                      [GNU<"xray_never_instrument">,
    443                       CXX11<"clang", "xray_never_instrument">]>];
    444   let Documentation = [XRayDocs];
    445 }
    446 
    447 def TLSModel : InheritableAttr {
    448   let Spellings = [GCC<"tls_model">];
    449   let Subjects = SubjectList<[TLSVar], ErrorDiag, "ExpectedTLSVar">;
    450   let Args = [StringArgument<"Model">];
    451   let Documentation = [TLSModelDocs];
    452 }
    453 
    454 def AnalyzerNoReturn : InheritableAttr {
    455   let Spellings = [GNU<"analyzer_noreturn">];
    456   let Documentation = [Undocumented];
    457 }
    458 
    459 def Annotate : InheritableParamAttr {
    460   let Spellings = [GNU<"annotate">];
    461   let Args = [StringArgument<"Annotation">];
    462   let Documentation = [Undocumented];
    463 }
    464 
    465 def ARMInterrupt : InheritableAttr, TargetSpecificAttr<TargetARM> {
    466   // NOTE: If you add any additional spellings, MSP430Interrupt's,
    467   // MipsInterrupt's and AnyX86Interrupt's spellings must match.
    468   let Spellings = [GNU<"interrupt">];
    469   let Args = [EnumArgument<"Interrupt", "InterruptType",
    470                            ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", ""],
    471                            ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", "Generic"],
    472                            1>];
    473   let ParseKind = "Interrupt";
    474   let HasCustomParsing = 1;
    475   let Documentation = [ARMInterruptDocs];
    476 }
    477 
    478 def AsmLabel : InheritableAttr {
    479   let Spellings = [Keyword<"asm">, Keyword<"__asm__">];
    480   let Args = [StringArgument<"Label">];
    481   let SemaHandler = 0;
    482   let Documentation = [Undocumented];
    483 }
    484 
    485 def Availability : InheritableAttr {
    486   let Spellings = [GNU<"availability">];
    487   let Args = [IdentifierArgument<"platform">, VersionArgument<"introduced">,
    488               VersionArgument<"deprecated">, VersionArgument<"obsoleted">,
    489               BoolArgument<"unavailable">, StringArgument<"message">,
    490               BoolArgument<"strict">, StringArgument<"replacement">];
    491   let AdditionalMembers =
    492 [{static llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) {
    493     return llvm::StringSwitch<llvm::StringRef>(Platform)
    494              .Case("android", "Android")
    495              .Case("ios", "iOS")
    496              .Case("macos", "macOS")
    497              .Case("tvos", "tvOS")
    498              .Case("watchos", "watchOS")
    499              .Case("ios_app_extension", "iOS (App Extension)")
    500              .Case("macos_app_extension", "macOS (App Extension)")
    501              .Case("tvos_app_extension", "tvOS (App Extension)")
    502              .Case("watchos_app_extension", "watchOS (App Extension)")
    503              .Default(llvm::StringRef());
    504 } }];
    505   let HasCustomParsing = 1;
    506   let DuplicatesAllowedWhileMerging = 1;
    507 //  let Subjects = SubjectList<[Named]>;
    508   let Documentation = [AvailabilityDocs];
    509 }
    510 
    511 def Blocks : InheritableAttr {
    512   let Spellings = [GNU<"blocks">];
    513   let Args = [EnumArgument<"Type", "BlockType", ["byref"], ["ByRef"]>];
    514   let Documentation = [Undocumented];
    515 }
    516 
    517 def Bounded : IgnoredAttr {
    518   let Spellings = [GNU<"bounded">];
    519 }
    520 
    521 def CarriesDependency : InheritableParamAttr {
    522   let Spellings = [GNU<"carries_dependency">,
    523                    CXX11<"","carries_dependency", 200809>];
    524   let Subjects = SubjectList<[ParmVar, ObjCMethod, Function], ErrorDiag>;
    525   let Documentation = [CarriesDependencyDocs];
    526 }
    527 
    528 def CDecl : InheritableAttr {
    529   let Spellings = [GCC<"cdecl">, Keyword<"__cdecl">, Keyword<"_cdecl">];
    530 //  let Subjects = [Function, ObjCMethod];
    531   let Documentation = [Undocumented];
    532 }
    533 
    534 // cf_audited_transfer indicates that the given function has been
    535 // audited and has been marked with the appropriate cf_consumed and
    536 // cf_returns_retained attributes.  It is generally applied by
    537 // '#pragma clang arc_cf_code_audited' rather than explicitly.
    538 def CFAuditedTransfer : InheritableAttr {
    539   let Spellings = [GNU<"cf_audited_transfer">];
    540   let Subjects = SubjectList<[Function], ErrorDiag>;
    541   let Documentation = [Undocumented];
    542 }
    543 
    544 // cf_unknown_transfer is an explicit opt-out of cf_audited_transfer.
    545 // It indicates that the function has unknown or unautomatable
    546 // transfer semantics.
    547 def CFUnknownTransfer : InheritableAttr {
    548   let Spellings = [GNU<"cf_unknown_transfer">];
    549   let Subjects = SubjectList<[Function], ErrorDiag>;
    550   let Documentation = [Undocumented];
    551 }
    552 
    553 def CFReturnsRetained : InheritableAttr {
    554   let Spellings = [GNU<"cf_returns_retained">];
    555 //  let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
    556   let Documentation = [Undocumented];
    557 }
    558 
    559 def CFReturnsNotRetained : InheritableAttr {
    560   let Spellings = [GNU<"cf_returns_not_retained">];
    561 //  let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
    562   let Documentation = [Undocumented];
    563 }
    564 
    565 def CFConsumed : InheritableParamAttr {
    566   let Spellings = [GNU<"cf_consumed">];
    567   let Subjects = SubjectList<[ParmVar]>;
    568   let Documentation = [Undocumented];
    569 }
    570 
    571 def Cleanup : InheritableAttr {
    572   let Spellings = [GCC<"cleanup">];
    573   let Args = [FunctionArgument<"FunctionDecl">];
    574   let Subjects = SubjectList<[Var]>;
    575   let Documentation = [Undocumented];
    576 }
    577 
    578 def Cold : InheritableAttr {
    579   let Spellings = [GCC<"cold">];
    580   let Subjects = SubjectList<[Function]>;
    581   let Documentation = [Undocumented];
    582 }
    583 
    584 def Common : InheritableAttr {
    585   let Spellings = [GCC<"common">];
    586   let Subjects = SubjectList<[Var]>;
    587   let Documentation = [Undocumented];
    588 }
    589 
    590 def Const : InheritableAttr {
    591   let Spellings = [GCC<"const">, GCC<"__const">];
    592   let Documentation = [Undocumented];
    593 }
    594 
    595 def Constructor : InheritableAttr {
    596   let Spellings = [GCC<"constructor">];
    597   let Args = [DefaultIntArgument<"Priority", 65535>];
    598   let Subjects = SubjectList<[Function]>;
    599   let Documentation = [Undocumented];
    600 }
    601 
    602 def CUDAConstant : InheritableAttr {
    603   let Spellings = [GNU<"constant">];
    604   let Subjects = SubjectList<[Var]>;
    605   let LangOpts = [CUDA];
    606   let Documentation = [Undocumented];
    607 }
    608 
    609 def CUDACudartBuiltin : IgnoredAttr {
    610   let Spellings = [GNU<"cudart_builtin">];
    611   let LangOpts = [CUDA];
    612 }
    613 
    614 def CUDADevice : InheritableAttr {
    615   let Spellings = [GNU<"device">];
    616   let Subjects = SubjectList<[Function, Var]>;
    617   let LangOpts = [CUDA];
    618   let Documentation = [Undocumented];
    619 }
    620 
    621 def CUDADeviceBuiltin : IgnoredAttr {
    622   let Spellings = [GNU<"device_builtin">];
    623   let LangOpts = [CUDA];
    624 }
    625 
    626 def CUDADeviceBuiltinSurfaceType : IgnoredAttr {
    627   let Spellings = [GNU<"device_builtin_surface_type">];
    628   let LangOpts = [CUDA];
    629 }
    630 
    631 def CUDADeviceBuiltinTextureType : IgnoredAttr {
    632   let Spellings = [GNU<"device_builtin_texture_type">];
    633   let LangOpts = [CUDA];
    634 }
    635 
    636 def CUDAGlobal : InheritableAttr {
    637   let Spellings = [GNU<"global">];
    638   let Subjects = SubjectList<[Function]>;
    639   let LangOpts = [CUDA];
    640   let Documentation = [Undocumented];
    641 }
    642 
    643 def CUDAHost : InheritableAttr {
    644   let Spellings = [GNU<"host">];
    645   let Subjects = SubjectList<[Function]>;
    646   let LangOpts = [CUDA];
    647   let Documentation = [Undocumented];
    648 }
    649 
    650 def CUDAInvalidTarget : InheritableAttr {
    651   let Spellings = [];
    652   let Subjects = SubjectList<[Function]>;
    653   let LangOpts = [CUDA];
    654   let Documentation = [Undocumented];
    655 }
    656 
    657 def CUDALaunchBounds : InheritableAttr {
    658   let Spellings = [GNU<"launch_bounds">];
    659   let Args = [ExprArgument<"MaxThreads">, ExprArgument<"MinBlocks", 1>];
    660   let LangOpts = [CUDA];
    661   let Subjects = SubjectList<[ObjCMethod, FunctionLike], WarnDiag,
    662                              "ExpectedFunctionOrMethod">;
    663   // An AST node is created for this attribute, but is not used by other parts
    664   // of the compiler. However, this node needs to exist in the AST because
    665   // non-LLVM backends may be relying on the attribute's presence.
    666   let Documentation = [Undocumented];
    667 }
    668 
    669 def CUDAShared : InheritableAttr {
    670   let Spellings = [GNU<"shared">];
    671   let Subjects = SubjectList<[Var]>;
    672   let LangOpts = [CUDA];
    673   let Documentation = [Undocumented];
    674 }
    675 
    676 def C11NoReturn : InheritableAttr {
    677   let Spellings = [Keyword<"_Noreturn">];
    678   let Subjects = SubjectList<[Function], ErrorDiag>;
    679   let SemaHandler = 0;
    680   let Documentation = [C11NoReturnDocs];
    681 }
    682 
    683 def CXX11NoReturn : InheritableAttr {
    684   let Spellings = [CXX11<"","noreturn", 200809>];
    685   let Subjects = SubjectList<[Function], ErrorDiag>;
    686   let Documentation = [CXX11NoReturnDocs];
    687 }
    688 
    689 def OpenCLKernel : InheritableAttr {
    690   let Spellings = [Keyword<"__kernel">, Keyword<"kernel">];
    691   let Subjects = SubjectList<[Function], ErrorDiag>;
    692   let Documentation = [Undocumented];
    693 }
    694 
    695 def OpenCLUnrollHint : InheritableAttr {
    696   let Spellings = [GNU<"opencl_unroll_hint">];
    697   let Args = [UnsignedArgument<"UnrollHint">];
    698   let Documentation = [OpenCLUnrollHintDocs];
    699 }
    700 
    701 // This attribute is both a type attribute, and a declaration attribute (for
    702 // parameter variables).
    703 def OpenCLAccess : Attr {
    704   let Spellings = [Keyword<"__read_only">, Keyword<"read_only">,
    705                    Keyword<"__write_only">, Keyword<"write_only">,
    706                    Keyword<"__read_write">, Keyword<"read_write">];
    707   let Subjects = SubjectList<[ParmVar, TypedefName], ErrorDiag,
    708                              "ExpectedParameterOrTypedef">;
    709   let Accessors = [Accessor<"isReadOnly", [Keyword<"__read_only">,
    710                                            Keyword<"read_only">]>,
    711                    Accessor<"isReadWrite", [Keyword<"__read_write">,
    712                                             Keyword<"read_write">]>,
    713                    Accessor<"isWriteOnly", [Keyword<"__write_only">,
    714                                             Keyword<"write_only">]>];
    715   let Documentation = [OpenCLAccessDocs];
    716 }
    717 
    718 def OpenCLPrivateAddressSpace : TypeAttr {
    719   let Spellings = [Keyword<"__private">, Keyword<"private">];
    720   let Documentation = [OpenCLAddressSpacePrivateDocs];
    721 }
    722 
    723 def OpenCLGlobalAddressSpace : TypeAttr {
    724   let Spellings = [Keyword<"__global">, Keyword<"global">];
    725   let Documentation = [OpenCLAddressSpaceGlobalDocs];
    726 }
    727 
    728 def OpenCLLocalAddressSpace : TypeAttr {
    729   let Spellings = [Keyword<"__local">, Keyword<"local">];
    730   let Documentation = [OpenCLAddressSpaceLocalDocs];
    731 }
    732 
    733 def OpenCLConstantAddressSpace : TypeAttr {
    734   let Spellings = [Keyword<"__constant">, Keyword<"constant">];
    735   let Documentation = [OpenCLAddressSpaceConstantDocs];
    736 }
    737 
    738 def OpenCLGenericAddressSpace : TypeAttr {
    739   let Spellings = [Keyword<"__generic">, Keyword<"generic">];
    740   let Documentation = [OpenCLAddressSpaceGenericDocs];
    741 }
    742 
    743 def OpenCLNoSVM : Attr {
    744   let Spellings = [GNU<"nosvm">];
    745   let Subjects = SubjectList<[Var]>;
    746   let Documentation = [OpenCLNoSVMDocs];
    747   let LangOpts = [OpenCL];
    748   let ASTNode = 0;
    749 }
    750 
    751 def RenderScriptKernel : Attr {
    752   let Spellings = [GNU<"kernel">];
    753   let Subjects = SubjectList<[Function]>;
    754   let Documentation = [RenderScriptKernelAttributeDocs];
    755   let LangOpts = [RenderScript];
    756 }
    757 
    758 def Deprecated : InheritableAttr {
    759   let Spellings = [GCC<"deprecated">, Declspec<"deprecated">,
    760                    CXX11<"","deprecated", 201309>];
    761   let Args = [StringArgument<"Message", 1>,
    762               // An optional string argument that enables us to provide a
    763               // Fix-It.
    764               StringArgument<"Replacement", 1>];
    765   let Documentation = [DeprecatedDocs];
    766 }
    767 
    768 def Destructor : InheritableAttr {
    769   let Spellings = [GCC<"destructor">];
    770   let Args = [DefaultIntArgument<"Priority", 65535>];
    771   let Subjects = SubjectList<[Function]>;
    772   let Documentation = [Undocumented];
    773 }
    774 
    775 def EmptyBases : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
    776   let Spellings = [Declspec<"empty_bases">];
    777   let Subjects = SubjectList<[CXXRecord]>;
    778   let Documentation = [EmptyBasesDocs];
    779 }
    780 
    781 def EnableIf : InheritableAttr {
    782   let Spellings = [GNU<"enable_if">];
    783   let Subjects = SubjectList<[Function]>;
    784   let Args = [ExprArgument<"Cond">, StringArgument<"Message">];
    785   let TemplateDependent = 1;
    786   let Documentation = [EnableIfDocs];
    787 }
    788 
    789 def ExtVectorType : Attr {
    790   let Spellings = [GNU<"ext_vector_type">];
    791   let Subjects = SubjectList<[TypedefName], ErrorDiag>;
    792   let Args = [ExprArgument<"NumElements">];
    793   let ASTNode = 0;
    794   let Documentation = [Undocumented];
    795 }
    796 
    797 def FallThrough : StmtAttr {
    798   let Spellings = [CXX11<"", "fallthrough", 201603>,
    799                    CXX11<"clang", "fallthrough">];
    800 //  let Subjects = [NullStmt];
    801   let Documentation = [FallthroughDocs];
    802 }
    803 
    804 def FastCall : InheritableAttr {
    805   let Spellings = [GCC<"fastcall">, Keyword<"__fastcall">,
    806                    Keyword<"_fastcall">];
    807 //  let Subjects = [Function, ObjCMethod];
    808   let Documentation = [FastCallDocs];
    809 }
    810 
    811 def Final : InheritableAttr {
    812   let Spellings = [Keyword<"final">, Keyword<"sealed">];
    813   let Accessors = [Accessor<"isSpelledAsSealed", [Keyword<"sealed">]>];
    814   let SemaHandler = 0;
    815   let Documentation = [Undocumented];
    816 }
    817 
    818 def MinSize : InheritableAttr {
    819   let Spellings = [GNU<"minsize">];
    820   let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>;
    821   let Documentation = [Undocumented];
    822 }
    823 
    824 def FlagEnum : InheritableAttr {
    825   let Spellings = [GNU<"flag_enum">];
    826   let Subjects = SubjectList<[Enum]>;
    827   let Documentation = [FlagEnumDocs];
    828   let LangOpts = [COnly];
    829 }
    830 
    831 def Flatten : InheritableAttr {
    832   let Spellings = [GCC<"flatten">];
    833   let Subjects = SubjectList<[Function], ErrorDiag>;
    834   let Documentation = [FlattenDocs];
    835 }
    836 
    837 def Format : InheritableAttr {
    838   let Spellings = [GCC<"format">];
    839   let Args = [IdentifierArgument<"Type">, IntArgument<"FormatIdx">,
    840               IntArgument<"FirstArg">];
    841   let Subjects = SubjectList<[ObjCMethod, Block, HasFunctionProto], WarnDiag,
    842                              "ExpectedFunctionWithProtoType">;
    843   let Documentation = [FormatDocs];
    844 }
    845 
    846 def FormatArg : InheritableAttr {
    847   let Spellings = [GCC<"format_arg">];
    848   let Args = [IntArgument<"FormatIdx">];
    849   let Subjects = SubjectList<[ObjCMethod, HasFunctionProto], WarnDiag,
    850                              "ExpectedFunctionWithProtoType">;
    851   let Documentation = [Undocumented];
    852 }
    853 
    854 def GNUInline : InheritableAttr {
    855   let Spellings = [GCC<"gnu_inline">];
    856   let Subjects = SubjectList<[Function]>;
    857   let Documentation = [Undocumented];
    858 }
    859 
    860 def Hot : InheritableAttr {
    861   let Spellings = [GCC<"hot">];
    862   let Subjects = SubjectList<[Function]>;
    863   // An AST node is created for this attribute, but not actually used beyond
    864   // semantic checking for mutual exclusion with the Cold attribute.
    865   let Documentation = [Undocumented];
    866 }
    867 
    868 def IBAction : InheritableAttr {
    869   let Spellings = [GNU<"ibaction">];
    870   let Subjects = SubjectList<[ObjCInstanceMethod], WarnDiag,
    871                              "ExpectedObjCInstanceMethod">;
    872   // An AST node is created for this attribute, but is not used by other parts
    873   // of the compiler. However, this node needs to exist in the AST because
    874   // external tools rely on it.
    875   let Documentation = [Undocumented];
    876 }
    877 
    878 def IBOutlet : InheritableAttr {
    879   let Spellings = [GNU<"iboutlet">];
    880 //  let Subjects = [ObjCIvar, ObjCProperty];
    881   let Documentation = [Undocumented];
    882 }
    883 
    884 def IBOutletCollection : InheritableAttr {
    885   let Spellings = [GNU<"iboutletcollection">];
    886   let Args = [TypeArgument<"Interface", 1>];
    887 //  let Subjects = [ObjCIvar, ObjCProperty];
    888   let Documentation = [Undocumented];
    889 }
    890 
    891 def IFunc : Attr {
    892   let Spellings = [GCC<"ifunc">];
    893   let Args = [StringArgument<"Resolver">];
    894   let Subjects = SubjectList<[Function]>;
    895   let Documentation = [IFuncDocs];
    896 }
    897 
    898 def Restrict : InheritableAttr {
    899   let Spellings = [Declspec<"restrict">, GCC<"malloc">];
    900   let Subjects = SubjectList<[Function]>;
    901   let Documentation = [Undocumented];
    902 }
    903 
    904 def LayoutVersion : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
    905   let Spellings = [Declspec<"layout_version">];
    906   let Args = [UnsignedArgument<"Version">];
    907   let Subjects = SubjectList<[CXXRecord]>;
    908   let Documentation = [LayoutVersionDocs];
    909 }
    910 
    911 def MaxFieldAlignment : InheritableAttr {
    912   // This attribute has no spellings as it is only ever created implicitly.
    913   let Spellings = [];
    914   let Args = [UnsignedArgument<"Alignment">];
    915   let SemaHandler = 0;
    916   let Documentation = [Undocumented];
    917 }
    918 
    919 def MayAlias : InheritableAttr {
    920   // FIXME: this is a type attribute in GCC, but a declaration attribute here.
    921   let Spellings = [GCC<"may_alias">];
    922   let Documentation = [Undocumented];
    923 }
    924 
    925 def MSABI : InheritableAttr {
    926   let Spellings = [GCC<"ms_abi">];
    927 //  let Subjects = [Function, ObjCMethod];
    928   let Documentation = [MSABIDocs];
    929 }
    930 
    931 def MSP430Interrupt : InheritableAttr, TargetSpecificAttr<TargetMSP430> {
    932   // NOTE: If you add any additional spellings, ARMInterrupt's, MipsInterrupt's
    933   // and AnyX86Interrupt's spellings must match.
    934   let Spellings = [GNU<"interrupt">];
    935   let Args = [UnsignedArgument<"Number">];
    936   let ParseKind = "Interrupt";
    937   let HasCustomParsing = 1;
    938   let Documentation = [Undocumented];
    939 }
    940 
    941 def Mips16 : InheritableAttr, TargetSpecificAttr<TargetMips> {
    942   let Spellings = [GCC<"mips16">];
    943   let Subjects = SubjectList<[Function], ErrorDiag>;
    944   let Documentation = [Undocumented];
    945 }
    946 
    947 def MipsInterrupt : InheritableAttr, TargetSpecificAttr<TargetMips> {
    948   // NOTE: If you add any additional spellings, ARMInterrupt's,
    949   // MSP430Interrupt's and AnyX86Interrupt's spellings must match.
    950   let Spellings = [GNU<"interrupt">];
    951   let Subjects = SubjectList<[Function]>;
    952   let Args = [EnumArgument<"Interrupt", "InterruptType",
    953                            ["vector=sw0", "vector=sw1", "vector=hw0",
    954                             "vector=hw1", "vector=hw2", "vector=hw3",
    955                             "vector=hw4", "vector=hw5", "eic", ""],
    956                            ["sw0", "sw1", "hw0", "hw1", "hw2", "hw3",
    957                             "hw4", "hw5", "eic", "eic"]
    958                            >];
    959   let ParseKind = "Interrupt";
    960   let Documentation = [MipsInterruptDocs];
    961 }
    962 
    963 def Mode : Attr {
    964   let Spellings = [GCC<"mode">];
    965   let Subjects = SubjectList<[Var, Enum, TypedefName, Field], ErrorDiag,
    966                              "ExpectedVariableEnumFieldOrTypedef">;
    967   let Args = [IdentifierArgument<"Mode">];
    968   let Documentation = [Undocumented];
    969 }
    970 
    971 def Naked : InheritableAttr {
    972   let Spellings = [GCC<"naked">, Declspec<"naked">];
    973   let Subjects = SubjectList<[Function]>;
    974   let Documentation = [Undocumented];
    975 }
    976 
    977 def NeonPolyVectorType : TypeAttr {
    978   let Spellings = [GNU<"neon_polyvector_type">];
    979   let Args = [IntArgument<"NumElements">];
    980   let Documentation = [Undocumented];
    981 }
    982 
    983 def NeonVectorType : TypeAttr {
    984   let Spellings = [GNU<"neon_vector_type">];
    985   let Args = [IntArgument<"NumElements">];
    986   let Documentation = [Undocumented];
    987 }
    988 
    989 def ReturnsTwice : InheritableAttr {
    990   let Spellings = [GCC<"returns_twice">];
    991   let Subjects = SubjectList<[Function]>;
    992   let Documentation = [Undocumented];
    993 }
    994 
    995 def DisableTailCalls : InheritableAttr {
    996   let Spellings = [GNU<"disable_tail_calls">,
    997                    CXX11<"clang", "disable_tail_calls">];
    998   let Subjects = SubjectList<[Function, ObjCMethod]>;
    999   let Documentation = [DisableTailCallsDocs];
   1000 }
   1001 
   1002 def NoAlias : InheritableAttr {
   1003   let Spellings = [Declspec<"noalias">];
   1004   let Subjects = SubjectList<[Function]>;
   1005   let Documentation = [NoAliasDocs];
   1006 }
   1007 
   1008 def NoCommon : InheritableAttr {
   1009   let Spellings = [GCC<"nocommon">];
   1010   let Subjects = SubjectList<[Var]>;
   1011   let Documentation = [Undocumented];
   1012 }
   1013 
   1014 def NoDebug : InheritableAttr {
   1015   let Spellings = [GCC<"nodebug">];
   1016   let Subjects = SubjectList<[FunctionLike, ObjCMethod, NonParmVar], WarnDiag,
   1017                               "ExpectedVariableOrFunction">;
   1018   let Documentation = [NoDebugDocs];
   1019 }
   1020 
   1021 def NoDuplicate : InheritableAttr {
   1022   let Spellings = [GNU<"noduplicate">, CXX11<"clang", "noduplicate">];
   1023   let Subjects = SubjectList<[Function]>;
   1024   let Documentation = [NoDuplicateDocs];
   1025 }
   1026 
   1027 def NoInline : InheritableAttr {
   1028   let Spellings = [GCC<"noinline">, Declspec<"noinline">];
   1029   let Subjects = SubjectList<[Function]>;
   1030   let Documentation = [Undocumented];
   1031 }
   1032 
   1033 def NoMips16 : InheritableAttr, TargetSpecificAttr<TargetMips> {
   1034   let Spellings = [GCC<"nomips16">];
   1035   let Subjects = SubjectList<[Function], ErrorDiag>;
   1036   let Documentation = [Undocumented];
   1037 }
   1038 
   1039 // This is not a TargetSpecificAttr so that is silently accepted and
   1040 // ignored on other targets as encouraged by the OpenCL spec.
   1041 //
   1042 // See OpenCL 1.2 6.11.5: "It is our intention that a particular
   1043 // implementation of OpenCL be free to ignore all attributes and the
   1044 // resulting executable binary will produce the same result."
   1045 //
   1046 // However, only AMD GPU targets will emit the corresponding IR
   1047 // attribute.
   1048 //
   1049 // FIXME: This provides a sub-optimal error message if you attempt to
   1050 // use this in CUDA, since CUDA does not use the same terminology.
   1051 def AMDGPUNumVGPR : InheritableAttr {
   1052   let Spellings = [GNU<"amdgpu_num_vgpr">];
   1053   let Args = [UnsignedArgument<"NumVGPR">];
   1054   let Documentation = [AMDGPUNumVGPRDocs];
   1055 
   1056 // FIXME: This should be for OpenCLKernelFunction, but is not to
   1057 // workaround needing to see kernel attribute before others to know if
   1058 // this should be rejected on non-kernels.
   1059   let Subjects = SubjectList<[Function], ErrorDiag,
   1060                              "ExpectedKernelFunction">;
   1061 }
   1062 
   1063 def AMDGPUNumSGPR : InheritableAttr {
   1064   let Spellings = [GNU<"amdgpu_num_sgpr">];
   1065   let Args = [UnsignedArgument<"NumSGPR">];
   1066   let Documentation = [AMDGPUNumSGPRDocs];
   1067   let Subjects = SubjectList<[Function], ErrorDiag,
   1068                               "ExpectedKernelFunction">;
   1069 }
   1070 
   1071 def NoSplitStack : InheritableAttr {
   1072   let Spellings = [GCC<"no_split_stack">];
   1073   let Subjects = SubjectList<[Function], ErrorDiag>;
   1074   let Documentation = [NoSplitStackDocs];
   1075 }
   1076 
   1077 def NonNull : InheritableAttr {
   1078   let Spellings = [GCC<"nonnull">];
   1079   let Subjects = SubjectList<[ObjCMethod, HasFunctionProto, ParmVar], WarnDiag,
   1080                              "ExpectedFunctionMethodOrParameter">;
   1081   let Args = [VariadicUnsignedArgument<"Args">];
   1082   let AdditionalMembers =
   1083 [{bool isNonNull(unsigned idx) const {
   1084     if (!args_size())
   1085       return true;
   1086     for (const auto &V : args())
   1087       if (V == idx)
   1088         return true;
   1089     return false;
   1090   } }];
   1091   // FIXME: We should merge duplicates into a single nonnull attribute.
   1092   let DuplicatesAllowedWhileMerging = 1;
   1093   let Documentation = [NonNullDocs];
   1094 }
   1095 
   1096 def ReturnsNonNull : InheritableAttr {
   1097   let Spellings = [GCC<"returns_nonnull">];
   1098   let Subjects = SubjectList<[ObjCMethod, Function], WarnDiag,
   1099                              "ExpectedFunctionOrMethod">;
   1100   let Documentation = [ReturnsNonNullDocs];
   1101 }
   1102 
   1103 // pass_object_size(N) indicates that the parameter should have
   1104 // __builtin_object_size with Type=N evaluated on the parameter at the callsite.
   1105 def PassObjectSize : InheritableParamAttr {
   1106   let Spellings = [GNU<"pass_object_size">];
   1107   let Args = [IntArgument<"Type">];
   1108   let Subjects = SubjectList<[ParmVar]>;
   1109   let Documentation = [PassObjectSizeDocs];
   1110 }
   1111 
   1112 // Nullability type attributes.
   1113 def TypeNonNull : TypeAttr {
   1114   let Spellings = [Keyword<"_Nonnull">];
   1115   let Documentation = [TypeNonNullDocs];
   1116 }
   1117 
   1118 def TypeNullable : TypeAttr {
   1119   let Spellings = [Keyword<"_Nullable">];
   1120   let Documentation = [TypeNullableDocs];
   1121 }
   1122 
   1123 def TypeNullUnspecified : TypeAttr {
   1124   let Spellings = [Keyword<"_Null_unspecified">];
   1125   let Documentation = [TypeNullUnspecifiedDocs];
   1126 }
   1127 
   1128 def ObjCKindOf : TypeAttr {
   1129   let Spellings = [Keyword<"__kindof">];
   1130   let Documentation = [Undocumented];
   1131 }
   1132 
   1133 def AssumeAligned : InheritableAttr {
   1134   let Spellings = [GCC<"assume_aligned">];
   1135   let Subjects = SubjectList<[ObjCMethod, Function]>;
   1136   let Args = [ExprArgument<"Alignment">, ExprArgument<"Offset", 1>];
   1137   let Documentation = [AssumeAlignedDocs];
   1138 }
   1139 
   1140 def NoReturn : InheritableAttr {
   1141   let Spellings = [GCC<"noreturn">, Declspec<"noreturn">];
   1142   // FIXME: Does GCC allow this on the function instead?
   1143   let Documentation = [Undocumented];
   1144 }
   1145 
   1146 def NoInstrumentFunction : InheritableAttr {
   1147   let Spellings = [GCC<"no_instrument_function">];
   1148   let Subjects = SubjectList<[Function]>;
   1149   let Documentation = [Undocumented];
   1150 }
   1151 
   1152 def NotTailCalled : InheritableAttr {
   1153   let Spellings = [GNU<"not_tail_called">, CXX11<"clang", "not_tail_called">];
   1154   let Subjects = SubjectList<[Function]>;
   1155   let Documentation = [NotTailCalledDocs];
   1156 }
   1157 
   1158 def NoThrow : InheritableAttr {
   1159   let Spellings = [GCC<"nothrow">, Declspec<"nothrow">];
   1160   let Documentation = [Undocumented];
   1161 }
   1162 
   1163 def NvWeak : IgnoredAttr {
   1164   let Spellings = [GNU<"nv_weak">];
   1165   let LangOpts = [CUDA];
   1166 }
   1167 
   1168 def ObjCBridge : InheritableAttr {
   1169   let Spellings = [GNU<"objc_bridge">];
   1170   let Subjects = SubjectList<[Record, TypedefName], ErrorDiag,
   1171                              "ExpectedStructOrUnionOrTypedef">;
   1172   let Args = [IdentifierArgument<"BridgedType">];
   1173   let Documentation = [Undocumented];
   1174 }
   1175 
   1176 def ObjCBridgeMutable : InheritableAttr {
   1177   let Spellings = [GNU<"objc_bridge_mutable">];
   1178   let Subjects = SubjectList<[Record], ErrorDiag>;
   1179   let Args = [IdentifierArgument<"BridgedType">];
   1180   let Documentation = [Undocumented];
   1181 }
   1182 
   1183 def ObjCBridgeRelated : InheritableAttr {
   1184   let Spellings = [GNU<"objc_bridge_related">];
   1185   let Subjects = SubjectList<[Record], ErrorDiag>;
   1186   let Args = [IdentifierArgument<"RelatedClass">,
   1187           IdentifierArgument<"ClassMethod", 1>,
   1188           IdentifierArgument<"InstanceMethod", 1>];
   1189   let HasCustomParsing = 1;
   1190   let Documentation = [Undocumented];
   1191 }
   1192 
   1193 def NSReturnsRetained : InheritableAttr {
   1194   let Spellings = [GNU<"ns_returns_retained">];
   1195 //  let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
   1196   let Documentation = [Undocumented];
   1197 }
   1198 
   1199 def NSReturnsNotRetained : InheritableAttr {
   1200   let Spellings = [GNU<"ns_returns_not_retained">];
   1201 //  let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
   1202   let Documentation = [Undocumented];
   1203 }
   1204 
   1205 def NSReturnsAutoreleased : InheritableAttr {
   1206   let Spellings = [GNU<"ns_returns_autoreleased">];
   1207 //  let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
   1208   let Documentation = [Undocumented];
   1209 }
   1210 
   1211 def NSConsumesSelf : InheritableAttr {
   1212   let Spellings = [GNU<"ns_consumes_self">];
   1213   let Subjects = SubjectList<[ObjCMethod]>;
   1214   let Documentation = [Undocumented];
   1215 }
   1216 
   1217 def NSConsumed : InheritableParamAttr {
   1218   let Spellings = [GNU<"ns_consumed">];
   1219   let Subjects = SubjectList<[ParmVar]>;
   1220   let Documentation = [Undocumented];
   1221 }
   1222 
   1223 def ObjCException : InheritableAttr {
   1224   let Spellings = [GNU<"objc_exception">];
   1225   let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
   1226   let Documentation = [Undocumented];
   1227 }
   1228 
   1229 def ObjCMethodFamily : InheritableAttr {
   1230   let Spellings = [GNU<"objc_method_family">];
   1231   let Subjects = SubjectList<[ObjCMethod], ErrorDiag>;
   1232   let Args = [EnumArgument<"Family", "FamilyKind",
   1233                ["none", "alloc", "copy", "init", "mutableCopy", "new"],
   1234                ["OMF_None", "OMF_alloc", "OMF_copy", "OMF_init",
   1235                 "OMF_mutableCopy", "OMF_new"]>];
   1236   let Documentation = [ObjCMethodFamilyDocs];
   1237 }
   1238 
   1239 def ObjCNSObject : InheritableAttr {
   1240   let Spellings = [GNU<"NSObject">];
   1241   let Documentation = [Undocumented];
   1242 }
   1243 
   1244 def ObjCIndependentClass : InheritableAttr {
   1245   let Spellings = [GNU<"objc_independent_class">];
   1246   let Documentation = [Undocumented];
   1247 }
   1248 
   1249 def ObjCPreciseLifetime : InheritableAttr {
   1250   let Spellings = [GNU<"objc_precise_lifetime">];
   1251   let Subjects = SubjectList<[Var], ErrorDiag>;
   1252   let Documentation = [Undocumented];
   1253 }
   1254 
   1255 def ObjCReturnsInnerPointer : InheritableAttr {
   1256   let Spellings = [GNU<"objc_returns_inner_pointer">];
   1257   let Subjects = SubjectList<[ObjCMethod, ObjCProperty], ErrorDiag>;
   1258   let Documentation = [Undocumented];
   1259 }
   1260 
   1261 def ObjCRequiresSuper : InheritableAttr {
   1262   let Spellings = [GNU<"objc_requires_super">];
   1263   let Subjects = SubjectList<[ObjCMethod], ErrorDiag>;
   1264   let Documentation = [ObjCRequiresSuperDocs];
   1265 }
   1266 
   1267 def ObjCRootClass : InheritableAttr {
   1268   let Spellings = [GNU<"objc_root_class">];
   1269   let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
   1270   let Documentation = [Undocumented];
   1271 }
   1272 
   1273 def ObjCExplicitProtocolImpl : InheritableAttr {
   1274   let Spellings = [GNU<"objc_protocol_requires_explicit_implementation">];
   1275   let Subjects = SubjectList<[ObjCProtocol], ErrorDiag>;
   1276   let Documentation = [Undocumented];
   1277 }
   1278 
   1279 def ObjCDesignatedInitializer : Attr {
   1280   let Spellings = [GNU<"objc_designated_initializer">];
   1281   let Subjects = SubjectList<[ObjCInterfaceDeclInitMethod], ErrorDiag,
   1282                              "ExpectedObjCInterfaceDeclInitMethod">;
   1283   let Documentation = [Undocumented];
   1284 }
   1285 
   1286 def ObjCRuntimeName : Attr {
   1287   let Spellings = [GNU<"objc_runtime_name">];
   1288   let Subjects = SubjectList<[ObjCInterface, ObjCProtocol], ErrorDiag>;
   1289   let Args = [StringArgument<"MetadataName">];
   1290   let Documentation = [ObjCRuntimeNameDocs];
   1291 }
   1292 
   1293 def ObjCRuntimeVisible : Attr {
   1294   let Spellings = [GNU<"objc_runtime_visible">];
   1295   let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
   1296   let Documentation = [ObjCRuntimeVisibleDocs];
   1297 }
   1298 
   1299 def ObjCBoxable : Attr {
   1300   let Spellings = [GNU<"objc_boxable">];
   1301   let Subjects = SubjectList<[Record], ErrorDiag, "ExpectedStructOrUnion">;
   1302   let Documentation = [ObjCBoxableDocs];
   1303 }
   1304 
   1305 def OptimizeNone : InheritableAttr {
   1306   let Spellings = [GNU<"optnone">, CXX11<"clang", "optnone">];
   1307   let Subjects = SubjectList<[Function, ObjCMethod]>;
   1308   let Documentation = [OptnoneDocs];
   1309 }
   1310 
   1311 def Overloadable : Attr {
   1312   let Spellings = [GNU<"overloadable">];
   1313   let Subjects = SubjectList<[Function], ErrorDiag>;
   1314   let Documentation = [OverloadableDocs];
   1315 }
   1316 
   1317 def Override : InheritableAttr { 
   1318   let Spellings = [Keyword<"override">];
   1319   let SemaHandler = 0;
   1320   let Documentation = [Undocumented];
   1321 }
   1322 
   1323 def Ownership : InheritableAttr {
   1324   let Spellings = [GNU<"ownership_holds">, GNU<"ownership_returns">,
   1325                    GNU<"ownership_takes">];
   1326   let Accessors = [Accessor<"isHolds", [GNU<"ownership_holds">]>,
   1327                    Accessor<"isReturns", [GNU<"ownership_returns">]>,
   1328                    Accessor<"isTakes", [GNU<"ownership_takes">]>];
   1329   let AdditionalMembers = [{
   1330     enum OwnershipKind { Holds, Returns, Takes };
   1331     OwnershipKind getOwnKind() const {
   1332       return isHolds() ? Holds :
   1333              isTakes() ? Takes :
   1334              Returns;
   1335     }
   1336   }];
   1337   let Args = [IdentifierArgument<"Module">, VariadicUnsignedArgument<"Args">];
   1338   let Subjects = SubjectList<[HasFunctionProto], WarnDiag,
   1339                              "ExpectedFunctionWithProtoType">;
   1340   let Documentation = [Undocumented];
   1341 }
   1342 
   1343 def Packed : InheritableAttr {
   1344   let Spellings = [GCC<"packed">];
   1345 //  let Subjects = [Tag, Field];
   1346   let Documentation = [Undocumented];
   1347 }
   1348 
   1349 def IntelOclBicc : InheritableAttr {
   1350   let Spellings = [GNU<"intel_ocl_bicc">];
   1351 //  let Subjects = [Function, ObjCMethod];
   1352   let Documentation = [Undocumented];
   1353 }
   1354 
   1355 def Pcs : InheritableAttr {
   1356   let Spellings = [GCC<"pcs">];
   1357   let Args = [EnumArgument<"PCS", "PCSType",
   1358                            ["aapcs", "aapcs-vfp"],
   1359                            ["AAPCS", "AAPCS_VFP"]>];
   1360 //  let Subjects = [Function, ObjCMethod];
   1361   let Documentation = [PcsDocs];
   1362 }
   1363 
   1364 def Pure : InheritableAttr {
   1365   let Spellings = [GCC<"pure">];
   1366   let Documentation = [Undocumented];
   1367 }
   1368 
   1369 def Regparm : TypeAttr {
   1370   let Spellings = [GCC<"regparm">];
   1371   let Args = [UnsignedArgument<"NumParams">];
   1372   let Documentation = [RegparmDocs];
   1373 }
   1374 
   1375 def ReqdWorkGroupSize : InheritableAttr {
   1376   let Spellings = [GNU<"reqd_work_group_size">];
   1377   let Args = [UnsignedArgument<"XDim">, UnsignedArgument<"YDim">,
   1378               UnsignedArgument<"ZDim">];
   1379   let Subjects = SubjectList<[Function], ErrorDiag>;
   1380   let Documentation = [Undocumented];
   1381 }
   1382 
   1383 def WorkGroupSizeHint :  InheritableAttr {
   1384   let Spellings = [GNU<"work_group_size_hint">];
   1385   let Args = [UnsignedArgument<"XDim">, 
   1386               UnsignedArgument<"YDim">,
   1387               UnsignedArgument<"ZDim">];
   1388   let Subjects = SubjectList<[Function], ErrorDiag>;
   1389   let Documentation = [Undocumented];
   1390 }
   1391 
   1392 def InitPriority : InheritableAttr {
   1393   let Spellings = [GNU<"init_priority">];
   1394   let Args = [UnsignedArgument<"Priority">];
   1395   let Subjects = SubjectList<[Var], ErrorDiag>;
   1396   let Documentation = [Undocumented];
   1397 }
   1398 
   1399 def Section : InheritableAttr {
   1400   let Spellings = [GCC<"section">, Declspec<"allocate">];
   1401   let Args = [StringArgument<"Name">];
   1402   let Subjects = SubjectList<[Function, GlobalVar,
   1403                               ObjCMethod, ObjCProperty], ErrorDiag,
   1404                              "ExpectedFunctionGlobalVarMethodOrProperty">;
   1405   let Documentation = [SectionDocs];
   1406 }
   1407 
   1408 def Sentinel : InheritableAttr {
   1409   let Spellings = [GCC<"sentinel">];
   1410   let Args = [DefaultIntArgument<"Sentinel", 0>,
   1411               DefaultIntArgument<"NullPos", 0>];
   1412 //  let Subjects = SubjectList<[Function, ObjCMethod, Block, Var]>;
   1413   let Documentation = [Undocumented];
   1414 }
   1415 
   1416 def StdCall : InheritableAttr {
   1417   let Spellings = [GCC<"stdcall">, Keyword<"__stdcall">, Keyword<"_stdcall">];
   1418 //  let Subjects = [Function, ObjCMethod];
   1419   let Documentation = [StdCallDocs];
   1420 }
   1421 
   1422 def SwiftCall : InheritableAttr {
   1423   let Spellings = [GCC<"swiftcall">];
   1424 //  let Subjects = SubjectList<[Function]>;
   1425   let Documentation = [SwiftCallDocs];
   1426 }
   1427 
   1428 def SwiftContext : ParameterABIAttr {
   1429   let Spellings = [GCC<"swift_context">];
   1430   let Documentation = [SwiftContextDocs];
   1431 }
   1432 
   1433 def SwiftErrorResult : ParameterABIAttr {
   1434   let Spellings = [GCC<"swift_error_result">];
   1435   let Documentation = [SwiftErrorResultDocs];
   1436 }
   1437 
   1438 def SwiftIndirectResult : ParameterABIAttr {
   1439   let Spellings = [GCC<"swift_indirect_result">];
   1440   let Documentation = [SwiftIndirectResultDocs];
   1441 }
   1442 
   1443 def SysVABI : InheritableAttr {
   1444   let Spellings = [GCC<"sysv_abi">];
   1445 //  let Subjects = [Function, ObjCMethod];
   1446   let Documentation = [Undocumented];
   1447 }
   1448 
   1449 def ThisCall : InheritableAttr {
   1450   let Spellings = [GCC<"thiscall">, Keyword<"__thiscall">,
   1451                    Keyword<"_thiscall">];
   1452 //  let Subjects = [Function, ObjCMethod];
   1453   let Documentation = [ThisCallDocs];
   1454 }
   1455 
   1456 def VectorCall : InheritableAttr {
   1457   let Spellings = [GNU<"vectorcall">, Keyword<"__vectorcall">,
   1458                    Keyword<"_vectorcall">];
   1459 //  let Subjects = [Function, ObjCMethod];
   1460   let Documentation = [VectorCallDocs];
   1461 }
   1462 
   1463 def Pascal : InheritableAttr {
   1464   let Spellings = [GNU<"pascal">, Keyword<"__pascal">, Keyword<"_pascal">];
   1465 //  let Subjects = [Function, ObjCMethod];
   1466   let Documentation = [Undocumented];
   1467 }
   1468 
   1469 def PreserveMost : InheritableAttr {
   1470   let Spellings = [GNU<"preserve_most">];
   1471   let Documentation = [PreserveMostDocs];
   1472 }
   1473 
   1474 def PreserveAll : InheritableAttr {
   1475   let Spellings = [GNU<"preserve_all">];
   1476   let Documentation = [PreserveAllDocs];
   1477 }
   1478 
   1479 def Target : InheritableAttr {
   1480   let Spellings = [GCC<"target">];
   1481   let Args = [StringArgument<"featuresStr">];
   1482   let Subjects = SubjectList<[Function], ErrorDiag>;
   1483   let Documentation = [TargetDocs];
   1484   let AdditionalMembers = [{
   1485     typedef std::pair<std::vector<std::string>, StringRef> ParsedTargetAttr;
   1486     ParsedTargetAttr parse() const {
   1487       ParsedTargetAttr Ret;
   1488       SmallVector<StringRef, 1> AttrFeatures;
   1489       getFeaturesStr().split(AttrFeatures, ",");
   1490 
   1491       // Grab the various features and prepend a "+" to turn on the feature to
   1492       // the backend and add them to our existing set of features.
   1493       for (auto &Feature : AttrFeatures) {
   1494         // Go ahead and trim whitespace rather than either erroring or
   1495         // accepting it weirdly.
   1496         Feature = Feature.trim();
   1497 
   1498         // We don't support cpu tuning this way currently.
   1499         // TODO: Support the fpmath option. It will require checking
   1500         // overall feature validity for the function with the rest of the
   1501         // attributes on the function.
   1502         if (Feature.startswith("fpmath=") || Feature.startswith("tune="))
   1503 	  continue;
   1504 
   1505         // While we're here iterating check for a different target cpu.
   1506         if (Feature.startswith("arch="))
   1507           Ret.second = Feature.split("=").second.trim();
   1508         else if (Feature.startswith("no-"))
   1509           Ret.first.push_back("-" + Feature.split("-").second.str());
   1510         else
   1511           Ret.first.push_back("+" + Feature.str());
   1512       }
   1513       return Ret;
   1514     }
   1515   }];
   1516 }
   1517 
   1518 def TransparentUnion : InheritableAttr {
   1519   let Spellings = [GCC<"transparent_union">];
   1520 //  let Subjects = SubjectList<[Record, TypedefName]>;
   1521   let Documentation = [Undocumented];
   1522 }
   1523 
   1524 def Unavailable : InheritableAttr {
   1525   let Spellings = [GNU<"unavailable">];
   1526   let Args = [StringArgument<"Message", 1>,
   1527               EnumArgument<"ImplicitReason", "ImplicitReason",
   1528                 ["", "", "", ""],
   1529                 ["IR_None",
   1530                  "IR_ARCForbiddenType",
   1531                  "IR_ForbiddenWeak",
   1532                  "IR_ARCForbiddenConversion",
   1533                  "IR_ARCInitReturnsUnrelated",
   1534                  "IR_ARCFieldWithOwnership"], 1, /*fake*/ 1>];
   1535   let Documentation = [Undocumented];
   1536 }
   1537 
   1538 def ArcWeakrefUnavailable : InheritableAttr {
   1539   let Spellings = [GNU<"objc_arc_weak_reference_unavailable">];
   1540   let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
   1541   let Documentation = [Undocumented];
   1542 }
   1543 
   1544 def ObjCGC : TypeAttr {
   1545   let Spellings = [GNU<"objc_gc">];
   1546   let Args = [IdentifierArgument<"Kind">];
   1547   let Documentation = [Undocumented];
   1548 }
   1549 
   1550 def ObjCOwnership : InheritableAttr {
   1551   let Spellings = [GNU<"objc_ownership">];
   1552   let Args = [IdentifierArgument<"Kind">];
   1553   let ASTNode = 0;
   1554   let Documentation = [Undocumented];
   1555 }
   1556 
   1557 def ObjCRequiresPropertyDefs : InheritableAttr {
   1558   let Spellings = [GNU<"objc_requires_property_definitions">];
   1559   let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
   1560   let Documentation = [Undocumented];
   1561 }
   1562 
   1563 def Unused : InheritableAttr {
   1564   let Spellings = [CXX11<"", "maybe_unused", 201603>, GCC<"unused">];
   1565   let Subjects = SubjectList<[Var, ObjCIvar, Type, Enum, EnumConstant, Label,
   1566                               Field, ObjCMethod, FunctionLike], WarnDiag,
   1567                              "ExpectedForMaybeUnused">;
   1568   let Documentation = [WarnMaybeUnusedDocs];
   1569 }
   1570 
   1571 def Used : InheritableAttr {
   1572   let Spellings = [GCC<"used">];
   1573   let Documentation = [Undocumented];
   1574 }
   1575 
   1576 def Uuid : InheritableAttr {
   1577   let Spellings = [Declspec<"uuid">];
   1578   let Args = [StringArgument<"Guid">];
   1579 //  let Subjects = SubjectList<[CXXRecord]>;
   1580   let LangOpts = [MicrosoftExt, Borland];
   1581   let Documentation = [Undocumented];
   1582 }
   1583 
   1584 def VectorSize : TypeAttr {
   1585   let Spellings = [GCC<"vector_size">];
   1586   let Args = [ExprArgument<"NumBytes">];
   1587   let Documentation = [Undocumented];
   1588 }
   1589 
   1590 def VecTypeHint : InheritableAttr {
   1591   let Spellings = [GNU<"vec_type_hint">];
   1592   let Args = [TypeArgument<"TypeHint">];
   1593   let Subjects = SubjectList<[Function], ErrorDiag>;
   1594   let Documentation = [Undocumented];
   1595 }
   1596 
   1597 def Visibility : InheritableAttr {
   1598   let Clone = 0;
   1599   let Spellings = [GCC<"visibility">];
   1600   let Args = [EnumArgument<"Visibility", "VisibilityType",
   1601                            ["default", "hidden", "internal", "protected"],
   1602                            ["Default", "Hidden", "Hidden", "Protected"]>];
   1603   let Documentation = [Undocumented];
   1604 }
   1605 
   1606 def TypeVisibility : InheritableAttr {
   1607   let Clone = 0;
   1608   let Spellings = [GNU<"type_visibility">, CXX11<"clang", "type_visibility">];
   1609   let Args = [EnumArgument<"Visibility", "VisibilityType",
   1610                            ["default", "hidden", "internal", "protected"],
   1611                            ["Default", "Hidden", "Hidden", "Protected"]>];
   1612 //  let Subjects = [Tag, ObjCInterface, Namespace];
   1613   let Documentation = [Undocumented];
   1614 }
   1615 
   1616 def VecReturn : InheritableAttr {
   1617   let Spellings = [GNU<"vecreturn">];
   1618   let Subjects = SubjectList<[CXXRecord], ErrorDiag>;
   1619   let Documentation = [Undocumented];
   1620 }
   1621 
   1622 def WarnUnused : InheritableAttr {
   1623   let Spellings = [GNU<"warn_unused">];
   1624   let Subjects = SubjectList<[Record]>;
   1625   let Documentation = [Undocumented];
   1626 }
   1627 
   1628 def WarnUnusedResult : InheritableAttr {
   1629   let Spellings = [CXX11<"", "nodiscard", 201603>,
   1630                    CXX11<"clang", "warn_unused_result">,
   1631                    GCC<"warn_unused_result">];
   1632   let Subjects = SubjectList<[ObjCMethod, Enum, CXXRecord, FunctionLike],
   1633                              WarnDiag, "ExpectedFunctionMethodEnumOrClass">;
   1634   let Documentation = [WarnUnusedResultsDocs];
   1635 }
   1636 
   1637 def Weak : InheritableAttr {
   1638   let Spellings = [GCC<"weak">];
   1639   let Subjects = SubjectList<[Var, Function, CXXRecord]>;
   1640   let Documentation = [Undocumented];
   1641 }
   1642 
   1643 def WeakImport : InheritableAttr {
   1644   let Spellings = [GNU<"weak_import">];
   1645   let Documentation = [Undocumented];
   1646 }
   1647 
   1648 def WeakRef : InheritableAttr {
   1649   let Spellings = [GCC<"weakref">];
   1650   // A WeakRef that has an argument is treated as being an AliasAttr
   1651   let Args = [StringArgument<"Aliasee", 1>];
   1652   let Subjects = SubjectList<[Var, Function], ErrorDiag>;
   1653   let Documentation = [Undocumented];
   1654 }
   1655 
   1656 def LTOVisibilityPublic : InheritableAttr {
   1657   let Spellings = [CXX11<"clang", "lto_visibility_public">];
   1658   let Subjects = SubjectList<[Record]>;
   1659   let Documentation = [LTOVisibilityDocs];
   1660 }
   1661 
   1662 def AnyX86Interrupt : InheritableAttr, TargetSpecificAttr<TargetAnyX86> {
   1663   // NOTE: If you add any additional spellings, ARMInterrupt's,
   1664   // MSP430Interrupt's and MipsInterrupt's spellings must match.
   1665   let Spellings = [GNU<"interrupt">];
   1666   let Subjects = SubjectList<[HasFunctionProto]>;
   1667   let ParseKind = "Interrupt";
   1668   let HasCustomParsing = 1;
   1669   let Documentation = [AnyX86InterruptDocs];
   1670 }
   1671 
   1672 def X86ForceAlignArgPointer : InheritableAttr, TargetSpecificAttr<TargetX86> {
   1673   let Spellings = [GNU<"force_align_arg_pointer">];
   1674   // Technically, this appertains to a FunctionDecl, but the target-specific
   1675   // code silently allows anything function-like (such as typedefs or function
   1676   // pointers), but does not apply the attribute to them.
   1677   let Documentation = [Undocumented];
   1678 }
   1679 
   1680 def NoSanitize : InheritableAttr {
   1681   let Spellings = [GNU<"no_sanitize">, CXX11<"clang", "no_sanitize">];
   1682   let Args = [VariadicStringArgument<"Sanitizers">];
   1683   let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>;
   1684   let Documentation = [NoSanitizeDocs];
   1685   let AdditionalMembers = [{
   1686     SanitizerMask getMask() const {
   1687       SanitizerMask Mask = 0;
   1688       for (auto SanitizerName : sanitizers()) {
   1689         SanitizerMask ParsedMask =
   1690             parseSanitizerValue(SanitizerName, /*AllowGroups=*/true);
   1691         Mask |= expandSanitizerGroups(ParsedMask);
   1692       }
   1693       return Mask;
   1694     }
   1695   }];
   1696 }
   1697 
   1698 // Attributes to disable a specific sanitizer. No new sanitizers should be added
   1699 // to this list; the no_sanitize attribute should be extended instead.
   1700 def NoSanitizeSpecific : InheritableAttr {
   1701   let Spellings = [GCC<"no_address_safety_analysis">,
   1702                    GCC<"no_sanitize_address">,
   1703                    GCC<"no_sanitize_thread">,
   1704                    GNU<"no_sanitize_memory">];
   1705   let Subjects = SubjectList<[Function], ErrorDiag>;
   1706   let Documentation = [NoSanitizeAddressDocs, NoSanitizeThreadDocs,
   1707                        NoSanitizeMemoryDocs];
   1708   let ASTNode = 0;
   1709 }
   1710 
   1711 // C/C++ Thread safety attributes (e.g. for deadlock, data race checking)
   1712 
   1713 def GuardedVar : InheritableAttr {
   1714   let Spellings = [GNU<"guarded_var">];
   1715   let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
   1716                              "ExpectedFieldOrGlobalVar">;
   1717   let Documentation = [Undocumented];
   1718 }
   1719 
   1720 def PtGuardedVar : InheritableAttr {
   1721   let Spellings = [GNU<"pt_guarded_var">];
   1722   let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
   1723                              "ExpectedFieldOrGlobalVar">;
   1724   let Documentation = [Undocumented];
   1725 }
   1726 
   1727 def Lockable : InheritableAttr {
   1728   let Spellings = [GNU<"lockable">];
   1729   let Subjects = SubjectList<[Record]>;
   1730   let Documentation = [Undocumented];
   1731   let ASTNode = 0;  // Replaced by Capability
   1732 }
   1733 
   1734 def ScopedLockable : InheritableAttr {
   1735   let Spellings = [GNU<"scoped_lockable">];
   1736   let Subjects = SubjectList<[Record]>;
   1737   let Documentation = [Undocumented];
   1738 }
   1739 
   1740 def Capability : InheritableAttr {
   1741   let Spellings = [GNU<"capability">, CXX11<"clang", "capability">,
   1742                    GNU<"shared_capability">,
   1743                    CXX11<"clang", "shared_capability">];
   1744   let Subjects = SubjectList<[Record, TypedefName], ErrorDiag,
   1745                              "ExpectedStructOrUnionOrTypedef">;
   1746   let Args = [StringArgument<"Name">];
   1747   let Accessors = [Accessor<"isShared",
   1748                     [GNU<"shared_capability">,
   1749                      CXX11<"clang","shared_capability">]>];
   1750   let Documentation = [Undocumented];
   1751   let AdditionalMembers = [{
   1752     bool isMutex() const { return getName().equals_lower("mutex"); }
   1753     bool isRole() const { return getName().equals_lower("role"); }
   1754   }];
   1755 }
   1756 
   1757 def AssertCapability : InheritableAttr {
   1758   let Spellings = [GNU<"assert_capability">,
   1759                    CXX11<"clang", "assert_capability">,
   1760                    GNU<"assert_shared_capability">,
   1761                    CXX11<"clang", "assert_shared_capability">];
   1762   let Subjects = SubjectList<[Function]>;
   1763   let LateParsed = 1;
   1764   let TemplateDependent = 1;
   1765   let ParseArgumentsAsUnevaluated = 1;
   1766   let DuplicatesAllowedWhileMerging = 1;
   1767   let Args = [ExprArgument<"Expr">];
   1768   let Accessors = [Accessor<"isShared",
   1769                     [GNU<"assert_shared_capability">,
   1770                      CXX11<"clang", "assert_shared_capability">]>];
   1771   let Documentation = [AssertCapabilityDocs];
   1772 }
   1773 
   1774 def AcquireCapability : InheritableAttr {
   1775   let Spellings = [GNU<"acquire_capability">,
   1776                    CXX11<"clang", "acquire_capability">,
   1777                    GNU<"acquire_shared_capability">,
   1778                    CXX11<"clang", "acquire_shared_capability">,
   1779                    GNU<"exclusive_lock_function">,
   1780                    GNU<"shared_lock_function">];
   1781   let Subjects = SubjectList<[Function]>;
   1782   let LateParsed = 1;
   1783   let TemplateDependent = 1;
   1784   let ParseArgumentsAsUnevaluated = 1;
   1785   let DuplicatesAllowedWhileMerging = 1;
   1786   let Args = [VariadicExprArgument<"Args">];
   1787   let Accessors = [Accessor<"isShared",
   1788                     [GNU<"acquire_shared_capability">,
   1789                      CXX11<"clang", "acquire_shared_capability">,
   1790                      GNU<"shared_lock_function">]>];
   1791   let Documentation = [AcquireCapabilityDocs];
   1792 }
   1793 
   1794 def TryAcquireCapability : InheritableAttr {
   1795   let Spellings = [GNU<"try_acquire_capability">,
   1796                    CXX11<"clang", "try_acquire_capability">,
   1797                    GNU<"try_acquire_shared_capability">,
   1798                    CXX11<"clang", "try_acquire_shared_capability">];
   1799   let Subjects = SubjectList<[Function],
   1800                              ErrorDiag>;
   1801   let LateParsed = 1;
   1802   let TemplateDependent = 1;
   1803   let ParseArgumentsAsUnevaluated = 1;
   1804   let DuplicatesAllowedWhileMerging = 1;
   1805   let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
   1806   let Accessors = [Accessor<"isShared",
   1807                     [GNU<"try_acquire_shared_capability">,
   1808                      CXX11<"clang", "try_acquire_shared_capability">]>];
   1809   let Documentation = [TryAcquireCapabilityDocs];
   1810 }
   1811 
   1812 def ReleaseCapability : InheritableAttr {
   1813   let Spellings = [GNU<"release_capability">,
   1814                    CXX11<"clang", "release_capability">,
   1815                    GNU<"release_shared_capability">,
   1816                    CXX11<"clang", "release_shared_capability">,
   1817                    GNU<"release_generic_capability">,
   1818                    CXX11<"clang", "release_generic_capability">,
   1819                    GNU<"unlock_function">];
   1820   let Subjects = SubjectList<[Function]>;
   1821   let LateParsed = 1;
   1822   let TemplateDependent = 1;
   1823   let ParseArgumentsAsUnevaluated = 1;
   1824   let DuplicatesAllowedWhileMerging = 1;
   1825   let Args = [VariadicExprArgument<"Args">];
   1826   let Accessors = [Accessor<"isShared",
   1827                     [GNU<"release_shared_capability">,
   1828                      CXX11<"clang", "release_shared_capability">]>,
   1829                    Accessor<"isGeneric",
   1830                      [GNU<"release_generic_capability">,
   1831                       CXX11<"clang", "release_generic_capability">,
   1832                       GNU<"unlock_function">]>];
   1833   let Documentation = [ReleaseCapabilityDocs];
   1834 }
   1835 
   1836 def RequiresCapability : InheritableAttr {
   1837   let Spellings = [GNU<"requires_capability">,
   1838                    CXX11<"clang", "requires_capability">,
   1839                    GNU<"exclusive_locks_required">,
   1840                    GNU<"requires_shared_capability">,
   1841                    CXX11<"clang", "requires_shared_capability">,
   1842                    GNU<"shared_locks_required">];
   1843   let Args = [VariadicExprArgument<"Args">];
   1844   let LateParsed = 1;
   1845   let TemplateDependent = 1;
   1846   let ParseArgumentsAsUnevaluated = 1;
   1847   let DuplicatesAllowedWhileMerging = 1;
   1848   let Subjects = SubjectList<[Function]>;
   1849   let Accessors = [Accessor<"isShared", [GNU<"requires_shared_capability">,
   1850                                          GNU<"shared_locks_required">,
   1851                                 CXX11<"clang","requires_shared_capability">]>];
   1852   let Documentation = [Undocumented];
   1853 }
   1854 
   1855 def NoThreadSafetyAnalysis : InheritableAttr {
   1856   let Spellings = [GNU<"no_thread_safety_analysis">];
   1857   let Subjects = SubjectList<[Function]>;
   1858   let Documentation = [Undocumented];
   1859 }
   1860 
   1861 def GuardedBy : InheritableAttr {
   1862   let Spellings = [GNU<"guarded_by">];
   1863   let Args = [ExprArgument<"Arg">];
   1864   let LateParsed = 1;
   1865   let TemplateDependent = 1;
   1866   let ParseArgumentsAsUnevaluated = 1;
   1867   let DuplicatesAllowedWhileMerging = 1;
   1868   let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
   1869                              "ExpectedFieldOrGlobalVar">;
   1870   let Documentation = [Undocumented];
   1871 }
   1872 
   1873 def PtGuardedBy : InheritableAttr {
   1874   let Spellings = [GNU<"pt_guarded_by">];
   1875   let Args = [ExprArgument<"Arg">];
   1876   let LateParsed = 1;
   1877   let TemplateDependent = 1;
   1878   let ParseArgumentsAsUnevaluated = 1;
   1879   let DuplicatesAllowedWhileMerging = 1;
   1880   let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
   1881                              "ExpectedFieldOrGlobalVar">;
   1882   let Documentation = [Undocumented];
   1883 }
   1884 
   1885 def AcquiredAfter : InheritableAttr {
   1886   let Spellings = [GNU<"acquired_after">];
   1887   let Args = [VariadicExprArgument<"Args">];
   1888   let LateParsed = 1;
   1889   let TemplateDependent = 1;
   1890   let ParseArgumentsAsUnevaluated = 1;
   1891   let DuplicatesAllowedWhileMerging = 1;
   1892   let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
   1893                              "ExpectedFieldOrGlobalVar">;
   1894   let Documentation = [Undocumented];
   1895 }
   1896 
   1897 def AcquiredBefore : InheritableAttr {
   1898   let Spellings = [GNU<"acquired_before">];
   1899   let Args = [VariadicExprArgument<"Args">];
   1900   let LateParsed = 1;
   1901   let TemplateDependent = 1;
   1902   let ParseArgumentsAsUnevaluated = 1;
   1903   let DuplicatesAllowedWhileMerging = 1;
   1904   let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
   1905                              "ExpectedFieldOrGlobalVar">;
   1906   let Documentation = [Undocumented];
   1907 }
   1908 
   1909 def AssertExclusiveLock : InheritableAttr {
   1910   let Spellings = [GNU<"assert_exclusive_lock">];
   1911   let Args = [VariadicExprArgument<"Args">];
   1912   let LateParsed = 1;
   1913   let TemplateDependent = 1;
   1914   let ParseArgumentsAsUnevaluated = 1;
   1915   let DuplicatesAllowedWhileMerging = 1;
   1916   let Subjects = SubjectList<[Function]>;
   1917   let Documentation = [Undocumented];
   1918 }
   1919 
   1920 def AssertSharedLock : InheritableAttr {
   1921   let Spellings = [GNU<"assert_shared_lock">];
   1922   let Args = [VariadicExprArgument<"Args">];
   1923   let LateParsed = 1;
   1924   let TemplateDependent = 1;
   1925   let ParseArgumentsAsUnevaluated = 1;
   1926   let DuplicatesAllowedWhileMerging = 1;
   1927   let Subjects = SubjectList<[Function]>;
   1928   let Documentation = [Undocumented];
   1929 }
   1930 
   1931 // The first argument is an integer or boolean value specifying the return value
   1932 // of a successful lock acquisition.
   1933 def ExclusiveTrylockFunction : InheritableAttr {
   1934   let Spellings = [GNU<"exclusive_trylock_function">];
   1935   let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
   1936   let LateParsed = 1;
   1937   let TemplateDependent = 1;
   1938   let ParseArgumentsAsUnevaluated = 1;
   1939   let DuplicatesAllowedWhileMerging = 1;
   1940   let Subjects = SubjectList<[Function]>;
   1941   let Documentation = [Undocumented];
   1942 }
   1943 
   1944 // The first argument is an integer or boolean value specifying the return value
   1945 // of a successful lock acquisition.
   1946 def SharedTrylockFunction : InheritableAttr {
   1947   let Spellings = [GNU<"shared_trylock_function">];
   1948   let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
   1949   let LateParsed = 1;
   1950   let TemplateDependent = 1;
   1951   let ParseArgumentsAsUnevaluated = 1;
   1952   let DuplicatesAllowedWhileMerging = 1;
   1953   let Subjects = SubjectList<[Function]>;
   1954   let Documentation = [Undocumented];
   1955 }
   1956 
   1957 def LockReturned : InheritableAttr {
   1958   let Spellings = [GNU<"lock_returned">];
   1959   let Args = [ExprArgument<"Arg">];
   1960   let LateParsed = 1;
   1961   let TemplateDependent = 1;
   1962   let ParseArgumentsAsUnevaluated = 1;
   1963   let Subjects = SubjectList<[Function]>;
   1964   let Documentation = [Undocumented];
   1965 }
   1966 
   1967 def LocksExcluded : InheritableAttr {
   1968   let Spellings = [GNU<"locks_excluded">];
   1969   let Args = [VariadicExprArgument<"Args">];
   1970   let LateParsed = 1;
   1971   let TemplateDependent = 1;
   1972   let ParseArgumentsAsUnevaluated = 1;
   1973   let DuplicatesAllowedWhileMerging = 1;
   1974   let Subjects = SubjectList<[Function]>;
   1975   let Documentation = [Undocumented];
   1976 }
   1977 
   1978 // C/C++ consumed attributes.
   1979 
   1980 def Consumable : InheritableAttr {
   1981   let Spellings = [GNU<"consumable">];
   1982   let Subjects = SubjectList<[CXXRecord]>;
   1983   let Args = [EnumArgument<"DefaultState", "ConsumedState",
   1984                            ["unknown", "consumed", "unconsumed"],
   1985                            ["Unknown", "Consumed", "Unconsumed"]>];
   1986   let Documentation = [ConsumableDocs];
   1987 }
   1988 
   1989 def ConsumableAutoCast : InheritableAttr {
   1990   let Spellings = [GNU<"consumable_auto_cast_state">];
   1991   let Subjects = SubjectList<[CXXRecord]>;
   1992   let Documentation = [Undocumented];
   1993 }
   1994 
   1995 def ConsumableSetOnRead : InheritableAttr {
   1996   let Spellings = [GNU<"consumable_set_state_on_read">];
   1997   let Subjects = SubjectList<[CXXRecord]>;
   1998   let Documentation = [Undocumented];
   1999 }
   2000 
   2001 def CallableWhen : InheritableAttr {
   2002   let Spellings = [GNU<"callable_when">];
   2003   let Subjects = SubjectList<[CXXMethod]>;
   2004   let Args = [VariadicEnumArgument<"CallableStates", "ConsumedState",
   2005                                    ["unknown", "consumed", "unconsumed"],
   2006                                    ["Unknown", "Consumed", "Unconsumed"]>];
   2007   let Documentation = [CallableWhenDocs];
   2008 }
   2009 
   2010 def ParamTypestate : InheritableAttr {
   2011   let Spellings = [GNU<"param_typestate">];
   2012   let Subjects = SubjectList<[ParmVar]>;
   2013   let Args = [EnumArgument<"ParamState", "ConsumedState",
   2014                            ["unknown", "consumed", "unconsumed"],
   2015                            ["Unknown", "Consumed", "Unconsumed"]>];
   2016   let Documentation = [ParamTypestateDocs];
   2017 }
   2018 
   2019 def ReturnTypestate : InheritableAttr {
   2020   let Spellings = [GNU<"return_typestate">];
   2021   let Subjects = SubjectList<[Function, ParmVar]>;
   2022   let Args = [EnumArgument<"State", "ConsumedState",
   2023                            ["unknown", "consumed", "unconsumed"],
   2024                            ["Unknown", "Consumed", "Unconsumed"]>];
   2025   let Documentation = [ReturnTypestateDocs];
   2026 }
   2027 
   2028 def SetTypestate : InheritableAttr {
   2029   let Spellings = [GNU<"set_typestate">];
   2030   let Subjects = SubjectList<[CXXMethod]>;
   2031   let Args = [EnumArgument<"NewState", "ConsumedState",
   2032                            ["unknown", "consumed", "unconsumed"],
   2033                            ["Unknown", "Consumed", "Unconsumed"]>];
   2034   let Documentation = [SetTypestateDocs];
   2035 }
   2036 
   2037 def TestTypestate : InheritableAttr {
   2038   let Spellings = [GNU<"test_typestate">];
   2039   let Subjects = SubjectList<[CXXMethod]>;
   2040   let Args = [EnumArgument<"TestState", "ConsumedState",
   2041                            ["consumed", "unconsumed"],
   2042                            ["Consumed", "Unconsumed"]>];
   2043   let Documentation = [TestTypestateDocs];
   2044 }
   2045 
   2046 // Type safety attributes for `void *' pointers and type tags.
   2047 
   2048 def ArgumentWithTypeTag : InheritableAttr {
   2049   let Spellings = [GNU<"argument_with_type_tag">,
   2050                    GNU<"pointer_with_type_tag">];
   2051   let Args = [IdentifierArgument<"ArgumentKind">,
   2052               UnsignedArgument<"ArgumentIdx">,
   2053               UnsignedArgument<"TypeTagIdx">,
   2054               BoolArgument<"IsPointer">];
   2055   let HasCustomParsing = 1;
   2056   let Documentation = [ArgumentWithTypeTagDocs, PointerWithTypeTagDocs];
   2057 }
   2058 
   2059 def TypeTagForDatatype : InheritableAttr {
   2060   let Spellings = [GNU<"type_tag_for_datatype">];
   2061   let Args = [IdentifierArgument<"ArgumentKind">,
   2062               TypeArgument<"MatchingCType">,
   2063               BoolArgument<"LayoutCompatible">,
   2064               BoolArgument<"MustBeNull">];
   2065 //  let Subjects = SubjectList<[Var], ErrorDiag>;
   2066   let HasCustomParsing = 1;
   2067   let Documentation = [TypeTagForDatatypeDocs];
   2068 }
   2069 
   2070 // Microsoft-related attributes
   2071 
   2072 def MSNoVTable : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
   2073   let Spellings = [Declspec<"novtable">];
   2074   let Subjects = SubjectList<[CXXRecord]>;
   2075   let Documentation = [MSNoVTableDocs];
   2076 }
   2077 
   2078 def : IgnoredAttr {
   2079   let Spellings = [Declspec<"property">];
   2080 }
   2081 
   2082 def MSStruct : InheritableAttr {
   2083   let Spellings = [GCC<"ms_struct">];
   2084   let Subjects = SubjectList<[Record]>;
   2085   let Documentation = [Undocumented];
   2086 }
   2087 
   2088 def DLLExport : InheritableAttr, TargetSpecificAttr<TargetWindows> {
   2089   let Spellings = [Declspec<"dllexport">, GCC<"dllexport">];
   2090   let Subjects = SubjectList<[Function, Var, CXXRecord]>;
   2091   let Documentation = [Undocumented];
   2092 }
   2093 
   2094 def DLLImport : InheritableAttr, TargetSpecificAttr<TargetWindows> {
   2095   let Spellings = [Declspec<"dllimport">, GCC<"dllimport">];
   2096   let Subjects = SubjectList<[Function, Var, CXXRecord]>;
   2097   let Documentation = [Undocumented];
   2098 }
   2099 
   2100 def SelectAny : InheritableAttr {
   2101   let Spellings = [Declspec<"selectany">];
   2102   let LangOpts = [MicrosoftExt];
   2103   let Documentation = [Undocumented];
   2104 }
   2105 
   2106 def Thread : Attr {
   2107   let Spellings = [Declspec<"thread">];
   2108   let LangOpts = [MicrosoftExt];
   2109   let Documentation = [ThreadDocs];
   2110   let Subjects = SubjectList<[Var]>;
   2111 }
   2112 
   2113 def Win64 : IgnoredAttr {
   2114   let Spellings = [Keyword<"__w64">];
   2115   let LangOpts = [MicrosoftExt];
   2116 }
   2117 
   2118 def Ptr32 : TypeAttr {
   2119   let Spellings = [Keyword<"__ptr32">];
   2120   let Documentation = [Undocumented];
   2121 }
   2122 
   2123 def Ptr64 : TypeAttr {
   2124   let Spellings = [Keyword<"__ptr64">];
   2125   let Documentation = [Undocumented];
   2126 }
   2127 
   2128 def SPtr : TypeAttr {
   2129   let Spellings = [Keyword<"__sptr">];
   2130   let Documentation = [Undocumented];
   2131 }
   2132 
   2133 def UPtr : TypeAttr {
   2134   let Spellings = [Keyword<"__uptr">];
   2135   let Documentation = [Undocumented];
   2136 }
   2137 
   2138 def MSInheritance : InheritableAttr {
   2139   let LangOpts = [MicrosoftExt];
   2140   let Args = [DefaultBoolArgument<"BestCase", 1>];
   2141   let Spellings = [Keyword<"__single_inheritance">,
   2142                    Keyword<"__multiple_inheritance">,
   2143                    Keyword<"__virtual_inheritance">,
   2144                    Keyword<"__unspecified_inheritance">];
   2145   let AdditionalMembers = [{
   2146   static bool hasVBPtrOffsetField(Spelling Inheritance) {
   2147     return Inheritance == Keyword_unspecified_inheritance;
   2148   }
   2149 
   2150   // Only member pointers to functions need a this adjustment, since it can be
   2151   // combined with the field offset for data pointers.
   2152   static bool hasNVOffsetField(bool IsMemberFunction, Spelling Inheritance) {
   2153     return IsMemberFunction && Inheritance >= Keyword_multiple_inheritance;
   2154   }
   2155 
   2156   static bool hasVBTableOffsetField(Spelling Inheritance) {
   2157     return Inheritance >= Keyword_virtual_inheritance;
   2158   }
   2159 
   2160   static bool hasOnlyOneField(bool IsMemberFunction,
   2161                               Spelling Inheritance) {
   2162     if (IsMemberFunction)
   2163       return Inheritance <= Keyword_single_inheritance;
   2164     return Inheritance <= Keyword_multiple_inheritance;
   2165   }
   2166   }];
   2167   let Documentation = [MSInheritanceDocs];
   2168 }
   2169 
   2170 def MSVtorDisp : InheritableAttr {
   2171   // This attribute has no spellings as it is only ever created implicitly.
   2172   let Spellings = [];
   2173   let Args = [UnsignedArgument<"vdm">];
   2174   let SemaHandler = 0;
   2175 
   2176   let AdditionalMembers = [{
   2177   enum Mode {
   2178     Never,
   2179     ForVBaseOverride,
   2180     ForVFTable
   2181   };
   2182 
   2183   Mode getVtorDispMode() const { return Mode(vdm); }
   2184   }];
   2185   let Documentation = [Undocumented];
   2186 }
   2187 
   2188 def InitSeg : Attr {
   2189   let Spellings = [Pragma<"", "init_seg">];
   2190   let Args = [StringArgument<"Section">];
   2191   let SemaHandler = 0;
   2192   let Documentation = [InitSegDocs];
   2193   let AdditionalMembers = [{
   2194   void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
   2195     OS << '(' << getSection() << ')';
   2196   }
   2197   }];
   2198 }
   2199 
   2200 def LoopHint : Attr {
   2201   /// #pragma clang loop <option> directive
   2202   /// vectorize: vectorizes loop operations if State == Enable.
   2203   /// vectorize_width: vectorize loop operations with width 'Value'.
   2204   /// interleave: interleave multiple loop iterations if State == Enable.
   2205   /// interleave_count: interleaves 'Value' loop interations.
   2206   /// unroll: fully unroll loop if State == Enable.
   2207   /// unroll_count: unrolls loop 'Value' times.
   2208   /// distribute: attempt to distribute loop if State == Enable
   2209 
   2210   /// #pragma unroll <argument> directive
   2211   /// <no arg>: fully unrolls loop.
   2212   /// boolean: fully unrolls loop if State == Enable.
   2213   /// expression: unrolls loop 'Value' times.
   2214 
   2215   let Spellings = [Pragma<"clang", "loop">, Pragma<"", "unroll">,
   2216                    Pragma<"", "nounroll">];
   2217 
   2218   /// State of the loop optimization specified by the spelling.
   2219   let Args = [EnumArgument<"Option", "OptionType",
   2220                           ["vectorize", "vectorize_width", "interleave", "interleave_count",
   2221                            "unroll", "unroll_count", "distribute"],
   2222                           ["Vectorize", "VectorizeWidth", "Interleave", "InterleaveCount",
   2223                            "Unroll", "UnrollCount", "Distribute"]>,
   2224               EnumArgument<"State", "LoopHintState",
   2225                            ["enable", "disable", "numeric", "assume_safety", "full"],
   2226                            ["Enable", "Disable", "Numeric", "AssumeSafety", "Full"]>,
   2227               ExprArgument<"Value">];
   2228 
   2229   let AdditionalMembers = [{
   2230   static const char *getOptionName(int Option) {
   2231     switch(Option) {
   2232     case Vectorize: return "vectorize";
   2233     case VectorizeWidth: return "vectorize_width";
   2234     case Interleave: return "interleave";
   2235     case InterleaveCount: return "interleave_count";
   2236     case Unroll: return "unroll";
   2237     case UnrollCount: return "unroll_count";
   2238     case Distribute: return "distribute";
   2239     }
   2240     llvm_unreachable("Unhandled LoopHint option.");
   2241   }
   2242 
   2243   void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
   2244     unsigned SpellingIndex = getSpellingListIndex();
   2245     // For "#pragma unroll" and "#pragma nounroll" the string "unroll" or
   2246     // "nounroll" is already emitted as the pragma name.
   2247     if (SpellingIndex == Pragma_nounroll)
   2248       return;
   2249     else if (SpellingIndex == Pragma_unroll) {
   2250       OS << getValueString(Policy);
   2251       return;
   2252     }
   2253 
   2254     assert(SpellingIndex == Pragma_clang_loop && "Unexpected spelling");
   2255     OS << getOptionName(option) << getValueString(Policy);
   2256   }
   2257 
   2258   // Return a string containing the loop hint argument including the
   2259   // enclosing parentheses.
   2260   std::string getValueString(const PrintingPolicy &Policy) const {
   2261     std::string ValueName;
   2262     llvm::raw_string_ostream OS(ValueName);
   2263     OS << "(";
   2264     if (state == Numeric)
   2265       value->printPretty(OS, nullptr, Policy);
   2266     else if (state == Enable)
   2267       OS << "enable";
   2268     else if (state == Full)
   2269       OS << "full";
   2270     else if (state == AssumeSafety)
   2271       OS << "assume_safety";
   2272     else
   2273       OS << "disable";
   2274     OS << ")";
   2275     return OS.str();
   2276   }
   2277 
   2278   // Return a string suitable for identifying this attribute in diagnostics.
   2279   std::string getDiagnosticName(const PrintingPolicy &Policy) const {
   2280     unsigned SpellingIndex = getSpellingListIndex();
   2281     if (SpellingIndex == Pragma_nounroll)
   2282       return "#pragma nounroll";
   2283     else if (SpellingIndex == Pragma_unroll)
   2284       return "#pragma unroll" + (option == UnrollCount ? getValueString(Policy) : "");
   2285 
   2286     assert(SpellingIndex == Pragma_clang_loop && "Unexpected spelling");
   2287     return getOptionName(option) + getValueString(Policy);
   2288   }
   2289   }];
   2290 
   2291   let Documentation = [LoopHintDocs, UnrollHintDocs];
   2292 }
   2293 
   2294 def CapturedRecord : InheritableAttr {
   2295   // This attribute has no spellings as it is only ever created implicitly.
   2296   let Spellings = [];
   2297   let SemaHandler = 0;
   2298   let Documentation = [Undocumented];
   2299 }
   2300 
   2301 def OMPThreadPrivateDecl : InheritableAttr {
   2302   // This attribute has no spellings as it is only ever created implicitly.
   2303   let Spellings = [];
   2304   let SemaHandler = 0;
   2305   let Documentation = [Undocumented];
   2306 }
   2307 
   2308 def OMPCaptureNoInit : InheritableAttr {
   2309   // This attribute has no spellings as it is only ever created implicitly.
   2310   let Spellings = [];
   2311   let SemaHandler = 0;
   2312   let Documentation = [Undocumented];
   2313 }
   2314 
   2315 def OMPDeclareSimdDecl : Attr {
   2316   let Spellings = [Pragma<"omp", "declare simd">];
   2317   let Subjects = SubjectList<[Function]>;
   2318   let SemaHandler = 0;
   2319   let HasCustomParsing = 1;
   2320   let Documentation = [OMPDeclareSimdDocs];
   2321   let Args = [
   2322     EnumArgument<"BranchState", "BranchStateTy",
   2323                  [ "", "inbranch", "notinbranch" ],
   2324                  [ "BS_Undefined", "BS_Inbranch", "BS_Notinbranch" ]>,
   2325     ExprArgument<"Simdlen">, VariadicExprArgument<"Uniforms">,
   2326     VariadicExprArgument<"Aligneds">, VariadicExprArgument<"Alignments">,
   2327     VariadicExprArgument<"Linears">, VariadicUnsignedArgument<"Modifiers">,
   2328     VariadicExprArgument<"Steps">
   2329   ];
   2330   let AdditionalMembers = [{
   2331     void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy)
   2332         const {
   2333       if (getBranchState() != BS_Undefined)
   2334         OS << ConvertBranchStateTyToStr(getBranchState()) << " ";
   2335       if (auto *E = getSimdlen()) {
   2336         OS << "simdlen(";
   2337         E->printPretty(OS, nullptr, Policy);
   2338         OS << ") ";
   2339       }
   2340       if (uniforms_size() > 0) {
   2341         OS << "uniform";
   2342         StringRef Sep = "(";
   2343         for (auto *E : uniforms()) {
   2344           OS << Sep;
   2345           E->printPretty(OS, nullptr, Policy);
   2346           Sep = ", ";
   2347         }
   2348         OS << ") ";
   2349       }
   2350       alignments_iterator NI = alignments_begin();
   2351       for (auto *E : aligneds()) {
   2352         OS << "aligned(";
   2353         E->printPretty(OS, nullptr, Policy);
   2354         if (*NI) {
   2355           OS << ": ";
   2356           (*NI)->printPretty(OS, nullptr, Policy);
   2357         }
   2358         OS << ") ";
   2359         ++NI;
   2360       }
   2361       steps_iterator I = steps_begin();
   2362       modifiers_iterator MI = modifiers_begin();
   2363       for (auto *E : linears()) {
   2364         OS << "linear(";
   2365         if (*MI != OMPC_LINEAR_unknown)
   2366           OS << getOpenMPSimpleClauseTypeName(OMPC_linear, *MI) << "(";
   2367         E->printPretty(OS, nullptr, Policy);
   2368         if (*MI != OMPC_LINEAR_unknown)
   2369           OS << ")";
   2370         if (*I) {
   2371           OS << ": ";
   2372           (*I)->printPretty(OS, nullptr, Policy);
   2373         }
   2374         OS << ") ";
   2375         ++I;
   2376         ++MI;
   2377       }
   2378     }
   2379   }];
   2380 }
   2381 
   2382 def OMPDeclareTargetDecl : Attr {
   2383   let Spellings = [Pragma<"omp", "declare target">];
   2384   let SemaHandler = 0;
   2385   let Documentation = [OMPDeclareTargetDocs];
   2386   let Args = [
   2387     EnumArgument<"MapType", "MapTypeTy",
   2388                  [ "to", "link" ],
   2389                  [ "MT_To", "MT_Link" ]>
   2390   ];
   2391   let AdditionalMembers = [{
   2392     void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
   2393       // Use fake syntax because it is for testing and debugging purpose only.
   2394       if (getMapType() != MT_To)
   2395         OS << ConvertMapTypeTyToStr(getMapType()) << " ";
   2396     }
   2397   }];
   2398 }
   2399 
   2400 def InternalLinkage : InheritableAttr {
   2401   let Spellings = [GNU<"internal_linkage">, CXX11<"clang", "internal_linkage">];
   2402   let Subjects = SubjectList<[Var, Function, CXXRecord]>;
   2403   let Documentation = [InternalLinkageDocs];
   2404 }
   2405