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;