13#ifndef LLVM_CLANG_AST_DECL_H
14#define LLVM_CLANG_AST_DECL_H
37#include "llvm/ADT/APSInt.h"
38#include "llvm/ADT/ArrayRef.h"
39#include "llvm/ADT/PointerIntPair.h"
40#include "llvm/ADT/PointerUnion.h"
41#include "llvm/ADT/StringRef.h"
42#include "llvm/ADT/iterator_range.h"
43#include "llvm/Support/Casting.h"
44#include "llvm/Support/Compiler.h"
45#include "llvm/Support/TrailingObjects.h"
56struct ASTTemplateArgumentListInfo;
58class DependentFunctionTemplateSpecializationInfo;
61class FunctionTemplateDecl;
62class FunctionTemplateSpecializationInfo;
65class MemberSpecializationInfo;
73class TemplateArgumentList;
74class TemplateArgumentListInfo;
75class TemplateParameterList;
76class TypeAliasTemplateDecl;
77class UnresolvedSetImpl;
107 virtual void anchor();
146 private llvm::TrailingObjects<PragmaCommentDecl, char> {
149 friend TrailingObjects;
155 :
Decl(PragmaComment, TU, CommentLoc), CommentKind(CommentKind) {}
157 virtual void anchor();
169 StringRef
getArg()
const {
return getTrailingObjects<char>(); }
180 private llvm::TrailingObjects<PragmaDetectMismatchDecl, char> {
183 friend TrailingObjects;
189 :
Decl(PragmaDetectMismatch, TU,
Loc), ValueStart(ValueStart) {}
191 virtual void anchor();
201 StringRef
getName()
const {
return getTrailingObjects<char>(); }
202 StringRef
getValue()
const {
return getTrailingObjects<char>() + ValueStart; }
231 virtual void anchor();
259 virtual void anchor();
262 NamedDecl *getUnderlyingDeclImpl() LLVM_READONLY;
266 :
Decl(DK, DC, L), Name(N) {}
281 assert(Name.isIdentifier() &&
"Name is not a simple identifier");
367 bool IsKnownNewer =
true)
const;
382 if (isa<EnumDecl>(DC))
445 std::optional<Visibility>
468 if (this->
getKind() != UsingShadow &&
469 this->
getKind() != ConstructorUsingShadow &&
470 this->
getKind() != ObjCCompatibleAlias &&
471 this->
getKind() != NamespaceAlias)
474 return getUnderlyingDeclImpl();
506 bool MSAsmNameResolved =
false;
515 :
NamedDecl(
Label, DC, IdentL, II), TheStmt(S), LocStart(StartL) {}
517 void anchor()
override;
629 return std::distance(
X.begin(),
X.end()) ==
630 std::distance(Y.begin(), Y.end());
674 void anchor()
override;
741 Expr *TrailingRequiresClause =
nullptr;
744 llvm::PointerUnion<TypeSourceInfo *, ExtInfo *> DeclInfo;
750 bool hasExtInfo()
const {
return isa<ExtInfo *>(DeclInfo); }
751 ExtInfo *getExtInfo() {
return cast<ExtInfo *>(DeclInfo); }
752 const ExtInfo *getExtInfo()
const {
return cast<ExtInfo *>(DeclInfo); }
758 :
ValueDecl(DK, DC, L, N,
T), DeclInfo(TInfo), InnerLocStart(StartL) {}
765 return hasExtInfo() ? getExtInfo()->TInfo
766 : cast<TypeSourceInfo *>(DeclInfo);
771 getExtInfo()->TInfo = TI;
793 return hasExtInfo() ? getExtInfo()->QualifierLoc.getNestedNameSpecifier()
801 return hasExtInfo() ? getExtInfo()->QualifierLoc
811 return hasExtInfo() ? getExtInfo()->TrailingRequiresClause
816 return hasExtInfo() ? getExtInfo()->TrailingRequiresClause
823 return hasExtInfo() ? getExtInfo()->NumTemplParamLists : 0;
828 return getExtInfo()->TemplParamLists[index];
840 return K >= firstDeclarator && K <= lastDeclarator;
924 using InitType = llvm::PointerUnion<Stmt *, EvaluatedStmt *>;
935 class VarDeclBitfields {
942 unsigned TSCSpec : 2;
944 unsigned InitStyle : 2;
948 LLVM_PREFERRED_TYPE(
bool)
949 unsigned ARCPseudoStrong : 1;
951 enum { NumVarDeclBits = 8 };
969 LLVM_PREFERRED_TYPE(VarDeclBitfields)
974 LLVM_PREFERRED_TYPE(
bool)
975 unsigned HasInheritedDefaultArg : 1;
985 LLVM_PREFERRED_TYPE(
bool)
986 unsigned IsKNRPromoted : 1;
989 LLVM_PREFERRED_TYPE(
bool)
990 unsigned IsObjCMethodParam : 1;
1008 LLVM_PREFERRED_TYPE(VarDeclBitfields)
1014 LLVM_PREFERRED_TYPE(
bool)
1015 unsigned IsThisDeclarationADemotedDefinition : 1;
1019 LLVM_PREFERRED_TYPE(
bool)
1020 unsigned ExceptionVar : 1;
1025 LLVM_PREFERRED_TYPE(
bool)
1026 unsigned NRVOVariable : 1;
1030 LLVM_PREFERRED_TYPE(
bool)
1031 unsigned CXXForRangeDecl : 1;
1034 LLVM_PREFERRED_TYPE(
bool)
1035 unsigned ObjCForDecl : 1;
1038 LLVM_PREFERRED_TYPE(
bool)
1039 unsigned IsInline : 1;
1042 LLVM_PREFERRED_TYPE(
bool)
1043 unsigned IsInlineSpecified : 1;
1046 LLVM_PREFERRED_TYPE(
bool)
1047 unsigned IsConstexpr : 1;
1051 LLVM_PREFERRED_TYPE(
bool)
1052 unsigned IsInitCapture : 1;
1057 LLVM_PREFERRED_TYPE(
bool)
1058 unsigned PreviousDeclInSameBlockScope : 1;
1065 LLVM_PREFERRED_TYPE(
bool)
1066 unsigned EscapingByref : 1;
1068 LLVM_PREFERRED_TYPE(
bool)
1069 unsigned IsCXXCondDecl : 1;
1126 assert(
VarDeclBits.TSCSpec == TSC &&
"truncation");
1208 return DC->getRedeclContext()->isFunctionOrMethod();
1295 if (K == ParmVar || K == ImplicitParam)
1361 bool IsConstantInitialization)
const;
1421 return isa<ParmVarDecl>(
this) ?
false :
1432 assert(!isa<ParmVarDecl>(
this) &&
"Cannot demote ParmVarDecls!");
1442 assert(!isa<ParmVarDecl>(
this));
1460 assert(!isa<ParmVarDecl>(
this));
1470 assert(!isa<ParmVarDecl>(
this));
1499 return isa<ParmVarDecl>(
this) ?
false
1503 assert(!isa<ParmVarDecl>(
this));
1508 assert(!isa<ParmVarDecl>(
this));
1517 assert(!isa<ParmVarDecl>(
this));
1526 assert(!isa<ParmVarDecl>(
this));
1537 return isa<ParmVarDecl>(
this)
1542 assert(!isa<ParmVarDecl>(
this));
1564 assert(!isa<ParmVarDecl>(
this));
1685 void anchor()
override;
1734 :
VarDecl(DK,
C, DC, StartLoc, IdLoc,
Id,
T, TInfo, S) {
1755 setParameterIndex(parameterIndex);
1765 setParameterIndex(parameterIndex);
1786 return getParameterIndex();
1814 return ExplicitObjectParameterIntroducerLoc.
isValid();
1818 ExplicitObjectParameterIntroducerLoc =
Loc;
1822 return ExplicitObjectParameterIntroducerLoc;
1896 void setParameterIndex(
unsigned parameterIndex) {
1897 if (parameterIndex >= ParameterIndexSentinel) {
1898 setParameterIndexLarge(parameterIndex);
1903 assert(
ParmVarDeclBits.ParameterIndex == parameterIndex &&
"truncation!");
1905 unsigned getParameterIndex()
const {
1907 return d == ParameterIndexSentinel ? getParameterIndexLarge() : d;
1910 void setParameterIndexLarge(
unsigned parameterIndex);
1911 unsigned getParameterIndexLarge()
const;
1962 : llvm::TrailingObjects<DefaultedOrDeletedFunctionInfo, DeclAccessPair,
1964 friend TrailingObjects;
1965 unsigned NumLookups;
1966 bool HasDeletedMessage;
1968 size_t numTrailingObjects(OverloadToken<DeclAccessPair>)
const {
1980 return {getTrailingObjects<DeclAccessPair>(), NumLookups};
1984 return HasDeletedMessage ? *getTrailingObjects<StringLiteral *>()
2036 TemplateOrSpecialization;
2063 void setFunctionTemplateSpecialization(
2090 const DeclarationNameInfo &NameInfo, QualType
T,
2093 Expr *TrailingRequiresClause =
nullptr);
2129 Expr *TrailingRequiresClause =
nullptr) {
2134 TrailingRequiresClause);
2142 Expr *TrailingRequiresClause);
2160 if (FPT && FPT->isVariadic())
2209 bool CheckForPendingFriendDefinition =
false)
const;
2332 "Can't set default loc is function isn't explicitly defaulted");
2333 DefaultKWLoc = NewLoc;
2339 auto *DeclAsWritten =
this;
2341 DeclAsWritten = Pattern;
2342 return !(DeclAsWritten->isDeleted() ||
2343 DeclAsWritten->getCanonicalDecl()->isDefaulted());
2523 std::optional<unsigned> *AlignmentParam =
nullptr,
2524 bool *IsNothrow =
nullptr)
const;
2646 unsigned getBuiltinID(
bool ConsiderWrapperFunctions =
false)
const;
2674 return ParamInfo[i];
2678 return ParamInfo[i];
2955 setFunctionTemplateSpecialization(
getASTContext(), Template, TemplateArgs,
2956 InsertPos, TSK, TemplateArgsAsWritten,
2957 PointOfInstantiation);
3013 if (
const auto *FPT =
3015 return FPT->getFunctionEffects();
3022 return K >= firstFunction && K <= lastFunction;
3038 enum InitStorageKind {
3054 ISK_CapturedVLAType,
3057 LLVM_PREFERRED_TYPE(
bool)
3058 unsigned BitField : 1;
3059 LLVM_PREFERRED_TYPE(
bool)
3060 unsigned Mutable : 1;
3061 LLVM_PREFERRED_TYPE(InitStorageKind)
3062 unsigned StorageKind : 2;
3063 mutable unsigned CachedFieldIndex : 28;
3067 struct InitAndBitWidthStorage {
3098 Mutable(Mutable), StorageKind((InitStorageKind)InitStyle),
3099 CachedFieldIndex(0),
Init() {
3151 "bit width or captured type already set");
3152 assert(Width &&
"no bit width specified");
3164 assert(
isBitField() &&
"no bitfield width to remove");
3168 Init = ExistingInit;
3189 return (StorageKind == ISK_CapturedVLAType ?
ICIS_NoInit
3223 StorageKind = ISK_NoInit;
3234 return StorageKind == ISK_CapturedVLAType;
3284 const llvm::APSInt &
V);
3292 const llvm::APSInt &
V);
3298 return llvm::APSInt(
getValue(), IsUnsigned);
3304 IsUnsigned =
V.isUnsigned();
3323 unsigned ChainingSize;
3329 void anchor()
override;
3352 assert(
chain().size() >= 2);
3353 return cast<FieldDecl>(
chain().back());
3357 assert(
chain().size() >= 2);
3358 return dyn_cast<VarDecl>(
chain().front());
3378 mutable const Type *TypeForDecl =
nullptr;
3383 void anchor()
override;
3414 struct alignas(8) ModedTInfo {
3421 mutable llvm::PointerIntPair<
3422 llvm::PointerUnion<TypeSourceInfo *, ModedTInfo *>, 2>
3425 void anchor()
override;
3432 MaybeModedTInfo(TInfo, 0) {}
3460 return isa<ModedTInfo *>(MaybeModedTInfo.getPointer());
3464 return isModed() ? cast<ModedTInfo *>(MaybeModedTInfo.getPointer())->first
3465 : cast<TypeSourceInfo *>(MaybeModedTInfo.getPointer());
3469 return isModed() ? cast<ModedTInfo *>(MaybeModedTInfo.getPointer())->second
3470 : cast<TypeSourceInfo *>(MaybeModedTInfo.getPointer())
3475 MaybeModedTInfo.setPointer(newType);
3480 ModedTInfo({unmodedTSI, modedTy}));
3497 if (MaybeModedTInfo.getInt())
3498 return MaybeModedTInfo.getInt() & 0x2;
3499 return isTransparentTagSlow();
3505 return K >= firstTypedefName && K <= lastTypedefName;
3509 bool isTransparentTagSlow()
const;
3543 Template(
nullptr) {}
3586 llvm::PointerUnion<TypedefNameDecl *, ExtInfo *> TypedefNameDeclOrQualifier;
3588 bool hasExtInfo()
const {
return isa<ExtInfo *>(TypedefNameDeclOrQualifier); }
3589 ExtInfo *getExtInfo() {
return cast<ExtInfo *>(TypedefNameDeclOrQualifier); }
3590 const ExtInfo *getExtInfo()
const {
3591 return cast<ExtInfo *>(TypedefNameDeclOrQualifier);
3596 SourceLocation L, IdentifierInfo *
Id, TagDecl *PrevDecl,
3597 SourceLocation StartL);
3698 TagDeclBits.IsEmbeddedInDeclarator = isInDeclarator;
3726 return TagDeclBits.IsThisDeclarationADemotedDefinition;
3733 "Should demote definitions only, not forward declarations");
3735 TagDeclBits.IsThisDeclarationADemotedDefinition =
true;
3764 TagDeclBits.TagDeclKind = llvm::to_underlying(TK);
3793 return hasExtInfo() ? nullptr
3794 : cast<TypedefNameDecl *>(TypedefNameDeclOrQualifier);
3865 llvm::PointerUnion<const Type *, TypeSourceInfo *> IntegerType;
3885 bool Scoped,
bool ScopedUsingClassTag,
bool Fixed);
3887 void anchor()
override;
3894 void setNumPositiveBits(
unsigned Num) {
3896 assert(
EnumDeclBits.NumPositiveBits ==
Num &&
"can't store this bitcount");
3922 bool hasODRHash()
const {
return EnumDeclBits.HasODRHash; }
3923 void setHasODRHash(
bool Hash =
true) {
EnumDeclBits.HasODRHash = Hash; }
3936 return cast_or_null<EnumDecl>(
3957 bool IsScoped,
bool IsScopedUsingClassTag,
3972 unsigned NumPositiveBits,
3973 unsigned NumNegativeBits);
4010 if (
const Type *
T = IntegerType.dyn_cast<
const Type*>())
4012 return cast<TypeSourceInfo *>(IntegerType)->getType().getUnqualifiedType();
4107 return SpecializationInfo;
4167 return cast_or_null<RecordDecl>(
4251 return RecordDeclBits.HasNonTrivialToPrimitiveDefaultInitializeCUnion;
4352 using field_range = llvm::iterator_range<specific_decl_iterator<FieldDecl>>;
4371 return K >= firstRecord && K <= lastRecord;
4393 void LoadFieldsFromExternalStorage()
const;
4397 void setODRHash(
unsigned Hash) {
RecordDeclBits.ODRHash = Hash; }
4406 :
Decl(FileScopeAsm, DC, StartL), AsmString(asmstring), RParenLoc(EndL) {}
4408 virtual void anchor();
4441 Stmt *Statement =
nullptr;
4442 bool IsSemiMissing =
false;
4445 :
Decl(TopLevelStmt, DC, L),
DeclContext(TopLevelStmt), Statement(S) {}
4447 virtual void anchor();
4487 llvm::PointerIntPair<VarDecl*, 2> VariableAndFlags;
4496 : VariableAndFlags(variable,
4497 (byRef ? flag_isByRef : 0) | (nested ? flag_isNested : 0)),
4505 bool isByRef()
const {
return VariableAndFlags.getInt() & flag_isByRef; }
4517 bool isNested()
const {
return VariableAndFlags.getInt() & flag_isNested; }
4529 unsigned NumParams = 0;
4531 Stmt *Body =
nullptr;
4534 const Capture *Captures =
nullptr;
4535 unsigned NumCaptures = 0;
4537 unsigned ManglingNumber = 0;
4538 Decl *ManglingContextDecl =
nullptr;
4582 return ParamInfo[i];
4586 return ParamInfo[i];
4638 bool CapturesCXXThis);
4645 ManglingNumber = Number;
4646 ManglingContextDecl = Ctx;
4654 return FPT->getFunctionEffects();
4673 private llvm::TrailingObjects<CapturedDecl, ImplicitParamDecl *> {
4684 unsigned ContextParam;
4687 llvm::PointerIntPair<Stmt *, 1, bool> BodyAndNothrow;
4692 return getTrailingObjects<ImplicitParamDecl *>();
4695 ImplicitParamDecl **getParams() {
4696 return getTrailingObjects<ImplicitParamDecl *>();
4705 unsigned NumParams);
4707 unsigned NumParams);
4718 assert(i < NumParams);
4719 return getParams()[i];
4722 assert(i < NumParams);
4736 assert(ContextParam < NumParams);
4740 assert(i < NumParams);
4786 llvm::TrailingObjects<ImportDecl, SourceLocation> {
4790 friend TrailingObjects;
4793 Module *ImportedModule =
nullptr;
4803 llvm::PointerIntPair<ImportDecl *, 1, bool> NextLocalImportAndComplete;
4813 bool isImportComplete()
const {
return NextLocalImportAndComplete.getInt(); }
4815 void setImportComplete(
bool C) { NextLocalImportAndComplete.setInt(
C); }
4819 ImportDecl *getNextLocalImport()
const {
4820 return NextLocalImportAndComplete.getPointer();
4823 void setNextLocalImport(ImportDecl *Import) {
4824 NextLocalImportAndComplete.setPointer(Import);
4830 SourceLocation StartLoc, Module *Imported,
4831 ArrayRef<SourceLocation> IdentifierLocs);
4836 SourceLocation StartLoc, Module *Imported,
4837 SourceLocation EndLoc);
4841 unsigned NumLocations);
4866 virtual void anchor();
4915 virtual void anchor();
4980template<
typename decl_type>
4984 assert(RedeclLink.isFirst() &&
4985 "setPreviousDecl on a decl already in a redeclaration chain");
4991 First = PrevDecl->getFirstDecl();
4992 assert(
First->RedeclLink.isFirst() &&
"Expected first");
4993 decl_type *MostRecent =
First->getNextRedeclaration();
4994 RedeclLink = PreviousDeclLink(cast<decl_type>(MostRecent));
4998 static_cast<decl_type*
>(
this)->IdentifierNamespace |=
4999 MostRecent->getIdentifierNamespace() &
5003 First =
static_cast<decl_type*
>(
this);
5007 First->RedeclLink.setLatest(
static_cast<decl_type*
>(
this));
5009 assert(!isa<NamedDecl>(
static_cast<decl_type*
>(
this)) ||
5010 cast<NamedDecl>(
static_cast<decl_type*
>(
this))->isLinkageValid());
5035 return "$ompvariant";
5041 bool IncludeLocallyStreaming);
Provides definitions for the various language-specific address spaces.
Defines the Diagnostic-related interfaces.
enum clang::sema::@1712::IndirectLocalPathEntry::EntryKind Kind
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
Defines the clang::Visibility enumeration and various utility functions.
void setValue(const ASTContext &C, const llvm::APInt &Val)
llvm::APInt getValue() const
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Reads an AST files chain containing the contents of a translation unit.
A class which contains all the information about a particular captured value.
bool isNested() const
Whether this is a nested capture, i.e.
void setCopyExpr(Expr *e)
Expr * getCopyExpr() const
bool isByRef() const
Whether this is a "by ref" capture, i.e.
Capture(VarDecl *variable, bool byRef, bool nested, Expr *copy)
bool isNonEscapingByref() const
VarDecl * getVariable() const
The variable being captured.
bool isEscapingByref() const
Represents a block literal declaration, which is like an unnamed FunctionDecl.
ParmVarDecl * getParamDecl(unsigned i)
static bool classofKind(Kind K)
CompoundStmt * getCompoundBody() const
static bool classof(const Decl *D)
unsigned getNumParams() const
unsigned getNumCaptures() const
Returns the number of captured variables.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
capture_const_iterator capture_begin() const
bool canAvoidCopyToHeap() const
void setDoesNotEscape(bool B=true)
param_iterator param_end()
capture_const_iterator capture_end() const
ArrayRef< Capture >::const_iterator capture_const_iterator
unsigned getBlockManglingNumber() const
param_const_iterator param_end() const
MutableArrayRef< ParmVarDecl * >::iterator param_iterator
size_t param_size() const
void setCapturesCXXThis(bool B=true)
void setSignatureAsWritten(TypeSourceInfo *Sig)
void setBlockMangling(unsigned Number, Decl *Ctx)
MutableArrayRef< ParmVarDecl * > parameters()
void setCanAvoidCopyToHeap(bool B=true)
param_iterator param_begin()
void setIsConversionFromLambda(bool val=true)
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
static DeclContext * castToDeclContext(const BlockDecl *D)
void setBlockMissingReturnType(bool val=true)
FunctionEffectsRef getFunctionEffects() const
ArrayRef< Capture > captures() const
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIsVariadic(bool value)
bool blockMissingReturnType() const
SourceLocation getCaretLocation() const
bool capturesCXXThis() const
bool capturesVariable(const VarDecl *var) const
bool doesNotEscape() const
bool hasCaptures() const
True if this block (or its nested blocks) captures anything of local storage from its enclosing scope...
Decl * getBlockManglingContextDecl() const
ArrayRef< ParmVarDecl * >::const_iterator param_const_iterator
static BlockDecl * castFromDeclContext(const DeclContext *DC)
const ParmVarDecl * getParamDecl(unsigned i) const
void setBody(CompoundStmt *B)
param_const_iterator param_begin() const
bool isConversionFromLambda() const
ArrayRef< ParmVarDecl * > parameters() const
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
TypeSourceInfo * getSignatureAsWritten() const
Represents the body of a CapturedStmt, and serves as its DeclContext.
unsigned getNumParams() const
static bool classof(const Decl *D)
ImplicitParamDecl *const * param_iterator
ImplicitParamDecl * getContextParam() const
Retrieve the parameter containing captured variables.
ArrayRef< ImplicitParamDecl * > parameters() const
static DeclContext * castToDeclContext(const CapturedDecl *D)
size_t numTrailingObjects(OverloadToken< ImplicitParamDecl >)
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
unsigned getContextParamPosition() const
static CapturedDecl * castFromDeclContext(const DeclContext *DC)
static bool classofKind(Kind K)
void setContextParam(unsigned i, ImplicitParamDecl *P)
void setNothrow(bool Nothrow=true)
void setParam(unsigned i, ImplicitParamDecl *P)
param_iterator param_end() const
Retrieve an iterator one past the last parameter decl.
MutableArrayRef< ImplicitParamDecl * > parameters()
param_iterator param_begin() const
Retrieve an iterator pointing to the first parameter decl.
llvm::iterator_range< param_iterator > param_range
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
ImplicitParamDecl * getParam(unsigned i) const
CharUnits - This is an opaque type for sizes expressed in character units.
CompoundStmt - This represents a group of statements like { stmt stmt }.
decl_iterator - Iterates through the declarations stored within this context.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
FunctionDeclBitfields FunctionDeclBits
TagDeclBitfields TagDeclBits
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
EnumDeclBitfields EnumDeclBits
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
BlockDeclBitfields BlockDeclBits
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
RecordDeclBitfields RecordDeclBits
NamespaceDeclBitfields NamespaceDeclBits
bool isFunctionOrMethod() const
Decl::Kind getDeclKind() const
DeclContext * getNonTransparentContext()
decl_iterator decls_begin() const
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
SourceLocation getEndLoc() const LLVM_READONLY
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
ASTContext & getASTContext() const LLVM_READONLY
bool hasCachedLinkage() const
Kind
Lists the kind of concrete classes of Decl.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
bool hasDefiningAttr() const
Return true if this declaration has an attribute which acts as definition of the entity,...
SourceLocation getLocation() const
@ IDNS_Ordinary
Ordinary names.
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
void setImplicit(bool I=true)
DeclContext * getDeclContext()
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
Module * getOwningModuleForLinkage() const
Get the module that owns this declaration for linkage purposes.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
DeclarationNameLoc - Additional source/type location info for a declaration name.
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
SourceLocation getTypeSpecEndLoc() const
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
TemplateParameterList * getTemplateParameterList(unsigned index) const
static bool classofKind(Kind K)
void setInnerLocStart(SourceLocation L)
SourceLocation getOuterLocStart() const
Return start of source range taking into account any outer template declarations.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
unsigned getNumTemplateParameterLists() const
void setTypeSourceInfo(TypeSourceInfo *TI)
DeclaratorDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
void setTrailingRequiresClause(Expr *TrailingRequiresClause)
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
Expr * getTrailingRequiresClause()
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
static bool classof(const Decl *D)
const Expr * getTrailingRequiresClause() const
TypeSourceInfo * getTypeSourceInfo() const
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Provides information about a dependent function-template specialization declaration.
@ ak_nameddecl
NamedDecl *.
Represents an empty-declaration.
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static bool classof(const Decl *D)
static bool classofKind(Kind K)
An instance of this object exists for each enum constant that is defined.
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static bool classofKind(Kind K)
const EnumConstantDecl * getCanonicalDecl() const
void setInitExpr(Expr *E)
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
llvm::APSInt getInitVal() const
EnumConstantDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this enumerator.
static bool classof(const Decl *D)
const Expr * getInitExpr() const
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
const EnumDecl * getMostRecentDecl() const
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
enumerator_range enumerators() const
void setFixed(bool Fixed=true)
True if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying type.
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
unsigned getNumNegativeBits() const
Returns the width in bits required to store all the negative enumerators of this enum.
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
enumerator_iterator enumerator_begin() const
bool isComplete() const
Returns true if this can be considered a complete type.
void setInstantiationOfMemberEnum(EnumDecl *ED, TemplateSpecializationKind TSK)
Specify that this enumeration is an instantiation of the member enumeration ED.
const EnumDecl * getCanonicalDecl() const
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For an enumeration member that was instantiated from a member enumeration of a templated class,...
TypeSourceInfo * getIntegerTypeSourceInfo() const
Return the type source info for the underlying integer type, if no type source info exists,...
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
bool isClosedFlag() const
Returns true if this enum is annotated with flag_enum and isn't annotated with enum_extensibility(ope...
EnumDecl * getMostRecentDecl()
void setScoped(bool Scoped=true)
True if this tag declaration is a scoped enumeration.
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
SourceRange getIntegerTypeRange() const LLVM_READONLY
Retrieve the source range that covers the underlying type if specified.
void setPromotionType(QualType T)
Set the promotion type.
EnumDecl * getPreviousDecl()
SourceRange getSourceRange() const override LLVM_READONLY
Overrides to provide correct range when there's an enum-base specifier with forward declarations.
static bool classofKind(Kind K)
llvm::iterator_range< specific_decl_iterator< EnumConstantDecl > > enumerator_range
static bool classof(const Decl *D)
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
EnumDecl * getDefinition() const
unsigned getNumPositiveBits() const
Returns the width in bits required to store all the non-negative enumerators of this enum.
const EnumDecl * getPreviousDecl() const
specific_decl_iterator< EnumConstantDecl > enumerator_iterator
TemplateSpecializationKind getTemplateSpecializationKind() const
If this enumeration is a member of a specialization of a templated class, determine what kind of temp...
void setScopedUsingClassTag(bool ScopedUCT=true)
If this tag declaration is a scoped enum, then this is true if the scoped enum was declared using the...
bool isClosed() const
Returns true if this enum is either annotated with enum_extensibility(closed) or isn't annotated with...
QualType getPromotionType() const
Return the integer type that enumerators should promote to.
EnumDecl * getTemplateInstantiationPattern() const
Retrieve the enum definition from which this enumeration could be instantiated, if it is an instantia...
bool isClosedNonFlag() const
Returns true if this enum is annotated with neither flag_enum nor enum_extensibility(open).
enumerator_iterator enumerator_end() const
void getValueRange(llvm::APInt &Max, llvm::APInt &Min) const
Calculates the [Min,Max) values the enum can store based on the NumPositiveBits and NumNegativeBits.
Represents a standard C++ module export declaration.
static bool classof(const Decl *D)
SourceLocation getRBraceLoc() const
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getExportLoc() const
static bool classofKind(Kind K)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
void setRBraceLoc(SourceLocation L)
static DeclContext * castToDeclContext(const ExportDecl *D)
static ExportDecl * castFromDeclContext(const DeclContext *DC)
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents one expression.
Declaration context for names declared as extern "C" in C++.
static DeclContext * castToDeclContext(const ExternCContextDecl *D)
static bool classof(const Decl *D)
static bool classofKind(Kind K)
static ExternCContextDecl * castFromDeclContext(const DeclContext *DC)
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool isBitField() const
Determines whether this field is a bitfield.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
FieldDecl(Kind DK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
void setBitWidth(Expr *Width)
Set the bit-field width for this member.
void removeBitWidth()
Remove the bit-field width from this member.
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
bool isZeroLengthBitField(const ASTContext &Ctx) const
Is this a zero-length bit-field? Such bit-fields aren't really bit-fields at all and instead act as a...
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
unsigned getBitWidthValue(const ASTContext &Ctx) const
Computes the bit width of this field, if this is a bit field.
void removeInClassInitializer()
Remove the C++11 in-class initializer from this member.
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
bool isZeroSize(const ASTContext &Ctx) const
Determine if this field is a subobject of zero size, that is, either a zero-length bit-field or a fie...
InitAndBitWidthStorage * InitAndBitWidth
FieldDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this field.
static bool classofKind(Kind K)
bool hasCapturedVLAType() const
Determine whether this member captures the variable length array type.
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
const FieldDecl * getCanonicalDecl() const
const FieldDecl * findCountedByField() const
Find the FieldDecl specified in a FAM's "counted_by" attribute.
const VariableArrayType * getCapturedVLAType() const
Get the captured variable length array type.
bool isPotentiallyOverlapping() const
Determine if this field is of potentially-overlapping class type, that is, subobject with the [[no_un...
void setCapturedVLAType(const VariableArrayType *VLAType)
Set the captured variable length array type for this field.
bool hasNonNullInClassInitializer() const
Determine whether getInClassInitializer() would return a non-null pointer without deserializing the i...
const VariableArrayType * CapturedVLAType
static bool classof(const Decl *D)
void setRParenLoc(SourceLocation L)
SourceLocation getAsmLoc() const
void setAsmString(StringLiteral *Asm)
static bool classofKind(Kind K)
const StringLiteral * getAsmString() const
SourceLocation getRParenLoc() const
static bool classof(const Decl *D)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
StringLiteral * getAsmString()
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Stashed information about a defaulted/deleted function body.
StringLiteral * getDeletedMessage() const
void setDeletedMessage(StringLiteral *Message)
ArrayRef< DeclAccessPair > getUnqualifiedLookups() const
Get the unqualified lookup results that should be used in this defaulted function definition.
Represents a function declaration or definition.
unsigned getMemoryFunctionKind() const
Identify a memory copying or setting function.
void setInstantiationIsPending(bool IC)
State that the instantiation of this function is pending.
bool isTargetClonesMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-clones functional...
bool isMultiVersion() const
True if this function is considered a multiversioned function.
const ParmVarDecl * getParamDecl(unsigned i) const
ExceptionSpecificationType getExceptionSpecType() const
Gets the ExceptionSpecificationType as declared.
bool isTrivialForCall() const
bool hasTrivialBody() const
Returns whether the function has a trivial body that does not require any specific codegen.
ConstexprSpecKind getConstexprKind() const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
void setPreviousDeclaration(FunctionDecl *PrevDecl)
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
const FunctionDecl * getDefinition() const
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
bool isImmediateFunction() const
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
SourceLocation getEllipsisLoc() const
Returns the location of the ellipsis of a variadic function.
static bool classofKind(Kind K)
void setHasSkippedBody(bool Skipped=true)
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
void setUsesSEHTry(bool UST)
param_iterator param_end()
StringLiteral * getDeletedMessage() const
Get the message that indicates why this function was deleted.
SourceLocation getPointOfInstantiation() const
Retrieve the (first) point of instantiation of a function template specialization or a member of a cl...
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
bool hasCXXExplicitFunctionObjectParameter() const
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
SourceLocation getDefaultLoc() const
void setInstantiationOfMemberFunction(FunctionDecl *FD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member function FD.
bool usesSEHTry() const
Indicates the function uses __try.
void setHasWrittenPrototype(bool P=true)
State that this function has a written prototype.
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isMSExternInline() const
The combination of the extern and inline keywords under MSVC forces the function to be required.
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
bool instantiationIsPending() const
Whether the instantiation of this function is pending.
unsigned getMinRequiredExplicitArguments() const
Returns the minimum number of non-object arguments needed to call this function.
const FunctionDecl * getCanonicalDecl() const
bool BodyContainsImmediateEscalatingExpressions() const
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
MutableArrayRef< ParmVarDecl * >::iterator param_iterator
FunctionDecl * getNextRedeclarationImpl() override
Returns the next redeclaration or itself if this is the only decl.
bool hasWrittenPrototype() const
Whether this function has a written prototype.
void setWillHaveBody(bool V=true)
void setDeclarationNameLoc(DeclarationNameLoc L)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
void setUsesFPIntrin(bool I)
Set whether the function was declared in source context that requires constrained FP intrinsics.
void setDefaultLoc(SourceLocation NewLoc)
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
FunctionTypeLoc getFunctionTypeLoc() const
Find the source location information for how the type of this function was written.
MutableArrayRef< ParmVarDecl * > parameters()
param_iterator param_begin()
FunctionDecl * getPreviousDeclImpl() override
Implementation of getPreviousDecl(), to be overridden by any subclass that has a redeclaration chain.
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool isVariadic() const
Whether this function is variadic.
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isConstexprSpecified() const
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
bool isDeleted() const
Whether this function has been deleted.
void setBodyContainsImmediateEscalatingExpressions(bool Set)
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
FunctionEffectsRef getFunctionEffects() const
static DeclContext * castToDeclContext(const FunctionDecl *D)
SourceRange getExceptionSpecSourceRange() const
Attempt to compute an informative source range covering the function exception specification,...
bool hasBody() const override
Returns true if this Decl represents a declaration for a body of code, such as a function or method d...
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
unsigned getODRHash()
Returns ODRHash of the function.
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Determine the kind of template specialization this function represents for the purpose of template in...
ArrayRef< ParmVarDecl * >::const_iterator param_const_iterator
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
void setInlineSpecified(bool I)
Set whether the "inline" keyword was specified for this function.
unsigned getNumNonObjectParams() const
TemplatedKind
The kind of templated function a FunctionDecl can be.
@ TK_MemberSpecialization
@ TK_DependentNonTemplate
@ TK_FunctionTemplateSpecialization
@ TK_DependentFunctionTemplateSpecialization
redeclarable_base::redecl_range redecl_range
StorageClass getStorageClass() const
Returns the storage class as written in the source.
FunctionDecl * getMostRecentDeclImpl() override
Implementation of getMostRecentDecl(), to be overridden by any subclass that has a redeclaration chai...
redeclarable_base::redecl_iterator redecl_iterator
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
bool isInlineBuiltinDeclaration() const
Determine if this function provides an inline implementation of a builtin.
bool FriendConstraintRefersToEnclosingTemplate() const
ParmVarDecl * getParamDecl(unsigned i)
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isDeletedAsWritten() const
bool isReservedGlobalPlacementOperator() const
Determines whether this operator new or delete is one of the reserved global placement operators: voi...
ParmVarDecl * getNonObjectParameter(unsigned I)
void setHasInheritedPrototype(bool P=true)
State that this function inherited its prototype from a previous declaration.
void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)
Specifies that this function declaration is actually a dependent function template specialization.
bool isInExternCContext() const
Determines whether this function's context is, or is nested within, a C++ extern "C" linkage spec.
FunctionDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass S, bool UsesFPIntrin, bool isInlineSpecified, ConstexprSpecKind ConstexprKind, Expr *TrailingRequiresClause=nullptr)
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isImplicitlyInstantiable() const
Determines whether this function is a function template specialization or a member of a class templat...
bool isExternC() const
Determines whether this function is a function with external, C linkage.
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
LazyDeclStmtPtr Body
The body of the function.
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
bool isImmediateEscalating() const
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
static bool classof(const Decl *D)
void setLateTemplateParsed(bool ILT=true)
State that this templated function will be late parsed.
DefaultedOrDeletedFunctionInfo * DefaultedOrDeletedInfo
Information about a future defaulted function definition.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isInExternCXXContext() const
Determines whether this function's context is, or is nested within, a C++ extern "C++" linkage spec.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
bool isTargetVersionMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target-version functiona...
void setTrivialForCall(bool IT)
bool isReplaceableGlobalAllocationFunction(std::optional< unsigned > *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
void setLazyBody(uint64_t Offset)
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, Expr *TrailingRequiresClause=nullptr)
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
void setRangeEnd(SourceLocation E)
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
bool isDefaulted() const
Whether this function is defaulted.
bool isIneligibleOrNotSelected() const
void setIneligibleOrNotSelected(bool II)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
FunctionDecl * getInstantiatedFromDecl() const
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Determine what kind of template instantiation this function represents.
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
void setConstexprKind(ConstexprSpecKind CSK)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
param_const_iterator param_begin() const
bool doesDeclarationForceExternallyVisibleDefinition() const
For a function declaration in C or C++, determine whether this declaration causes the definition to b...
void setDefaulted(bool D=true)
bool isTargetMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the target functionality.
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
void setStorageClass(StorageClass SClass)
Sets the storage class as written in the source.
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
bool isGlobal() const
Determines whether this is a global function.
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
void setFunctionTemplateSpecialization(FunctionTemplateDecl *Template, TemplateArgumentList *TemplateArgs, void *InsertPos, TemplateSpecializationKind TSK=TSK_ImplicitInstantiation, TemplateArgumentListInfo *TemplateArgsAsWritten=nullptr, SourceLocation PointOfInstantiation=SourceLocation())
Specify that this function declaration is actually a function template specialization.
void getAssociatedConstraints(SmallVectorImpl< const Expr * > &AC) const
Get the associated-constraints of this function declaration.
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
param_const_iterator param_end() const
bool hasInheritedPrototype() const
Whether this function inherited its prototype from a previous declaration.
bool isTargetMultiVersionDefault() const
True if this function is the default version of a multiversioned dispatch function as a part of the t...
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
bool isInlineDefinitionExternallyVisible() const
For an inline function definition in C, or for a gnu_inline function in C++, determine whether the de...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
size_t param_size() const
DeclarationNameInfo getNameInfo() const
SourceRange getParametersSourceRange() const
Attempt to compute an informative source range covering the function parameters, including the ellips...
static FunctionDecl * castFromDeclContext(const DeclContext *DC)
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
DefaultedOrDeletedFunctionInfo * getDefalutedOrDeletedInfo() const
void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const override
Appends a human-readable name for this declaration into the given stream.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
const ASTTemplateArgumentListInfo * getTemplateSpecializationArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
QualType getCallResultType() const
Determine the type of an expression that calls this function.
An immutable set of FunctionEffects and possibly conditions attached to them.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
SourceLocation getEllipsisLoc() const
Declaration of a template function.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
Wrapper for source info for functions.
FunctionType - C99 6.7.5.3 - Function Declarators.
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
static HLSLBufferDecl * castFromDeclContext(const DeclContext *DC)
static DeclContext * castToDeclContext(const HLSLBufferDecl *D)
SourceLocation getLBraceLoc() const
SourceLocation getLocStart() const LLVM_READONLY
SourceLocation getRBraceLoc() const
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
void setRBraceLoc(SourceLocation L)
static bool classofKind(Kind K)
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static bool classof(const Decl *D)
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
static bool classofKind(Kind K)
ImplicitParamDecl(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, const IdentifierInfo *Id, QualType Type, ImplicitParamKind ParamKind)
ImplicitParamKind getParameterKind() const
Returns the implicit parameter kind.
static bool classof(const Decl *D)
ImplicitParamDecl(ASTContext &C, QualType Type, ImplicitParamKind ParamKind)
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Describes a module import declaration, which makes the contents of the named module visible in the cu...
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
static bool classof(const Decl *D)
ArrayRef< SourceLocation > getIdentifierLocs() const
Retrieves the locations of each of the identifiers that make up the complete module name in the impor...
Module * getImportedModule() const
Retrieve the module that was imported by the import declaration.
static bool classofKind(Kind K)
static ImportDecl * CreateImplicit(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, Module *Imported, SourceLocation EndLoc)
Create a new module import declaration for an implicitly-generated import.
Represents a field injected from an anonymous union/struct into the parent scope.
const IndirectFieldDecl * getCanonicalDecl() const
static bool classofKind(Kind K)
static bool classof(const Decl *D)
FieldDecl * getAnonField() const
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
unsigned getChainingSize() const
IndirectFieldDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
chain_iterator chain_end() const
chain_iterator chain_begin() const
ArrayRef< NamedDecl * > chain() const
VarDecl * getVarDecl() const
ArrayRef< NamedDecl * >::const_iterator chain_iterator
Represents the declaration of a label.
static bool classofKind(Kind K)
void setMSAsmLabel(StringRef Name)
bool isResolvedMSAsmLabel() const
static bool classof(const Decl *D)
void setLocStart(SourceLocation L)
LabelStmt * getStmt() const
StringRef getMSAsmLabel() const
void setStmt(LabelStmt *T)
void setMSAsmLabelResolved()
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
bool isMSAsmLabel() const
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
LabelStmt - Represents a label, which has a substatement.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Visibility getVisibility() const
Provides information a specialization of a member of a class template, which may be a member function...
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
FieldDecl * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Describes a module or submodule.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
ExplicitVisibilityKind
Kinds of explicit visibility.
@ VisibilityForValue
Do an LV computation for, ultimately, a non-type declaration.
@ VisibilityForType
Do an LV computation for, ultimately, a type.
Linkage getLinkageInternal() const
Determine what kind of linkage this entity has.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
NamedDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N)
LinkageInfo getLinkageAndVisibility() const
Determines the linkage and visibility of this entity.
bool isLinkageValid() const
True if the computed linkage is valid.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
bool isPlaceholderVar(const LangOptions &LangOpts) const
Visibility getVisibility() const
Determines the visibility of this entity.
bool hasLinkageBeenComputed() const
True if something has required us to compute the linkage of this declaration.
bool hasExternalFormalLinkage() const
True if this decl has external linkage.
static bool classof(const Decl *D)
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
std::optional< Visibility > getExplicitVisibility(ExplicitVisibilityKind kind) const
If visibility was explicitly specified for this declaration, return that visibility.
NamedDecl * getMostRecentDecl()
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
bool declarationReplaces(const NamedDecl *OldD, bool IsKnownNewer=true) const
Determine whether this declaration, if known to be well-formed within its context,...
ObjCStringFormatFamily getObjCFStringFormattingFamily() const
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
void printQualifiedName(raw_ostream &OS) const
Returns a human-readable qualified name for this declaration, like A::B::i, for i being member of nam...
static bool classofKind(Kind K)
virtual void printName(raw_ostream &OS, const PrintingPolicy &Policy) const
Pretty-print the unqualified name of this declaration.
bool isCXXInstanceMember() const
Determine whether the given declaration is an instance member of a C++ class.
bool hasLinkage() const
Determine whether this declaration has linkage.
const NamedDecl * getMostRecentDecl() const
bool isExternallyVisible() const
void setDeclName(DeclarationName N)
Set the name of this declaration.
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine if the declaration obeys the reserved identifier rules of the given language.
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
const NamedDecl * getUnderlyingDecl() const
void printNestedNameSpecifier(raw_ostream &OS) const
Print only the nested name specifier part of a fully-qualified name, including the '::' at the end.
bool isExternallyDeclarable() const
Determine whether this declaration can be redeclared in a different translation unit.
Represent a C++ namespace.
NamespaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this namespace.
redeclarable_base::redecl_iterator redecl_iterator
SourceLocation getRBraceLoc() const
const NamespaceDecl * getCanonicalDecl() const
void setAnonymousNamespace(NamespaceDecl *D)
static bool classofKind(Kind K)
void setNested(bool Nested)
Set whether this is a nested namespace declaration.
static DeclContext * castToDeclContext(const NamespaceDecl *D)
void setLocStart(SourceLocation L)
SourceLocation getBeginLoc() const LLVM_READONLY
bool isAnonymousNamespace() const
Returns true if this is an anonymous namespace declaration.
bool isInline() const
Returns true if this is an inline namespace declaration.
static bool classof(const Decl *D)
static NamespaceDecl * castFromDeclContext(const DeclContext *DC)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
void setInline(bool Inline)
Set whether this is an inline namespace declaration.
NamespaceDecl * getAnonymousNamespace() const
Retrieve the anonymous namespace that inhabits this namespace, if any.
bool isNested() const
Returns true if this is a nested namespace declaration.
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setRBraceLoc(SourceLocation L)
redeclarable_base::redecl_range redecl_range
bool isRedundantInlineQualifierFor(DeclarationName Name) const
Returns true if the inline qualifier for Name is redundant.
A C++ nested-name-specifier augmented with source location information.
NestedNameSpecifier * getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Represents a parameter to a function.
bool isKNRPromoted() const
True if the value passed to this parameter must undergo K&R-style default argument promotion:
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
void setObjCDeclQualifier(ObjCDeclQualifier QTVal)
static bool classofKind(Kind K)
void setDefaultArg(Expr *defarg)
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
SourceLocation getExplicitObjectParamThisLoc() const
void setUnparsedDefaultArg()
Specify that this parameter has an unparsed default argument.
ParmVarDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
SourceRange getDefaultArgRange() const
Retrieve the source range that covers the entire default argument.
void setUninstantiatedDefaultArg(Expr *arg)
bool isObjCMethodParameter() const
ObjCDeclQualifier getObjCDeclQualifier() const
static constexpr unsigned getMaxFunctionScopeDepth()
const Expr * getDefaultArg() const
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
bool hasUninstantiatedDefaultArg() const
void setObjCMethodScopeInfo(unsigned parameterIndex)
bool isDestroyedInCallee() const
Determines whether this parameter is destroyed in the callee function.
bool hasInheritedDefaultArg() const
bool isExplicitObjectParameter() const
void setKNRPromoted(bool promoted)
QualType getOriginalType() const
const Expr * getUninstantiatedDefaultArg() const
void setExplicitObjectParameterLoc(SourceLocation Loc)
Expr * getUninstantiatedDefaultArg()
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
unsigned getFunctionScopeDepth() const
void setHasInheritedDefaultArg(bool I=true)
void setOwningFunction(DeclContext *FD)
Sets the function declaration that owns this ParmVarDecl.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static bool classof(const Decl *D)
Represents a #pragma detect_mismatch line.
StringRef getName() const
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
StringRef getValue() const
static bool classofKind(Kind K)
static bool classof(const Decl *D)
A (possibly-)qualified type.
Represents a struct/union/class.
bool hasLoadedFieldsFromExternalStorage() const
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
bool hasNonTrivialToPrimitiveDestructCUnion() const
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
bool hasNonTrivialToPrimitiveCopyCUnion() const
bool isMsStruct(const ASTContext &C) const
Get whether or not this is an ms_struct which can be turned on with an attribute, pragma,...
void setAnonymousStructOrUnion(bool Anon)
bool canPassInRegisters() const
Determine whether this class can be passed in registers.
RecordArgPassingKind getArgPassingRestrictions() const
bool hasVolatileMember() const
bool hasFlexibleArrayMember() const
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
const FieldDecl * findFirstNamedDataMember() const
Finds the first data member which has a name.
const RecordDecl * getMostRecentDecl() const
void setArgPassingRestrictions(RecordArgPassingKind Kind)
void setNonTrivialToPrimitiveCopy(bool V)
bool hasObjectMember() const
bool isNonTrivialToPrimitiveDestroy() const
bool isNonTrivialToPrimitiveCopy() const
bool isCapturedRecord() const
Determine whether this record is a record for captured variables in CapturedStmt construct.
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
field_iterator field_end() const
field_range fields() const
bool isRandomized() const
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
static bool classofKind(Kind K)
void setHasFlexibleArrayMember(bool V)
void setParamDestroyedInCallee(bool V)
void setNonTrivialToPrimitiveDestroy(bool V)
void setHasObjectMember(bool val)
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
void setHasVolatileMember(bool val)
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
void reorderDecls(const SmallVectorImpl< Decl * > &Decls)
void setIsRandomized(bool V)
bool isParamDestroyedInCallee() const
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
bool mayInsertExtraPadding(bool EmitRemark=false) const
Whether we are allowed to insert extra padding between fields.
static bool classof(const Decl *D)
RecordDecl * getMostRecentDecl()
const RecordDecl * getPreviousDecl() const
bool isOrContainsUnion() const
Returns whether this record is a union, or contains (at any nesting level) a union member.
virtual void completeDefinition()
Note that the definition of this type is now complete.
llvm::iterator_range< specific_decl_iterator< FieldDecl > > field_range
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
void setCapturedRecord()
Mark the record as a record for captured variables in CapturedStmt construct.
specific_decl_iterator< FieldDecl > field_iterator
RecordDecl * getPreviousDecl()
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
bool isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C structs.
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
void setHasLoadedFieldsFromExternalStorage(bool val) const
field_iterator field_begin() const
Provides common interface for the Decls that can be redeclared.
TranslationUnitDecl * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
TranslationUnitDecl * getNextRedeclaration() const
TranslationUnitDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
redecl_iterator redecls_end() const
llvm::iterator_range< redecl_iterator > redecl_range
TranslationUnitDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
redecl_iterator redecls_begin() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
void AddTaggedVal(uint64_t V, DiagnosticsEngine::ArgumentKind Kind) const
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
void setTagKind(TagKind TK)
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
static TagDecl * castFromDeclContext(const DeclContext *DC)
SourceRange getBraceRange() const
bool isBeingDefined() const
Return true if this decl is currently being defined.
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
TagDecl * getMostRecentDeclImpl() override
Implementation of getMostRecentDecl(), to be overridden by any subclass that has a redeclaration chai...
TagDecl * getDefinition() const
Returns the TagDecl that actually defines this struct/union/class/enum.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
void setEmbeddedInDeclarator(bool isInDeclarator)
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
SourceLocation getInnerLocStart() const
Return SourceLocation representing start of source range ignoring outer template declarations.
bool isEmbeddedInDeclarator() const
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
StringRef getKindName() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
void setMayHaveOutOfDateDef(bool V=true)
Indicates whether it is possible for declarations of this kind to have an out-of-date definition.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
redeclarable_base::redecl_iterator redecl_iterator
TypedefNameDecl * getTypedefNameForAnonDecl() const
static bool classofKind(Kind K)
void startDefinition()
Starts the definition of this tag declaration.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
bool mayHaveOutOfDateDef() const
Indicates whether it is possible for declarations of this kind to have an out-of-date definition.
SourceLocation getOuterLocStart() const
Return SourceLocation representing start of source range taking into account any outer template decla...
bool isCompleteDefinitionRequired() const
Return true if this complete decl is required to be complete for some existing use.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isFreeStanding() const
True if this tag is free standing, e.g. "struct foo;".
void setBeingDefined(bool V=true)
True if this decl is currently being defined.
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
void completeDefinition()
Completes the definition of this tag declaration.
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
static bool classof(const Decl *D)
bool hasNameForLinkage() const
Is this tag type named, either directly or via being defined in a typedef of this type?
TemplateParameterList * getTemplateParameterList(unsigned i) const
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
TagKind getTagKind() const
TagDecl * getNextRedeclarationImpl() override
Returns the next redeclaration or itself if this is the only decl.
TagDecl * getPreviousDeclImpl() override
Implementation of getPreviousDecl(), to be overridden by any subclass that has a redeclaration chain.
bool isThisDeclarationADemotedDefinition() const
Whether this declaration was a definition in some module but was forced to be a declaration.
unsigned getNumTemplateParameterLists() const
redeclarable_base::redecl_range redecl_range
static DeclContext * castToDeclContext(const TagDecl *D)
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
void setBraceRange(SourceRange R)
TagDecl(Kind DK, TagKind TK, const ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, TagDecl *PrevDecl, SourceLocation StartL)
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
A convenient class for passing around template argument information.
A template argument list.
Stores a list of template parameters for a TemplateDecl and its derived classes.
A declaration that models statements at global scope.
static bool classofKind(Kind K)
const Stmt * getStmt() const
void setSemiMissing(bool Missing=true)
static bool classof(const Decl *D)
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
bool isSemiMissing() const
static DeclContext * castToDeclContext(const TopLevelStmtDecl *D)
static TopLevelStmtDecl * castFromDeclContext(const DeclContext *DC)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
The top declaration context.
static TranslationUnitDecl * castFromDeclContext(const DeclContext *DC)
static DeclContext * castToDeclContext(const TranslationUnitDecl *D)
redeclarable_base::redecl_range redecl_range
const TranslationUnitDecl * getCanonicalDecl() const
static bool classofKind(Kind K)
NamespaceDecl * getAnonymousNamespace() const
ASTContext & getASTContext() const
redeclarable_base::redecl_iterator redecl_iterator
static bool classof(const Decl *D)
TranslationUnitDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this translation unit.
void setAnonymousNamespace(NamespaceDecl *D)
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
TypeAliasTemplateDecl * getDescribedAliasTemplate() const
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
static bool classof(const Decl *D)
static bool classofKind(Kind K)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Declaration of an alias template.
Represents a declaration of a type.
void setLocStart(SourceLocation L)
static bool classofKind(Kind K)
void setTypeForDecl(const Type *TD)
const Type * getTypeForDecl() const
static bool classof(const Decl *D)
TypeDecl(Kind DK, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, SourceLocation StartL=SourceLocation())
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
SourceLocation getBeginLoc() const LLVM_READONLY
A container of type source information.
static StringRef getTagTypeKindName(TagTypeKind Kind)
The base class of the type hierarchy.
const T * castAs() const
Member-template castAs<specific type>.
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static bool classofKind(Kind K)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static bool classof(const Decl *D)
Base class for declarations which introduce a typedef-name.
TypedefNameDecl * getNextRedeclarationImpl() override
Returns the next redeclaration or itself if this is the only decl.
TypeSourceInfo * getTypeSourceInfo() const
TypedefNameDecl * getPreviousDeclImpl() override
Implementation of getPreviousDecl(), to be overridden by any subclass that has a redeclaration chain.
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
redeclarable_base::redecl_range redecl_range
static bool classof(const Decl *D)
const TypedefNameDecl * getCanonicalDecl() const
TypedefNameDecl * getMostRecentDeclImpl() override
Implementation of getMostRecentDecl(), to be overridden by any subclass that has a redeclaration chai...
TypedefNameDecl(Kind DK, ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
QualType getUnderlyingType() const
bool isTransparentTag() const
Determines if this typedef shares a name and spelling location with its underlying tag type,...
redeclarable_base::redecl_iterator redecl_iterator
TypedefNameDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this typedef-name.
void setTypeSourceInfo(TypeSourceInfo *newType)
static bool classofKind(Kind K)
TagDecl * getAnonDeclWithTypedefName(bool AnyRedecl=false) const
Retrieves the tag declaration for which this is the typedef name for linkage purposes,...
A set of unresolved declarations.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
static bool classof(const Decl *D)
ValueDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T)
void setType(QualType newType)
bool isWeak() const
Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.
static bool classofKind(Kind K)
VarDecl * getPotentiallyDecomposedVarDecl()
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
const VarDecl * getPotentiallyDecomposedVarDecl() const
Represents a variable declaration or definition.
@ NumScopeDepthOrObjCQualsBits
const VarDecl * getDefinition() const
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
void setObjCForDecl(bool FRD)
Stmt ** getInitAddress()
Retrieve the address of the initializer expression.
const VarDecl * getInitializingDeclaration() const
void setCXXForRangeDecl(bool FRD)
DefinitionKind isThisDeclarationADefinition() const
bool isFunctionOrMethodVarDecl() const
Similar to isLocalVarDecl, but excludes variables declared in blocks.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
void setInstantiationOfStaticDataMember(VarDecl *VD, TemplateSpecializationKind TSK)
Specify that this variable is an instantiation of the static data member VD.
TLSKind getTLSKind() const
bool hasICEInitializer(const ASTContext &Context) const
Determine whether the initializer of this variable is an integer constant expression.
redeclarable_base::redecl_range redecl_range
ParmVarDeclBitfields ParmVarDeclBits
void setARCPseudoStrong(bool PS)
VarDecl * getNextRedeclarationImpl() override
Returns the next redeclaration or itself if this is the only decl.
void setInitStyle(InitializationStyle Style)
redeclarable_base::redecl_iterator redecl_iterator
InitializationStyle getInitStyle() const
The style of initialization for this declaration.
void setInitCapture(bool IC)
DefinitionKind hasDefinition() const
static const char * getStorageClassSpecifierString(StorageClass SC)
Return the string used to specify the storage class SC.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a static data member.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool hasFlexibleArrayInit(const ASTContext &Ctx) const
Whether this variable has a flexible array member initialized with one or more elements.
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed? If so, the variable need not have a usable destr...
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
bool isCXXCondDecl() const
InitializationStyle
Initialization styles.
@ ListInit
Direct list-initialization (C++11)
@ CInit
C-style initialization with assignment.
@ ParenListInit
Parenthesized list-initialization (C++20)
@ CallInit
Call-style initialization (C++98)
bool isObjCForDecl() const
Determine whether this variable is a for-loop declaration for a for-in statement in Objective-C.
void setStorageClass(StorageClass SC)
void setPreviousDeclInSameBlockScope(bool Same)
bool isInlineSpecified() const
APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
bool isStaticDataMember() const
Determines whether this is a static data member.
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
VarDecl * getTemplateInstantiationPattern() const
Retrieve the variable declaration from which this variable could be instantiated, if it is an instant...
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
VarDeclBitfields VarDeclBits
CharUnits getFlexibleArrayInitChars(const ASTContext &Ctx) const
If hasFlexibleArrayInit is true, compute the number of additional bytes necessary to store those elem...
bool hasConstantInitialization() const
Determine whether this variable has constant initialization.
bool isCXXForRangeDecl() const
Determine whether this variable is the for-range-declaration in a C++0x for-range statement.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
static bool classofKind(Kind K)
const VarDecl * getDefinition(ASTContext &C) const
EvaluatedStmt * getEvaluatedStmt() const
bool mightBeUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value might be usable in a constant expression, according to the re...
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
bool evaluateDestruction(SmallVectorImpl< PartialDiagnosticAt > &Notes) const
Evaluate the destruction of this variable to determine if it constitutes constant destruction.
static bool classof(const Decl *D)
bool isNRVOVariable() const
Determine whether this local variable can be used with the named return value optimization (NRVO).
void setInlineSpecified()
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
const VarDecl * getCanonicalDecl() const
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
bool isExceptionVariable() const
Determine whether this variable is the exception variable in a C++ catch statememt or an Objective-C ...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For a static data member that was instantiated from a static data member of a class template,...
void setTSCSpec(ThreadStorageClassSpecifier TSC)
void setNRVOVariable(bool NRVO)
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
bool checkForConstantInitialization(SmallVectorImpl< PartialDiagnosticAt > &Notes) const
Evaluate the initializer of this variable to determine whether it's a constant initializer.
bool isInline() const
Whether this variable is (C++1z) inline.
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
bool isNonEscapingByref() const
Indicates the capture is a __block variable that is never captured by an escaping block.
bool isInExternCContext() const
Determines whether this variable's context is, or is nested within, a C++ extern "C" linkage spec.
NonParmVarDeclBitfields NonParmVarDeclBits
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
InitType Init
The initializer for this variable or, for a ParmVarDecl, the C++ default argument.
APValue * getEvaluatedValue() const
Return the already-evaluated value of this variable's initializer, or NULL if the value is not yet kn...
bool isARCPseudoStrong() const
Determine whether this variable is an ARC pseudo-__strong variable.
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
VarDecl * getInitializingDeclaration()
Get the initializing declaration of this variable, if any.
void setConstexpr(bool IC)
TLSKind
Kinds of thread-local storage.
@ TLS_Static
TLS with a known-constant initializer.
@ TLS_Dynamic
TLS with a dynamic initializer.
@ TLS_None
Not a TLS variable.
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
@ TentativeDefinition
This declaration is a tentative definition.
@ DeclarationOnly
This declaration is only a declaration.
@ Definition
This declaration is definitely a definition.
void setDescribedVarTemplate(VarTemplateDecl *Template)
bool isExternC() const
Determines whether this variable is a variable with external, C linkage.
llvm::PointerUnion< Stmt *, EvaluatedStmt * > InitType
bool isLocalVarDecl() const
Returns true for local variable declarations other than parameters.
bool isDirectInit() const
Whether the initializer is a direct-initializer (list or call).
VarDecl * getMostRecentDeclImpl() override
Implementation of getMostRecentDecl(), to be overridden by any subclass that has a redeclaration chai...
StorageDuration getStorageDuration() const
Get the storage duration of this variable, per C++ [basic.stc].
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isEscapingByref() const
Indicates the capture is a __block variable that is captured by a block that can potentially escape (...
void setImplicitlyInline()
bool isThisDeclarationADemotedDefinition() const
If this definition should pretend to be a declaration.
bool isPreviousDeclInSameBlockScope() const
Whether this local extern variable declaration's previous declaration was declared in the same block ...
bool isUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value can be used in a constant expression, according to the releva...
bool isInExternCXXContext() const
Determines whether this variable's context is, or is nested within, a C++ extern "C++" linkage spec.
SourceLocation getPointOfInstantiation() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
bool hasDependentAlignment() const
Determines if this variable's alignment is dependent.
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Get the template specialization kind of this variable for the purposes of template instantiation.
VarDecl * getDefinition()
bool isLocalVarDeclOrParm() const
Similar to isLocalVarDecl but also includes parameters.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const VarDecl * getActingDefinition() const
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
void setExceptionVariable(bool EV)
bool isKnownToBeDefined() const
VarDecl * getPreviousDeclImpl() override
Implementation of getPreviousDecl(), to be overridden by any subclass that has a redeclaration chain.
void demoteThisDefinitionToDeclaration()
This is a definition which should be demoted to a declaration.
bool isParameterPack() const
Determine whether this variable is actually a function parameter pack or init-capture pack.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Declaration of a variable template.
Represents a C array with a specified size that is not an integer-constant-expression.
Defines the Linkage enumeration and various utility functions.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
ConstexprSpecKind
Define the kind of constexpr specifier.
InClassInitStyle
In-class initialization styles for non-static data members.
@ ICIS_CopyInit
Copy initialization.
@ ICIS_ListInit
Direct list-initialization.
@ ICIS_NoInit
No in-class initializer.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
bool IsEnumDeclComplete(EnumDecl *ED)
Check if the given decl is complete.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
LanguageLinkage
Describes the different kinds of language linkage (C++ [dcl.link]) that an entity may have.
StorageClass
Storage classes.
ThreadStorageClassSpecifier
Thread storage-class-specifier.
@ TSCS_thread_local
C++11 thread_local.
static constexpr StringRef getOpenMPVariantManglingSeparatorStr()
OpenMP variants are mangled early based on their OpenMP context selector.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ Asm
Assembly: we accept this only so that we can preprocess it.
StorageDuration
The storage duration for an object (per C++ [basic.stc]).
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
@ SD_Automatic
Automatic storage duration (most local variables).
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Union
The "union" keyword.
@ Enum
The "enum" keyword.
bool IsEnumDeclScoped(EnumDecl *ED)
Check if the given decl is scoped.
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
@ CanPassInRegs
The argument of this type can be passed directly in registers.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
@ CannotPassInRegs
The argument of this type cannot be passed directly in registers.
const FunctionProtoType * T
bool isExternalFormalLinkage(Linkage L)
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ None
The alignment was not explicit in code.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
bool isExternallyVisible(Linkage L)
ImplicitParamKind
Defines the kind of the implicit parameter: is this an implicit parameter with pointer to 'this',...
@ CXXThis
Parameter for C++ 'this' argument.
@ ThreadPrivateVar
Parameter for Thread private variable.
@ Other
Other implicit parameter.
@ CXXVTT
Parameter for C++ virtual table pointers.
@ ObjCSelf
Parameter for Objective-C 'self' argument.
@ ObjCCmd
Parameter for Objective-C '_cmd' argument.
@ CapturedContext
Parameter for captured context.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_None
no exception specification
Visibility
Describes the different kinds of visibility that a declaration may have.
Diagnostic wrappers for TextAPI types for error reporting.
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
A placeholder type used to construct an empty shell of a decl-derived type that will be filled in lat...
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
Structure used to store a statement, the constant value to which it was evaluated (if any),...
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
bool WasEvaluated
Whether this statement was already evaluated.
bool IsEvaluating
Whether this statement is being evaluated.
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
bool HasICEInit
In C++98, whether the initializer is an ICE.
Describes how types, statements, expressions, and declarations should be printed.
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
QualifierInfo & operator=(const QualifierInfo &)=delete
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
NestedNameSpecifierLoc QualifierLoc
QualifierInfo(const QualifierInfo &)=delete
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Sets info about "outer" template parameter lists.