summaryrefslogtreecommitdiffstats
path: root/include/clang/Basic/Attr.td
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang/Basic/Attr.td')
-rw-r--r--include/clang/Basic/Attr.td2172
1 files changed, 0 insertions, 2172 deletions
diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td
deleted file mode 100644
index d5ba722..0000000
--- a/include/clang/Basic/Attr.td
+++ /dev/null
@@ -1,2172 +0,0 @@
-//==--- Attr.td - attribute definitions -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-// The documentation is organized by category. Attributes can have category-
-// specific documentation that is collated within the larger document.
-class DocumentationCategory<string name> {
- string Name = name;
- code Content = [{}];
-}
-def DocCatFunction : DocumentationCategory<"Function Attributes">;
-def DocCatVariable : DocumentationCategory<"Variable Attributes">;
-def DocCatType : DocumentationCategory<"Type Attributes">;
-def DocCatStmt : DocumentationCategory<"Statement Attributes">;
-// Attributes listed under the Undocumented category do not generate any public
-// documentation. Ideally, this category should be used for internal-only
-// attributes which contain no spellings.
-def DocCatUndocumented : DocumentationCategory<"Undocumented">;
-
-class DocDeprecated<string replacement = ""> {
- // If the Replacement field is empty, no replacement will be listed with the
- // documentation. Otherwise, the documentation will specify the attribute has
- // been superseded by this replacement.
- string Replacement = replacement;
-}
-
-// Specifies the documentation to be associated with the given category.
-class Documentation {
- DocumentationCategory Category;
- code Content;
-
- // If the heading is empty, one may be picked automatically. If the attribute
- // only has one spelling, no heading is required as the attribute's sole
- // spelling is sufficient. If all spellings are semantically common, the
- // heading will be the semantic spelling. If the spellings are not
- // semantically common and no heading is provided, an error will be emitted.
- string Heading = "";
-
- // When set, specifies that the attribute is deprecated and can optionally
- // specify a replacement attribute.
- DocDeprecated Deprecated;
-}
-
-// Specifies that the attribute is explicitly undocumented. This can be a
-// helpful placeholder for the attribute while working on the implementation,
-// but should not be used once feature work has been completed.
-def Undocumented : Documentation {
- let Category = DocCatUndocumented;
-}
-
-include "clang/Basic/AttrDocs.td"
-
-// An attribute's subject is whatever it appertains to. In this file, it is
-// more accurately a list of things that an attribute can appertain to. All
-// Decls and Stmts are possibly AttrSubjects (even though the syntax may not
-// allow attributes on a given Decl or Stmt).
-class AttrSubject;
-
-include "clang/Basic/DeclNodes.td"
-include "clang/Basic/StmtNodes.td"
-
-// A subset-subject is an AttrSubject constrained to operate only on some subset
-// of that subject.
-//
-// The code fragment is a boolean expression that will confirm that the subject
-// meets the requirements; the subject will have the name S, and will have the
-// type specified by the base. It should be a simple boolean expression.
-class SubsetSubject<AttrSubject base, code check> : AttrSubject {
- AttrSubject Base = base;
- code CheckCode = check;
-}
-
-// This is the type of a variable which C++11 allows alignas(...) to appertain
-// to.
-def NormalVar : SubsetSubject<Var,
- [{S->getStorageClass() != VarDecl::Register &&
- S->getKind() != Decl::ImplicitParam &&
- S->getKind() != Decl::ParmVar &&
- S->getKind() != Decl::NonTypeTemplateParm}]>;
-def NonBitField : SubsetSubject<Field,
- [{!S->isBitField()}]>;
-
-def ObjCInstanceMethod : SubsetSubject<ObjCMethod,
- [{S->isInstanceMethod()}]>;
-
-def ObjCInterfaceDeclInitMethod : SubsetSubject<ObjCMethod,
- [{S->getMethodFamily() == OMF_init &&
- (isa<ObjCInterfaceDecl>(S->getDeclContext()) ||
- (isa<ObjCCategoryDecl>(S->getDeclContext()) &&
- cast<ObjCCategoryDecl>(S->getDeclContext())->IsClassExtension()))}]>;
-
-def Struct : SubsetSubject<Record,
- [{!S->isUnion()}]>;
-
-def TLSVar : SubsetSubject<Var,
- [{S->getTLSKind() != 0}]>;
-
-def SharedVar : SubsetSubject<Var,
- [{S->hasGlobalStorage() && !S->getTLSKind()}]>;
-
-def GlobalVar : SubsetSubject<Var,
- [{S->hasGlobalStorage()}]>;
-
-// FIXME: this hack is needed because DeclNodes.td defines the base Decl node
-// type to be a class, not a definition. This makes it impossible to create an
-// attribute subject which accepts a Decl. Normally, this is not a problem,
-// because the attribute can have no Subjects clause to accomplish this. But in
-// the case of a SubsetSubject, there's no way to express it without this hack.
-def DeclBase : AttrSubject;
-def FunctionLike : SubsetSubject<DeclBase,
- [{S->getFunctionType(false) != nullptr}]>;
-
-def OpenCLKernelFunction : SubsetSubject<Function, [{
- S->hasAttr<OpenCLKernelAttr>()
-}]>;
-
-// HasFunctionProto is a more strict version of FunctionLike, so it should
-// never be specified in a Subjects list along with FunctionLike (due to the
-// inclusive nature of subject testing).
-def HasFunctionProto : SubsetSubject<DeclBase,
- [{(S->getFunctionType(true) != nullptr &&
- isa<FunctionProtoType>(S->getFunctionType())) ||
- isa<ObjCMethodDecl>(S) ||
- isa<BlockDecl>(S)}]>;
-
-// A single argument to an attribute
-class Argument<string name, bit optional, bit fake = 0> {
- string Name = name;
- bit Optional = optional;
-
- /// A fake argument is used to store and serialize additional information
- /// in an attribute without actually changing its parsing or pretty-printing.
- bit Fake = fake;
-}
-
-class BoolArgument<string name, bit opt = 0> : Argument<name, opt>;
-class IdentifierArgument<string name, bit opt = 0> : Argument<name, opt>;
-class IntArgument<string name, bit opt = 0> : Argument<name, opt>;
-class StringArgument<string name, bit opt = 0> : Argument<name, opt>;
-class ExprArgument<string name, bit opt = 0> : Argument<name, opt>;
-class FunctionArgument<string name, bit opt = 0> : Argument<name, opt>;
-class TypeArgument<string name, bit opt = 0> : Argument<name, opt>;
-class UnsignedArgument<string name, bit opt = 0> : Argument<name, opt>;
-class VariadicUnsignedArgument<string name> : Argument<name, 1>;
-class VariadicExprArgument<string name> : Argument<name, 1>;
-class VariadicStringArgument<string name> : Argument<name, 1>;
-
-// A version of the form major.minor[.subminor].
-class VersionArgument<string name, bit opt = 0> : Argument<name, opt>;
-
-// This one's a doozy, so it gets its own special type
-// It can be an unsigned integer, or a type. Either can
-// be dependent.
-class AlignedArgument<string name, bit opt = 0> : Argument<name, opt>;
-
-// A bool argument with a default value
-class DefaultBoolArgument<string name, bit default> : BoolArgument<name, 1> {
- bit Default = default;
-}
-
-// An integer argument with a default value
-class DefaultIntArgument<string name, int default> : IntArgument<name, 1> {
- int Default = default;
-}
-
-// This argument is more complex, it includes the enumerator type name,
-// a list of strings to accept, and a list of enumerators to map them to.
-class EnumArgument<string name, string type, list<string> values,
- list<string> enums, bit opt = 0, bit fake = 0>
- : Argument<name, opt, fake> {
- string Type = type;
- list<string> Values = values;
- list<string> Enums = enums;
-}
-
-// FIXME: There should be a VariadicArgument type that takes any other type
-// of argument and generates the appropriate type.
-class VariadicEnumArgument<string name, string type, list<string> values,
- list<string> enums> : Argument<name, 1> {
- string Type = type;
- list<string> Values = values;
- list<string> Enums = enums;
-}
-
-// This handles one spelling of an attribute.
-class Spelling<string name, string variety> {
- string Name = name;
- string Variety = variety;
- bit KnownToGCC;
-}
-
-class GNU<string name> : Spelling<name, "GNU">;
-class Declspec<string name> : Spelling<name, "Declspec">;
-class CXX11<string namespace, string name, int version = 1>
- : Spelling<name, "CXX11"> {
- string Namespace = namespace;
- int Version = version;
-}
-class Keyword<string name> : Spelling<name, "Keyword">;
-class Pragma<string namespace, string name> : Spelling<name, "Pragma"> {
- string Namespace = namespace;
-}
-
-// The GCC spelling implies GNU<name, "GNU"> and CXX11<"gnu", name> and also
-// sets KnownToGCC to 1. This spelling should be used for any GCC-compatible
-// attributes.
-class GCC<string name> : Spelling<name, "GCC"> {
- let KnownToGCC = 1;
-}
-
-class Accessor<string name, list<Spelling> spellings> {
- string Name = name;
- list<Spelling> Spellings = spellings;
-}
-
-class SubjectDiag<bit warn> {
- bit Warn = warn;
-}
-def WarnDiag : SubjectDiag<1>;
-def ErrorDiag : SubjectDiag<0>;
-
-class SubjectList<list<AttrSubject> subjects, SubjectDiag diag = WarnDiag,
- string customDiag = ""> {
- list<AttrSubject> Subjects = subjects;
- SubjectDiag Diag = diag;
- string CustomDiag = customDiag;
-}
-
-class LangOpt<string name, bit negated = 0> {
- string Name = name;
- bit Negated = negated;
-}
-def MicrosoftExt : LangOpt<"MicrosoftExt">;
-def Borland : LangOpt<"Borland">;
-def CUDA : LangOpt<"CUDA">;
-def COnly : LangOpt<"CPlusPlus", 1>;
-
-// Defines targets for target-specific attributes. The list of strings should
-// specify architectures for which the target applies, based off the ArchType
-// enumeration in Triple.h.
-class TargetArch<list<string> arches> {
- list<string> Arches = arches;
- list<string> OSes;
- list<string> CXXABIs;
-}
-def TargetARM : TargetArch<["arm", "thumb"]>;
-def TargetMips : TargetArch<["mips", "mipsel"]>;
-def TargetMSP430 : TargetArch<["msp430"]>;
-def TargetX86 : TargetArch<["x86"]>;
-def TargetWindows : TargetArch<["x86", "x86_64", "arm", "thumb"]> {
- let OSes = ["Win32"];
-}
-def TargetMicrosoftCXXABI : TargetArch<["x86", "x86_64", "arm", "thumb"]> {
- let CXXABIs = ["Microsoft"];
-}
-
-class Attr {
- // The various ways in which an attribute can be spelled in source
- list<Spelling> Spellings;
- // The things to which an attribute can appertain
- SubjectList Subjects;
- // The arguments allowed on an attribute
- list<Argument> Args = [];
- // Accessors which should be generated for the attribute.
- list<Accessor> Accessors = [];
- // Set to true for attributes with arguments which require delayed parsing.
- bit LateParsed = 0;
- // Set to false to prevent an attribute from being propagated from a template
- // to the instantiation.
- bit Clone = 1;
- // Set to true for attributes which must be instantiated within templates
- bit TemplateDependent = 0;
- // Set to true for attributes that have a corresponding AST node.
- bit ASTNode = 1;
- // Set to true for attributes which have handler in Sema.
- bit SemaHandler = 1;
- // Set to true for attributes that are completely ignored.
- bit Ignored = 0;
- // Set to true if the attribute's parsing does not match its semantic
- // content. Eg) It parses 3 args, but semantically takes 4 args. Opts out of
- // common attribute error checking.
- bit HasCustomParsing = 0;
- // Set to true if all of the attribute's arguments should be parsed in an
- // unevaluated context.
- bit ParseArgumentsAsUnevaluated = 0;
- // Set to true if this attribute can be duplicated on a subject when merging
- // attributes. By default, attributes are not merged.
- bit DuplicatesAllowedWhileMerging = 0;
- // Lists language options, one of which is required to be true for the
- // attribute to be applicable. If empty, no language options are required.
- list<LangOpt> LangOpts = [];
- // Any additional text that should be included verbatim in the class.
- // Note: Any additional data members will leak and should be constructed
- // externally on the ASTContext.
- code AdditionalMembers = [{}];
- // Any documentation that should be associated with the attribute. Since an
- // attribute may be documented under multiple categories, more than one
- // Documentation entry may be listed.
- list<Documentation> Documentation;
-}
-
-/// A type attribute is not processed on a declaration or a statement.
-class TypeAttr : Attr {
- // By default, type attributes do not get an AST node.
- let ASTNode = 0;
-}
-
-/// An inheritable attribute is inherited by later redeclarations.
-class InheritableAttr : Attr;
-
-/// A target-specific attribute. This class is meant to be used as a mixin
-/// with InheritableAttr or Attr depending on the attribute's needs.
-class TargetSpecificAttr<TargetArch target> {
- TargetArch Target = target;
- // Attributes are generally required to have unique spellings for their names
- // so that the parser can determine what kind of attribute it has parsed.
- // However, target-specific attributes are special in that the attribute only
- // "exists" for a given target. So two target-specific attributes can share
- // the same name when they exist in different targets. To support this, a
- // Kind can be explicitly specified for a target-specific attribute. This
- // corresponds to the AttributeList::AT_* enum that is generated and it
- // should contain a shared value between the attributes.
- //
- // Target-specific attributes which use this feature should ensure that the
- // spellings match exactly betweeen the attributes, and if the arguments or
- // subjects differ, should specify HasCustomParsing = 1 and implement their
- // own parsing and semantic handling requirements as-needed.
- string ParseKind;
-}
-
-/// An inheritable parameter attribute is inherited by later
-/// redeclarations, even when it's written on a parameter.
-class InheritableParamAttr : InheritableAttr;
-
-/// An ignored attribute, which we parse but discard with no checking.
-class IgnoredAttr : Attr {
- let Ignored = 1;
- let ASTNode = 0;
- let SemaHandler = 0;
- let Documentation = [Undocumented];
-}
-
-//
-// Attributes begin here
-//
-
-def AddressSpace : TypeAttr {
- let Spellings = [GNU<"address_space">];
- let Args = [IntArgument<"AddressSpace">];
- let Documentation = [Undocumented];
-}
-
-def Alias : Attr {
- let Spellings = [GCC<"alias">];
- let Args = [StringArgument<"Aliasee">];
- let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag,
- "ExpectedFunctionGlobalVarMethodOrProperty">;
- let Documentation = [Undocumented];
-}
-
-def Aligned : InheritableAttr {
- let Spellings = [GCC<"aligned">, Declspec<"align">, Keyword<"alignas">,
- Keyword<"_Alignas">];
-// let Subjects = SubjectList<[NonBitField, NormalVar, Tag]>;
- let Args = [AlignedArgument<"Alignment", 1>];
- let Accessors = [Accessor<"isGNU", [GCC<"aligned">]>,
- Accessor<"isC11", [Keyword<"_Alignas">]>,
- Accessor<"isAlignas", [Keyword<"alignas">,
- Keyword<"_Alignas">]>,
- Accessor<"isDeclspec",[Declspec<"align">]>];
- let Documentation = [Undocumented];
-}
-
-def AlignValue : Attr {
- let Spellings = [
- // Unfortunately, this is semantically an assertion, not a directive
- // (something else must ensure the alignment), so aligned_value is a
- // probably a better name. We might want to add an aligned_value spelling in
- // the future (and a corresponding C++ attribute), but this can be done
- // later once we decide if we also want them to have slightly-different
- // semantics than Intel's align_value.
- GNU<"align_value">
- // Intel's compiler on Windows also supports:
- // , Declspec<"align_value">
- ];
- let Args = [ExprArgument<"Alignment">];
- let Subjects = SubjectList<[Var, TypedefName], WarnDiag,
- "ExpectedVariableOrTypedef">;
- let Documentation = [AlignValueDocs];
-}
-
-def AlignMac68k : InheritableAttr {
- // This attribute has no spellings as it is only ever created implicitly.
- let Spellings = [];
- let SemaHandler = 0;
- let Documentation = [Undocumented];
-}
-
-def AlwaysInline : InheritableAttr {
- let Spellings = [GCC<"always_inline">, Keyword<"__forceinline">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def TLSModel : InheritableAttr {
- let Spellings = [GCC<"tls_model">];
- let Subjects = SubjectList<[TLSVar], ErrorDiag, "ExpectedTLSVar">;
- let Args = [StringArgument<"Model">];
- let Documentation = [TLSModelDocs];
-}
-
-def AnalyzerNoReturn : InheritableAttr {
- let Spellings = [GNU<"analyzer_noreturn">];
- let Documentation = [Undocumented];
-}
-
-def Annotate : InheritableParamAttr {
- let Spellings = [GNU<"annotate">];
- let Args = [StringArgument<"Annotation">];
- let Documentation = [Undocumented];
-}
-
-def ARMInterrupt : InheritableAttr, TargetSpecificAttr<TargetARM> {
- // NOTE: If you add any additional spellings, MSP430Interrupt's and
- // MipsInterrupt's spellings must match.
- let Spellings = [GNU<"interrupt">];
- let Args = [EnumArgument<"Interrupt", "InterruptType",
- ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", ""],
- ["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", "Generic"],
- 1>];
- let ParseKind = "Interrupt";
- let HasCustomParsing = 1;
- let Documentation = [ARMInterruptDocs];
-}
-
-def AsmLabel : InheritableAttr {
- let Spellings = [Keyword<"asm">, Keyword<"__asm__">];
- let Args = [StringArgument<"Label">];
- let SemaHandler = 0;
- let Documentation = [Undocumented];
-}
-
-def Availability : InheritableAttr {
- let Spellings = [GNU<"availability">];
- let Args = [IdentifierArgument<"platform">, VersionArgument<"introduced">,
- VersionArgument<"deprecated">, VersionArgument<"obsoleted">,
- BoolArgument<"unavailable">, StringArgument<"message">];
- let AdditionalMembers =
-[{static llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) {
- return llvm::StringSwitch<llvm::StringRef>(Platform)
- .Case("android", "Android")
- .Case("ios", "iOS")
- .Case("macosx", "OS X")
- .Case("tvos", "tvOS")
- .Case("watchos", "watchOS")
- .Case("ios_app_extension", "iOS (App Extension)")
- .Case("macosx_app_extension", "OS X (App Extension)")
- .Case("tvos_app_extension", "tvOS (App Extension)")
- .Case("watchos_app_extension", "watchOS (App Extension)")
- .Default(llvm::StringRef());
-} }];
- let HasCustomParsing = 1;
- let DuplicatesAllowedWhileMerging = 1;
-// let Subjects = SubjectList<[Named]>;
- let Documentation = [AvailabilityDocs];
-}
-
-def Blocks : InheritableAttr {
- let Spellings = [GNU<"blocks">];
- let Args = [EnumArgument<"Type", "BlockType", ["byref"], ["ByRef"]>];
- let Documentation = [Undocumented];
-}
-
-def Bounded : IgnoredAttr {
- let Spellings = [GNU<"bounded">];
-}
-
-def CarriesDependency : InheritableParamAttr {
- let Spellings = [GNU<"carries_dependency">,
- CXX11<"","carries_dependency", 200809>];
- let Subjects = SubjectList<[ParmVar, ObjCMethod, Function], ErrorDiag>;
- let Documentation = [CarriesDependencyDocs];
-}
-
-def CDecl : InheritableAttr {
- let Spellings = [GCC<"cdecl">, Keyword<"__cdecl">, Keyword<"_cdecl">];
-// let Subjects = [Function, ObjCMethod];
- let Documentation = [Undocumented];
-}
-
-// cf_audited_transfer indicates that the given function has been
-// audited and has been marked with the appropriate cf_consumed and
-// cf_returns_retained attributes. It is generally applied by
-// '#pragma clang arc_cf_code_audited' rather than explicitly.
-def CFAuditedTransfer : InheritableAttr {
- let Spellings = [GNU<"cf_audited_transfer">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-// cf_unknown_transfer is an explicit opt-out of cf_audited_transfer.
-// It indicates that the function has unknown or unautomatable
-// transfer semantics.
-def CFUnknownTransfer : InheritableAttr {
- let Spellings = [GNU<"cf_unknown_transfer">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def CFReturnsRetained : InheritableAttr {
- let Spellings = [GNU<"cf_returns_retained">];
-// let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
- let Documentation = [Undocumented];
-}
-
-def CFReturnsNotRetained : InheritableAttr {
- let Spellings = [GNU<"cf_returns_not_retained">];
-// let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
- let Documentation = [Undocumented];
-}
-
-def CFConsumed : InheritableParamAttr {
- let Spellings = [GNU<"cf_consumed">];
- let Subjects = SubjectList<[ParmVar]>;
- let Documentation = [Undocumented];
-}
-
-def Cleanup : InheritableAttr {
- let Spellings = [GCC<"cleanup">];
- let Args = [FunctionArgument<"FunctionDecl">];
- let Subjects = SubjectList<[Var]>;
- let Documentation = [Undocumented];
-}
-
-def Cold : InheritableAttr {
- let Spellings = [GCC<"cold">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def Common : InheritableAttr {
- let Spellings = [GCC<"common">];
- let Subjects = SubjectList<[Var]>;
- let Documentation = [Undocumented];
-}
-
-def Const : InheritableAttr {
- let Spellings = [GCC<"const">, GCC<"__const">];
- let Documentation = [Undocumented];
-}
-
-def Constructor : InheritableAttr {
- let Spellings = [GCC<"constructor">];
- let Args = [DefaultIntArgument<"Priority", 65535>];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def CUDAConstant : InheritableAttr {
- let Spellings = [GNU<"constant">];
- let Subjects = SubjectList<[Var]>;
- let LangOpts = [CUDA];
- let Documentation = [Undocumented];
-}
-
-def CUDACudartBuiltin : IgnoredAttr {
- let Spellings = [GNU<"cudart_builtin">];
- let LangOpts = [CUDA];
-}
-
-def CUDADevice : InheritableAttr {
- let Spellings = [GNU<"device">];
- let Subjects = SubjectList<[Function, Var]>;
- let LangOpts = [CUDA];
- let Documentation = [Undocumented];
-}
-
-def CUDADeviceBuiltin : IgnoredAttr {
- let Spellings = [GNU<"device_builtin">];
- let LangOpts = [CUDA];
-}
-
-def CUDADeviceBuiltinSurfaceType : IgnoredAttr {
- let Spellings = [GNU<"device_builtin_surface_type">];
- let LangOpts = [CUDA];
-}
-
-def CUDADeviceBuiltinTextureType : IgnoredAttr {
- let Spellings = [GNU<"device_builtin_texture_type">];
- let LangOpts = [CUDA];
-}
-
-def CUDAGlobal : InheritableAttr {
- let Spellings = [GNU<"global">];
- let Subjects = SubjectList<[Function]>;
- let LangOpts = [CUDA];
- let Documentation = [Undocumented];
-}
-
-def CUDAHost : InheritableAttr {
- let Spellings = [GNU<"host">];
- let Subjects = SubjectList<[Function]>;
- let LangOpts = [CUDA];
- let Documentation = [Undocumented];
-}
-
-def CUDAInvalidTarget : InheritableAttr {
- let Spellings = [];
- let Subjects = SubjectList<[Function]>;
- let LangOpts = [CUDA];
- let Documentation = [Undocumented];
-}
-
-def CUDALaunchBounds : InheritableAttr {
- let Spellings = [GNU<"launch_bounds">];
- let Args = [ExprArgument<"MaxThreads">, ExprArgument<"MinBlocks", 1>];
- let LangOpts = [CUDA];
- let Subjects = SubjectList<[ObjCMethod, FunctionLike], WarnDiag,
- "ExpectedFunctionOrMethod">;
- // An AST node is created for this attribute, but is not used by other parts
- // of the compiler. However, this node needs to exist in the AST because
- // non-LLVM backends may be relying on the attribute's presence.
- let Documentation = [Undocumented];
-}
-
-def CUDAShared : InheritableAttr {
- let Spellings = [GNU<"shared">];
- let Subjects = SubjectList<[Var]>;
- let LangOpts = [CUDA];
- let Documentation = [Undocumented];
-}
-
-def C11NoReturn : InheritableAttr {
- let Spellings = [Keyword<"_Noreturn">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let SemaHandler = 0;
- let Documentation = [C11NoReturnDocs];
-}
-
-def CXX11NoReturn : InheritableAttr {
- let Spellings = [CXX11<"","noreturn", 200809>];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [CXX11NoReturnDocs];
-}
-
-def OpenCLKernel : InheritableAttr {
- let Spellings = [Keyword<"__kernel">, Keyword<"kernel">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-// This attribute is both a type attribute, and a declaration attribute (for
-// parameter variables).
-def OpenCLImageAccess : Attr {
- let Spellings = [Keyword<"__read_only">, Keyword<"read_only">,
- Keyword<"__write_only">, Keyword<"write_only">,
- Keyword<"__read_write">, Keyword<"read_write">];
- let Subjects = SubjectList<[ParmVar], ErrorDiag>;
- let Accessors = [Accessor<"isReadOnly", [Keyword<"__read_only">,
- Keyword<"read_only">]>,
- Accessor<"isReadWrite", [Keyword<"__read_write">,
- Keyword<"read_write">]>,
- Accessor<"isWriteOnly", [Keyword<"__write_only">,
- Keyword<"write_only">]>];
- let Documentation = [Undocumented];
-}
-
-def OpenCLPrivateAddressSpace : TypeAttr {
- let Spellings = [Keyword<"__private">, Keyword<"private">];
- let Documentation = [OpenCLAddressSpacePrivateDocs];
-}
-
-def OpenCLGlobalAddressSpace : TypeAttr {
- let Spellings = [Keyword<"__global">, Keyword<"global">];
- let Documentation = [OpenCLAddressSpaceGlobalDocs];
-}
-
-def OpenCLLocalAddressSpace : TypeAttr {
- let Spellings = [Keyword<"__local">, Keyword<"local">];
- let Documentation = [OpenCLAddressSpaceLocalDocs];
-}
-
-def OpenCLConstantAddressSpace : TypeAttr {
- let Spellings = [Keyword<"__constant">, Keyword<"constant">];
- let Documentation = [OpenCLAddressSpaceConstantDocs];
-}
-
-def OpenCLGenericAddressSpace : TypeAttr {
- let Spellings = [Keyword<"__generic">, Keyword<"generic">];
- let Documentation = [OpenCLAddressSpaceGenericDocs];
-}
-
-def Deprecated : InheritableAttr {
- let Spellings = [GCC<"deprecated">, Declspec<"deprecated">,
- CXX11<"","deprecated", 201309>];
- let Args = [StringArgument<"Message", 1>];
- let Documentation = [Undocumented];
-}
-
-def Destructor : InheritableAttr {
- let Spellings = [GCC<"destructor">];
- let Args = [DefaultIntArgument<"Priority", 65535>];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def EnableIf : InheritableAttr {
- let Spellings = [GNU<"enable_if">];
- let Subjects = SubjectList<[Function]>;
- let Args = [ExprArgument<"Cond">, StringArgument<"Message">];
- let TemplateDependent = 1;
- let Documentation = [EnableIfDocs];
-}
-
-def ExtVectorType : Attr {
- let Spellings = [GNU<"ext_vector_type">];
- let Subjects = SubjectList<[TypedefName], ErrorDiag>;
- let Args = [ExprArgument<"NumElements">];
- let ASTNode = 0;
- let Documentation = [Undocumented];
-}
-
-def FallThrough : Attr {
- let Spellings = [CXX11<"clang", "fallthrough">];
-// let Subjects = [NullStmt];
- let Documentation = [FallthroughDocs];
-}
-
-def FastCall : InheritableAttr {
- let Spellings = [GCC<"fastcall">, Keyword<"__fastcall">,
- Keyword<"_fastcall">];
-// let Subjects = [Function, ObjCMethod];
- let Documentation = [FastCallDocs];
-}
-
-def Final : InheritableAttr {
- let Spellings = [Keyword<"final">, Keyword<"sealed">];
- let Accessors = [Accessor<"isSpelledAsSealed", [Keyword<"sealed">]>];
- let SemaHandler = 0;
- let Documentation = [Undocumented];
-}
-
-def MinSize : InheritableAttr {
- let Spellings = [GNU<"minsize">];
- let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def FlagEnum : InheritableAttr {
- let Spellings = [GNU<"flag_enum">];
- let Subjects = SubjectList<[Enum]>;
- let Documentation = [FlagEnumDocs];
- let LangOpts = [COnly];
-}
-
-def Flatten : InheritableAttr {
- let Spellings = [GCC<"flatten">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [FlattenDocs];
-}
-
-def Format : InheritableAttr {
- let Spellings = [GCC<"format">];
- let Args = [IdentifierArgument<"Type">, IntArgument<"FormatIdx">,
- IntArgument<"FirstArg">];
- let Subjects = SubjectList<[ObjCMethod, Block, HasFunctionProto], WarnDiag,
- "ExpectedFunctionWithProtoType">;
- let Documentation = [FormatDocs];
-}
-
-def FormatArg : InheritableAttr {
- let Spellings = [GCC<"format_arg">];
- let Args = [IntArgument<"FormatIdx">];
- let Subjects = SubjectList<[ObjCMethod, HasFunctionProto], WarnDiag,
- "ExpectedFunctionWithProtoType">;
- let Documentation = [Undocumented];
-}
-
-def GNUInline : InheritableAttr {
- let Spellings = [GCC<"gnu_inline">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def Hot : InheritableAttr {
- let Spellings = [GCC<"hot">];
- let Subjects = SubjectList<[Function]>;
- // An AST node is created for this attribute, but not actually used beyond
- // semantic checking for mutual exclusion with the Cold attribute.
- let Documentation = [Undocumented];
-}
-
-def IBAction : InheritableAttr {
- let Spellings = [GNU<"ibaction">];
- let Subjects = SubjectList<[ObjCInstanceMethod], WarnDiag,
- "ExpectedObjCInstanceMethod">;
- // An AST node is created for this attribute, but is not used by other parts
- // of the compiler. However, this node needs to exist in the AST because
- // external tools rely on it.
- let Documentation = [Undocumented];
-}
-
-def IBOutlet : InheritableAttr {
- let Spellings = [GNU<"iboutlet">];
-// let Subjects = [ObjCIvar, ObjCProperty];
- let Documentation = [Undocumented];
-}
-
-def IBOutletCollection : InheritableAttr {
- let Spellings = [GNU<"iboutletcollection">];
- let Args = [TypeArgument<"Interface", 1>];
-// let Subjects = [ObjCIvar, ObjCProperty];
- let Documentation = [Undocumented];
-}
-
-def Restrict : InheritableAttr {
- let Spellings = [Declspec<"restrict">, GCC<"malloc">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def MaxFieldAlignment : InheritableAttr {
- // This attribute has no spellings as it is only ever created implicitly.
- let Spellings = [];
- let Args = [UnsignedArgument<"Alignment">];
- let SemaHandler = 0;
- let Documentation = [Undocumented];
-}
-
-def MayAlias : InheritableAttr {
- // FIXME: this is a type attribute in GCC, but a declaration attribute here.
- let Spellings = [GCC<"may_alias">];
- let Documentation = [Undocumented];
-}
-
-def MSABI : InheritableAttr {
- let Spellings = [GCC<"ms_abi">];
-// let Subjects = [Function, ObjCMethod];
- let Documentation = [MSABIDocs];
-}
-
-def MSP430Interrupt : InheritableAttr, TargetSpecificAttr<TargetMSP430> {
- // NOTE: If you add any additional spellings, ARMInterrupt's and
- // MipsInterrupt's spellings must match.
- let Spellings = [GNU<"interrupt">];
- let Args = [UnsignedArgument<"Number">];
- let ParseKind = "Interrupt";
- let HasCustomParsing = 1;
- let Documentation = [Undocumented];
-}
-
-def Mips16 : InheritableAttr, TargetSpecificAttr<TargetMips> {
- let Spellings = [GCC<"mips16">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def MipsInterrupt : InheritableAttr, TargetSpecificAttr<TargetMips> {
- // NOTE: If you add any additional spellings, ARMInterrupt's and
- // MSP430Interrupt's spellings must match.
- let Spellings = [GNU<"interrupt">];
- let Subjects = SubjectList<[Function]>;
- let Args = [EnumArgument<"Interrupt", "InterruptType",
- ["vector=sw0", "vector=sw1", "vector=hw0",
- "vector=hw1", "vector=hw2", "vector=hw3",
- "vector=hw4", "vector=hw5", "eic", ""],
- ["sw0", "sw1", "hw0", "hw1", "hw2", "hw3",
- "hw4", "hw5", "eic", "eic"]
- >];
- let ParseKind = "Interrupt";
- let Documentation = [MipsInterruptDocs];
-}
-
-def Mode : Attr {
- let Spellings = [GCC<"mode">];
- let Args = [IdentifierArgument<"Mode">];
- let Documentation = [Undocumented];
-}
-
-def Naked : InheritableAttr {
- let Spellings = [GCC<"naked">, Declspec<"naked">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def NeonPolyVectorType : TypeAttr {
- let Spellings = [GNU<"neon_polyvector_type">];
- let Args = [IntArgument<"NumElements">];
- let Documentation = [Undocumented];
-}
-
-def NeonVectorType : TypeAttr {
- let Spellings = [GNU<"neon_vector_type">];
- let Args = [IntArgument<"NumElements">];
- let Documentation = [Undocumented];
-}
-
-def ReturnsTwice : InheritableAttr {
- let Spellings = [GCC<"returns_twice">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def DisableTailCalls : InheritableAttr {
- let Spellings = [GNU<"disable_tail_calls">,
- CXX11<"clang", "disable_tail_calls">];
- let Subjects = SubjectList<[Function, ObjCMethod]>;
- let Documentation = [DisableTailCallsDocs];
-}
-
-def NoAlias : InheritableAttr {
- let Spellings = [Declspec<"noalias">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [NoAliasDocs];
-}
-
-def NoCommon : InheritableAttr {
- let Spellings = [GCC<"nocommon">];
- let Subjects = SubjectList<[Var]>;
- let Documentation = [Undocumented];
-}
-
-def NoDebug : InheritableAttr {
- let Spellings = [GCC<"nodebug">];
- let Documentation = [Undocumented];
-}
-
-def NoDuplicate : InheritableAttr {
- let Spellings = [GNU<"noduplicate">, CXX11<"clang", "noduplicate">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [NoDuplicateDocs];
-}
-
-def NoInline : InheritableAttr {
- let Spellings = [GCC<"noinline">, Declspec<"noinline">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def NoMips16 : InheritableAttr, TargetSpecificAttr<TargetMips> {
- let Spellings = [GCC<"nomips16">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-// This is not a TargetSpecificAttr so that is silently accepted and
-// ignored on other targets as encouraged by the OpenCL spec.
-//
-// See OpenCL 1.2 6.11.5: "It is our intention that a particular
-// implementation of OpenCL be free to ignore all attributes and the
-// resulting executable binary will produce the same result."
-//
-// However, only AMD GPU targets will emit the corresponding IR
-// attribute.
-//
-// FIXME: This provides a sub-optimal error message if you attempt to
-// use this in CUDA, since CUDA does not use the same terminology.
-def AMDGPUNumVGPR : InheritableAttr {
- let Spellings = [GNU<"amdgpu_num_vgpr">];
- let Args = [UnsignedArgument<"NumVGPR">];
- let Documentation = [AMDGPUNumVGPRDocs];
-
-// FIXME: This should be for OpenCLKernelFunction, but is not to
-// workaround needing to see kernel attribute before others to know if
-// this should be rejected on non-kernels.
- let Subjects = SubjectList<[Function], ErrorDiag,
- "ExpectedKernelFunction">;
-}
-
-def AMDGPUNumSGPR : InheritableAttr {
- let Spellings = [GNU<"amdgpu_num_sgpr">];
- let Args = [UnsignedArgument<"NumSGPR">];
- let Documentation = [AMDGPUNumSGPRDocs];
- let Subjects = SubjectList<[Function], ErrorDiag,
- "ExpectedKernelFunction">;
-}
-
-def NoSplitStack : InheritableAttr {
- let Spellings = [GCC<"no_split_stack">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [NoSplitStackDocs];
-}
-
-def NonNull : InheritableAttr {
- let Spellings = [GCC<"nonnull">];
- let Subjects = SubjectList<[ObjCMethod, HasFunctionProto, ParmVar], WarnDiag,
- "ExpectedFunctionMethodOrParameter">;
- let Args = [VariadicUnsignedArgument<"Args">];
- let AdditionalMembers =
-[{bool isNonNull(unsigned idx) const {
- if (!args_size())
- return true;
- for (const auto &V : args())
- if (V == idx)
- return true;
- return false;
- } }];
- // FIXME: We should merge duplicates into a single nonnull attribute.
- let DuplicatesAllowedWhileMerging = 1;
- let Documentation = [NonNullDocs];
-}
-
-def ReturnsNonNull : InheritableAttr {
- let Spellings = [GCC<"returns_nonnull">];
- let Subjects = SubjectList<[ObjCMethod, Function], WarnDiag,
- "ExpectedFunctionOrMethod">;
- let Documentation = [ReturnsNonNullDocs];
-}
-
-// pass_object_size(N) indicates that the parameter should have
-// __builtin_object_size with Type=N evaluated on the parameter at the callsite.
-def PassObjectSize : InheritableParamAttr {
- let Spellings = [GNU<"pass_object_size">];
- let Args = [IntArgument<"Type">];
- let Subjects = SubjectList<[ParmVar]>;
- let Documentation = [PassObjectSizeDocs];
-}
-
-// Nullability type attributes.
-def TypeNonNull : TypeAttr {
- let Spellings = [Keyword<"_Nonnull">];
- let Documentation = [TypeNonNullDocs];
-}
-
-def TypeNullable : TypeAttr {
- let Spellings = [Keyword<"_Nullable">];
- let Documentation = [TypeNullableDocs];
-}
-
-def TypeNullUnspecified : TypeAttr {
- let Spellings = [Keyword<"_Null_unspecified">];
- let Documentation = [TypeNullUnspecifiedDocs];
-}
-
-def ObjCKindOf : TypeAttr {
- let Spellings = [Keyword<"__kindof">];
- let Documentation = [Undocumented];
-}
-
-def AssumeAligned : InheritableAttr {
- let Spellings = [GCC<"assume_aligned">];
- let Subjects = SubjectList<[ObjCMethod, Function]>;
- let Args = [ExprArgument<"Alignment">, ExprArgument<"Offset", 1>];
- let Documentation = [AssumeAlignedDocs];
-}
-
-def NoReturn : InheritableAttr {
- let Spellings = [GCC<"noreturn">, Declspec<"noreturn">];
- // FIXME: Does GCC allow this on the function instead?
- let Documentation = [Undocumented];
-}
-
-def NoInstrumentFunction : InheritableAttr {
- let Spellings = [GCC<"no_instrument_function">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def NotTailCalled : InheritableAttr {
- let Spellings = [GNU<"not_tail_called">, CXX11<"clang", "not_tail_called">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [NotTailCalledDocs];
-}
-
-def NoThrow : InheritableAttr {
- let Spellings = [GCC<"nothrow">, Declspec<"nothrow">];
- let Documentation = [Undocumented];
-}
-
-def NvWeak : IgnoredAttr {
- let Spellings = [GNU<"nv_weak">];
- let LangOpts = [CUDA];
-}
-
-def ObjCBridge : InheritableAttr {
- let Spellings = [GNU<"objc_bridge">];
- let Subjects = SubjectList<[Record, TypedefName], ErrorDiag,
- "ExpectedStructOrUnionOrTypedef">;
- let Args = [IdentifierArgument<"BridgedType">];
- let Documentation = [Undocumented];
-}
-
-def ObjCBridgeMutable : InheritableAttr {
- let Spellings = [GNU<"objc_bridge_mutable">];
- let Subjects = SubjectList<[Record], ErrorDiag>;
- let Args = [IdentifierArgument<"BridgedType">];
- let Documentation = [Undocumented];
-}
-
-def ObjCBridgeRelated : InheritableAttr {
- let Spellings = [GNU<"objc_bridge_related">];
- let Subjects = SubjectList<[Record], ErrorDiag>;
- let Args = [IdentifierArgument<"RelatedClass">,
- IdentifierArgument<"ClassMethod", 1>,
- IdentifierArgument<"InstanceMethod", 1>];
- let HasCustomParsing = 1;
- let Documentation = [Undocumented];
-}
-
-def NSReturnsRetained : InheritableAttr {
- let Spellings = [GNU<"ns_returns_retained">];
-// let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
- let Documentation = [Undocumented];
-}
-
-def NSReturnsNotRetained : InheritableAttr {
- let Spellings = [GNU<"ns_returns_not_retained">];
-// let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
- let Documentation = [Undocumented];
-}
-
-def NSReturnsAutoreleased : InheritableAttr {
- let Spellings = [GNU<"ns_returns_autoreleased">];
-// let Subjects = SubjectList<[ObjCMethod, ObjCProperty, Function]>;
- let Documentation = [Undocumented];
-}
-
-def NSConsumesSelf : InheritableAttr {
- let Spellings = [GNU<"ns_consumes_self">];
- let Subjects = SubjectList<[ObjCMethod]>;
- let Documentation = [Undocumented];
-}
-
-def NSConsumed : InheritableParamAttr {
- let Spellings = [GNU<"ns_consumed">];
- let Subjects = SubjectList<[ParmVar]>;
- let Documentation = [Undocumented];
-}
-
-def ObjCException : InheritableAttr {
- let Spellings = [GNU<"objc_exception">];
- let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def ObjCMethodFamily : InheritableAttr {
- let Spellings = [GNU<"objc_method_family">];
- let Subjects = SubjectList<[ObjCMethod], ErrorDiag>;
- let Args = [EnumArgument<"Family", "FamilyKind",
- ["none", "alloc", "copy", "init", "mutableCopy", "new"],
- ["OMF_None", "OMF_alloc", "OMF_copy", "OMF_init",
- "OMF_mutableCopy", "OMF_new"]>];
- let Documentation = [ObjCMethodFamilyDocs];
-}
-
-def ObjCNSObject : InheritableAttr {
- let Spellings = [GNU<"NSObject">];
- let Documentation = [Undocumented];
-}
-
-def ObjCIndependentClass : InheritableAttr {
- let Spellings = [GNU<"objc_independent_class">];
- let Documentation = [Undocumented];
-}
-
-def ObjCPreciseLifetime : InheritableAttr {
- let Spellings = [GNU<"objc_precise_lifetime">];
- let Subjects = SubjectList<[Var], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def ObjCReturnsInnerPointer : InheritableAttr {
- let Spellings = [GNU<"objc_returns_inner_pointer">];
- let Subjects = SubjectList<[ObjCMethod, ObjCProperty], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def ObjCRequiresSuper : InheritableAttr {
- let Spellings = [GNU<"objc_requires_super">];
- let Subjects = SubjectList<[ObjCMethod], ErrorDiag>;
- let Documentation = [ObjCRequiresSuperDocs];
-}
-
-def ObjCRootClass : InheritableAttr {
- let Spellings = [GNU<"objc_root_class">];
- let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def ObjCExplicitProtocolImpl : InheritableAttr {
- let Spellings = [GNU<"objc_protocol_requires_explicit_implementation">];
- let Subjects = SubjectList<[ObjCProtocol], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def ObjCDesignatedInitializer : Attr {
- let Spellings = [GNU<"objc_designated_initializer">];
- let Subjects = SubjectList<[ObjCInterfaceDeclInitMethod], ErrorDiag,
- "ExpectedObjCInterfaceDeclInitMethod">;
- let Documentation = [Undocumented];
-}
-
-def ObjCRuntimeName : Attr {
- let Spellings = [GNU<"objc_runtime_name">];
- let Subjects = SubjectList<[ObjCInterface, ObjCProtocol], ErrorDiag>;
- let Args = [StringArgument<"MetadataName">];
- let Documentation = [ObjCRuntimeNameDocs];
-}
-
-def ObjCBoxable : Attr {
- let Spellings = [GNU<"objc_boxable">];
- let Subjects = SubjectList<[Record], ErrorDiag, "ExpectedStructOrUnion">;
- let Documentation = [ObjCBoxableDocs];
-}
-
-def OptimizeNone : InheritableAttr {
- let Spellings = [GNU<"optnone">, CXX11<"clang", "optnone">];
- let Subjects = SubjectList<[Function, ObjCMethod]>;
- let Documentation = [OptnoneDocs];
-}
-
-def Overloadable : Attr {
- let Spellings = [GNU<"overloadable">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [OverloadableDocs];
-}
-
-def Override : InheritableAttr {
- let Spellings = [Keyword<"override">];
- let SemaHandler = 0;
- let Documentation = [Undocumented];
-}
-
-def Ownership : InheritableAttr {
- let Spellings = [GNU<"ownership_holds">, GNU<"ownership_returns">,
- GNU<"ownership_takes">];
- let Accessors = [Accessor<"isHolds", [GNU<"ownership_holds">]>,
- Accessor<"isReturns", [GNU<"ownership_returns">]>,
- Accessor<"isTakes", [GNU<"ownership_takes">]>];
- let AdditionalMembers = [{
- enum OwnershipKind { Holds, Returns, Takes };
- OwnershipKind getOwnKind() const {
- return isHolds() ? Holds :
- isTakes() ? Takes :
- Returns;
- }
- }];
- let Args = [IdentifierArgument<"Module">, VariadicUnsignedArgument<"Args">];
- let Subjects = SubjectList<[HasFunctionProto], WarnDiag,
- "ExpectedFunctionWithProtoType">;
- let Documentation = [Undocumented];
-}
-
-def Packed : InheritableAttr {
- let Spellings = [GCC<"packed">];
-// let Subjects = [Tag, Field];
- let Documentation = [Undocumented];
-}
-
-def IntelOclBicc : InheritableAttr {
- let Spellings = [GNU<"intel_ocl_bicc">];
-// let Subjects = [Function, ObjCMethod];
- let Documentation = [Undocumented];
-}
-
-def Pcs : InheritableAttr {
- let Spellings = [GCC<"pcs">];
- let Args = [EnumArgument<"PCS", "PCSType",
- ["aapcs", "aapcs-vfp"],
- ["AAPCS", "AAPCS_VFP"]>];
-// let Subjects = [Function, ObjCMethod];
- let Documentation = [PcsDocs];
-}
-
-def Pure : InheritableAttr {
- let Spellings = [GCC<"pure">];
- let Documentation = [Undocumented];
-}
-
-def Regparm : TypeAttr {
- let Spellings = [GCC<"regparm">];
- let Args = [UnsignedArgument<"NumParams">];
- let Documentation = [RegparmDocs];
-}
-
-def ReqdWorkGroupSize : InheritableAttr {
- let Spellings = [GNU<"reqd_work_group_size">];
- let Args = [UnsignedArgument<"XDim">, UnsignedArgument<"YDim">,
- UnsignedArgument<"ZDim">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def WorkGroupSizeHint : InheritableAttr {
- let Spellings = [GNU<"work_group_size_hint">];
- let Args = [UnsignedArgument<"XDim">,
- UnsignedArgument<"YDim">,
- UnsignedArgument<"ZDim">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def InitPriority : InheritableAttr {
- let Spellings = [GNU<"init_priority">];
- let Args = [UnsignedArgument<"Priority">];
- let Subjects = SubjectList<[Var], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def Section : InheritableAttr {
- let Spellings = [GCC<"section">, Declspec<"allocate">];
- let Args = [StringArgument<"Name">];
- let Subjects = SubjectList<[Function, GlobalVar,
- ObjCMethod, ObjCProperty], ErrorDiag,
- "ExpectedFunctionGlobalVarMethodOrProperty">;
- let Documentation = [SectionDocs];
-}
-
-def Sentinel : InheritableAttr {
- let Spellings = [GCC<"sentinel">];
- let Args = [DefaultIntArgument<"Sentinel", 0>,
- DefaultIntArgument<"NullPos", 0>];
-// let Subjects = SubjectList<[Function, ObjCMethod, Block, Var]>;
- let Documentation = [Undocumented];
-}
-
-def StdCall : InheritableAttr {
- let Spellings = [GCC<"stdcall">, Keyword<"__stdcall">, Keyword<"_stdcall">];
-// let Subjects = [Function, ObjCMethod];
- let Documentation = [StdCallDocs];
-}
-
-def SysVABI : InheritableAttr {
- let Spellings = [GCC<"sysv_abi">];
-// let Subjects = [Function, ObjCMethod];
- let Documentation = [Undocumented];
-}
-
-def ThisCall : InheritableAttr {
- let Spellings = [GCC<"thiscall">, Keyword<"__thiscall">,
- Keyword<"_thiscall">];
-// let Subjects = [Function, ObjCMethod];
- let Documentation = [ThisCallDocs];
-}
-
-def VectorCall : InheritableAttr {
- let Spellings = [GNU<"vectorcall">, Keyword<"__vectorcall">,
- Keyword<"_vectorcall">];
-// let Subjects = [Function, ObjCMethod];
- let Documentation = [VectorCallDocs];
-}
-
-def Pascal : InheritableAttr {
- let Spellings = [GNU<"pascal">, Keyword<"__pascal">, Keyword<"_pascal">];
-// let Subjects = [Function, ObjCMethod];
- let Documentation = [Undocumented];
-}
-
-def Target : InheritableAttr {
- let Spellings = [GCC<"target">];
- let Args = [StringArgument<"featuresStr">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [TargetDocs];
- let AdditionalMembers = [{
- typedef std::pair<std::vector<std::string>, StringRef> ParsedTargetAttr;
- ParsedTargetAttr parse() const {
- ParsedTargetAttr Ret;
- SmallVector<StringRef, 1> AttrFeatures;
- getFeaturesStr().split(AttrFeatures, ",");
-
- // Grab the various features and prepend a "+" to turn on the feature to
- // the backend and add them to our existing set of features.
- for (auto &Feature : AttrFeatures) {
- // Go ahead and trim whitespace rather than either erroring or
- // accepting it weirdly.
- Feature = Feature.trim();
-
- // We don't support cpu tuning this way currently.
- // TODO: Support the fpmath option. It will require checking
- // overall feature validity for the function with the rest of the
- // attributes on the function.
- if (Feature.startswith("fpmath=") || Feature.startswith("tune="))
- continue;
-
- // While we're here iterating check for a different target cpu.
- if (Feature.startswith("arch="))
- Ret.second = Feature.split("=").second.trim();
- else if (Feature.startswith("no-"))
- Ret.first.push_back("-" + Feature.split("-").second.str());
- else
- Ret.first.push_back("+" + Feature.str());
- }
- return Ret;
- }
- }];
-}
-
-def TransparentUnion : InheritableAttr {
- let Spellings = [GCC<"transparent_union">];
-// let Subjects = SubjectList<[Record, TypedefName]>;
- let Documentation = [Undocumented];
-}
-
-def Unavailable : InheritableAttr {
- let Spellings = [GNU<"unavailable">];
- let Args = [StringArgument<"Message", 1>,
- EnumArgument<"ImplicitReason", "ImplicitReason",
- ["", "", "", ""],
- ["IR_None",
- "IR_ARCForbiddenType",
- "IR_ForbiddenWeak",
- "IR_ARCForbiddenConversion",
- "IR_ARCInitReturnsUnrelated",
- "IR_ARCFieldWithOwnership"], 1, /*fake*/ 1>];
- let Documentation = [Undocumented];
-}
-
-def ArcWeakrefUnavailable : InheritableAttr {
- let Spellings = [GNU<"objc_arc_weak_reference_unavailable">];
- let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def ObjCGC : TypeAttr {
- let Spellings = [GNU<"objc_gc">];
- let Args = [IdentifierArgument<"Kind">];
- let Documentation = [Undocumented];
-}
-
-def ObjCOwnership : InheritableAttr {
- let Spellings = [GNU<"objc_ownership">];
- let Args = [IdentifierArgument<"Kind">];
- let ASTNode = 0;
- let Documentation = [Undocumented];
-}
-
-def ObjCRequiresPropertyDefs : InheritableAttr {
- let Spellings = [GNU<"objc_requires_property_definitions">];
- let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def Unused : InheritableAttr {
- let Spellings = [GCC<"unused">];
- let Subjects = SubjectList<[Var, ObjCIvar, Type, Label, Field, ObjCMethod,
- FunctionLike], WarnDiag,
- "ExpectedVariableFunctionOrLabel">;
- let Documentation = [Undocumented];
-}
-
-def Used : InheritableAttr {
- let Spellings = [GCC<"used">];
- let Documentation = [Undocumented];
-}
-
-def Uuid : InheritableAttr {
- let Spellings = [Declspec<"uuid">];
- let Args = [StringArgument<"Guid">];
-// let Subjects = SubjectList<[CXXRecord]>;
- let LangOpts = [MicrosoftExt, Borland];
- let Documentation = [Undocumented];
-}
-
-def VectorSize : TypeAttr {
- let Spellings = [GCC<"vector_size">];
- let Args = [ExprArgument<"NumBytes">];
- let Documentation = [Undocumented];
-}
-
-def VecTypeHint : InheritableAttr {
- let Spellings = [GNU<"vec_type_hint">];
- let Args = [TypeArgument<"TypeHint">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def Visibility : InheritableAttr {
- let Clone = 0;
- let Spellings = [GCC<"visibility">];
- let Args = [EnumArgument<"Visibility", "VisibilityType",
- ["default", "hidden", "internal", "protected"],
- ["Default", "Hidden", "Hidden", "Protected"]>];
- let Documentation = [Undocumented];
-}
-
-def TypeVisibility : InheritableAttr {
- let Clone = 0;
- let Spellings = [GNU<"type_visibility">, CXX11<"clang", "type_visibility">];
- let Args = [EnumArgument<"Visibility", "VisibilityType",
- ["default", "hidden", "internal", "protected"],
- ["Default", "Hidden", "Hidden", "Protected"]>];
-// let Subjects = [Tag, ObjCInterface, Namespace];
- let Documentation = [Undocumented];
-}
-
-def VecReturn : InheritableAttr {
- let Spellings = [GNU<"vecreturn">];
- let Subjects = SubjectList<[CXXRecord], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def WarnUnused : InheritableAttr {
- let Spellings = [GNU<"warn_unused">];
- let Subjects = SubjectList<[Record]>;
- let Documentation = [Undocumented];
-}
-
-def WarnUnusedResult : InheritableAttr {
- let Spellings = [GCC<"warn_unused_result">,
- CXX11<"clang", "warn_unused_result">];
- let Subjects = SubjectList<[ObjCMethod, CXXRecord, FunctionLike], WarnDiag,
- "ExpectedFunctionMethodOrClass">;
- let Documentation = [Undocumented];
-}
-
-def Weak : InheritableAttr {
- let Spellings = [GCC<"weak">];
- let Subjects = SubjectList<[Var, Function, CXXRecord]>;
- let Documentation = [Undocumented];
-}
-
-def WeakImport : InheritableAttr {
- let Spellings = [GNU<"weak_import">];
- let Documentation = [Undocumented];
-}
-
-def WeakRef : InheritableAttr {
- let Spellings = [GCC<"weakref">];
- // A WeakRef that has an argument is treated as being an AliasAttr
- let Args = [StringArgument<"Aliasee", 1>];
- let Subjects = SubjectList<[Var, Function], ErrorDiag>;
- let Documentation = [Undocumented];
-}
-
-def X86ForceAlignArgPointer : InheritableAttr, TargetSpecificAttr<TargetX86> {
- let Spellings = [GNU<"force_align_arg_pointer">];
- // Technically, this appertains to a FunctionDecl, but the target-specific
- // code silently allows anything function-like (such as typedefs or function
- // pointers), but does not apply the attribute to them.
- let Documentation = [Undocumented];
-}
-
-def NoSanitize : InheritableAttr {
- let Spellings = [GNU<"no_sanitize">, CXX11<"clang", "no_sanitize">];
- let Args = [VariadicStringArgument<"Sanitizers">];
- let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>;
- let Documentation = [NoSanitizeDocs];
- let AdditionalMembers = [{
- SanitizerMask getMask() const {
- SanitizerMask Mask = 0;
- for (auto SanitizerName : sanitizers()) {
- SanitizerMask ParsedMask =
- parseSanitizerValue(SanitizerName, /*AllowGroups=*/true);
- Mask |= expandSanitizerGroups(ParsedMask);
- }
- return Mask;
- }
- }];
-}
-
-// Attributes to disable a specific sanitizer. No new sanitizers should be added
-// to this list; the no_sanitize attribute should be extended instead.
-def NoSanitizeSpecific : InheritableAttr {
- let Spellings = [GCC<"no_address_safety_analysis">,
- GCC<"no_sanitize_address">,
- GCC<"no_sanitize_thread">,
- GNU<"no_sanitize_memory">];
- let Subjects = SubjectList<[Function], ErrorDiag>;
- let Documentation = [NoSanitizeAddressDocs, NoSanitizeThreadDocs,
- NoSanitizeMemoryDocs];
- let ASTNode = 0;
-}
-
-// C/C++ Thread safety attributes (e.g. for deadlock, data race checking)
-
-def GuardedVar : InheritableAttr {
- let Spellings = [GNU<"guarded_var">];
- let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
- "ExpectedFieldOrGlobalVar">;
- let Documentation = [Undocumented];
-}
-
-def PtGuardedVar : InheritableAttr {
- let Spellings = [GNU<"pt_guarded_var">];
- let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
- "ExpectedFieldOrGlobalVar">;
- let Documentation = [Undocumented];
-}
-
-def Lockable : InheritableAttr {
- let Spellings = [GNU<"lockable">];
- let Subjects = SubjectList<[Record]>;
- let Documentation = [Undocumented];
- let ASTNode = 0; // Replaced by Capability
-}
-
-def ScopedLockable : InheritableAttr {
- let Spellings = [GNU<"scoped_lockable">];
- let Subjects = SubjectList<[Record]>;
- let Documentation = [Undocumented];
-}
-
-def Capability : InheritableAttr {
- let Spellings = [GNU<"capability">, CXX11<"clang", "capability">,
- GNU<"shared_capability">,
- CXX11<"clang", "shared_capability">];
- let Subjects = SubjectList<[Record, TypedefName], ErrorDiag,
- "ExpectedStructOrUnionOrTypedef">;
- let Args = [StringArgument<"Name">];
- let Accessors = [Accessor<"isShared",
- [GNU<"shared_capability">,
- CXX11<"clang","shared_capability">]>];
- let Documentation = [Undocumented];
- let AdditionalMembers = [{
- bool isMutex() const { return getName().equals_lower("mutex"); }
- bool isRole() const { return getName().equals_lower("role"); }
- }];
-}
-
-def AssertCapability : InheritableAttr {
- let Spellings = [GNU<"assert_capability">,
- CXX11<"clang", "assert_capability">,
- GNU<"assert_shared_capability">,
- CXX11<"clang", "assert_shared_capability">];
- let Subjects = SubjectList<[Function]>;
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Args = [ExprArgument<"Expr">];
- let Accessors = [Accessor<"isShared",
- [GNU<"assert_shared_capability">,
- CXX11<"clang", "assert_shared_capability">]>];
- let Documentation = [AssertCapabilityDocs];
-}
-
-def AcquireCapability : InheritableAttr {
- let Spellings = [GNU<"acquire_capability">,
- CXX11<"clang", "acquire_capability">,
- GNU<"acquire_shared_capability">,
- CXX11<"clang", "acquire_shared_capability">,
- GNU<"exclusive_lock_function">,
- GNU<"shared_lock_function">];
- let Subjects = SubjectList<[Function]>;
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Args = [VariadicExprArgument<"Args">];
- let Accessors = [Accessor<"isShared",
- [GNU<"acquire_shared_capability">,
- CXX11<"clang", "acquire_shared_capability">,
- GNU<"shared_lock_function">]>];
- let Documentation = [AcquireCapabilityDocs];
-}
-
-def TryAcquireCapability : InheritableAttr {
- let Spellings = [GNU<"try_acquire_capability">,
- CXX11<"clang", "try_acquire_capability">,
- GNU<"try_acquire_shared_capability">,
- CXX11<"clang", "try_acquire_shared_capability">];
- let Subjects = SubjectList<[Function],
- ErrorDiag>;
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
- let Accessors = [Accessor<"isShared",
- [GNU<"try_acquire_shared_capability">,
- CXX11<"clang", "try_acquire_shared_capability">]>];
- let Documentation = [TryAcquireCapabilityDocs];
-}
-
-def ReleaseCapability : InheritableAttr {
- let Spellings = [GNU<"release_capability">,
- CXX11<"clang", "release_capability">,
- GNU<"release_shared_capability">,
- CXX11<"clang", "release_shared_capability">,
- GNU<"release_generic_capability">,
- CXX11<"clang", "release_generic_capability">,
- GNU<"unlock_function">];
- let Subjects = SubjectList<[Function]>;
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Args = [VariadicExprArgument<"Args">];
- let Accessors = [Accessor<"isShared",
- [GNU<"release_shared_capability">,
- CXX11<"clang", "release_shared_capability">]>,
- Accessor<"isGeneric",
- [GNU<"release_generic_capability">,
- CXX11<"clang", "release_generic_capability">,
- GNU<"unlock_function">]>];
- let Documentation = [ReleaseCapabilityDocs];
-}
-
-def RequiresCapability : InheritableAttr {
- let Spellings = [GNU<"requires_capability">,
- CXX11<"clang", "requires_capability">,
- GNU<"exclusive_locks_required">,
- GNU<"requires_shared_capability">,
- CXX11<"clang", "requires_shared_capability">,
- GNU<"shared_locks_required">];
- let Args = [VariadicExprArgument<"Args">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Subjects = SubjectList<[Function]>;
- let Accessors = [Accessor<"isShared", [GNU<"requires_shared_capability">,
- GNU<"shared_locks_required">,
- CXX11<"clang","requires_shared_capability">]>];
- let Documentation = [Undocumented];
-}
-
-def NoThreadSafetyAnalysis : InheritableAttr {
- let Spellings = [GNU<"no_thread_safety_analysis">];
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def GuardedBy : InheritableAttr {
- let Spellings = [GNU<"guarded_by">];
- let Args = [ExprArgument<"Arg">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
- "ExpectedFieldOrGlobalVar">;
- let Documentation = [Undocumented];
-}
-
-def PtGuardedBy : InheritableAttr {
- let Spellings = [GNU<"pt_guarded_by">];
- let Args = [ExprArgument<"Arg">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
- "ExpectedFieldOrGlobalVar">;
- let Documentation = [Undocumented];
-}
-
-def AcquiredAfter : InheritableAttr {
- let Spellings = [GNU<"acquired_after">];
- let Args = [VariadicExprArgument<"Args">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
- "ExpectedFieldOrGlobalVar">;
- let Documentation = [Undocumented];
-}
-
-def AcquiredBefore : InheritableAttr {
- let Spellings = [GNU<"acquired_before">];
- let Args = [VariadicExprArgument<"Args">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Subjects = SubjectList<[Field, SharedVar], WarnDiag,
- "ExpectedFieldOrGlobalVar">;
- let Documentation = [Undocumented];
-}
-
-def AssertExclusiveLock : InheritableAttr {
- let Spellings = [GNU<"assert_exclusive_lock">];
- let Args = [VariadicExprArgument<"Args">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def AssertSharedLock : InheritableAttr {
- let Spellings = [GNU<"assert_shared_lock">];
- let Args = [VariadicExprArgument<"Args">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-// The first argument is an integer or boolean value specifying the return value
-// of a successful lock acquisition.
-def ExclusiveTrylockFunction : InheritableAttr {
- let Spellings = [GNU<"exclusive_trylock_function">];
- let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-// The first argument is an integer or boolean value specifying the return value
-// of a successful lock acquisition.
-def SharedTrylockFunction : InheritableAttr {
- let Spellings = [GNU<"shared_trylock_function">];
- let Args = [ExprArgument<"SuccessValue">, VariadicExprArgument<"Args">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def LockReturned : InheritableAttr {
- let Spellings = [GNU<"lock_returned">];
- let Args = [ExprArgument<"Arg">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-def LocksExcluded : InheritableAttr {
- let Spellings = [GNU<"locks_excluded">];
- let Args = [VariadicExprArgument<"Args">];
- let LateParsed = 1;
- let TemplateDependent = 1;
- let ParseArgumentsAsUnevaluated = 1;
- let DuplicatesAllowedWhileMerging = 1;
- let Subjects = SubjectList<[Function]>;
- let Documentation = [Undocumented];
-}
-
-// C/C++ consumed attributes.
-
-def Consumable : InheritableAttr {
- let Spellings = [GNU<"consumable">];
- let Subjects = SubjectList<[CXXRecord]>;
- let Args = [EnumArgument<"DefaultState", "ConsumedState",
- ["unknown", "consumed", "unconsumed"],
- ["Unknown", "Consumed", "Unconsumed"]>];
- let Documentation = [ConsumableDocs];
-}
-
-def ConsumableAutoCast : InheritableAttr {
- let Spellings = [GNU<"consumable_auto_cast_state">];
- let Subjects = SubjectList<[CXXRecord]>;
- let Documentation = [Undocumented];
-}
-
-def ConsumableSetOnRead : InheritableAttr {
- let Spellings = [GNU<"consumable_set_state_on_read">];
- let Subjects = SubjectList<[CXXRecord]>;
- let Documentation = [Undocumented];
-}
-
-def CallableWhen : InheritableAttr {
- let Spellings = [GNU<"callable_when">];
- let Subjects = SubjectList<[CXXMethod]>;
- let Args = [VariadicEnumArgument<"CallableStates", "ConsumedState",
- ["unknown", "consumed", "unconsumed"],
- ["Unknown", "Consumed", "Unconsumed"]>];
- let Documentation = [CallableWhenDocs];
-}
-
-def ParamTypestate : InheritableAttr {
- let Spellings = [GNU<"param_typestate">];
- let Subjects = SubjectList<[ParmVar]>;
- let Args = [EnumArgument<"ParamState", "ConsumedState",
- ["unknown", "consumed", "unconsumed"],
- ["Unknown", "Consumed", "Unconsumed"]>];
- let Documentation = [ParamTypestateDocs];
-}
-
-def ReturnTypestate : InheritableAttr {
- let Spellings = [GNU<"return_typestate">];
- let Subjects = SubjectList<[Function, ParmVar]>;
- let Args = [EnumArgument<"State", "ConsumedState",
- ["unknown", "consumed", "unconsumed"],
- ["Unknown", "Consumed", "Unconsumed"]>];
- let Documentation = [ReturnTypestateDocs];
-}
-
-def SetTypestate : InheritableAttr {
- let Spellings = [GNU<"set_typestate">];
- let Subjects = SubjectList<[CXXMethod]>;
- let Args = [EnumArgument<"NewState", "ConsumedState",
- ["unknown", "consumed", "unconsumed"],
- ["Unknown", "Consumed", "Unconsumed"]>];
- let Documentation = [SetTypestateDocs];
-}
-
-def TestTypestate : InheritableAttr {
- let Spellings = [GNU<"test_typestate">];
- let Subjects = SubjectList<[CXXMethod]>;
- let Args = [EnumArgument<"TestState", "ConsumedState",
- ["consumed", "unconsumed"],
- ["Consumed", "Unconsumed"]>];
- let Documentation = [TestTypestateDocs];
-}
-
-// Type safety attributes for `void *' pointers and type tags.
-
-def ArgumentWithTypeTag : InheritableAttr {
- let Spellings = [GNU<"argument_with_type_tag">,
- GNU<"pointer_with_type_tag">];
- let Args = [IdentifierArgument<"ArgumentKind">,
- UnsignedArgument<"ArgumentIdx">,
- UnsignedArgument<"TypeTagIdx">,
- BoolArgument<"IsPointer">];
- let HasCustomParsing = 1;
- let Documentation = [ArgumentWithTypeTagDocs, PointerWithTypeTagDocs];
-}
-
-def TypeTagForDatatype : InheritableAttr {
- let Spellings = [GNU<"type_tag_for_datatype">];
- let Args = [IdentifierArgument<"ArgumentKind">,
- TypeArgument<"MatchingCType">,
- BoolArgument<"LayoutCompatible">,
- BoolArgument<"MustBeNull">];
-// let Subjects = SubjectList<[Var], ErrorDiag>;
- let HasCustomParsing = 1;
- let Documentation = [TypeTagForDatatypeDocs];
-}
-
-// Microsoft-related attributes
-
-def MSNoVTable : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
- let Spellings = [Declspec<"novtable">];
- let Subjects = SubjectList<[CXXRecord]>;
- let Documentation = [MSNoVTableDocs];
-}
-
-def : IgnoredAttr {
- let Spellings = [Declspec<"property">];
-}
-
-def MSStruct : InheritableAttr {
- let Spellings = [GCC<"ms_struct">];
- let Subjects = SubjectList<[Record]>;
- let Documentation = [Undocumented];
-}
-
-def DLLExport : InheritableAttr, TargetSpecificAttr<TargetWindows> {
- let Spellings = [Declspec<"dllexport">, GCC<"dllexport">];
- let Subjects = SubjectList<[Function, Var, CXXRecord]>;
- let Documentation = [Undocumented];
-}
-
-def DLLImport : InheritableAttr, TargetSpecificAttr<TargetWindows> {
- let Spellings = [Declspec<"dllimport">, GCC<"dllimport">];
- let Subjects = SubjectList<[Function, Var, CXXRecord]>;
- let Documentation = [Undocumented];
-}
-
-def SelectAny : InheritableAttr {
- let Spellings = [Declspec<"selectany">];
- let LangOpts = [MicrosoftExt];
- let Documentation = [Undocumented];
-}
-
-def Thread : Attr {
- let Spellings = [Declspec<"thread">];
- let LangOpts = [MicrosoftExt];
- let Documentation = [ThreadDocs];
- let Subjects = SubjectList<[Var]>;
-}
-
-def Win64 : IgnoredAttr {
- let Spellings = [Keyword<"__w64">];
- let LangOpts = [MicrosoftExt];
-}
-
-def Ptr32 : TypeAttr {
- let Spellings = [Keyword<"__ptr32">];
- let Documentation = [Undocumented];
-}
-
-def Ptr64 : TypeAttr {
- let Spellings = [Keyword<"__ptr64">];
- let Documentation = [Undocumented];
-}
-
-def SPtr : TypeAttr {
- let Spellings = [Keyword<"__sptr">];
- let Documentation = [Undocumented];
-}
-
-def UPtr : TypeAttr {
- let Spellings = [Keyword<"__uptr">];
- let Documentation = [Undocumented];
-}
-
-def MSInheritance : InheritableAttr {
- let LangOpts = [MicrosoftExt];
- let Args = [DefaultBoolArgument<"BestCase", 1>];
- let Spellings = [Keyword<"__single_inheritance">,
- Keyword<"__multiple_inheritance">,
- Keyword<"__virtual_inheritance">,
- Keyword<"__unspecified_inheritance">];
- let AdditionalMembers = [{
- static bool hasVBPtrOffsetField(Spelling Inheritance) {
- return Inheritance == Keyword_unspecified_inheritance;
- }
-
- // Only member pointers to functions need a this adjustment, since it can be
- // combined with the field offset for data pointers.
- static bool hasNVOffsetField(bool IsMemberFunction, Spelling Inheritance) {
- return IsMemberFunction && Inheritance >= Keyword_multiple_inheritance;
- }
-
- static bool hasVBTableOffsetField(Spelling Inheritance) {
- return Inheritance >= Keyword_virtual_inheritance;
- }
-
- static bool hasOnlyOneField(bool IsMemberFunction,
- Spelling Inheritance) {
- if (IsMemberFunction)
- return Inheritance <= Keyword_single_inheritance;
- return Inheritance <= Keyword_multiple_inheritance;
- }
- }];
- let Documentation = [MSInheritanceDocs];
-}
-
-def MSVtorDisp : InheritableAttr {
- // This attribute has no spellings as it is only ever created implicitly.
- let Spellings = [];
- let Args = [UnsignedArgument<"vdm">];
- let SemaHandler = 0;
-
- let AdditionalMembers = [{
- enum Mode {
- Never,
- ForVBaseOverride,
- ForVFTable
- };
-
- Mode getVtorDispMode() const { return Mode(vdm); }
- }];
- let Documentation = [Undocumented];
-}
-
-def InitSeg : Attr {
- let Spellings = [Pragma<"", "init_seg">];
- let Args = [StringArgument<"Section">];
- let SemaHandler = 0;
- let Documentation = [InitSegDocs];
- let AdditionalMembers = [{
- void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
- OS << '(' << getSection() << ')';
- }
- }];
-}
-
-def Unaligned : IgnoredAttr {
- let Spellings = [Keyword<"__unaligned">];
-}
-
-def LoopHint : Attr {
- /// #pragma clang loop <option> directive
- /// vectorize: vectorizes loop operations if State == Enable.
- /// vectorize_width: vectorize loop operations with width 'Value'.
- /// interleave: interleave multiple loop iterations if State == Enable.
- /// interleave_count: interleaves 'Value' loop interations.
- /// unroll: fully unroll loop if State == Enable.
- /// unroll_count: unrolls loop 'Value' times.
-
- /// #pragma unroll <argument> directive
- /// <no arg>: fully unrolls loop.
- /// boolean: fully unrolls loop if State == Enable.
- /// expression: unrolls loop 'Value' times.
-
- let Spellings = [Pragma<"clang", "loop">, Pragma<"", "unroll">,
- Pragma<"", "nounroll">];
-
- /// State of the loop optimization specified by the spelling.
- let Args = [EnumArgument<"Option", "OptionType",
- ["vectorize", "vectorize_width", "interleave", "interleave_count",
- "unroll", "unroll_count"],
- ["Vectorize", "VectorizeWidth", "Interleave", "InterleaveCount",
- "Unroll", "UnrollCount"]>,
- EnumArgument<"State", "LoopHintState",
- ["enable", "disable", "numeric", "assume_safety", "full"],
- ["Enable", "Disable", "Numeric", "AssumeSafety", "Full"]>,
- ExprArgument<"Value">];
-
- let AdditionalMembers = [{
- static const char *getOptionName(int Option) {
- switch(Option) {
- case Vectorize: return "vectorize";
- case VectorizeWidth: return "vectorize_width";
- case Interleave: return "interleave";
- case InterleaveCount: return "interleave_count";
- case Unroll: return "unroll";
- case UnrollCount: return "unroll_count";
- }
- llvm_unreachable("Unhandled LoopHint option.");
- }
-
- void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
- unsigned SpellingIndex = getSpellingListIndex();
- // For "#pragma unroll" and "#pragma nounroll" the string "unroll" or
- // "nounroll" is already emitted as the pragma name.
- if (SpellingIndex == Pragma_nounroll)
- return;
- else if (SpellingIndex == Pragma_unroll) {
- OS << getValueString(Policy);
- return;
- }
-
- assert(SpellingIndex == Pragma_clang_loop && "Unexpected spelling");
- OS << getOptionName(option) << getValueString(Policy);
- }
-
- // Return a string containing the loop hint argument including the
- // enclosing parentheses.
- std::string getValueString(const PrintingPolicy &Policy) const {
- std::string ValueName;
- llvm::raw_string_ostream OS(ValueName);
- OS << "(";
- if (state == Numeric)
- value->printPretty(OS, nullptr, Policy);
- else if (state == Enable)
- OS << "enable";
- else if (state == Full)
- OS << "full";
- else if (state == AssumeSafety)
- OS << "assume_safety";
- else
- OS << "disable";
- OS << ")";
- return OS.str();
- }
-
- // Return a string suitable for identifying this attribute in diagnostics.
- std::string getDiagnosticName(const PrintingPolicy &Policy) const {
- unsigned SpellingIndex = getSpellingListIndex();
- if (SpellingIndex == Pragma_nounroll)
- return "#pragma nounroll";
- else if (SpellingIndex == Pragma_unroll)
- return "#pragma unroll" + (option == UnrollCount ? getValueString(Policy) : "");
-
- assert(SpellingIndex == Pragma_clang_loop && "Unexpected spelling");
- return getOptionName(option) + getValueString(Policy);
- }
- }];
-
- let Documentation = [LoopHintDocs, UnrollHintDocs];
-}
-
-def CapturedRecord : InheritableAttr {
- // This attribute has no spellings as it is only ever created implicitly.
- let Spellings = [];
- let SemaHandler = 0;
- let Documentation = [Undocumented];
-}
-
-def OMPThreadPrivateDecl : InheritableAttr {
- // This attribute has no spellings as it is only ever created implicitly.
- let Spellings = [];
- let SemaHandler = 0;
- let Documentation = [Undocumented];
-}
-
-def InternalLinkage : InheritableAttr {
- let Spellings = [GNU<"internal_linkage">, CXX11<"clang", "internal_linkage">];
- let Subjects = SubjectList<[Var, Function, CXXRecord]>;
- let Documentation = [InternalLinkageDocs];
-}
OpenPOWER on IntegriCloud