40#include "llvm/ADT/SmallPtrSet.h"
41#include "llvm/ADT/SmallVector.h"
42#include "llvm/ADT/iterator_range.h"
43#include "llvm/Support/Casting.h"
44#include "llvm/Support/ErrorHandling.h"
45#include "llvm/Support/Format.h"
46#include "llvm/Support/raw_ostream.h"
58void AccessSpecDecl::anchor() {}
65void LazyASTUnresolvedSet::getFromExternalSource(
ASTContext &
C)
const {
67 assert(Impl.Decls.isLazy() &&
"getFromExternalSource for non-lazy set");
68 assert(Source &&
"getFromExternalSource with no external source");
73 Impl.Decls.setLazy(
false);
77 : UserDeclaredConstructor(
false), UserDeclaredSpecialMembers(0),
79 Abstract(
false), IsStandardLayout(
true), IsCXX11StandardLayout(
true),
80 HasBasesWithFields(
false), HasBasesWithNonStaticDataMembers(
false),
81 HasPrivateFields(
false), HasProtectedFields(
false),
82 HasPublicFields(
false), HasMutableFields(
false), HasVariantMembers(
false),
83 HasOnlyCMembers(
true), HasInitMethod(
false), HasInClassInitializer(
false),
84 HasUninitializedReferenceMember(
false), HasUninitializedFields(
false),
85 HasInheritedConstructor(
false), HasInheritedDefaultConstructor(
false),
86 HasInheritedAssignment(
false),
87 NeedOverloadResolutionForCopyConstructor(
false),
88 NeedOverloadResolutionForMoveConstructor(
false),
89 NeedOverloadResolutionForCopyAssignment(
false),
90 NeedOverloadResolutionForMoveAssignment(
false),
91 NeedOverloadResolutionForDestructor(
false),
92 DefaultedCopyConstructorIsDeleted(
false),
93 DefaultedMoveConstructorIsDeleted(
false),
94 DefaultedCopyAssignmentIsDeleted(
false),
95 DefaultedMoveAssignmentIsDeleted(
false),
96 DefaultedDestructorIsDeleted(
false), HasTrivialSpecialMembers(SMF_All),
97 HasTrivialSpecialMembersForCall(SMF_All),
98 DeclaredNonTrivialSpecialMembers(0),
99 DeclaredNonTrivialSpecialMembersForCall(0), HasIrrelevantDestructor(
true),
100 HasConstexprNonCopyMoveConstructor(
false),
101 HasDefaultedDefaultConstructor(
false),
102 DefaultedDefaultConstructorIsConstexpr(
true),
103 HasConstexprDefaultConstructor(
false),
104 DefaultedDestructorIsConstexpr(
true),
105 HasNonLiteralTypeFieldsOrBases(
false), StructuralIfLiteral(
true),
106 UserProvidedDefaultConstructor(
false), DeclaredSpecialMembers(0),
107 ImplicitCopyConstructorCanHaveConstParamForVBase(
true),
108 ImplicitCopyConstructorCanHaveConstParamForNonVBase(
true),
109 ImplicitCopyAssignmentHasConstParam(
true),
110 HasDeclaredCopyConstructorWithConstParam(
false),
111 HasDeclaredCopyAssignmentWithConstParam(
false),
112 IsAnyDestructorNoReturn(
false), IsHLSLIntangible(
false), IsLambda(
false),
113 IsParsingBaseSpecifiers(
false), ComputedVisibleConversions(
false),
117 return Bases.get(
Definition->getASTContext().getExternalSource());
121 return VBases.get(
Definition->getASTContext().getExternalSource());
129 DefinitionData(PrevDecl ? PrevDecl->DefinitionData
143 unsigned DependencyKind,
bool IsGeneric,
146 Loc,
nullptr,
nullptr);
148 R->DefinitionData =
new (
C)
struct LambdaDefinitionData(
149 R, Info, DependencyKind, IsGeneric, CaptureDefault);
150 R->setImplicit(
true);
156 auto *R =
new (
C, ID)
168 while (!WorkList.empty()) {
173 if (
const CXXRecordDecl *B = BaseSpec.getType()->getAsCXXRecordDecl()) {
174 if (!SeenBaseTypes.insert(B).second)
176 WorkList.push_back(B);
188 if (!data().Bases.isOffset() && data().NumBases > 0)
189 C.Deallocate(data().getBases());
192 if (!
C.getLangOpts().CPlusPlus17) {
195 data().Aggregate =
false;
200 data().PlainOldData =
false;
210 data().NumBases = NumBases;
211 for (
unsigned i = 0; i < NumBases; ++i) {
212 data().getBases()[i] = *Bases[i];
226 if (BaseClassDecl->data().HasBasesWithFields ||
227 !BaseClassDecl->field_empty()) {
228 if (data().HasBasesWithFields)
230 data().IsStandardLayout =
false;
231 data().HasBasesWithFields =
true;
238 if (BaseClassDecl->data().HasBasesWithNonStaticDataMembers ||
239 BaseClassDecl->hasDirectFields()) {
240 if (data().HasBasesWithNonStaticDataMembers)
241 data().IsCXX11StandardLayout =
false;
242 data().HasBasesWithNonStaticDataMembers =
true;
245 if (!BaseClassDecl->isEmpty()) {
249 data().Empty =
false;
255 data().Aggregate =
false;
260 data().StructuralIfLiteral =
false;
266 if (BaseClassDecl->isPolymorphic()) {
267 data().Polymorphic =
true;
270 data().Aggregate =
false;
276 if (!BaseClassDecl->isStandardLayout())
277 data().IsStandardLayout =
false;
278 if (!BaseClassDecl->isCXX11StandardLayout())
279 data().IsCXX11StandardLayout =
false;
283 data().HasNonLiteralTypeFieldsOrBases =
true;
286 for (
const auto &VBase : BaseClassDecl->vbases()) {
288 if (SeenVBaseTypes.insert(
C.getCanonicalType(VBase.getType())).second) {
289 VBases.push_back(&VBase);
296 if (
CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl())
297 if (!VBaseDecl->hasCopyConstructorWithConstParam())
298 data().ImplicitCopyConstructorCanHaveConstParamForVBase =
false;
302 data().Aggregate =
false;
306 if (
Base->isVirtual()) {
308 if (SeenVBaseTypes.insert(
C.getCanonicalType(BaseType)).second)
309 VBases.push_back(
Base);
314 data().Empty =
false;
318 data().Aggregate =
false;
324 data().HasTrivialSpecialMembers &= SMF_Destructor;
325 data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
330 data().IsStandardLayout =
false;
331 data().IsCXX11StandardLayout =
false;
337 data().DefaultedDefaultConstructorIsConstexpr =
false;
338 data().DefaultedDestructorIsConstexpr =
false;
345 if (!BaseClassDecl->hasCopyConstructorWithConstParam())
346 data().ImplicitCopyConstructorCanHaveConstParamForVBase =
false;
352 if (!BaseClassDecl->hasTrivialDefaultConstructor())
353 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
360 if (!BaseClassDecl->hasTrivialCopyConstructor())
361 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
363 if (!BaseClassDecl->hasTrivialCopyConstructorForCall())
364 data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
370 if (!BaseClassDecl->hasTrivialMoveConstructor())
371 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
373 if (!BaseClassDecl->hasTrivialMoveConstructorForCall())
374 data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
381 if (!BaseClassDecl->hasTrivialCopyAssignment())
382 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
387 if (!BaseClassDecl->hasTrivialMoveAssignment())
388 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
394 if (!BaseClassDecl->hasConstexprDefaultConstructor())
395 data().DefaultedDefaultConstructorIsConstexpr =
396 C.getLangOpts().CPlusPlus23;
403 if (!BaseClassDecl->hasCopyConstructorWithConstParam())
404 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase =
false;
410 if (!BaseClassDecl->hasTrivialDestructor())
411 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
413 if (!BaseClassDecl->hasTrivialDestructorForCall())
414 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
416 if (!BaseClassDecl->hasIrrelevantDestructor())
417 data().HasIrrelevantDestructor =
false;
419 if (BaseClassDecl->isAnyDestructorNoReturn())
420 data().IsAnyDestructorNoReturn =
true;
422 if (BaseClassDecl->isHLSLIntangible())
423 data().IsHLSLIntangible =
true;
430 if (!BaseClassDecl->hasCopyAssignmentWithConstParam())
431 data().ImplicitCopyAssignmentHasConstParam =
false;
435 if (BaseClassDecl->hasObjectMember())
438 if (BaseClassDecl->hasVolatileMember())
441 if (BaseClassDecl->getArgPassingRestrictions() ==
446 if (BaseClassDecl->hasMutableFields())
447 data().HasMutableFields =
true;
449 if (BaseClassDecl->hasUninitializedExplicitInitFields() &&
450 BaseClassDecl->isAggregate())
453 if (BaseClassDecl->hasUninitializedReferenceMember())
454 data().HasUninitializedReferenceMember =
true;
456 if (!BaseClassDecl->allowConstDefaultInit())
457 data().HasUninitializedFields =
true;
459 addedClassSubobject(BaseClassDecl);
470 data().IsStandardLayout =
false;
472 if (VBases.empty()) {
473 data().IsParsingBaseSpecifiers =
false;
479 data().NumVBases = VBases.size();
480 for (
int I = 0,
E = VBases.size(); I !=
E; ++I) {
484 data().getVBases()[I] = *VBases[I];
487 data().IsParsingBaseSpecifiers =
false;
491 assert(
hasDefinition() &&
"ODRHash only for records with definitions");
494 if (DefinitionData->HasODRHash)
495 return DefinitionData->ODRHash;
500 DefinitionData->HasODRHash =
true;
503 return DefinitionData->ODRHash;
506void CXXRecordDecl::addedClassSubobject(
CXXRecordDecl *Subobj) {
514 data().NeedOverloadResolutionForCopyConstructor =
true;
516 data().NeedOverloadResolutionForMoveConstructor =
true;
525 data().NeedOverloadResolutionForCopyAssignment =
true;
527 data().NeedOverloadResolutionForMoveAssignment =
true;
537 data().NeedOverloadResolutionForCopyConstructor =
true;
538 data().NeedOverloadResolutionForMoveConstructor =
true;
539 data().NeedOverloadResolutionForDestructor =
true;
548 data().DefaultedDestructorIsConstexpr =
555 if (!Subobj->data().StructuralIfLiteral)
556 data().StructuralIfLiteral =
false;
562 "getStandardLayoutBaseWithFields called on a non-standard-layout type");
563#ifdef EXPENSIVE_CHECKS
565 unsigned NumberOfBasesWithFields = 0;
567 ++NumberOfBasesWithFields;
570 if (!
Base->field_empty())
571 ++NumberOfBasesWithFields;
573 UniqueBases.insert(
Base->getCanonicalDecl()).second &&
574 "Standard layout struct has multiple base classes of the same type");
577 assert(NumberOfBasesWithFields <= 1 &&
578 "Standard layout struct has fields declared in more than one class");
585 if (!
Base->field_empty()) {
637void CXXRecordDecl::markedVirtualFunctionPure() {
640 data().Abstract =
true;
643bool CXXRecordDecl::hasSubobjectAtOffsetZeroOfEmptyBaseType(
654 RD = RD->getCanonicalDecl();
662 if (!RD->data().HasBasesWithFields) {
681 if (M.insert(RD).second)
682 WorkList.push_back(RD);
689 while (!WorkList.empty()) {
699 bool IsFirstField =
true;
700 for (
auto *FD :
X->fields()) {
703 if (FD->isUnnamedBitField())
706 if (!IsFirstField && !FD->isZeroSize(Ctx))
709 if (FD->isInvalidDecl())
719 IsFirstField =
false;
727 assert(
isLambda() &&
"not a lambda");
744void CXXRecordDecl::addedMember(
Decl *
D) {
745 if (!
D->
isImplicit() && !isa<FieldDecl>(
D) && !isa<IndirectFieldDecl>(
D) &&
749 data().HasOnlyCMembers =
false;
755 auto *FunTmpl = dyn_cast<FunctionTemplateDecl>(
D);
757 D = FunTmpl->getTemplatedDecl();
760 Decl *DUnderlying =
D;
761 if (
auto *ND = dyn_cast<NamedDecl>(DUnderlying)) {
762 DUnderlying = ND->getUnderlyingDecl();
763 if (
auto *UnderlyingFunTmpl = dyn_cast<FunctionTemplateDecl>(DUnderlying))
764 DUnderlying = UnderlyingFunTmpl->getTemplatedDecl();
767 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(
D)) {
768 if (
Method->isVirtual()) {
771 data().Aggregate =
false;
775 data().PlainOldData =
false;
779 data().Empty =
false;
784 data().Polymorphic =
true;
790 data().HasTrivialSpecialMembers &= SMF_Destructor;
791 data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
796 data().IsStandardLayout =
false;
797 data().IsCXX11StandardLayout =
false;
811 if (
const auto *
Constructor = dyn_cast<CXXConstructorDecl>(
D)) {
818 data().UserDeclaredConstructor =
true;
828 data().PlainOldData =
false;
833 SMKind |= SMF_DefaultConstructor;
836 data().UserProvidedDefaultConstructor =
true;
838 data().HasConstexprDefaultConstructor =
true;
840 data().HasDefaultedDefaultConstructor =
true;
846 SMKind |= SMF_CopyConstructor;
849 data().HasDeclaredCopyConstructorWithConstParam =
true;
851 SMKind |= SMF_MoveConstructor;
863 data().Aggregate =
false;
868 if (
const auto *
Constructor = dyn_cast<CXXConstructorDecl>(DUnderlying)) {
876 data().HasConstexprNonCopyMoveConstructor =
true;
877 if (!isa<CXXConstructorDecl>(
D) &&
Constructor->isDefaultConstructor())
878 data().HasInheritedDefaultConstructor =
true;
882 if (
const auto *
Method = dyn_cast<CXXMethodDecl>(
D)) {
883 if (isa<CXXDestructorDecl>(
D))
884 SMKind |= SMF_Destructor;
886 if (
Method->isCopyAssignmentOperator()) {
887 SMKind |= SMF_CopyAssignment;
889 const auto *ParamTy =
891 if (!ParamTy || ParamTy->getPointeeType().isConstQualified())
892 data().HasDeclaredCopyAssignmentWithConstParam =
true;
895 if (
Method->isMoveAssignmentOperator())
896 SMKind |= SMF_MoveAssignment;
899 if (
auto *Conversion = dyn_cast<CXXConversionDecl>(
D)) {
908 if (Conversion->getPrimaryTemplate()) {
914 FunTmpl ? cast<NamedDecl>(FunTmpl) :
cast<
NamedDecl>(Conversion);
919 Conversions.
addDecl(Ctx, Primary, AS);
926 data().HasTrivialSpecialMembers &=
927 data().DeclaredSpecialMembers | ~SMKind;
928 data().HasTrivialSpecialMembersForCall &=
929 data().DeclaredSpecialMembers | ~SMKind;
933 data().DeclaredSpecialMembers |= SMKind;
934 if (!
Method->isImplicit()) {
935 data().UserDeclaredSpecialMembers |= SMKind;
939 SMKind != SMF_MoveAssignment) ||
953 data().PlainOldData =
false;
961 if (!
Method->isIneligibleOrNotSelected()) {
970 if (
const auto *Field = dyn_cast<FieldDecl>(
D)) {
978 if (data().HasBasesWithFields)
979 data().IsStandardLayout =
false;
985 if (
Field->isUnnamedBitField()) {
989 if (data().
Empty && !
Field->isZeroLengthBitField() &&
991 LangOptions::ClangABI::Ver6)
992 data().Empty =
false;
1000 if (data().HasBasesWithNonStaticDataMembers)
1001 data().IsCXX11StandardLayout =
false;
1009 data().Aggregate =
false;
1010 data().PlainOldData =
false;
1015 data().StructuralIfLiteral =
false;
1020 bool IsFirstField = !data().HasPrivateFields &&
1021 !data().HasProtectedFields && !data().HasPublicFields;
1028 case AS_private: data().HasPrivateFields =
true;
break;
1029 case AS_protected: data().HasProtectedFields =
true;
break;
1030 case AS_public: data().HasPublicFields =
true;
break;
1031 case AS_none: llvm_unreachable(
"Invalid access specifier");
1033 if ((data().HasPrivateFields + data().HasProtectedFields +
1034 data().HasPublicFields) > 1) {
1035 data().IsStandardLayout =
false;
1036 data().IsCXX11StandardLayout =
false;
1040 if (
Field->isMutable()) {
1041 data().HasMutableFields =
true;
1046 data().StructuralIfLiteral =
false;
1053 data().HasVariantMembers =
true;
1055 if (
isUnion() && IsFirstField)
1056 data().HasUninitializedFields =
true;
1067 if (
T.hasNonTrivialObjCLifetime()) {
1075 struct DefinitionData &
Data = data();
1076 Data.PlainOldData =
false;
1077 Data.HasTrivialSpecialMembers = 0;
1083 data().HasTrivialSpecialMembersForCall = 0;
1089 Data.HasIrrelevantDestructor =
false;
1092 data().DefaultedCopyConstructorIsDeleted =
true;
1093 data().DefaultedMoveConstructorIsDeleted =
true;
1094 data().DefaultedCopyAssignmentIsDeleted =
true;
1095 data().DefaultedMoveAssignmentIsDeleted =
true;
1096 data().DefaultedDestructorIsDeleted =
true;
1097 data().NeedOverloadResolutionForCopyConstructor =
true;
1098 data().NeedOverloadResolutionForMoveConstructor =
true;
1099 data().NeedOverloadResolutionForCopyAssignment =
true;
1100 data().NeedOverloadResolutionForMoveAssignment =
true;
1101 data().NeedOverloadResolutionForDestructor =
true;
1103 }
else if (!Context.
getLangOpts().ObjCAutoRefCount) {
1106 }
else if (!
T.isCXX98PODType(Context))
1107 data().PlainOldData =
false;
1113 if (Q.isAddressDiscriminated()) {
1114 struct DefinitionData &
Data = data();
1115 Data.PlainOldData =
false;
1116 Data.HasTrivialSpecialMembers &=
1117 ~(SMF_CopyConstructor | SMF_MoveConstructor | SMF_CopyAssignment |
1118 SMF_MoveAssignment);
1124 data().DefaultedCopyConstructorIsDeleted =
true;
1125 data().DefaultedMoveConstructorIsDeleted =
true;
1126 data().DefaultedCopyAssignmentIsDeleted =
true;
1127 data().DefaultedMoveAssignmentIsDeleted =
true;
1128 data().NeedOverloadResolutionForCopyConstructor =
true;
1129 data().NeedOverloadResolutionForMoveConstructor =
true;
1130 data().NeedOverloadResolutionForCopyAssignment =
true;
1131 data().NeedOverloadResolutionForMoveAssignment =
true;
1136 if (
Field->hasAttr<ExplicitInitAttr>())
1140 if (!
Field->hasInClassInitializer())
1141 data().HasUninitializedReferenceMember =
true;
1146 data().IsStandardLayout =
false;
1147 data().IsCXX11StandardLayout =
false;
1153 data().DefaultedCopyConstructorIsDeleted =
true;
1157 if (
Field->hasInClassInitializer())
1158 data().HasUninitializedFields =
false;
1159 }
else if (!
Field->hasInClassInitializer() && !
Field->isMutable()) {
1161 if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
1162 data().HasUninitializedFields =
true;
1164 data().HasUninitializedFields =
true;
1170 data().HasNonLiteralTypeFieldsOrBases =
true;
1172 if (
Field->hasInClassInitializer() ||
1173 (
Field->isAnonymousStructOrUnion() &&
1174 Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
1175 data().HasInClassInitializer =
true;
1180 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1188 data().Aggregate =
false;
1192 data().PlainOldData =
false;
1200 data().DefaultedCopyAssignmentIsDeleted =
true;
1201 data().DefaultedMoveAssignmentIsDeleted =
true;
1206 bool IsZeroSize =
Field->isZeroSize(Context);
1209 if (FieldRec->isBeingDefined() || FieldRec->isCompleteDefinition()) {
1210 addedClassSubobject(FieldRec);
1218 data().NeedOverloadResolutionForCopyConstructor =
true;
1219 data().NeedOverloadResolutionForMoveConstructor =
true;
1220 data().NeedOverloadResolutionForCopyAssignment =
true;
1221 data().NeedOverloadResolutionForMoveAssignment =
true;
1230 if (FieldRec->hasNonTrivialCopyConstructor())
1231 data().DefaultedCopyConstructorIsDeleted =
true;
1232 if (FieldRec->hasNonTrivialMoveConstructor())
1233 data().DefaultedMoveConstructorIsDeleted =
true;
1234 if (FieldRec->hasNonTrivialCopyAssignment())
1235 data().DefaultedCopyAssignmentIsDeleted =
true;
1236 if (FieldRec->hasNonTrivialMoveAssignment())
1237 data().DefaultedMoveAssignmentIsDeleted =
true;
1238 if (FieldRec->hasNonTrivialDestructor()) {
1239 data().DefaultedDestructorIsDeleted =
true;
1243 data().DefaultedDestructorIsConstexpr =
true;
1249 if (
Field->isAnonymousStructOrUnion()) {
1250 data().NeedOverloadResolutionForCopyConstructor |=
1251 FieldRec->data().NeedOverloadResolutionForCopyConstructor;
1252 data().NeedOverloadResolutionForMoveConstructor |=
1253 FieldRec->data().NeedOverloadResolutionForMoveConstructor;
1254 data().NeedOverloadResolutionForCopyAssignment |=
1255 FieldRec->data().NeedOverloadResolutionForCopyAssignment;
1256 data().NeedOverloadResolutionForMoveAssignment |=
1257 FieldRec->data().NeedOverloadResolutionForMoveAssignment;
1258 data().NeedOverloadResolutionForDestructor |=
1259 FieldRec->data().NeedOverloadResolutionForDestructor;
1267 if (!FieldRec->hasTrivialDefaultConstructor())
1268 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1276 if (!FieldRec->hasTrivialCopyConstructor())
1277 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
1279 if (!FieldRec->hasTrivialCopyConstructorForCall())
1280 data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
1285 if (!FieldRec->hasTrivialMoveConstructor())
1286 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
1288 if (!FieldRec->hasTrivialMoveConstructorForCall())
1289 data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
1297 if (!FieldRec->hasTrivialCopyAssignment())
1298 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
1302 if (!FieldRec->hasTrivialMoveAssignment())
1303 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
1305 if (!FieldRec->hasTrivialDestructor())
1306 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1307 if (!FieldRec->hasTrivialDestructorForCall())
1308 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1309 if (!FieldRec->hasIrrelevantDestructor())
1310 data().HasIrrelevantDestructor =
false;
1311 if (FieldRec->isAnyDestructorNoReturn())
1312 data().IsAnyDestructorNoReturn =
true;
1313 if (FieldRec->hasObjectMember())
1315 if (FieldRec->hasVolatileMember())
1317 if (FieldRec->getArgPassingRestrictions() ==
1325 if (!FieldRec->isStandardLayout())
1326 data().IsStandardLayout =
false;
1327 if (!FieldRec->isCXX11StandardLayout())
1328 data().IsCXX11StandardLayout =
false;
1334 if (data().IsStandardLayout &&
1335 (
isUnion() || IsFirstField || IsZeroSize) &&
1336 hasSubobjectAtOffsetZeroOfEmptyBaseType(Context, FieldRec))
1337 data().IsStandardLayout =
false;
1343 if (data().IsCXX11StandardLayout && IsFirstField) {
1346 for (
const auto &BI :
bases()) {
1348 data().IsCXX11StandardLayout =
false;
1355 if (FieldRec->hasMutableFields())
1356 data().HasMutableFields =
true;
1358 if (
Field->isMutable()) {
1362 data().NeedOverloadResolutionForCopyConstructor =
true;
1363 data().NeedOverloadResolutionForCopyAssignment =
true;
1373 if (!
Field->hasInClassInitializer() &&
1374 !FieldRec->hasConstexprDefaultConstructor() && !
isUnion())
1377 data().DefaultedDefaultConstructorIsConstexpr =
1385 if (!FieldRec->hasCopyConstructorWithConstParam())
1386 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase =
false;
1394 if (!FieldRec->hasCopyAssignmentWithConstParam())
1395 data().ImplicitCopyAssignmentHasConstParam =
false;
1397 if (FieldRec->hasUninitializedExplicitInitFields() &&
1398 FieldRec->isAggregate())
1401 if (FieldRec->hasUninitializedReferenceMember() &&
1402 !
Field->hasInClassInitializer())
1403 data().HasUninitializedReferenceMember =
true;
1408 if (FieldRec->hasVariantMembers() &&
1409 Field->isAnonymousStructOrUnion())
1410 data().HasVariantMembers =
true;
1417 data().DefaultedDefaultConstructorIsConstexpr =
false;
1424 if (
T.isConstQualified()) {
1425 data().DefaultedCopyAssignmentIsDeleted =
true;
1426 data().DefaultedMoveAssignmentIsDeleted =
true;
1435 data().StructuralIfLiteral =
false;
1441 if (
T.hasAddressDiscriminatedPointerAuth())
1442 data().HasTrivialSpecialMembers &=
1443 SMF_DefaultConstructor | SMF_Destructor;
1448 if (data().
Empty && !IsZeroSize)
1449 data().Empty =
false;
1452 const Type *Ty =
Field->getType()->getUnqualifiedDesugaredType();
1453 while (isa<ConstantArrayType>(Ty))
1457 if (
const RecordType *RT = dyn_cast<RecordType>(Ty))
1458 data().IsHLSLIntangible |= RT->getAsCXXRecordDecl()->isHLSLIntangible();
1466 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(
D)) {
1467 if (Shadow->getDeclName().getNameKind()
1470 data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess());
1474 if (
const auto *Using = dyn_cast<UsingDecl>(
D)) {
1475 if (
Using->getDeclName().getNameKind() ==
1477 data().HasInheritedConstructor =
true;
1480 data().Aggregate =
false;
1483 if (
Using->getDeclName().getCXXOverloadedOperator() == OO_Equal)
1484 data().HasInheritedAssignment =
true;
1497 data().Aggregate = data().UserDeclaredSpecialMembers == 0;
1512 bool HasAtLeastOneLiteralMember =
1514 return !
D->getType().isVolatileQualified() &&
1517 if (!HasAtLeastOneLiteralMember)
1536 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
1537 if (DD->isUserProvided())
1538 data().HasIrrelevantDestructor =
false;
1545 if (DD->isVirtual()) {
1546 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1547 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1550 if (DD->isNoReturn())
1551 data().IsAnyDestructorNoReturn =
true;
1559 data().HasTrivialSpecialMembers |= SMKind;
1560 data().HasTrivialSpecialMembersForCall |= SMKind;
1562 data().HasTrivialSpecialMembersForCall |= SMKind;
1563 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1565 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1572 data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1580 unsigned SMKind = 0;
1582 if (
const auto *
Constructor = dyn_cast<CXXConstructorDecl>(
D)) {
1584 SMKind |= SMF_DefaultConstructor;
1586 data().HasConstexprDefaultConstructor =
true;
1589 SMKind |= SMF_CopyConstructor;
1591 SMKind |= SMF_MoveConstructor;
1594 data().HasConstexprNonCopyMoveConstructor =
true;
1595 }
else if (isa<CXXDestructorDecl>(
D)) {
1596 SMKind |= SMF_Destructor;
1598 data().HasIrrelevantDestructor =
false;
1599 }
else if (
D->isCopyAssignmentOperator())
1600 SMKind |= SMF_CopyAssignment;
1601 else if (
D->isMoveAssignmentOperator())
1602 SMKind |= SMF_MoveAssignment;
1606 if (!
D->isIneligibleOrNotSelected()) {
1608 data().HasTrivialSpecialMembers |= SMKind;
1610 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1614void CXXRecordDecl::LambdaDefinitionData::AddCaptureList(
ASTContext &Ctx,
1616 Captures.push_back(CaptureList);
1617 if (Captures.size() == 2) {
1625 CXXRecordDecl::LambdaDefinitionData &
Data = getLambdaData();
1628 Data.NumCaptures = Captures.size();
1629 Data.NumExplicitCaptures = 0;
1632 Data.AddCaptureList(Context, ToCapture);
1635 ++
Data.NumExplicitCaptures;
1642 Data.DefaultedCopyAssignmentIsDeleted =
true;
1646 unsigned SMKind = 0;
1648 if (
const auto *
Constructor = dyn_cast<CXXConstructorDecl>(
D)) {
1650 SMKind = SMF_CopyConstructor;
1652 SMKind = SMF_MoveConstructor;
1653 }
else if (isa<CXXDestructorDecl>(
D))
1654 SMKind = SMF_Destructor;
1656 if (
D->isTrivialForCall())
1657 data().HasTrivialSpecialMembersForCall |= SMKind;
1659 data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1665 !TemplateOrInstantiation.isNull())
1670 return isPOD() && data().HasOnlyCMembers;
1675 return getLambdaData().IsGenericLambda;
1687 if (!RD.
isLambda())
return nullptr;
1698 "More than one lambda call operator!");
1723 auto *MD = cast<NamedDecl>(
D);
1724 if (MD->getOwningModule() == M)
1728 llvm_unreachable(
"Couldn't find our call operator!");
1733 return dyn_cast_or_null<FunctionTemplateDecl>(CallOp);
1739 if (CallOp ==
nullptr)
1742 if (
const auto *CallOpTmpl = dyn_cast<FunctionTemplateDecl>(CallOp))
1743 return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl());
1745 return cast<CXXMethodDecl>(CallOp);
1750 assert(CallOp &&
"null call operator");
1757 assert(RD.
isLambda() &&
"Must be a lambda");
1764 if (
const auto *InvokerTemplate = dyn_cast<FunctionTemplateDecl>(ND))
1765 return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl());
1766 return cast<CXXMethodDecl>(ND);
1776 cast<ValueDecl>(ND->getAsFunction())->getType()->castAs<
FunctionType>();
1777 if (FTy->getCallConv() == CC)
1785 llvm::DenseMap<const ValueDecl *, FieldDecl *> &Captures,
1788 ThisCapture =
nullptr;
1790 LambdaDefinitionData &Lambda = getLambdaData();
1794 C != CEnd; ++
C, ++Field) {
1795 if (
C->capturesThis())
1796 ThisCapture = *Field;
1797 else if (
C->capturesVariable())
1798 Captures[
C->getCapturedVar()] = *Field;
1809 return Tmpl->getTemplateParameters();
1819 assert(std::is_partitioned(List->begin(), List->end(),
1820 [](
const NamedDecl *
D) { return !D->isImplicit(); })
1821 &&
"Explicit template params should be ordered before implicit ones");
1823 const auto ExplicitEnd = llvm::partition_point(
1825 return ArrayRef(List->begin(), ExplicitEnd);
1829 assert(
isLambda() &&
"Not a lambda closure type!");
1831 return getLambdaData().ContextDecl.get(Source);
1835 assert(
isLambda() &&
"Not a lambda closure type!");
1841 getLambdaData().ContextDecl = Numbering.
ContextDecl;
1846 assert(
isLambda() &&
"Not a lambda closure type!");
1847 return getASTContext().DeviceLambdaManglingNumbers.lookup(
this);
1853 ->getConversionType();
1885 if (ConvI != ConvE) {
1886 HiddenTypesBuffer = ParentHiddenTypes;
1887 HiddenTypes = &HiddenTypesBuffer;
1891 bool Hidden = ParentHiddenTypes.count(ConvType);
1893 HiddenTypesBuffer.insert(ConvType);
1897 if (Hidden && InVirtual)
1898 HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1906 VOutput.
addDecl(I.getDecl(), IAccess);
1908 Output.
addDecl(Context, I.getDecl(), IAccess);
1914 for (
const auto &I :
Record->bases()) {
1915 const auto *
Base = I.getType()->getAsCXXRecordDecl();
1921 bool BaseInVirtual = InVirtual || I.isVirtual();
1924 *HiddenTypes, Output, VOutput, HiddenVBaseCs);
1951 Output.
append(Context, ConvI, ConvE);
1952 for (; ConvI != ConvE; ++ConvI)
1956 for (
const auto &I :
Record->bases()) {
1957 const auto *
Base = I.getType()->getAsCXXRecordDecl();
1962 I.getAccessSpecifier(), HiddenTypes, Output,
1963 VBaseCs, HiddenVBaseCs);
1969 if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1970 Output.
addDecl(Context, I.getDecl(), I.getAccess());
1976llvm::iterator_range<CXXRecordDecl::conversion_iterator>
1981 if (
bases().empty()) {
1983 Set = &data().Conversions.get(Ctx);
1985 Set = &data().VisibleConversions.get(Ctx);
1987 if (!data().ComputedVisibleConversions) {
1989 data().ComputedVisibleConversions =
true;
1992 return llvm::make_range(
Set->begin(),
Set->end());
2008 for (
unsigned I = 0,
E = Convs.
size(); I !=
E; ++I) {
2009 if (Convs[I].getDecl() == ConvDecl) {
2011 assert(!llvm::is_contained(Convs, ConvDecl) &&
2012 "conversion was found multiple times in unresolved set");
2017 llvm_unreachable(
"conversion not found in set!");
2022 return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
2028 return dyn_cast_if_present<MemberSpecializationInfo *>(
2029 TemplateOrInstantiation);
2035 assert(TemplateOrInstantiation.isNull() &&
2036 "Previous template or instantiation?");
2037 assert(!isa<ClassTemplatePartialSpecializationDecl>(
this));
2038 TemplateOrInstantiation
2043 return dyn_cast_if_present<ClassTemplateDecl *>(TemplateOrInstantiation);
2047 TemplateOrInstantiation =
Template;
2051 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
this))
2052 return Spec->getSpecializationKind();
2055 return MSInfo->getTemplateSpecializationKind();
2062 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
this)) {
2063 Spec->setSpecializationKind(TSK);
2068 MSInfo->setTemplateSpecializationKind(TSK);
2072 llvm_unreachable(
"Not a class template or member class specialization");
2076 auto GetDefinitionOrSelf =
2078 if (
auto *Def =
D->getDefinition())
2085 if (
auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(
this)) {
2086 auto From = TD->getInstantiatedFrom();
2087 if (
auto *CTD = dyn_cast_if_present<ClassTemplateDecl *>(From)) {
2088 while (
auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
2089 if (NewCTD->isMemberSpecialization())
2093 return GetDefinitionOrSelf(CTD->getTemplatedDecl());
2096 dyn_cast_if_present<ClassTemplatePartialSpecializationDecl *>(
2098 while (
auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
2099 if (NewCTPSD->isMemberSpecialization())
2103 return GetDefinitionOrSelf(CTPSD);
2112 return GetDefinitionOrSelf(RD);
2117 "couldn't find pattern for class template instantiation");
2132 for (
auto *
Decl : R) {
2133 auto* DD = dyn_cast<CXXDestructorDecl>(
Decl);
2134 if (DD && !DD->isIneligibleOrNotSelected())
2142 return D->isDeleted();
2158 case Decl::ClassTemplatePartialSpecialization:
2160 case Decl::ClassTemplateSpecialization:
2162 case Decl::CXXRecord:
2165 llvm_unreachable(
"unexpected decl kind");
2171 if (
auto *RD = dyn_cast<ClassTemplatePartialSpecializationDecl>(
this))
2172 return RD->getCanonicalInjectedSpecializationType(Ctx);
2174 TD && !isa<ClassTemplateSpecializationDecl>(
this))
2175 return TD->getCanonicalInjectedSpecializationType(Ctx);
2189 assert(
hasDefinition() &&
"checking for interface-like without a definition");
2208 const auto *Uuid = getAttr<UuidAttr>();
2215 Uuid->getGuid() ==
"00000000-0000-0000-C000-000000000046") ||
2217 Uuid->getGuid() ==
"00020400-0000-0000-C000-000000000046"))) {
2231 if (BaseSpec.isVirtual() || BaseSpec.getAccessSpecifier() !=
AS_public)
2233 const auto *
Base = BaseSpec.getType()->getAsCXXRecordDecl();
2234 if (
Base->isInterface() || !
Base->isInterfaceLike())
2245 if (!FinalOverriders) {
2251 for (
const CXXFinalOverriderMap::value_type &
2252 OverridingMethodsEntry : *FinalOverriders) {
2253 for (
const auto &[_, SubobjOverrides] : OverridingMethodsEntry.second) {
2254 assert(SubobjOverrides.size() > 0 &&
2255 "All virtual functions have overriding virtual functions");
2257 if (SubobjOverrides.front().Method->isPureVirtual())
2280 I.setAccess((*I)->getAccess());
2288 if (
const auto *AT = FD->getAttr<ExplicitInitAttr>())
2291 diag::warn_cxx20_compat_requires_explicit_init_non_aggregate)
2301 if (
const auto *AT = FD->getAttr<ExplicitInitAttr>())
2303 diag::warn_attribute_needs_aggregate)
2311 if (data().Abstract ||
isInvalidDecl() || !data().Polymorphic ||
2315 for (
const auto &B :
bases()) {
2316 const auto *BaseDecl = cast<CXXRecordDecl>(
2318 if (BaseDecl->isAbstract())
2329 if (Def->hasAttr<FinalAttr>())
2331 if (
const auto *Dtor = Def->getDestructor())
2332 if (Dtor->hasAttr<FinalAttr>())
2337void CXXDeductionGuideDecl::anchor() {}
2356 case Decl::Kind::CXXConstructor:
2357 return cast<CXXConstructorDecl>(
Function)->getExplicitSpecifier();
2358 case Decl::Kind::CXXConversion:
2359 return cast<CXXConversionDecl>(
Function)->getExplicitSpecifier();
2360 case Decl::Kind::CXXDeductionGuide:
2361 return cast<CXXDeductionGuideDecl>(
Function)->getExplicitSpecifier();
2375 C, DC, StartLoc, ES, NameInfo,
T, TInfo, EndLocation, Ctor,
Kind,
2376 TrailingRequiresClause, GeneratedFrom, SourceKind);
2399void CXXMethodDecl::anchor() {}
2429 if (isa<CXXDestructorDecl>(
this)) {
2441 auto *MD = dyn_cast<CXXMethodDecl>(ND);
2469 llvm::erase_if(FinalOverriders, [&](
CXXMethodDecl *OtherD) {
2473 FinalOverriders.push_back(
D);
2476 for (
const auto &I : RD->
bases()) {
2477 const auto *
Base = I.getType()->getAsCXXRecordDecl();
2481 AddFinalOverrider(
D);
2484 return FinalOverriders.size() == 1 ? FinalOverriders.front() :
nullptr;
2495 CXXMethod,
C, RD, StartLoc, NameInfo,
T, TInfo, SC,
UsesFPIntrin,
2496 isInline, ConstexprKind, EndLocation, TrailingRequiresClause);
2510 assert(
isVirtual() &&
"this method is expected to be virtual");
2519 if (hasAttr<FinalAttr>())
2528 Base =
Base->getBestDynamicClassTypeExpr();
2529 if (
Base->isPRValue() &&
Base->getType()->isRecordType())
2534 if (!BestDynamicDecl)
2543 if (!DevirtualizedMethod)
2553 if (DevirtualizedMethod->
hasAttr<FinalAttr>())
2554 return DevirtualizedMethod;
2560 return DevirtualizedMethod;
2562 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
Base)) {
2563 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2564 if (VD->getType()->isRecordType())
2566 return DevirtualizedMethod;
2574 if (
const auto *ME = dyn_cast<MemberExpr>(
Base)) {
2575 const ValueDecl *VD = ME->getMemberDecl();
2581 if (
auto *BO = dyn_cast<BinaryOperator>(
Base)) {
2582 if (BO->isPtrMemOp()) {
2584 if (MPT->getPointeeType()->isRecordType())
2585 return DevirtualizedMethod;
2595 assert(PreventedBy.empty() &&
"PreventedBy is expected to be empty");
2611 if (!PrimaryTemplate)
2645 unsigned UsualParams = 1;
2692 for (
const auto *
D : R) {
2693 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
2694 if (FD->getNumParams() == 1) {
2695 PreventedBy.push_back(FD);
2757 assert(MD->
isVirtual() &&
"Method is not virtual!");
2763 if (isa<CXXConstructorDecl>(
this))
return nullptr;
2768 if (isa<CXXConstructorDecl>(
this))
return nullptr;
2773 if (isa<CXXConstructorDecl>(
this))
return 0;
2779 if (isa<CXXConstructorDecl>(
this))
2801 ObjectTy =
C.getLangOpts().HLSL ?
C.getLValueReferenceType(ObjectTy)
2802 :
C.getPointerType(ObjectTy);
2815 assert(
isInstance() &&
"No 'this' for static methods!");
2829 return C.getRValueReferenceType(
Type);
2830 return C.getLValueReferenceType(
Type);
2856 : Initializee(TInfo),
Init(
Init), MemberOrEllipsisLocation(EllipsisLoc),
2857 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(IsVirtual),
2858 IsWritten(
false), SourceOrder(0) {}
2864 : Initializee(
Member),
Init(
Init), MemberOrEllipsisLocation(MemberLoc),
2865 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(
false),
2866 IsWritten(
false), SourceOrder(0) {}
2873 : Initializee(
Member),
Init(
Init), MemberOrEllipsisLocation(MemberLoc),
2874 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(
false),
2875 IsWritten(
false), SourceOrder(0) {}
2881 : Initializee(TInfo),
Init(
Init), LParenLoc(L), RParenLoc(R),
2882 IsDelegating(
true), IsVirtual(
false), IsWritten(
false), SourceOrder(0) {}
2891 return cast<TypeSourceInfo *>(Initializee)->getTypeLoc();
2898 return cast<TypeSourceInfo *>(Initializee)->getType().getTypePtr();
2910 if (
const auto *TSInfo = cast<TypeSourceInfo *>(Initializee))
2911 return TSInfo->getTypeLoc().getBeginLoc();
2919 if (
Expr *I =
D->getInClassInitializer())
2920 return I->getSourceRange();
2927CXXConstructorDecl::CXXConstructorDecl(
2935 SC_None, UsesFPIntrin, isInline, ConstexprKind,
2937 setNumCtorInitializers(0);
2938 setInheritingConstructor(
static_cast<bool>(Inherited));
2939 setImplicit(isImplicitlyDeclared);
2940 CXXConstructorDeclBits.HasTrailingExplicitSpecifier = ES.
getExpr() ? 1 : 0;
2942 *getTrailingObjects<InheritedConstructor>() = Inherited;
2943 setExplicitSpecifier(ES);
2946void CXXConstructorDecl::anchor() {}
2950 uint64_t AllocKind) {
2951 bool hasTrailingExplicit =
static_cast<bool>(AllocKind & TAKHasTailExplicit);
2953 static_cast<bool>(AllocKind & TAKInheritsConstructor);
2955 additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2962 Result->CXXConstructorDeclBits.HasTrailingExplicitSpecifier =
2963 hasTrailingExplicit;
2977 "Name must refer to a constructor");
2979 additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2980 Inherited ? 1 : 0, ES.
getExpr() ? 1 : 0);
2983 isImplicitlyDeclared, ConstexprKind, Inherited, TrailingRequiresClause);
2993 if (
const auto *Construct = dyn_cast<CXXConstructExpr>(
E))
2994 return Construct->getConstructor();
3085 return ParamType == ClassTy;
3088void CXXDestructorDecl::anchor() {}
3101 bool UsesFPIntrin,
bool isInline,
bool isImplicitlyDeclared,
3106 "Name must refer to a destructor");
3109 isImplicitlyDeclared, ConstexprKind, TrailingRequiresClause);
3114 if (OD && !
First->OperatorDelete) {
3115 First->OperatorDelete = OD;
3116 First->OperatorDeleteThisArg = ThisArg;
3118 L->ResolvedOperatorDelete(
First, OD, ThisArg);
3133 const FunctionDecl *SelectedOperatorDelete = OpDel ? OpDel : OperatorDelete;
3134 if (!SelectedOperatorDelete)
3144void CXXConversionDecl::anchor() {}
3162 "Name must refer to a conversion function");
3165 ConstexprKind, EndLocation, TrailingRequiresClause);
3182void LinkageSpecDecl::anchor() {}
3189 return new (
C, DC)
LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
3199void UsingDirectiveDecl::anchor() {}
3208 if (
auto *NS = dyn_cast_or_null<NamespaceDecl>(
Used))
3209 Used = NS->getFirstDecl();
3211 IdentLoc,
Used, CommonAncestor);
3223 if (
auto *Alias = dyn_cast<NamespaceAliasDecl>(
this))
3224 return Alias->getNamespace();
3225 return cast<NamespaceDecl>(
this);
3229 if (
auto *NA = dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
3231 return cast_or_null<NamespaceDecl>(NominatedNamespace);
3239 redeclarable_base(
C), LocStart(StartLoc) {
3242 setPreviousDecl(PrevDecl);
3271void NamespaceAliasDecl::anchor() {}
3291 if (
auto *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
3292 Namespace = NS->getFirstDecl();
3294 QualifierLoc, IdentLoc, Namespace);
3305void LifetimeExtendedTemporaryDecl::anchor() {}
3314 if (isa<FieldDecl>(ExtendingDecl))
3318 if (isa<BindingDecl>(ExtendingDecl))
3321 return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
3326 "don't need to cache the computed value for this temporary");
3327 if (MayCreate && !
Value) {
3331 assert(
Value &&
"may not be null");
3335void UsingShadowDecl::anchor() {}
3341 UsingOrNextShadow(Introducer) {
3343 assert(!isa<UsingShadowDecl>(
Target));
3360 while (
const auto *NextShadow =
3361 dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
3362 Shadow = NextShadow;
3363 return cast<BaseUsingDecl>(Shadow->UsingOrNextShadow);
3366void ConstructorUsingShadowDecl::anchor() {}
3385void BaseUsingDecl::anchor() {}
3388 assert(!llvm::is_contained(
shadows(), S) &&
"declaration already in set");
3389 assert(S->getIntroducer() ==
this);
3391 if (FirstUsingShadow.getPointer())
3392 S->UsingOrNextShadow = FirstUsingShadow.getPointer();
3393 FirstUsingShadow.setPointer(S);
3397 assert(llvm::is_contained(
shadows(), S) &&
"declaration not in set");
3398 assert(S->getIntroducer() ==
this);
3402 if (FirstUsingShadow.getPointer() == S) {
3403 FirstUsingShadow.setPointer(
3404 dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
3405 S->UsingOrNextShadow =
this;
3410 while (Prev->UsingOrNextShadow != S)
3411 Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
3412 Prev->UsingOrNextShadow = S->UsingOrNextShadow;
3413 S->UsingOrNextShadow =
this;
3416void UsingDecl::anchor() {}
3422 return new (
C, DC)
UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
3437void UsingEnumDecl::anchor() {}
3459void UsingPackDecl::anchor() {}
3464 size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
3469 unsigned NumExpansions) {
3470 size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
3472 Result->NumExpansions = NumExpansions;
3473 auto *Trail =
Result->getTrailingObjects();
3474 std::uninitialized_fill_n(Trail, NumExpansions,
nullptr);
3478void UnresolvedUsingValueDecl::anchor() {}
3487 QualifierLoc, NameInfo,
3506void UnresolvedUsingTypenameDecl::anchor() {}
3517 DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
3538 return new (Ctx,
ID)
3542UnresolvedUsingIfExistsDecl::UnresolvedUsingIfExistsDecl(
DeclContext *DC,
3547void UnresolvedUsingIfExistsDecl::anchor() {}
3549void StaticAssertDecl::anchor() {}
3567 assert((isa<VarDecl, BindingDecl>(
this)) &&
3568 "expected a VarDecl or a BindingDecl");
3569 if (
auto *Var = llvm::dyn_cast<VarDecl>(
this))
3571 if (
auto *BD = llvm::dyn_cast<BindingDecl>(
this))
3572 return llvm::dyn_cast_if_present<VarDecl>(BD->getDecomposedDecl());
3576void BindingDecl::anchor() {}
3597 auto *VD = cast<VarDecl>(DRE->getDecl());
3598 assert(VD->isImplicit() &&
"holding var for binding decl not implicit");
3603 assert(Binding &&
"expecting a pack expr");
3604 auto *FP = cast<FunctionParmPackExpr>(Binding);
3605 ValueDecl *
const *
First = FP->getNumExpansions() > 0 ? FP->begin() :
nullptr;
3606 assert((!
First || isa<BindingDecl>(*
First)) &&
"expecting a BindingDecl");
3608 FP->getNumExpansions());
3611void DecompositionDecl::anchor() {}
3619 size_t Extra = additionalSizeToAlloc<BindingDecl *>(
Bindings.size());
3620 return new (
C, DC,
Extra)
3626 unsigned NumBindings) {
3627 size_t Extra = additionalSizeToAlloc<BindingDecl *>(NumBindings);
3632 Result->NumBindings = NumBindings;
3633 auto *Trail =
Result->getTrailingObjects();
3634 std::uninitialized_fill_n(Trail, NumBindings,
nullptr);
3645 B->printName(OS, Policy);
3651void MSPropertyDecl::anchor() {}
3659 return new (
C, DC)
MSPropertyDecl(DC, L, N,
T, TInfo, StartL, Getter, Setter);
3669void MSGuidDecl::anchor() {}
3686 OS << llvm::format(
"GUID{%08" PRIx32
"-%04" PRIx16
"-%04" PRIx16
"-",
3689 for (uint8_t Byte : PartVal.
Part4And5) {
3690 OS << llvm::format(
"%02" PRIx8, Byte);
3703 auto IsInt = [&Ctx](
unsigned N) {
3710 auto IsArray = [&Ctx](MatcherRef Elem,
unsigned N) {
3717 auto IsStruct = [](std::initializer_list<MatcherRef> Fields) {
3725 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3726 if (CXXRD->getNumBases())
3728 auto MatcherIt = Fields.begin();
3730 if (FD->isUnnamedBitField())
3732 if (FD->isBitField() || MatcherIt == Fields.end() ||
3733 !(*MatcherIt)(FD->getType()))
3737 return MatcherIt == Fields.end();
3742 return IsStruct({IsInt(32), IsInt(16), IsInt(16), IsArray(IsInt(8), 8)})(
T);
3755 for (
unsigned I = 0; I != 8; ++I) {
3767void UnnamedGlobalConstantDecl::anchor() {}
3769UnnamedGlobalConstantDecl::UnnamedGlobalConstantDecl(
const ASTContext &
C,
3778 if (
Value.needsCleanup())
3779 C.addDestruction(&
Value);
3797 OS <<
"unnamed-global-constant";
3803 llvm_unreachable(
"Invalid access specifier!");
3811 llvm_unreachable(
"Invalid access specifier!");
Defines the clang::ASTContext interface.
ASTImporterLookupTable & LT
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines the Diagnostic-related interfaces.
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
static void CollectVisibleConversions(ASTContext &Context, const CXXRecordDecl *Record, bool InVirtual, AccessSpecifier Access, const llvm::SmallPtrSet< CanQualType, 8 > &ParentHiddenTypes, ASTUnresolvedSet &Output, UnresolvedSetImpl &VOutput, llvm::SmallPtrSet< NamedDecl *, 8 > &HiddenVBaseCs)
Collect the visible conversions of a base class.
static const char * getAccessName(AccessSpecifier AS)
static bool recursivelyOverrides(const CXXMethodDecl *DerivedMD, const CXXMethodDecl *BaseMD)
static bool isValidStructGUID(ASTContext &Ctx, QualType T)
Determine if T is a valid 'struct _GUID' of the shape that we expect.
static DeclContext::lookup_result getLambdaStaticInvokers(const CXXRecordDecl &RD)
static NamedDecl * getLambdaCallOperatorHelper(const CXXRecordDecl &RD)
static QualType getThisObjectType(ASTContext &C, const FunctionProtoType *FPT, const CXXRecordDecl *Decl)
static bool hasPureVirtualFinalOverrider(const CXXRecordDecl &RD, const CXXFinalOverriderMap *FinalOverriders)
static bool allLookupResultsAreTheSame(const DeclContext::lookup_result &R)
static bool isDeclContextInNamespace(const DeclContext *DC)
static bool hasRepeatedBaseClass(const CXXRecordDecl *StartRD)
Determine whether a class has a repeated base class.
static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv)
static CXXMethodDecl * getInvokerAsMethod(NamedDecl *ND)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
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 the LambdaCapture class.
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
llvm::MachO::Record Record
This file contains the declaration of the ODRHash class, which calculates a hash based on AST nodes,...
Defines an enumeration for C++ overloaded operators.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
APValue & getArrayInitializedElt(unsigned I)
APValue & getStructField(unsigned i)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
unsigned getIntWidth(QualType T) const
DeclarationNameTable DeclarationNames
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
overridden_method_range overridden_methods(const CXXMethodDecl *Method) const
const LangOptions & getLangOpts() const
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
overridden_cxx_method_iterator overridden_methods_end(const CXXMethodDecl *Method) const
llvm::BumpPtrAllocator & getAllocator() const
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
void * Allocate(size_t Size, unsigned Align=8) const
unsigned overridden_methods_size(const CXXMethodDecl *Method) const
overridden_cxx_method_iterator overridden_methods_begin(const CXXMethodDecl *Method) const
DiagnosticsEngine & getDiagnostics() const
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
CanQualType getCanonicalTagType(const TagDecl *TD) const
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
An UnresolvedSet-like class which uses the ASTContext's allocator.
void append(ASTContext &C, iterator I, iterator E)
bool replace(const NamedDecl *Old, NamedDecl *New, AccessSpecifier AS)
Replaces the given declaration with the new one, once.
void addDecl(ASTContext &C, NamedDecl *D, AccessSpecifier AS)
Represents an access specifier followed by colon ':'.
static AccessSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
QualType getElementType() const
Represents a C++ declaration that introduces decls from somewhere else.
void addShadowDecl(UsingShadowDecl *S)
shadow_range shadows() const
void removeShadowDecl(UsingShadowDecl *S)
A binding in a decomposition declaration.
VarDecl * getHoldingVar() const
Get the variable (if any) that holds the value of evaluating the binding.
static BindingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T)
Expr * getBinding() const
Get the expression to which this declaration is bound.
ArrayRef< BindingDecl * > getBindingPackDecls() const
static BindingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
bool isExplicit() const
Return true if the declaration is already resolved to be explicit.
init_iterator init_begin()
Retrieve an iterator to the first initializer.
CXXConstructorDecl * getTargetConstructor() const
When this constructor delegates to another, retrieve the target.
static CXXConstructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, uint64_t AllocKind)
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
bool isDelegatingConstructor() const
Determine whether this constructor is a delegating constructor.
bool isSpecializationCopyingObject() const
Determine whether this is a member template specialization that would copy the object to itself.
bool isMoveConstructor() const
Determine whether this constructor is a move constructor (C++11 [class.copy]p3), which can be used to...
bool isCopyOrMoveConstructor() const
Determine whether this a copy or move constructor.
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), const AssociatedConstraint &TrailingRequiresClause={})
bool isInheritingConstructor() const
Determine whether this is an implicit constructor synthesized to model a call to a constructor inheri...
CXXCtorInitializer *const * init_const_iterator
Iterates through the member/base initializer list.
bool isConvertingConstructor(bool AllowExplicit) const
Whether this constructor is a converting constructor (C++ [class.conv.ctor]), which can be used for u...
bool isCopyConstructor() const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
Represents a C++ conversion function within a class.
bool isLambdaToBlockPointerConversion() const
Determine whether this conversion function is a conversion from a lambda closure type to a block poin...
static CXXConversionDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
QualType getConversionType() const
Returns the type that this conversion function is converting to.
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ base or member initializer.
SourceLocation getRParenLoc() const
SourceRange getSourceRange() const LLVM_READONLY
Determine the source range covering the entire initializer.
SourceLocation getSourceLocation() const
Determine the source location of the initializer.
bool isAnyMemberInitializer() const
bool isBaseInitializer() const
Determine whether this initializer is initializing a base class.
int64_t getID(const ASTContext &Context) const
bool isInClassMemberInitializer() const
Determine whether this initializer is an implicit initializer generated for a field with an initializ...
const Type * getBaseClass() const
If this is a base class initializer, returns the type of the base class.
SourceLocation getMemberLocation() const
FieldDecl * getAnyMember() const
TypeLoc getBaseClassLoc() const
If this is a base class initializer, returns the type of the base class with location information.
CXXCtorInitializer(ASTContext &Context, TypeSourceInfo *TInfo, bool IsVirtual, SourceLocation L, Expr *Init, SourceLocation R, SourceLocation EllipsisLoc)
Creates a new base-class initializer.
Represents a C++ deduction guide declaration.
static CXXDeductionGuideDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, ExplicitSpecifier ES, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, SourceLocation EndLocation, CXXConstructorDecl *Ctor=nullptr, DeductionCandidate Kind=DeductionCandidate::Normal, const AssociatedConstraint &TrailingRequiresClause={}, const CXXDeductionGuideDecl *SourceDG=nullptr, SourceDeductionGuideKind SK=SourceDeductionGuideKind::None)
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ destructor within a class.
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, const AssociatedConstraint &TrailingRequiresClause={})
void setOperatorDelete(FunctionDecl *OD, Expr *ThisArg)
bool isCalledByDelete(const FunctionDecl *OpDel=nullptr) const
Will this destructor ever be called when considering which deallocation function is associated with t...
A mapping from each virtual member function to its set of final overriders.
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
CXXMethodDecl * getCorrespondingMethodDeclaredInClass(const CXXRecordDecl *RD, bool MayBeBase=false)
Find if RD declares a function that overrides this function, and if so, return it.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
void addOverriddenMethod(const CXXMethodDecl *MD)
bool hasInlineBody() const
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
bool isUsualDeallocationFunction(SmallVectorImpl< const FunctionDecl * > &PreventedBy) const
Determine whether this is a usual deallocation function (C++ [basic.stc.dynamic.deallocation]p2),...
unsigned getNumExplicitParams() const
overridden_method_range overridden_methods() const
unsigned size_overridden_methods() const
const CXXMethodDecl *const * method_iterator
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
method_iterator begin_overridden_methods() const
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
QualType getThisType() const
Return the type of the this pointer.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
CXXMethodDecl * getDevirtualizedMethod(const Expr *Base, bool IsAppleKext)
If it's possible to devirtualize a call to this method, return the called function.
static bool isStaticOverloadedOperator(OverloadedOperatorKind OOK)
Returns true if the given operator is implicitly static in a record context.
CXXMethodDecl * getCorrespondingMethodInClass(const CXXRecordDecl *RD, bool MayBeBase=false)
Find the method in RD that corresponds to this one.
llvm::iterator_range< llvm::TinyPtrVector< const CXXMethodDecl * >::const_iterator > overridden_method_range
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
method_iterator end_overridden_methods() const
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isLambdaStaticInvoker() const
Determine whether this is a lambda closure type's static member function that is used for the result ...
Represents a C++ struct/union/class.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
bool mayBeAbstract() const
Determine whether this class may end up being abstract, even though it is not yet known to be abstrac...
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
bool isTriviallyCopyable() const
Determine whether this class is considered trivially copyable per (C++11 [class]p6).
bool hasNonTrivialCopyAssignment() const
Determine whether this class has a non-trivial copy assignment operator (C++ [class....
TemplateParameterList * getGenericLambdaTemplateParameterList() const
Retrieve the generic lambda's template parameter list.
bool isEffectivelyFinal() const
Determine whether it's impossible for a class to be derived from this class.
bool hasSimpleMoveConstructor() const
true if we know for sure that this class has a single, accessible, unambiguous move constructor that ...
bool isAggregate() const
Determine whether this class is an aggregate (C++ [dcl.init.aggr]), which is a class with no user-dec...
bool hasTrivialDefaultConstructor() const
Determine whether this class has a trivial default constructor (C++11 [class.ctor]p5).
void setBases(CXXBaseSpecifier const *const *Bases, unsigned NumBases)
Sets the base classes of this struct or class.
bool isGenericLambda() const
Determine whether this class describes a generic lambda function object (i.e.
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
bool hasUserDeclaredDestructor() const
Determine whether this class has a user-declared destructor.
CXXRecordDecl * getInstantiatedFromMemberClass() const
If this record is an instantiation of a member class, retrieves the member class from which it was in...
bool hasInjectedClassType() const
Determines whether this declaration has is canonically of an injected class type.
void completeDefinition() override
Indicates that the definition of this class is now complete.
bool isLiteral() const
Determine whether this class is a literal type.
bool hasDeletedDestructor() const
Returns the destructor decl for this class.
bool defaultedDestructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
bool isStandardLayout() const
Determine whether this class is standard-layout per C++ [class]p7.
void setCaptures(ASTContext &Context, ArrayRef< LambdaCapture > Captures)
Set the captures for this lambda closure type.
unsigned getDeviceLambdaManglingNumber() const
Retrieve the device side mangling number.
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
void setTrivialForCallFlags(CXXMethodDecl *MD)
bool isLambda() const
Determine whether this class describes a lambda function object.
void addedSelectedDestructor(CXXDestructorDecl *DD)
Notify the class that this destructor is now selected.
bool hasFriends() const
Determines whether this record has any friends.
method_range methods() const
CXXRecordDecl * getDefinition() const
static AccessSpecifier MergeAccess(AccessSpecifier PathAccess, AccessSpecifier DeclAccess)
Calculates the access of a decl that is reached along a path.
void getCaptureFields(llvm::DenseMap< const ValueDecl *, FieldDecl * > &Captures, FieldDecl *&ThisCapture) const
For a closure type, retrieve the mapping from captured variables and this to the non-static data memb...
bool hasConstexprNonCopyMoveConstructor() const
Determine whether this class has at least one constexpr constructor other than the copy or move const...
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
llvm::iterator_range< conversion_iterator > getVisibleConversionFunctions() const
Get all conversion functions visible in current class, including conversion function templates.
bool hasConstexprDestructor() const
Determine whether this class has a constexpr destructor.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool hasNonLiteralTypeFieldsOrBases() const
Determine whether this class has a non-literal or/ volatile type non-static data member or base class...
bool isTriviallyCopyConstructible() const
Determine whether this class is considered trivially copyable per.
bool isCapturelessLambda() const
const CXXRecordDecl * getTemplateInstantiationPattern() const
Retrieve the record declaration from which this record could be instantiated.
bool lambdaIsDefaultConstructibleAndAssignable() const
Determine whether this lambda should have an implicit default constructor and copy and move assignmen...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
base_class_iterator bases_begin()
FunctionTemplateDecl * getDependentLambdaCallOperator() const
Retrieve the dependent lambda call operator of the closure type if this is a templated closure type.
void addedEligibleSpecialMemberFunction(const CXXMethodDecl *MD, unsigned SMKind)
Notify the class that an eligible SMF has been added.
conversion_iterator conversion_end() const
void finishedDefaultedOrDeletedMember(CXXMethodDecl *MD)
Indicates that the declaration of a defaulted or deleted special member function is now complete.
CXXRecordDecl(Kind K, TagKind TK, const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl)
bool isCLike() const
True if this class is C-like, without C++-specific features, e.g.
void setInstantiationOfMemberClass(CXXRecordDecl *RD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member class RD.
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
bool hasSimpleMoveAssignment() const
true if we know for sure that this class has a single, accessible, unambiguous move assignment operat...
bool hasNonTrivialMoveConstructor() const
Determine whether this class has a non-trivial move constructor (C++11 [class.copy]p12)
CanQualType getCanonicalTemplateSpecializationType(const ASTContext &Ctx) const
bool hasUserDeclaredConstructor() const
Determine whether this class has any user-declared constructors.
unsigned getODRHash() const
bool hasDefinition() const
ArrayRef< NamedDecl * > getLambdaExplicitTemplateParameters() const
Retrieve the lambda template parameters that were specified explicitly.
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
bool isPOD() const
Whether this class is a POD-type (C++ [class]p4)
void getFinalOverriders(CXXFinalOverriderMap &FinaOverriders) const
Retrieve the final overriders for each virtual member function in the class hierarchy where this clas...
void removeConversion(const NamedDecl *Old)
Removes a conversion function from this class.
bool hasSimpleCopyConstructor() const
true if we know for sure that this class has a single, accessible, unambiguous copy constructor that ...
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
bool hasNonTrivialMoveAssignment() const
Determine whether this class has a non-trivial move assignment operator (C++11 [class....
CXXMethodDecl * getLambdaStaticInvoker() const
Retrieve the lambda static invoker, the address of which is returned by the conversion operator,...
bool hasSimpleDestructor() const
true if we know for sure that this class has an accessible destructor that is not deleted.
void setDescribedClassTemplate(ClassTemplateDecl *Template)
bool isInterfaceLike() const
void setLambdaNumbering(LambdaNumbering Numbering)
Set the mangling numbers and context declaration for a lambda class.
bool forallBases(ForallBasesCallback BaseMatches) const
Determines if the given callback holds for all the direct or indirect base classes of this type.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
bool hasNonTrivialCopyConstructor() const
Determine whether this class has a non-trivial copy constructor (C++ [class.copy]p6,...
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
const CXXRecordDecl * getStandardLayoutBaseWithFields() const
If this is a standard-layout class or union, any and all data members will be declared in the same ty...
bool hasSimpleCopyAssignment() const
true if we know for sure that this class has a single, accessible, unambiguous copy assignment operat...
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the kind of specialization or template instantiation this is.
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
conversion_iterator conversion_begin() const
Declaration of a class template.
Represents the canonical version of C arrays with a specified constant size.
llvm::APInt getSize() const
Return the constant array size as an APInt.
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
UsingDecl * getIntroducer() const
Override the UsingShadowDecl's getIntroducer, returning the UsingDecl that introduced this.
static ConstructorUsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, UsingDecl *Using, NamedDecl *Target, bool IsVirtual)
CXXRecordDecl * getNominatedBaseClass() const
Get the base class that was named in the using declaration.
The results of name lookup within a DeclContext.
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.
ASTContext & getParentASTContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
bool isFunctionOrMethod() const
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
LinkageSpecDeclBitfields LinkageSpecDeclBits
Decl::Kind getDeclKind() const
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
ASTMutationListener * getASTMutationListener() const
Kind
Lists the kind of concrete classes of Decl.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isInvalidDecl() const
SourceLocation getLocation() const
void setImplicit(bool I=true)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
const LangOptions & getLangOpts() const LLVM_READONLY
Helper to get the language options from the ASTContext.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
A decomposition declaration.
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
ArrayRef< BindingDecl * > bindings() const
static DecompositionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation LSquareLoc, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< BindingDecl * > Bindings)
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
Store information needed for an explicit specifier.
ExplicitSpecKind getKind() const
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(FunctionDecl *Function)
bool isEquivalent(const ExplicitSpecifier Other) const
Check for equivalence of explicit specifiers.
This represents one expression.
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Abstract interface for external sources of AST nodes.
virtual Decl * GetExternalDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Represents a member of a struct/union/class.
Represents a function declaration or definition.
static constexpr unsigned RequiredTypeAwareDeleteParameterCount
Count of mandatory parameters for type aware operator delete.
const ParmVarDecl * getParamDecl(unsigned i) const
bool isTrivialForCall() const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
bool hasCXXExplicitFunctionObjectParameter() const
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
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.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
void setIneligibleOrNotSelected(bool II)
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Represents a prototype with parameter type info, e.g.
Qualifiers getMethodQuals() const
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
FunctionType - C99 6.7.5.3 - Function Declarators.
One of these records is kept for each identifier that is lexed.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
Represents a field injected from an anonymous union/struct into the parent scope.
Description of a constructor that was inherited from a base class.
An lvalue reference type, per C++11 [dcl.ref].
Describes the capture of a variable or of this, or of a C++1y init-capture.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
APValue * getOrCreateValue(bool MayCreate) const
Get the storage for the constant value of a materialized temporary of static storage duration.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
ValueDecl * getExtendingDecl()
Represents a linkage specification.
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
APValue & getAsAPValue() const
Get the value of this MSGuidDecl as an APValue.
void printName(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const override
Print this UUID in a human-readable format.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL, IdentifierInfo *Getter, IdentifierInfo *Setter)
static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A pointer to member type per C++ 8.3.3 - Pointers to members.
Provides information a specialization of a member of a class template, which may be a member function...
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.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Represents a C++ namespace alias.
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamespaceBaseDecl *Namespace)
Represents C++ namespaces and their aliases.
NamespaceDecl * getNamespace()
Represent a C++ namespace.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A C++ nested-name-specifier augmented with source location information.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier, or null.
void AddStmt(const Stmt *S)
void AddCXXRecordDecl(const CXXRecordDecl *Record)
Represents a parameter to a function.
Pointer-authentication qualifiers.
A (possibly-)qualified type.
void addRestrict()
Add the restrict qualifier to this QualType.
void removeLocalRestrict()
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
Represents a struct/union/class.
void setArgPassingRestrictions(RecordArgPassingKind Kind)
field_iterator field_end() const
field_range fields() const
void setHasObjectMember(bool val)
void setHasVolatileMember(bool val)
virtual void completeDefinition()
Note that the definition of this type is now complete.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
bool hasUninitializedExplicitInitFields() const
void setHasUninitializedExplicitInitFields(bool V)
field_iterator field_begin() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getOriginalDecl() const
FunctionDecl * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
NamespaceDecl * getNextRedeclaration() const
NamespaceDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
NamespaceDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
Base for LValueReferenceType and RValueReferenceType.
Represents the body of a requires-expression.
static RequiresExprBodyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc)
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Encodes a location in the source.
A trivial tuple used to represent a source range.
Represents a C++11 static_assert declaration.
static StaticAssertDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *Message, SourceLocation RParenLoc, bool Failed)
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
bool isBeingDefined() const
Return true if this decl is currently being defined.
void setBeingDefined(bool V=true)
True if this decl is currently being defined.
TagKind getTagKind() const
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
Exposes information about the current target.
virtual bool areDefaultedSMFStillPOD(const LangOptions &) const
Controls whether explicitly defaulted (= default) special member functions disqualify something from ...
Stores a list of template parameters for a TemplateDecl and its derived classes.
Base wrapper for a particular "section" of type source info.
A container of type source information.
The base class of the type hierarchy.
bool isBlockPointerType() const
bool isLiteralType(const ASTContext &Ctx) const
Return true if this is a literal type (C++11 [basic.types]p10)
bool isUnsignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is unsigned or an enumeration types whose underlying ...
bool isRValueReferenceType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
CXXRecordDecl * castAsCXXRecordDecl() const
bool isHLSLBuiltinIntangibleType() const
CanQualType getCanonicalTypeUnqualified() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
const Type * getArrayElementTypeNoTypeQual() const
If this is an array type, return the element type of the array, potentially with type qualifiers miss...
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isLValueReferenceType() const
bool isStructuralType() const
Determine if this type is a structural type, per C++20 [temp.param]p7.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
EnumDecl * castAsEnumDecl() const
bool isHLSLAttributedResourceType() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isRecordType() const
bool isObjCRetainableType() const
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
void printName(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const override
Print this in a human-readable format.
A set of unresolved declarations.
void addDecl(NamedDecl *D)
The iterator over UnresolvedSets.
NamedDecl * getDecl() const
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
static UnresolvedUsingIfExistsDecl * Create(ASTContext &Ctx, DeclContext *DC, SourceLocation Loc, DeclarationName Name)
Represents a dependent using declaration which was marked with typename.
static UnresolvedUsingTypenameDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation TypenameLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TargetNameLoc, DeclarationName TargetName, SourceLocation EllipsisLoc)
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a dependent using declaration which was not marked with typename.
bool isAccessDeclaration() const
Return true if it is a C++03 access declaration (no 'using').
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
DeclarationNameInfo getNameInfo() const
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static UnresolvedUsingValueDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, SourceLocation EllipsisLoc)
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-declaration.
bool isAccessDeclaration() const
Return true if it is a C++03 access declaration (no 'using').
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
DeclarationNameInfo getNameInfo() const
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
Represents C++ using-directive.
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
Represents a C++ using-enum-declaration.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static UsingEnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, SourceLocation EnumL, SourceLocation NameL, TypeSourceInfo *EnumType)
Represents a pack of using declarations that a single using-declarator pack-expanded into.
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
static UsingPackDecl * Create(ASTContext &C, DeclContext *DC, NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > UsingDecls)
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
void setTargetDecl(NamedDecl *ND)
Sets the underlying declaration which has been brought into the local scope.
UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC, SourceLocation Loc, DeclarationName Name, BaseUsingDecl *Introducer, NamedDecl *Target)
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
VarDecl * getPotentiallyDecomposedVarDecl()
Represents a variable declaration or definition.
Defines the clang::TargetInfo interface.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
StorageClass
Storage classes.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
StorageDuration
The storage duration for an object (per C++ [basic.stc]).
@ SD_Static
Static storage duration.
@ SD_FullExpression
Full-expression storage duration (for temporaries).
@ SD_Automatic
Automatic storage duration (most local variables).
@ Result
The result type of a method or function.
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
StringRef getLambdaStaticInvokerName()
const FunctionProtoType * T
DeductionCandidate
Only used by CXXDeductionGuideDecl.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ Other
Other implicit parameter.
Information about how a lambda is numbered within its context.
unsigned DeviceManglingNumber
bool HasKnownInternalLinkage
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...
DeclarationName getName() const
getName - Returns the embedded declaration name.
T * get(ExternalASTSource *Source) const
Retrieve the pointer to the AST node that this lazy pointer points to.
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
Describes how types, statements, expressions, and declarations should be printed.