16 #ifndef LLVM_CLANG_AST_DECLCXX_H 17 #define LLVM_CLANG_AST_DECLCXX_H 40 #include "llvm/ADT/ArrayRef.h" 41 #include "llvm/ADT/DenseMap.h" 42 #include "llvm/ADT/PointerIntPair.h" 43 #include "llvm/ADT/PointerUnion.h" 44 #include "llvm/ADT/STLExtras.h" 45 #include "llvm/ADT/iterator_range.h" 46 #include "llvm/Support/Casting.h" 47 #include "llvm/Support/Compiler.h" 48 #include "llvm/Support/PointerLikeTypeTraits.h" 49 #include "llvm/Support/TrailingObjects.h" 58 class ClassTemplateDecl;
59 class ConstructorUsingShadowDecl;
62 class CXXConstructorDecl;
63 class CXXDestructorDecl;
64 class CXXFinalOverriderMap;
65 class CXXIndirectPrimaryBaseSet;
67 class DiagnosticBuilder;
69 class FunctionTemplateDecl;
71 class MemberSpecializationInfo;
73 class TemplateParameterList;
111 return ::clang::AnyFunctionDecl::getFromNamedDecl(
112 static_cast< ::clang::NamedDecl*>(P));
115 enum { NumLowBitsAvailable = 2 };
144 virtual void anchor();
203 unsigned Virtual : 1;
209 unsigned BaseOfClass : 1;
219 unsigned InheritConstructors : 1;
231 : Range(R), EllipsisLoc(EllipsisLoc), Virtual(V), BaseOfClass(BC),
232 Access(A), InheritConstructors(
false), BaseTypeInfo(TInfo) {}
261 InheritConstructors = Inherit;
316 enum SpecialMemberFlags {
317 SMF_DefaultConstructor = 0x1,
318 SMF_CopyConstructor = 0x2,
319 SMF_MoveConstructor = 0x4,
320 SMF_CopyAssignment = 0x8,
321 SMF_MoveAssignment = 0x10,
322 SMF_Destructor = 0x20,
326 struct DefinitionData {
328 unsigned UserDeclaredConstructor : 1;
331 unsigned UserDeclaredSpecialMembers : 6;
334 unsigned Aggregate : 1;
337 unsigned PlainOldData : 1;
347 unsigned Polymorphic : 1;
351 unsigned Abstract : 1;
355 unsigned IsStandardLayout : 1;
372 unsigned IsCXX11StandardLayout : 1;
378 unsigned HasBasesWithFields : 1;
384 unsigned HasBasesWithNonStaticDataMembers : 1;
387 unsigned HasPrivateFields : 1;
390 unsigned HasProtectedFields : 1;
393 unsigned HasPublicFields : 1;
396 unsigned HasMutableFields : 1;
400 unsigned HasVariantMembers : 1;
403 unsigned HasOnlyCMembers : 1;
407 unsigned HasInClassInitializer : 1;
414 unsigned HasUninitializedReferenceMember : 1;
418 unsigned HasUninitializedFields : 1;
422 unsigned HasInheritedConstructor : 1;
426 unsigned HasInheritedAssignment : 1;
431 unsigned NeedOverloadResolutionForCopyConstructor : 1;
432 unsigned NeedOverloadResolutionForMoveConstructor : 1;
433 unsigned NeedOverloadResolutionForMoveAssignment : 1;
434 unsigned NeedOverloadResolutionForDestructor : 1;
440 unsigned DefaultedCopyConstructorIsDeleted : 1;
441 unsigned DefaultedMoveConstructorIsDeleted : 1;
442 unsigned DefaultedMoveAssignmentIsDeleted : 1;
443 unsigned DefaultedDestructorIsDeleted : 1;
452 unsigned HasTrivialSpecialMembers : 6;
457 unsigned HasTrivialSpecialMembersForCall : 6;
465 unsigned DeclaredNonTrivialSpecialMembers : 6;
471 unsigned DeclaredNonTrivialSpecialMembersForCall : 6;
474 unsigned HasIrrelevantDestructor : 1;
478 unsigned HasConstexprNonCopyMoveConstructor : 1;
482 unsigned HasDefaultedDefaultConstructor : 1;
486 unsigned DefaultedDefaultConstructorIsConstexpr : 1;
492 unsigned HasConstexprDefaultConstructor : 1;
496 unsigned HasNonLiteralTypeFieldsOrBases : 1;
500 unsigned ComputedVisibleConversions : 1;
504 unsigned UserProvidedDefaultConstructor : 1;
508 unsigned DeclaredSpecialMembers : 6;
512 unsigned ImplicitCopyConstructorCanHaveConstParamForVBase : 1;
513 unsigned ImplicitCopyConstructorCanHaveConstParamForNonVBase : 1;
517 unsigned ImplicitCopyAssignmentHasConstParam : 1;
521 unsigned HasDeclaredCopyConstructorWithConstParam : 1;
525 unsigned HasDeclaredCopyAssignmentWithConstParam : 1;
528 unsigned IsLambda : 1;
531 unsigned IsParsingBaseSpecifiers : 1;
533 unsigned HasODRHash : 1;
539 unsigned NumBases = 0;
542 unsigned NumVBases = 0;
579 return Bases.
get(
nullptr);
580 return getBasesSlowCase();
586 return VBases.
get(
nullptr);
587 return getVBasesSlowCase();
591 return llvm::makeArrayRef(getBases(), NumBases);
595 return llvm::makeArrayRef(getVBases(), NumVBases);
603 struct DefinitionData *DefinitionData;
606 struct LambdaDefinitionData :
public DefinitionData {
617 unsigned Dependent : 1;
620 unsigned IsGenericLambda : 1;
623 unsigned CaptureDefault : 2;
626 unsigned NumCaptures : 15;
629 unsigned NumExplicitCaptures : 13;
633 unsigned ManglingNumber = 0;
649 bool Dependent,
bool IsGeneric,
651 : DefinitionData(D), Dependent(Dependent), IsGenericLambda(IsGeneric),
652 CaptureDefault(CaptureDefault), NumCaptures(0), NumExplicitCaptures(0),
659 PlainOldData =
false;
663 struct DefinitionData *dataPtr()
const {
666 return DefinitionData;
669 struct DefinitionData &data()
const {
670 auto *DD = dataPtr();
671 assert(DD &&
"queried property of class with no definition");
675 struct LambdaDefinitionData &getLambdaData()
const {
678 auto *DD = DefinitionData;
679 assert(DD && DD->IsLambda &&
"queried lambda property of non-lambda class");
680 return static_cast<LambdaDefinitionData&
>(*DD);
692 llvm::PointerUnion<ClassTemplateDecl *, MemberSpecializationInfo *>
693 TemplateOrInstantiation;
704 void addedMember(
Decl *D);
706 void markedVirtualFunctionPure();
715 bool hasSubobjectAtOffsetZeroOfEmptyBaseType(
ASTContext &Ctx,
739 return cast_or_null<CXXRecordDecl>(
740 static_cast<RecordDecl *
>(
this)->getPreviousDecl());
748 return cast<CXXRecordDecl>(
749 static_cast<RecordDecl *
>(
this)->getMostRecentDecl());
753 return const_cast<CXXRecordDecl*
>(
this)->getMostRecentDecl();
768 return const_cast<CXXRecordDecl*
>(
this)->getMostRecentNonInjectedDecl();
774 auto *DD = DefinitionData ? DefinitionData : dataPtr();
775 return DD ? DD->Definition :
nullptr;
784 bool DelayTypeCreation =
false);
787 bool DependentLambda,
bool IsGeneric,
792 return data().Polymorphic || data().NumVBases != 0;
798 return !
hasDefinition() || isDynamicClass() || hasAnyDependentBases();
804 return !
hasDefinition() || !isDynamicClass() || hasAnyDependentBases();
810 return data().IsParsingBaseSpecifiers;
813 unsigned getODRHash()
const;
823 llvm::iterator_range<base_class_const_iterator>;
836 return bases_begin() + data().NumBases;
853 return vbases_begin() + data().NumVBases;
858 bool hasAnyDependentBases()
const;
865 llvm::iterator_range<specific_decl_iterator<CXXMethodDecl>>;
885 llvm::iterator_range<specific_decl_iterator<CXXConstructorDecl>>;
909 return data().FirstFriend.isValid();
915 assert((!needsOverloadResolutionForCopyConstructor() ||
916 (data().DeclaredSpecialMembers & SMF_CopyConstructor)) &&
917 "this property has not yet been computed by Sema");
918 return data().DefaultedCopyConstructorIsDeleted;
924 assert((!needsOverloadResolutionForMoveConstructor() ||
925 (data().DeclaredSpecialMembers & SMF_MoveConstructor)) &&
926 "this property has not yet been computed by Sema");
927 return data().DefaultedMoveConstructorIsDeleted;
932 assert((!needsOverloadResolutionForDestructor() ||
933 (data().DeclaredSpecialMembers & SMF_Destructor)) &&
934 "this property has not yet been computed by Sema");
935 return data().DefaultedDestructorIsDeleted;
941 return !hasUserDeclaredCopyConstructor() &&
942 !data().DefaultedCopyConstructorIsDeleted;
948 return !hasUserDeclaredMoveConstructor() && hasMoveConstructor() &&
949 !data().DefaultedMoveConstructorIsDeleted;
955 return !hasUserDeclaredMoveAssignment() && hasMoveAssignment() &&
956 !data().DefaultedMoveAssignmentIsDeleted;
962 return !hasUserDeclaredDestructor() &&
963 !data().DefaultedDestructorIsDeleted;
968 return (data().DeclaredSpecialMembers & SMF_DefaultConstructor) ||
969 needsImplicitDefaultConstructor();
977 return !data().UserDeclaredConstructor &&
978 !(data().DeclaredSpecialMembers & SMF_DefaultConstructor) &&
989 return data().UserDeclaredConstructor;
995 return data().UserProvidedDefaultConstructor;
1002 return data().UserDeclaredSpecialMembers & SMF_CopyConstructor;
1008 return !(data().DeclaredSpecialMembers & SMF_CopyConstructor);
1020 if (data().UserDeclaredSpecialMembers &
1021 (SMF_MoveConstructor | SMF_MoveAssignment))
1023 return data().NeedOverloadResolutionForCopyConstructor;
1029 return data().ImplicitCopyConstructorCanHaveConstParamForNonVBase &&
1031 data().ImplicitCopyConstructorCanHaveConstParamForVBase);
1037 return data().HasDeclaredCopyConstructorWithConstParam ||
1038 (needsImplicitCopyConstructor() &&
1039 implicitCopyConstructorHasConstParam());
1048 return data().UserDeclaredSpecialMembers &
1049 (SMF_MoveConstructor | SMF_MoveAssignment);
1055 return data().UserDeclaredSpecialMembers & SMF_MoveConstructor;
1060 return (data().DeclaredSpecialMembers & SMF_MoveConstructor) ||
1061 needsImplicitMoveConstructor();
1067 assert((data().DefaultedCopyConstructorIsDeleted ||
1068 needsOverloadResolutionForCopyConstructor()) &&
1069 "Copy constructor should not be deleted");
1070 data().DefaultedCopyConstructorIsDeleted =
true;
1076 assert((data().DefaultedMoveConstructorIsDeleted ||
1077 needsOverloadResolutionForMoveConstructor()) &&
1078 "move constructor should not be deleted");
1079 data().DefaultedMoveConstructorIsDeleted =
true;
1085 assert((data().DefaultedDestructorIsDeleted ||
1086 needsOverloadResolutionForDestructor()) &&
1087 "destructor should not be deleted");
1088 data().DefaultedDestructorIsDeleted =
true;
1094 return !(data().DeclaredSpecialMembers & SMF_MoveConstructor) &&
1095 !hasUserDeclaredCopyConstructor() &&
1096 !hasUserDeclaredCopyAssignment() &&
1097 !hasUserDeclaredMoveAssignment() &&
1098 !hasUserDeclaredDestructor();
1104 return data().NeedOverloadResolutionForMoveConstructor;
1112 return data().UserDeclaredSpecialMembers & SMF_CopyAssignment;
1118 return !(data().DeclaredSpecialMembers & SMF_CopyAssignment);
1124 return data().HasMutableFields;
1130 return data().ImplicitCopyAssignmentHasConstParam;
1137 return data().HasDeclaredCopyAssignmentWithConstParam ||
1138 (needsImplicitCopyAssignment() &&
1139 implicitCopyAssignmentHasConstParam());
1145 return data().UserDeclaredSpecialMembers & SMF_MoveAssignment;
1150 return (data().DeclaredSpecialMembers & SMF_MoveAssignment) ||
1151 needsImplicitMoveAssignment();
1157 assert((data().DefaultedMoveAssignmentIsDeleted ||
1158 needsOverloadResolutionForMoveAssignment()) &&
1159 "move assignment should not be deleted");
1160 data().DefaultedMoveAssignmentIsDeleted =
true;
1167 return !(data().DeclaredSpecialMembers & SMF_MoveAssignment) &&
1168 !hasUserDeclaredCopyConstructor() &&
1169 !hasUserDeclaredCopyAssignment() &&
1170 !hasUserDeclaredMoveConstructor() &&
1171 !hasUserDeclaredDestructor() &&
1181 return data().NeedOverloadResolutionForMoveAssignment;
1188 return data().UserDeclaredSpecialMembers & SMF_Destructor;
1194 return !(data().DeclaredSpecialMembers & SMF_Destructor);
1200 return data().NeedOverloadResolutionForDestructor;
1206 auto *DD = DefinitionData;
1207 return DD && DD->IsLambda;
1213 bool isGenericLambda()
const;
1246 void getCaptureFields(llvm::DenseMap<const VarDecl *, FieldDecl *> &Captures,
1257 return isLambda() ? getLambdaData().Captures :
nullptr;
1261 return isLambda() ? captures_begin() + getLambdaData().NumCaptures
1268 return data().Conversions.get(getASTContext()).begin();
1272 return data().Conversions.get(getASTContext()).end();
1278 void removeConversion(
const NamedDecl *Old);
1282 llvm::iterator_range<conversion_iterator> getVisibleConversionFunctions();
1304 return !isUnion() && !hasUserDeclaredConstructor() &&
1305 data().HasUninitializedReferenceMember;
1316 bool isPOD()
const {
return data().PlainOldData; }
1320 bool isCLike()
const;
1336 return D.HasPublicFields || D.HasProtectedFields || D.HasPrivateFields;
1368 return hasDefaultConstructor() &&
1369 (data().HasTrivialSpecialMembers & SMF_DefaultConstructor);
1375 return (data().DeclaredNonTrivialSpecialMembers & SMF_DefaultConstructor) ||
1376 (needsImplicitDefaultConstructor() &&
1377 !(data().HasTrivialSpecialMembers & SMF_DefaultConstructor));
1383 return data().HasConstexprNonCopyMoveConstructor ||
1384 (needsImplicitDefaultConstructor() &&
1385 defaultedDefaultConstructorIsConstexpr());
1391 return data().DefaultedDefaultConstructorIsConstexpr &&
1392 (!isUnion() || hasInClassInitializer() || !hasVariantMembers());
1397 return data().HasConstexprDefaultConstructor ||
1398 (needsImplicitDefaultConstructor() &&
1399 defaultedDefaultConstructorIsConstexpr());
1405 return data().HasTrivialSpecialMembers & SMF_CopyConstructor;
1409 return data().HasTrivialSpecialMembersForCall & SMF_CopyConstructor;
1415 return data().DeclaredNonTrivialSpecialMembers & SMF_CopyConstructor ||
1416 !hasTrivialCopyConstructor();
1420 return (data().DeclaredNonTrivialSpecialMembersForCall &
1421 SMF_CopyConstructor) ||
1422 !hasTrivialCopyConstructorForCall();
1428 return hasMoveConstructor() &&
1429 (data().HasTrivialSpecialMembers & SMF_MoveConstructor);
1433 return hasMoveConstructor() &&
1434 (data().HasTrivialSpecialMembersForCall & SMF_MoveConstructor);
1440 return (data().DeclaredNonTrivialSpecialMembers & SMF_MoveConstructor) ||
1441 (needsImplicitMoveConstructor() &&
1442 !(data().HasTrivialSpecialMembers & SMF_MoveConstructor));
1446 return (data().DeclaredNonTrivialSpecialMembersForCall &
1447 SMF_MoveConstructor) ||
1448 (needsImplicitMoveConstructor() &&
1449 !(data().HasTrivialSpecialMembersForCall & SMF_MoveConstructor));
1455 return data().HasTrivialSpecialMembers & SMF_CopyAssignment;
1461 return data().DeclaredNonTrivialSpecialMembers & SMF_CopyAssignment ||
1462 !hasTrivialCopyAssignment();
1468 return hasMoveAssignment() &&
1469 (data().HasTrivialSpecialMembers & SMF_MoveAssignment);
1475 return (data().DeclaredNonTrivialSpecialMembers & SMF_MoveAssignment) ||
1476 (needsImplicitMoveAssignment() &&
1477 !(data().HasTrivialSpecialMembers & SMF_MoveAssignment));
1483 return data().HasTrivialSpecialMembers & SMF_Destructor;
1487 return data().HasTrivialSpecialMembersForCall & SMF_Destructor;
1493 return !(data().HasTrivialSpecialMembers & SMF_Destructor);
1497 return !(data().HasTrivialSpecialMembersForCall & SMF_Destructor);
1501 data().HasTrivialSpecialMembersForCall =
1502 (SMF_CopyConstructor | SMF_MoveConstructor | SMF_Destructor);
1508 return !data().HasUninitializedFields ||
1509 !(data().HasDefaultedDefaultConstructor ||
1510 needsImplicitDefaultConstructor());
1519 return data().HasIrrelevantDestructor;
1525 return data().HasNonLiteralTypeFieldsOrBases;
1531 return data().HasInheritedConstructor;
1537 return data().HasInheritedAssignment;
1542 bool isTriviallyCopyable()
const;
1550 return isTriviallyCopyable() && hasTrivialDefaultConstructor();
1571 return hasTrivialDestructor() &&
1572 (!isLambda() || getASTContext().getLangOpts().CPlusPlus17) &&
1573 !hasNonLiteralTypeFieldsOrBases() &&
1574 (isAggregate() || isLambda() ||
1575 hasConstexprNonCopyMoveConstructor() ||
1576 hasTrivialDefaultConstructor());
1635 const CXXRecordDecl *getTemplateInstantiationPattern()
const;
1639 ->getTemplateInstantiationPattern());
1647 bool isAnyDestructorNoReturn()
const;
1652 if (
const auto *RD = dyn_cast<CXXRecordDecl>(getDeclContext()))
1665 bool isCurrentInstantiation(
const DeclContext *CurContext)
const;
1710 bool isVirtuallyDerivedFrom(
const CXXRecordDecl *Base)
const;
1722 llvm::function_ref<bool(const CXXRecordDecl *BaseDefinition)>;
1738 bool AllowShortCircuit =
true)
const;
1776 bool LookupInDependent =
false)
const;
1857 std::vector<const NamedDecl *>
1859 llvm::function_ref<
bool(
const NamedDecl *ND)> Filter);
1864 void viewInheritance(
ASTContext& Context)
const;
1870 assert(DeclAccess !=
AS_none);
1872 return (PathAccess > DeclAccess ? PathAccess : DeclAccess);
1882 void completeDefinition()
override;
1900 bool mayBeAbstract()
const;
1909 assert(isLambda() &&
"Not a lambda closure type!");
1910 return getLambdaData().ManglingNumber;
1922 Decl *getLambdaContextDecl()
const;
1927 getLambdaData().ManglingNumber = ManglingNumber;
1928 getLambdaData().ContextDecl = ContextDecl;
1932 MSInheritanceAttr::Spelling getMSInheritanceModel()
const;
1935 MSInheritanceAttr::Spelling calculateInheritanceModel()
const;
1944 return !MSInheritanceAttr::hasOnlyOneField(
false,
1945 getMSInheritanceModel()) ||
1951 MSVtorDispAttr::Mode getMSVtorDispMode()
const;
1965 return isLambda() && getLambdaData().Dependent;
1969 return getLambdaData().MethodTyInfo;
1974 bool isInterfaceLike()
const;
1978 return K >= firstCXXRecord && K <= lastCXXRecord;
1993 void anchor()
override;
2000 :
FunctionDecl(CXXDeductionGuide, C, DC, StartLoc, NameInfo, T, TInfo,
2003 setRangeEnd(EndLocation);
2004 IsExplicitSpecified = IsExplicit;
2027 return getDeclName().getCXXDeductionGuideTemplate();
2031 IsCopyDeductionCandidate =
true;
2046 void anchor()
override;
2054 :
FunctionDecl(DK, C, RD, StartLoc, NameInfo, T, TInfo,
2055 SC, isInline, isConstexpr) {
2057 setRangeEnd(EndLocation);
2072 bool isStatic()
const;
2083 return OOK == OO_New || OOK == OO_Array_New || OOK == OO_Delete ||
2084 OOK == OO_Array_Delete;
2109 bool IsAppleKext)
const {
2110 return const_cast<CXXMethodDecl *
>(
this)->getDevirtualizedMethod(
2117 bool isUsualDeallocationFunction()
const;
2121 bool isCopyAssignmentOperator()
const;
2124 bool isMoveAssignmentOperator()
const;
2134 return cast<CXXMethodDecl>(
2135 static_cast<FunctionDecl *
>(
this)->getMostRecentDecl());
2138 return const_cast<CXXMethodDecl*
>(
this)->getMostRecentDecl();
2144 auto *DeclAsWritten =
this;
2145 if (
auto *Pattern = getTemplateInstantiationPattern())
2146 DeclAsWritten = cast<CXXMethodDecl>(Pattern);
2147 return !(DeclAsWritten->isDeleted() ||
2148 DeclAsWritten->getCanonicalDecl()->isDefaulted());
2157 unsigned size_overridden_methods()
const;
2203 bool hasInlineBody()
const;
2212 bool isLambdaStaticInvoker()
const;
2221 bool MayBeBase =
false);
2225 bool MayBeBase =
false)
const {
2227 ->getCorrespondingMethodInClass(RD, MayBeBase);
2233 return K >= firstCXXMethod && K <= lastCXXMethod;
2256 llvm::PointerUnion3<TypeSourceInfo *, FieldDecl *, IndirectFieldDecl *>
2279 unsigned IsDelegating : 1;
2283 unsigned IsVirtual : 1;
2287 unsigned IsWritten : 1;
2291 unsigned SourceOrder : 13;
2327 return isMemberInitializer() || isIndirectMemberInitializer();
2341 return Init->
getStmtClass() == Stmt::CXXDefaultInitExprClass;
2352 return isBaseInitializer() && MemberOrEllipsisLocation.
isValid();
2357 assert(isPackExpansion() &&
"Initializer is not a pack expansion");
2358 return MemberOrEllipsisLocation;
2364 TypeLoc getBaseClassLoc()
const;
2368 const Type *getBaseClass()
const;
2372 assert(isBaseInitializer() &&
"Must call this on base initializer!");
2386 if (isMemberInitializer())
2392 if (isMemberInitializer())
2394 if (isIndirectMemberInitializer())
2400 if (isIndirectMemberInitializer())
2406 return MemberOrEllipsisLocation;
2422 return IsWritten ?
static_cast<int>(SourceOrder) : -1;
2433 assert(!IsWritten &&
2434 "setSourceOrder() used on implicit initializer");
2435 assert(SourceOrder == 0 &&
2436 "calling twice setSourceOrder() on the same initializer");
2438 "setSourceOrder() used to make an initializer implicit");
2440 SourceOrder =
static_cast<unsigned>(Pos);
2459 : Shadow(Shadow), BaseCtor(BaseCtor) {}
2461 explicit operator bool()
const {
return Shadow; }
2484 unsigned NumCtorInitializers : 31;
2489 unsigned IsInheritingConstructor : 1;
2494 bool isExplicitSpecified,
bool isInline,
2495 bool isImplicitlyDeclared,
bool isConstexpr,
2497 :
CXXMethodDecl(CXXConstructor, C, RD, StartLoc, NameInfo, T, TInfo,
2499 NumCtorInitializers(0), IsInheritingConstructor((
bool)Inherited) {
2500 setImplicit(isImplicitlyDeclared);
2502 *getTrailingObjects<InheritedConstructor>() = Inherited;
2503 IsExplicitSpecified = isExplicitSpecified;
2506 void anchor()
override;
2514 bool InheritsConstructor);
2518 bool isExplicit,
bool isInline,
bool isImplicitlyDeclared,
2538 const auto *ConstThis =
this;
2547 return init_begin() + NumCtorInitializers;
2552 return init_begin() + NumCtorInitializers;
2557 std::reverse_iterator<init_const_iterator>;
2576 return NumCtorInitializers;
2580 NumCtorInitializers = numCtorInitializers;
2584 CtorInitializers = Initializers;
2597 return (getNumCtorInitializers() == 1) &&
2598 init_begin()[0]->isDelegatingInitializer();
2607 bool isDefaultConstructor()
const;
2622 bool isCopyConstructor(
unsigned &TypeQuals)
const;
2628 unsigned TypeQuals = 0;
2629 return isCopyConstructor(TypeQuals);
2637 bool isMoveConstructor(
unsigned &TypeQuals)
const;
2642 unsigned TypeQuals = 0;
2643 return isMoveConstructor(TypeQuals);
2650 bool isCopyOrMoveConstructor(
unsigned &TypeQuals)
const;
2655 return isCopyOrMoveConstructor(Quals);
2661 bool isConvertingConstructor(
bool AllowExplicit)
const;
2666 bool isSpecializationCopyingObject()
const;
2674 return IsInheritingConstructor ? *getTrailingObjects<InheritedConstructor>()
2707 Expr *OperatorDeleteThisArg =
nullptr;
2712 bool isInline,
bool isImplicitlyDeclared)
2713 :
CXXMethodDecl(CXXDestructor, C, RD, StartLoc, NameInfo, T, TInfo,
2716 setImplicit(isImplicitlyDeclared);
2719 void anchor()
override;
2727 bool isImplicitlyDeclared);
2766 bool isExplicitSpecified,
bool isConstexpr,
2768 :
CXXMethodDecl(CXXConversion, C, RD, StartLoc, NameInfo, T, TInfo,
2769 SC_None, isInline, isConstexpr, EndLocation) {
2770 IsExplicitSpecified = isExplicitSpecified;
2773 void anchor()
override;
2783 bool isInline,
bool isExplicit,
2803 bool isLambdaToBlockPointerConversion()
const;
2824 virtual void anchor();
2840 unsigned Language : 3;
2847 unsigned HasBraces : 1;
2858 Language(lang), HasBraces(HasBraces), ExternLoc(ExternLoc),
2877 assert(!RBraceLoc.
isValid() || HasBraces);
2886 HasBraces = RBraceLoc.
isValid();
2892 return getRBraceLoc();
2895 return decls_empty() ? getLocation() : decls_begin()->getLocEnd();
2948 NamespaceLoc(NamespcLoc), QualifierLoc(QualifierLoc),
2949 NominatedNamespace(Nominated), CommonAncestor(CommonAncestor) {}
2959 void anchor()
override;
2979 return NominatedNamespace;
3052 NamespaceLoc(NamespaceLoc), IdentLoc(IdentLoc),
3053 QualifierLoc(QualifierLoc), Namespace(Namespace) {}
3055 void anchor()
override;
3077 using redeclarable_base::redecls_begin;
3078 using redeclarable_base::redecls_end;
3079 using redeclarable_base::redecls;
3080 using redeclarable_base::getPreviousDecl;
3081 using redeclarable_base::getMostRecentDecl;
3084 return getFirstDecl();
3087 return getFirstDecl();
3102 if (
auto *AD = dyn_cast<NamespaceAliasDecl>(Namespace))
3103 return AD->getNamespace();
3105 return cast<NamespaceDecl>(Namespace);
3157 void anchor()
override;
3162 return getNextRedeclaration();
3166 return getPreviousDecl();
3170 return getMostRecentDecl();
3185 return new (
C, DC)
UsingShadowDecl(UsingShadow, C, DC, Loc, Using, Target);
3193 using redeclarable_base::redecls_begin;
3194 using redeclarable_base::redecls_end;
3195 using redeclarable_base::redecls;
3196 using redeclarable_base::getPreviousDecl;
3197 using redeclarable_base::getMostRecentDecl;
3198 using redeclarable_base::isFirstDecl;
3201 return getFirstDecl();
3204 return getFirstDecl();
3214 assert(ND &&
"Target decl is null!");
3220 ~(IDNS_OrdinaryFriend | IDNS_TagFriend | IDNS_LocalExtern);
3229 return dyn_cast_or_null<UsingShadowDecl>(UsingOrNextShadow);
3234 return K == Decl::UsingShadow || K == Decl::ConstructorUsingShadow;
3263 unsigned IsVirtual : 1;
3267 bool TargetInVirtualBase)
3270 NominatedBaseClassShadowDecl(
3271 dyn_cast<ConstructorUsingShadowDecl>(Target)),
3272 ConstructedBaseClassShadowDecl(NominatedBaseClassShadowDecl),
3273 IsVirtual(TargetInVirtualBase) {
3277 if (NominatedBaseClassShadowDecl &&
3278 NominatedBaseClassShadowDecl->constructsVirtualBase()) {
3279 ConstructedBaseClassShadowDecl =
3280 NominatedBaseClassShadowDecl->ConstructedBaseClassShadowDecl;
3286 :
UsingShadowDecl(ConstructorUsingShadow, C, Empty), IsVirtual(
false) {}
3288 void anchor()
override;
3305 return cast<CXXRecordDecl>(getDeclContext());
3308 return cast<CXXRecordDecl>(getDeclContext());
3316 return NominatedBaseClassShadowDecl;
3322 return ConstructedBaseClassShadowDecl;
3332 return cast<CXXRecordDecl>((ConstructedBaseClassShadowDecl
3333 ? ConstructedBaseClassShadowDecl
3335 ->getDeclContext());
3376 llvm::PointerIntPair<UsingShadowDecl *, 1, bool> FirstUsingShadow;
3382 UsingLocation(UL), QualifierLoc(QualifierLoc),
3383 DNLoc(NameInfo.
getInfo()), FirstUsingShadow(
nullptr, HasTypenameKeyword) {
3386 void anchor()
override;
3451 return x.Current == y.Current;
3454 return x.Current != y.Current;
3483 bool HasTypenameKeyword);
3518 unsigned NumExpansions;
3523 InstantiatedFrom ? InstantiatedFrom->
getLocation()
3525 InstantiatedFrom ? InstantiatedFrom->
getDeclName()
3527 InstantiatedFrom(InstantiatedFrom), NumExpansions(UsingDecls.size()) {
3528 std::uninitialized_copy(UsingDecls.begin(), UsingDecls.end(),
3529 getTrailingObjects<NamedDecl *>());
3532 void anchor()
override;
3547 return llvm::makeArrayRef(getTrailingObjects<NamedDecl *>(), NumExpansions);
3555 unsigned NumExpansions);
3580 public Mergeable<UnresolvedUsingValueDecl> {
3601 UsingLocation(UsingLoc), EllipsisLoc(EllipsisLoc),
3602 QualifierLoc(QualifierLoc), DNLoc(NameInfo.
getInfo()) {}
3604 void anchor()
override;
3648 CreateDeserialized(
ASTContext &C,
unsigned ID);
3654 return getFirstDecl();
3657 return getFirstDecl();
3677 public Mergeable<UnresolvedUsingTypenameDecl> {
3695 :
TypeDecl(UnresolvedUsingTypename, DC, TargetNameLoc, TargetName,
3697 TypenameLocation(TypenameLoc), EllipsisLoc(EllipsisLoc),
3698 QualifierLoc(QualifierLoc) {}
3700 void anchor()
override;
3739 CreateDeserialized(
ASTContext &C,
unsigned ID);
3743 return getFirstDecl();
3746 return getFirstDecl();
3755 llvm::PointerIntPair<Expr *, 1, bool> AssertExprAndFailed;
3762 :
Decl(StaticAssert, DC, StaticAssertLoc),
3763 AssertExprAndFailed(AssertExpr, Failed), Message(Message),
3764 RParenLoc(RParenLoc) {}
3766 virtual void anchor();
3783 bool isFailed()
const {
return AssertExprAndFailed.getInt(); }
3788 return SourceRange(getLocation(), getRParenLoc());
3808 Expr *Binding =
nullptr;
3813 void anchor()
override;
3829 VarDecl *getHoldingVar()
const;
3835 setType(DeclaredType);
3836 this->Binding = Binding;
3855 unsigned NumBindings;
3861 :
VarDecl(Decomposition, C, DC, StartLoc, LSquareLoc,
nullptr, T, TInfo,
3863 NumBindings(Bindings.size()) {
3864 std::uninitialized_copy(Bindings.begin(), Bindings.end(),
3865 getTrailingObjects<BindingDecl *>());
3868 void anchor()
override;
3881 unsigned NumBindings);
3884 return llvm::makeArrayRef(getTrailingObjects<BindingDecl *>(), NumBindings);
3887 void printName(raw_ostream &os)
const override;
3927 GetterId(Getter), SetterId(Setter) {}
3956 #endif // LLVM_CLANG_AST_DECLCXX_H const CXXRecordDecl * getPreviousDecl() const
bool isBaseInitializer() const
Determine whether this initializer is initializing a base class.
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
void setSourceOrder(int Pos)
Set the source order of this initializer.
Defines the clang::ASTContext interface.
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
static const Decl * getCanonicalDecl(const Decl *D)
Represents a function declaration or definition.
Expr * getInit() const
Get the initializer.
llvm::iterator_range< redecl_iterator > redecl_range
A (possibly-)qualified type.
unsigned getNumCtorInitializers() const
Determine the number of arguments used to initialize the member or base.
bool hasUninitializedReferenceMember() const
Whether this class or any of its subobjects has any members of reference type which would make value-...
bool isStandardLayout() const
Determine whether this class is standard-layout per C++ [class]p7.
static bool classof(const Decl *D)
bool mayBeNonDynamicClass() const
const CXXMethodDecl *const * method_iterator
const DeclarationNameLoc & getInfo() const
unsigned getNumBases() const
Retrieves the number of base classes of this class.
SourceLocation getEllipsisLoc() const
Get the location of the ellipsis if this is a pack expansion.
SourceLocation getLParenLoc() const
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
static bool classof(const Decl *D)
Iterates through the using shadow declarations associated with this using declaration.
Stmt - This represents one statement.
static bool classofKind(Kind K)
FunctionType - C99 6.7.5.3 - Function Declarators.
bool isInClassMemberInitializer() const
Determine whether this initializer is an implicit initializer generated for a field with an initializ...
static bool classof(const Decl *D)
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
C Language Family Type Representation.
bool hasNonTrivialCopyConstructor() const
Determine whether this class has a non-trivial copy constructor (C++ [class.copy]p6, C++11 [class.copy]p12)
bool allowConstDefaultInit() const
Determine whether declaring a const variable with this type is ok per core issue 253.
static TemplateSpecializationKind getTemplateSpecializationKind(Decl *D)
Determine what kind of template specialization the given declaration is.
bool hasIrrelevantDestructor() const
Determine whether this class has a destructor which has no semantic effect.
Decl - This represents one declaration (or definition), e.g.
bool needsOverloadResolutionForDestructor() const
Determine whether we need to eagerly declare a destructor for this class.
void setAccessSpecifierLoc(SourceLocation ASLoc)
Sets the location of the access specifier.
IdentifierInfo * getGetterId() const
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
bool hasUserDeclaredCopyAssignment() const
Determine whether this class has a user-declared copy assignment operator.
init_const_reverse_iterator init_rend() const
shadow_iterator shadow_end() const
bool isPOD() const
Whether this class is a POD-type (C++ [class]p4)
bool isWritten() const
Determine whether this initializer is explicitly written in the source code.
void setPure(bool P=true)
init_reverse_iterator init_rend()
bool isPackExpansion() const
Determine whether this is a pack expansion.
const DiagnosticBuilder & operator<<(const DiagnosticBuilder &DB, const Attr *At)
SourceLocation getColonLoc() const
The location of the colon following the access specifier.
The base class of the type hierarchy.
static bool classof(const Decl *D)
Expr * getOperatorDeleteThisArg() const
const CXXMethodDecl * getDevirtualizedMethod(const Expr *Base, bool IsAppleKext) const
void setIsCopyDeductionCandidate()
Represent a C++ namespace.
std::reverse_iterator< init_iterator > init_reverse_iterator
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of the namespace.
const NamedDecl * getNominatedNamespaceAsWritten() const
bool hasTrivialMoveConstructor() const
Determine whether this class has a trivial move constructor (C++11 [class.copy]p12) ...
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
const NestedNameSpecifier * Specifier
A container of type source information.
bool hasConstexprNonCopyMoveConstructor() const
Determine whether this class has at least one constexpr constructor other than the copy or move const...
capture_const_range captures() const
static bool classof(const Decl *D)
base_class_const_iterator vbases_end() const
bool needsImplicitMoveAssignment() const
Determine whether this class should get an implicit move assignment operator or if any existing speci...
QualType getConversionType() const
Returns the type that this conversion function is converting to.
static bool classofKind(Kind K)
bool hasFriends() const
Determines whether this record has any friends.
Describes the capture of a variable or of this, or of a C++1y init-capture.
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
bool hasUserDeclaredMoveOperation() const
Whether this class has a user-declared move constructor or assignment operator.
unsigned getIdentifierNamespace() const
static bool classof(const Decl *D)
Represents a C++ constructor within a class.
bool implicitCopyAssignmentHasConstParam() const
Determine whether an implicit copy assignment operator for this type would have a parameter with a co...
float __ovld __cnfn distance(float p0, float p1)
Returns the distance between p0 and p1.
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
bool needsOverloadResolutionForCopyConstructor() const
Determine whether we need to eagerly declare a defaulted copy constructor for this class...
bool isPackExpansion() const
Determine whether this initializer is a pack expansion.
SourceLocation getTargetNameLoc() const
Returns the location of the identifier in the named namespace.
friend bool operator!=(shadow_iterator x, shadow_iterator y)
bool isIndirectMemberInitializer() const
const Expr * getAssertExpr() const
FriendDecl - Represents the declaration of a friend entity, which can be a function, a type, or a templated function or type.
Represents a variable declaration or definition.
static bool classof(const Decl *D)
const T * getAs() const
Member-template getAs<specific type>'.
bool needsImplicitCopyAssignment() const
Determine whether this class needs an implicit copy assignment operator to be lazily declared...
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
bool hasTrivialDefaultConstructor() const
Determine whether this class has a trivial default constructor (C++11 [class.ctor]p5).
Stores a list of template parameters for a TemplateDecl and its derived classes.
bool isMemberInitializer() const
Determine whether this initializer is initializing a non-static data member.
SourceLocation getEllipsisLoc() const
bool hasDefinition() const
UsingShadowDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
static AccessSpecDecl * Create(ASTContext &C, AccessSpecifier AS, DeclContext *DC, SourceLocation ASLoc, SourceLocation ColonLoc)
Represents any kind of function declaration, whether it is a concrete function or a function template...
DeclarationNameInfo getNameInfo() const
bool isExplicitSpecified() const
Whether this function is marked as explicit explicitly.
SourceLocation getRParenLoc() const
reference operator*() const
std::string getName(ArrayRef< StringRef > Parts) const
Get the platform-specific name separator.
bool isExplicitSpecified() const
Whether this deduction guide was declared with the 'explicit' specifier.
static bool classof(const Decl *D)
An UnresolvedSet-like class that might not have been loaded from the external AST source yet...
const FunctionDecl * isLocalClass() const
If the class is a local class [class.local], returns the enclosing function declaration.
bool hasNonTrivialDefaultConstructor() const
Determine whether this class has a non-trivial default constructor (C++11 [class.ctor]p5).
Base wrapper for a particular "section" of type source info.
Represents a struct/union/class.
bool hasTrivialCopyConstructorForCall() const
LanguageIDs getLanguage() const
Return the language specified by this linkage specification.
An iterator over the friend declarations of a class.
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
Description of a constructor that was inherited from a base class.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Provides common interface for the Decls that can be redeclared.
SourceLocation getLocEnd() const LLVM_READONLY
One of these records is kept for each identifier that is lexed.
CXXRecordDecl * getParent()
Returns the parent of this method declaration, which is the class in which this method is defined...
StringLiteral * getMessage()
static bool classof(const Decl *D)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
CXXRecordDecl * getPreviousDecl()
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
A C++ nested-name-specifier augmented with source location information.
SourceLocation getColonLoc() const
Returns the location of ':'.
NamespaceDecl * getNamespace()
Retrieve the namespace declaration aliased by this directive.
static bool classofKind(Kind K)
bool defaultedDefaultConstructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
bool mayBeDynamicClass() const
void setLanguage(LanguageIDs L)
Set the language specified by this linkage specification.
static bool classof(const Decl *D)
SourceLocation getLocStart() const LLVM_READONLY
Represents a member of a struct/union/class.
TypeSourceInfo * getTypeSourceInfo() const
Returns the declarator information for a base class or delegating initializer.
llvm::iterator_range< capture_const_iterator > capture_const_range
conversion_iterator conversion_end() const
void startDefinition()
Starts the definition of this tag declaration.
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isCopyOrMoveConstructor() const
Determine whether this a copy or move constructor.
static bool classofKind(Kind K)
bool hasTrivialMoveAssignment() const
Determine whether this class has a trivial move assignment operator (C++11 [class.copy]p25)
InheritedConstructor getInheritedConstructor() const
Get the constructor that this inheriting constructor is based on.
The iterator over UnresolvedSets.
static NamespaceDecl * getNamespace(const NestedNameSpecifier *X)
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
static bool classof(const Decl *D)
FieldDecl * getAnonField() const
bool hasUserDeclaredDestructor() const
Determine whether this class has a user-declared destructor.
unsigned getTypeQualifiers() const
method_iterator method_begin() const
Method begin iterator.
static bool classofKind(Kind K)
Represents an access specifier followed by colon ':'.
llvm::iterator_range< init_iterator > init_range
TypeSourceInfo * getLambdaTypeInfo() const
NamespaceAliasDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
llvm::iterator_range< friend_iterator > friend_range
void setImplicitCopyConstructorIsDeleted()
Set that we attempted to declare an implicit copy constructor, but overload resolution failed so we d...
static bool classofKind(Kind K)
Represents a C++ using-declaration.
UnresolvedUsingValueDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this declaration.
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
ArrayRef< BindingDecl * > bindings() const
bool hasNonLiteralTypeFieldsOrBases() const
Determine whether this class has a non-literal or/ volatile type non-static data member or base class...
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this method.
bool isDelegatingConstructor() const
Determine whether this constructor is a delegating constructor.
CXXMethodDecl(Kind DK, ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool isInline, bool isConstexpr, SourceLocation EndLocation)
bool isBaseVirtual() const
Returns whether the base is virtual or not.
bool hasMoveAssignment() const
Determine whether this class has a move assignment operator.
AccessSpecifier getAccessSpecifier() const
Returns the access specifier for this base specifier.
const CXXRecordDecl * getMostRecentNonInjectedDecl() const
bool getInheritConstructors() const
Determine whether this base class's constructors get inherited.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
bool needsOverloadResolutionForCopyAssignment() const
Determine whether we need to eagerly declare a defaulted copy assignment operator for this class...
NamedDecl * getNominatedNamespaceAsWritten()
bool hasNonTrivialDestructorForCall() const
FunctionDecl * isLocalClass()
static bool classof(const Decl *D)
Represents a declaration of a type.
void setLambdaMangling(unsigned ManglingNumber, Decl *ContextDecl)
Set the mangling number and context declaration for a lambda class.
bool isAccessDeclaration() const
Return true if it is a C++03 access declaration (no 'using').
bool isLambda() const
Determine whether this class describes a lambda function object.
static DeclContext * castToDeclContext(const LinkageSpecDecl *D)
base_class_const_iterator bases_begin() const
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
llvm::iterator_range< init_const_iterator > init_const_range
CXXConversionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isAnyMemberInitializer() const
base_class_iterator bases_begin()
SourceLocation getExternLoc() const
SourceLocation getLocEnd() const LLVM_READONLY
void setNumCtorInitializers(unsigned numCtorInitializers)
FieldDecl * getAnyMember() const
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
bool hasSimpleCopyConstructor() const
true if we know for sure that this class has a single, accessible, unambiguous copy constructor that ...
FieldDecl * getMember() const
If this is a member initializer, returns the declaration of the non-static data member being initiali...
Represents a linkage specification.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
shadow_iterator shadow_begin() const
bool hasConstexprDefaultConstructor() const
Determine whether this class has a constexpr default constructor.
bool isAbstract() const
Determine whether this class has a pure virtual function.
A binding in a decomposition declaration.
init_iterator init_begin()
Retrieve an iterator to the first initializer.
llvm::iterator_range< overridden_cxx_method_iterator > overridden_method_range
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
CXXRecordDecl * getMostRecentNonInjectedDecl()
SourceLocation getRParenLoc() const
llvm::iterator_range< specific_decl_iterator< CXXConstructorDecl > > ctor_range
bool hasBraces() const
Determines whether this linkage specification had braces in its syntactic form.
unsigned getLambdaManglingNumber() const
If this is the closure type of a lambda expression, retrieve the number to be used for name mangling ...
bool hasCopyAssignmentWithConstParam() const
Determine whether this class has a copy assignment operator with a parameter type which is a referenc...
CXXConstructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool hasUserProvidedDefaultConstructor() const
Whether this class has a user-provided default constructor per C++11.
InheritedConstructor(ConstructorUsingShadowDecl *Shadow, CXXConstructorDecl *BaseCtor)
A placeholder type used to construct an empty shell of a decl-derived type that will be filled in lat...
CXXRecordDecl * getMostRecentDecl()
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of the namespace.
A little helper class used to produce diagnostics.
init_const_range inits() const
Represents a prototype with parameter type info, e.g.
bool isDynamicClass() const
CXXDestructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
static bool classofKind(Kind K)
SourceLocation getTypenameLoc() const
Returns the source location of the 'typename' keyword.
Represents a ValueDecl that came out of a declarator.
static bool classof(const Decl *D)
bool isDelegatingInitializer() const
Determine whether this initializer is creating a delegating constructor.
init_reverse_iterator init_rbegin()
bool hasTrivialMoveConstructorForCall() const
std::forward_iterator_tag iterator_category
bool isLiteral() const
Determine whether this class is a literal type.
const CXXRecordDecl * getParent() const
Returns the parent of this using shadow declaration, which is the class in which this is declared...
SourceLocation getBeginLoc() const LLVM_READONLY
CXXCtorInitializer *const * init_const_iterator
Iterates through the member/base initializer list.
bool hasInheritedConstructor() const
Determine whether this class has a using-declaration that names a user-declared base class constructo...
capture_const_iterator captures_end() const
static bool classof(const Decl *D)
static bool classofKind(Kind K)
const UnresolvedUsingValueDecl * getCanonicalDecl() const
bool hasUserDeclaredCopyConstructor() const
Determine whether this class has a user-declared copy constructor.
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Expr - This represents one expression.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
Defines the clang::LangOptions interface.
const NamespaceDecl * getNominatedNamespace() const
SourceLocation getAliasLoc() const
Returns the location of the alias name, i.e.
ctor_iterator ctor_end() const
const CXXConversionDecl * getCanonicalDecl() const
static bool classofKind(Kind K)
base_class_const_range bases() const
bool defaultedMoveConstructorIsDeleted() const
true if a defaulted move constructor for this class would be deleted.
DeclarationNameInfo getNameInfo() const
CXXRecordDecl * getTemplateInstantiationPattern()
const CXXRecordDecl * getCanonicalDecl() const
Represents a C++ destructor within a class.
init_const_reverse_iterator init_rbegin() const
bool isCopyConstructor() const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
const UsingDecl * getCanonicalDecl() const
bool isCopyDeductionCandidate() const
Defines an enumeration for C++ overloaded operators.
void setRBraceLoc(SourceLocation L)
bool hasUserDeclaredMoveAssignment() const
Determine whether this class has had a move assignment declared by the user.
bool isPackExpansion() const
Determine whether this is a pack expansion.
CXXRecordDecl * getDefinition() const
bool isExplicit() const
Whether this deduction guide is explicit.
base_class_iterator vbases_end()
llvm::iterator_range< specific_decl_iterator< CXXMethodDecl > > method_range
static TemplateParameterList * getGenericLambdaTemplateParameterList(LambdaScopeInfo *LSI, Sema &SemaRef)
ConstructorUsingShadowDecl * getNominatedBaseClassShadowDecl() const
Get the inheriting constructor declaration for the direct base class from which this using shadow dec...
bool hasMoveConstructor() const
Determine whether this class has a move constructor.
const CXXConstructorDecl * getCanonicalDecl() const
bool needsImplicitDestructor() const
Determine whether this class needs an implicit destructor to be lazily declared.
Defines the clang::TypeLoc interface and its subclasses.
bool isTrivial() const
Determine whether this class is considered trivial.
init_const_iterator init_end() const
Retrieve an iterator past the last initializer.
CXXRecordDecl * getConstructedBaseClass() const
Get the base class whose constructor or constructor shadow declaration is passed the constructor argu...
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
const CXXMethodDecl * getCanonicalDecl() const
void setInheritConstructors(bool Inherit=true)
Set that this base class's constructors should be inherited.
StorageClass
Storage classes.
const UnresolvedUsingTypenameDecl * getCanonicalDecl() const
bool hasNonTrivialDestructor() const
Determine whether this class has a non-trivial destructor (C++ [class.dtor]p3)
IdentifierInfo * getSetterId() const
void setTypename(bool TN)
Sets whether the using declaration has 'typename'.
DeclContext * getParent()
getParent - Returns the containing DeclContext.
method_iterator method_end() const
Method past-the-end iterator.
SourceLocation getEnd() const
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
void setHasTrivialSpecialMemberForCall()
bool isBaseOfClass() const
Determine whether this base class is a base of a class declared with the 'class' keyword (vs...
bool hasSimpleMoveConstructor() const
true if we know for sure that this class has a single, accessible, unambiguous move constructor that ...
bool hasTrivialCopyConstructor() const
Determine whether this class has a trivial copy constructor (C++ [class.copy]p6, C++11 [class...
Represents a C++ deduction guide declaration.
bool needsImplicitDefaultConstructor() const
Determine if we need to declare a default constructor for this class.
Represents a C++ conversion function within a class.
bool hasNonTrivialMoveAssignment() const
Determine whether this class has a non-trivial move assignment operator (C++11 [class.copy]p25)
bool nullFieldOffsetIsZero() const
In the Microsoft C++ ABI, use zero for the field offset of a null data member pointer if we can guara...
UsingPackDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
llvm::function_ref< bool(const CXXBaseSpecifier *Specifier, CXXBasePath &Path)> BaseMatchesCallback
Function type used by lookupInBases() to determine whether a specific base class subobject matches th...
bool hasNonTrivialMoveConstructor() const
Determine whether this class has a non-trivial move constructor (C++11 [class.copy]p12) ...
CXXMethodDecl * getMostRecentDecl()
const CXXRecordDecl * getMostRecentDecl() const
llvm::iterator_range< shadow_iterator > shadow_range
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
bool hasVariantMembers() const
Determine whether this class has any variant members.
bool isExplicit() const
Whether this function is explicit.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
SourceLocation getUsingLoc() const
Return the location of the using keyword.
unsigned size_overridden_methods() const
SourceLocation getUsingLoc() const
Returns the source location of the 'using' keyword.
const UsingPackDecl * getCanonicalDecl() const
void setColonLoc(SourceLocation CLoc)
Sets the location of the colon.
UnresolvedUsingTypenameDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this declaration.
const NamespaceAliasDecl * getCanonicalDecl() const
NamedDecl * getInstantiatedFromUsingDecl() const
Get the using declaration from which this was instantiated.
shadow_iterator(UsingShadowDecl *C)
bool hasTrivialCopyAssignment() const
Determine whether this class has a trivial copy assignment operator (C++ [class.copy]p11, C++11 [class.copy]p25)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Encodes a location in the source.
bool isPure() const
Whether this virtual function is pure, i.e.
static bool classofKind(Kind K)
redeclarable_base::redecl_iterator redecl_iterator
const CXXMethodDecl * getCorrespondingMethodInClass(const CXXRecordDecl *RD, bool MayBeBase=false) const
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
A set of all the primary bases for a class.
const StringLiteral * getMessage() const
SourceLocation getNamespaceKeyLocation() const
Returns the location of the namespace keyword.
std::ptrdiff_t difference_type
DeclarationName getName() const
getName - Returns the embedded declaration name.
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
std::reverse_iterator< init_const_iterator > init_const_reverse_iterator
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Represents a dependent using declaration which was not marked with typename.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
init_iterator init_end()
Retrieve an iterator past the last initializer.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
llvm::iterator_range< base_class_iterator > base_class_range
void setCtorInitializers(CXXCtorInitializer **Initializers)
Represents a static or instance method of a struct/union/class.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
static bool classofKind(Kind K)
SourceLocation getIdentLocation() const
Returns the location of this using declaration's identifier.
bool isPackExpansion() const
Determine whether this base specifier is a pack expansion.
void setImplicitMoveConstructorIsDeleted()
Set that we attempted to declare an implicit move constructor, but overload resolution failed so we d...
static bool classofKind(Kind K)
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
llvm::function_ref< bool(const CXXRecordDecl *BaseDefinition)> ForallBasesCallback
Function type used by forallBases() as a callback.
UsingDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this declaration.
bool isExplicitSpecified() const
Whether this function is marked as explicit explicitly.
static bool classof(const Decl *D)
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
static bool classof(const Decl *D)
ConstructorUsingShadowDecl * getConstructedBaseClassShadowDecl() const
Get the inheriting constructor declaration for the base class for which we don't have an explicit ini...
void setIsParsingBaseSpecifiers()
static void * getAsVoidPointer(::clang::AnyFunctionDecl F)
bool hasNonTrivialMoveConstructorForCall() const
void setImplicitDestructorIsDeleted()
Set that we attempted to declare an implicit destructor, but overload resolution failed so we deleted...
const CXXDestructorDecl * getCanonicalDecl() const
SourceLocation getMemberLocation() const
::clang::AnyFunctionDecl getFromVoidPointer(void *P)
Represents a C++11 static_assert declaration.
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getRBraceLoc() const
TypeSourceInfo * getTypeSourceInfo() const
Retrieves the type and source location of the base class.
SourceLocation getAccessSpecifierLoc() const
The location of the access specifier.
bool defaultedCopyConstructorIsDeleted() const
true if a defaulted copy constructor for this class would be deleted.
__PTRDIFF_TYPE__ ptrdiff_t
A signed integer type that is the result of subtracting two pointers.
int getSourceOrder() const
Return the source position of the initializer, counting from 0.
CXXBaseSpecifier(SourceRange R, bool V, bool BC, AccessSpecifier A, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc)
bool hasInClassInitializer() const
Whether this class has any in-class initializers for non-static data members (including those in anon...
Defines various enumerations that describe declaration and type specifiers.
DeclarationNameLoc - Additional source/type location info for a declaration name. ...
CXXConstructorDecl * getConstructor() const
bool hasSimpleDestructor() const
true if we know for sure that this class has an accessible destructor that is not deleted...
TagTypeKind
The kind of a tag type.
static bool isStaticOverloadedOperator(OverloadedOperatorKind OOK)
Returns true if the given operator is implicitly static in a record context.
bool hasNonTrivialCopyConstructorForCall() const
pointer operator->() const
Dataflow Directional Tag Classes.
bool isExplicit() const
Whether this function is explicit.
NestedNameSpecifier * getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
bool isValid() const
Return true if this is a valid SourceLocation object.
static bool classof(const Decl *D)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
The base class of all kinds of template declarations (e.g., class, function, etc.).
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
static AnyFunctionDecl getFromNamedDecl(NamedDecl *ND)
SourceLocation getLocStart() const LLVM_READONLY
base_class_const_range vbases() const
bool hasTrivialDestructorForCall() const
Reads an AST files chain containing the contents of a translation unit.
SourceLocation getBaseTypeLoc() const LLVM_READONLY
Get the location at which the base class type was written.
bool isAccessDeclaration() const
Return true if it is a C++03 access declaration (no 'using').
Represents a field injected from an anonymous union/struct into the parent scope. ...
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
DeclContext * getCommonAncestor()
Returns the common ancestor context of this using-directive and its nominated namespace.
llvm::iterator_range< base_class_const_iterator > base_class_const_range
A decomposition declaration.
bool hasUserDeclaredConstructor() const
Determine whether this class has any user-declared constructors.
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
Represents a dependent using declaration which was marked with typename.
conversion_iterator conversion_begin() const
DeclarationName - The name of a declaration.
StmtClass getStmtClass() const
bool isCXX11StandardLayout() const
Determine whether this class was standard-layout per C++11 [class]p7, specifically using the C++11 ru...
const CXXRecordDecl * getParent() const
Returns the parent of this method declaration, which is the class in which this method is defined...
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
DeclarationNameInfo getNameInfo() const
unsigned shadow_size() const
Return the number of shadowed declarations associated with this using declaration.
const NamespaceDecl * getNamespace() const
A mapping from each virtual member function to its set of final overriders.
llvm::iterator_range< redecl_iterator > redecl_range
base_class_const_iterator bases_end() const
base_class_iterator vbases_begin()
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
void setExternLoc(SourceLocation L)
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration...
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspnd...
T * get(ExternalASTSource *Source) const
Retrieve the pointer to the AST node that this lazy pointer points to.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext, providing only those that are of type SpecificDecl (or a class derived from it).
bool hasNonTrivialCopyAssignment() const
Determine whether this class has a non-trivial copy assignment operator (C++ [class.copy]p11, C++11 [class.copy]p25)
bool isMoveConstructor() const
Determine whether this constructor is a move constructor (C++11 [class.copy]p3), which can be used to...
const FunctionDecl * getOperatorDelete() const
bool needsOverloadResolutionForMoveConstructor() const
Determine whether we need to eagerly declare a defaulted move constructor for this class...
static AccessSpecifier MergeAccess(AccessSpecifier PathAccess, AccessSpecifier DeclAccess)
Calculates the access of a decl that is reached along a path.
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
static bool classofKind(Kind K)
static bool classof(const Decl *D)
const CXXMethodDecl * getMostRecentDecl() const
Represents a C++ base or member initializer.
bool isParsingBaseSpecifiers() const
LanguageIDs
Represents the language in a linkage specification.
bool needsOverloadResolutionForMoveAssignment() const
Determine whether we need to eagerly declare a move assignment operator for this class.
IndirectFieldDecl * getIndirectMember() const
static bool classofKind(Kind K)
base_class_const_iterator vbases_begin() const
static LinkageSpecDecl * castFromDeclContext(const DeclContext *DC)
static UsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, UsingDecl *Using, NamedDecl *Target)
const DeclContext * getCommonAncestor() const
AnyFunctionDecl(FunctionDecl *FD)
Represents a base class of a C++ class.
bool hasTypename() const
Return true if the using declaration has 'typename'.
static bool classofKind(Kind K)
SourceLocation getEndLoc() const LLVM_READONLY
bool needsImplicitCopyConstructor() const
Determine whether this class needs an implicit copy constructor to be lazily declared.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
X
Add a minimal nested name specifier fixit hint to allow lookup of a tag name from an outer enclosing ...
bool hasMutableFields() const
Determine whether this class, or any of its class subobjects, contains a mutable field.
shadow_range shadows() const
static bool classofKind(Kind K)
Defines the clang::SourceLocation class and associated facilities.
void setImplicitMoveAssignmentIsDeleted()
Set that we attempted to declare an implicit move assignment operator, but overload resolution failed...
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Represents a C++ struct/union/class.
void setBinding(QualType DeclaredType, Expr *Binding)
Set the binding for this BindingDecl, along with its declared type (which should be a possibly-cv-qua...
bool hasUserDeclaredMoveConstructor() const
Determine whether this class has had a move constructor declared by the user.
bool hasSimpleMoveAssignment() const
true if we know for sure that this class has a single, accessible, unambiguous move assignment operat...
static bool classof(const Decl *D)
SourceLocation getEllipsisLoc() const
For a pack expansion, determine the location of the ellipsis.
UsingShadowDecl * getNextUsingShadowDecl() const
The next using shadow declaration contained in the shadow decl chain of the using declaration which i...
An object for streaming information to a record.
static bool classofKind(Kind K)
Provides information a specialization of a member of a class template, which may be a member function...
LambdaCaptureDefault getLambdaCaptureDefault() const
bool isDependentLambda() const
Determine whether this lambda expression was known to be dependent at the time it was created...
base_class_iterator bases_end()
friend bool operator==(shadow_iterator x, shadow_iterator y)
shadow_iterator & operator++()
Declaration of a class template.
Writes an AST file containing the contents of a translation unit.
bool hasInheritedAssignment() const
Determine whether this class has a using-declaration that names a base class assignment operator...
bool isOffset() const
Whether this pointer is currently stored as an offset.
StringLiteral - This represents a string literal expression, e.g.
Kind
Lists the kind of concrete classes of Decl.
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
SourceLocation getEllipsisLoc() const
Get the location of the ellipsis if this is a pack expansion.
bool constructsVirtualBase() const
Returns true if the constructed base class is a virtual base class subobject of this declaration's cl...
Expr * getBinding() const
Get the expression to which this declaration is bound.
static bool classof(const Decl *D)
SourceLocation getUsingLoc() const
Returns the source location of the 'using' keyword.
bool implicitCopyConstructorHasConstParam() const
Determine whether an implicit copy constructor for this type would have a parameter with a const-qual...
ASTContext::overridden_method_range overridden_method_range
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
capture_const_iterator captures_begin() const
bool needsImplicitMoveConstructor() const
Determine whether this class should get an implicit move constructor or if any existing special membe...
bool hasDirectFields() const
Determine whether this class has direct non-static data members.
An instance of this class represents the declaration of a property member.
SourceLocation getNamespaceLoc() const
Returns the location of the namespace keyword.
AccessSpecifier getAccessSpecifierAsWritten() const
Retrieves the access specifier as written in the source code (which may mean that no access specifier...
shadow_iterator operator++(int)
NamedDecl * get() const
Retrieve the underlying function or function template.
A trivial tuple used to represent a source range.
static bool classofKind(Kind K)
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
static bool classofKind(Kind K)
This represents a decl that may have a name.
bool hasCopyConstructorWithConstParam() const
Determine whether this class has a copy constructor with a parameter type which is a reference to a c...
static DeclarationName getUsingDirectiveName()
getUsingDirectiveName - Return name for all using-directives.
redeclarable_base::redecl_iterator redecl_iterator
Represents a C++ namespace alias.
SourceRange getSourceRange() const LLVM_READONLY
Retrieves the source range that contains the entire base specifier.
ArrayRef< NamedDecl * > expansions() const
Get the set of using declarations that this pack expanded into.
Represents C++ using-directive.
bool isAggregate() const
Determine whether this class is an aggregate (C++ [dcl.init.aggr]), which is a class with no user-dec...
SourceLocation getBegin() const
SourceLocation ColonLoc
Location of ':'.
TemplateDecl * getDeducedTemplate() const
Get the template for which this guide performs deduction.
bool hasDefaultConstructor() const
Determine whether this class has any default constructors.
ctor_iterator ctor_begin() const
base_class_range vbases()
Declaration of a template function.
void setTargetDecl(NamedDecl *ND)
Sets the underlying declaration which has been brought into the local scope.
SourceLocation getLocation() const
Represents a shadow declaration introduced into a scope by a (resolved) using declaration.
Represents a pack of using declarations that a single using-declarator pack-expanded into...
QualType getType() const
Return the type wrapped by this type source info.
static bool isProvablyNotDerivedFrom(Sema &SemaRef, CXXRecordDecl *Record, const BaseSet &Bases)
Determines if the given class is provably not derived from all of the prospective base classes...
const UsingShadowDecl * getCanonicalDecl() const
ConstructorUsingShadowDecl * getShadowDecl() const
Defines the LambdaCapture class.
NamedDecl * getAliasedNamespace() const
Retrieve the namespace that this alias refers to, which may either be a NamespaceDecl or a NamespaceA...
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
CXXRecordDecl * getParent()
static OMPLinearClause * Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc, SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef< Expr *> VL, ArrayRef< Expr *> PL, ArrayRef< Expr *> IL, Expr *Step, Expr *CalcStep, Stmt *PreInit, Expr *PostUpdate)
Creates clause with a list of variables VL and a linear step Step.
bool isInheritingConstructor() const
Determine whether this is an implicit constructor synthesized to model a call to a constructor inheri...
method_range methods() const
QualType getType() const
Retrieves the type of the base class.
bool defaultedDestructorIsDeleted() const
true if a defaulted destructor for this class would be deleted.