35#include "llvm/ADT/ArrayRef.h"
36#include "llvm/Support/ErrorHandling.h"
58 case OO_Call:
case OO_Subscript:
71 bool SkippedNot =
false;
72 if (
auto *NotEq = dyn_cast<UnaryOperator>(E)) {
73 assert(NotEq->getOpcode() == UO_LNot);
79 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
80 assert(!SkippedNot || BO->getOpcode() == BO_EQ);
81 Result.Opcode = SkippedNot ? BO_NE : BO->getOpcode();
85 }
else if (
auto *BO = dyn_cast<CXXOperatorCallExpr>(E)) {
86 assert(!SkippedNot || BO->getOperator() == OO_EqualEqual);
87 assert(BO->isInfixBinaryOp());
88 switch (BO->getOperator()) {
89 case OO_Less:
Result.Opcode = BO_LT;
break;
90 case OO_LessEqual:
Result.Opcode = BO_LE;
break;
91 case OO_Greater:
Result.Opcode = BO_GT;
break;
92 case OO_GreaterEqual:
Result.Opcode = BO_GE;
break;
93 case OO_Spaceship:
Result.Opcode = BO_Cmp;
break;
94 case OO_EqualEqual:
Result.Opcode = SkippedNot ? BO_NE : BO_EQ;
break;
95 default: llvm_unreachable(
"unexpected binop in rewritten operator expr");
97 Result.LHS = BO->getArg(0);
98 Result.RHS = BO->getArg(1);
101 llvm_unreachable(
"unexpected rewritten operator form");
114 E =
Result.LHS->IgnoreUnlessSpelledInSource();
115 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
116 assert(BO->getOpcode() == BO_Cmp);
117 Result.LHS = BO->getLHS();
118 Result.RHS = BO->getRHS();
120 }
else if (
auto *BO = dyn_cast<CXXOperatorCallExpr>(E)) {
121 assert(BO->getOperator() == OO_Spaceship);
122 Result.LHS = BO->getArg(0);
123 Result.RHS = BO->getArg(1);
126 llvm_unreachable(
"unexpected rewritten operator form");
144 if (RD->isPolymorphic() && E->
isGLValue())
151 assert(!
isTypeOperand() &&
"Cannot call isMostDerived for typeid(type)");
155 if (RD->isEffectivelyFinal())
158 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
159 QualType Ty = DRE->getDecl()->getType();
168 assert(
isTypeOperand() &&
"Cannot call getTypeOperand for typeid(expr)");
170 return Context.getUnqualifiedArrayType(
177 if (
const auto *CE = dyn_cast<CastExpr>(E)) {
178 if (!CE->getSubExpr()->isGLValue())
183 if (
const auto *OVE = dyn_cast<OpaqueValueExpr>(E))
186 if (
const auto *BO = dyn_cast<BinaryOperator>(E))
187 if (BO->getOpcode() == BO_Comma)
190 if (
const auto *ACO = dyn_cast<AbstractConditionalOperator>(E))
199 if (
const auto *UO = dyn_cast<UnaryOperator>(E))
200 if (UO->getOpcode() == UO_Deref)
222 assert(
isTypeOperand() &&
"Cannot call getTypeOperand for __uuidof(expr)");
224 return Context.getUnqualifiedArrayType(
230 return TypeInfo ? TypeInfo->getTypeLoc().getBeginLoc() :
getRParenLoc();
234CXXNewExpr::CXXNewExpr(
bool IsGlobalNew,
FunctionDecl *OperatorNew,
237 bool UsualArrayDeleteWantsSize,
239 std::optional<Expr *> ArraySize,
245 OperatorNew(OperatorNew), OperatorDelete(OperatorDelete),
246 AllocatedTypeInfo(AllocatedTypeInfo), Range(Range),
247 DirectInitRange(DirectInitRange) {
251 "Only CXXNewInitializationStyle::None can have no initializer!");
258 CXXNewExprBits.UsualArrayDeleteWantsSize = UsualArrayDeleteWantsSize;
261 llvm::to_underlying(InitializationStyle);
262 bool IsParenTypeId = TypeIdParens.
isValid();
267 getTrailingObjects<Stmt *>()[arraySizeOffset()] = *ArraySize;
269 getTrailingObjects<Stmt *>()[initExprOffset()] =
Initializer;
270 llvm::copy(PlacementArgs,
271 getTrailingObjects<Stmt *>() + placementNewArgsOffset());
273 getTrailingObjects<SourceRange>()[0] = TypeIdParens;
275 switch (getInitializationStyle()) {
291CXXNewExpr::CXXNewExpr(EmptyShell
Empty,
bool IsArray,
292 unsigned NumPlacementArgs,
bool IsParenTypeId)
303 SourceRange TypeIdParens, std::optional<Expr *> ArraySize,
307 bool IsArray = ArraySize.has_value();
309 unsigned NumPlacementArgs = PlacementArgs.size();
310 bool IsParenTypeId = TypeIdParens.
isValid();
312 Ctx.
Allocate(totalSizeToAlloc<Stmt *, SourceRange>(
313 IsArray + HasInit + NumPlacementArgs, IsParenTypeId),
314 alignof(CXXNewExpr));
315 return new (Mem) CXXNewExpr(
316 IsGlobalNew, OperatorNew, OperatorDelete, IAP, UsualArrayDeleteWantsSize,
317 PlacementArgs, TypeIdParens, ArraySize, InitializationStyle,
Initializer,
318 Ty, AllocatedTypeInfo, Range, DirectInitRange);
322 bool HasInit,
unsigned NumPlacementArgs,
323 bool IsParenTypeId) {
325 Ctx.
Allocate(totalSizeToAlloc<Stmt *, SourceRange>(
326 IsArray + HasInit + NumPlacementArgs, IsParenTypeId),
327 alignof(CXXNewExpr));
329 CXXNewExpr(
EmptyShell(), IsArray, NumPlacementArgs, IsParenTypeId);
350 while (
const auto *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
351 if (ICE->getCastKind() == CK_DerivedToBase ||
352 ICE->getCastKind() == CK_UncheckedDerivedToBase ||
353 ICE->getCastKind() == CK_NoOp) {
354 assert((ICE->getCastKind() == CK_NoOp ||
356 "only a destroying operator delete can have a converted arg");
357 Arg = ICE->getSubExpr();
382 :
Expr(CXXPseudoDestructorExprClass, Context.BoundMemberTy,
VK_PRValue,
385 OperatorLoc(OperatorLoc), QualifierLoc(QualifierLoc),
386 ScopeType(ScopeType), ColonColonLoc(ColonColonLoc), TildeLoc(TildeLoc),
387 DestroyedType(DestroyedType) {
393 return TInfo->getType();
401 End = TInfo->getTypeLoc().getSourceRange().getEnd();
405DependentTemplateIdExpr::DependentTemplateIdExpr(
408 :
Expr(DependentTemplateIdExprClass, Context.DependentTy,
VK_LValue,
410 NameInfo(NameInfo), Name(Name) {
411 KWAndArgs.initializeFrom({}, TemplateArgs,
412 getTrailingObjects());
416DependentTemplateIdExpr::DependentTemplateIdExpr(EmptyShell
Empty,
417 unsigned NumTemplateArgs)
418 :
Expr(DependentTemplateIdExprClass,
Empty) {
419 KWAndArgs.NumTemplateArgs = NumTemplateArgs;
425 void *Mem = Context.Allocate(
426 totalSizeToAlloc<TemplateArgumentLoc>(TemplateArgs.
size()),
427 alignof(DependentTemplateIdExpr));
429 DependentTemplateIdExpr(Context, NameInfo, Name, TemplateArgs);
434 unsigned NumTemplateArgs) {
436 Context.Allocate(totalSizeToAlloc<TemplateArgumentLoc>(NumTemplateArgs),
437 alignof(DependentTemplateIdExpr));
438 return new (Mem) DependentTemplateIdExpr(
EmptyShell(), NumTemplateArgs);
442UnresolvedLookupExpr::UnresolvedLookupExpr(
448 bool KnownInstantiationDependent)
449 :
OverloadExpr(UnresolvedLookupExprClass, Context, QualifierLoc,
450 TemplateKWLoc, NameInfo, TemplateArgs, Begin, End,
451 KnownDependent, KnownInstantiationDependent,
453 NamingClass(NamingClass) {
457UnresolvedLookupExpr::UnresolvedLookupExpr(EmptyShell
Empty,
459 bool HasTemplateKWAndArgsInfo)
461 HasTemplateKWAndArgsInfo) {}
467 bool KnownDependent,
bool KnownInstantiationDependent) {
468 unsigned NumResults = End - Begin;
471 void *Mem = Context.Allocate(Size,
alignof(UnresolvedLookupExpr));
472 return new (Mem) UnresolvedLookupExpr(
473 Context, NamingClass, QualifierLoc,
475 nullptr, Begin, End, KnownDependent,
476 KnownInstantiationDependent);
485 bool KnownInstantiationDependent) {
486 unsigned NumResults = End - Begin;
487 bool HasTemplateKWAndArgsInfo = Args || TemplateKWLoc.
isValid();
488 unsigned NumTemplateArgs = Args ? Args->
size() : 0;
491 NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
492 void *Mem = Context.Allocate(Size,
alignof(UnresolvedLookupExpr));
493 return new (Mem) UnresolvedLookupExpr(
494 Context, NamingClass, QualifierLoc, TemplateKWLoc, NameInfo, RequiresADL,
495 Args, Begin, End, KnownDependent, KnownInstantiationDependent);
499 const ASTContext &Context,
unsigned NumResults,
500 bool HasTemplateKWAndArgsInfo,
unsigned NumTemplateArgs) {
501 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
504 NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
505 void *Mem = Context.Allocate(Size,
alignof(UnresolvedLookupExpr));
507 UnresolvedLookupExpr(
EmptyShell(), NumResults, HasTemplateKWAndArgsInfo);
517 bool KnownInstantiationDependent,
518 bool KnownContainsUnexpandedParameterPack)
520 QualifierLoc(QualifierLoc) {
521 unsigned NumResults = End - Begin;
534 auto Deps = TemplateArgumentDependence::None;
537 }
else if (TemplateKWLoc.
isValid()) {
538 getTrailingASTTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
542 KnownInstantiationDependent,
543 KnownContainsUnexpandedParameterPack));
549 bool HasTemplateKWAndArgsInfo)
556DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(
561 QualifierLoc(QualifierLoc), NameInfo(NameInfo) {
563 (Args !=
nullptr) || TemplateKWLoc.
isValid();
565 auto Deps = TemplateArgumentDependence::None;
566 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
567 TemplateKWLoc, *Args, getTrailingObjects<TemplateArgumentLoc>(), Deps);
568 }
else if (TemplateKWLoc.
isValid()) {
569 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
579 assert(QualifierLoc &&
"should be created for dependent qualifiers");
580 bool HasTemplateKWAndArgsInfo = Args || TemplateKWLoc.
isValid();
582 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
583 HasTemplateKWAndArgsInfo, Args ? Args->
size() : 0);
584 void *Mem = Context.Allocate(Size);
585 return new (Mem) DependentScopeDeclRefExpr(Context.DependentTy, QualifierLoc,
586 TemplateKWLoc, NameInfo, Args);
591 bool HasTemplateKWAndArgsInfo,
592 unsigned NumTemplateArgs) {
593 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
595 totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
596 HasTemplateKWAndArgsInfo, NumTemplateArgs);
597 void *Mem = Context.Allocate(Size);
598 auto *E =
new (Mem) DependentScopeDeclRefExpr(
601 E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo =
602 HasTemplateKWAndArgsInfo;
607 if (
const auto *TOE = dyn_cast<CXXTemporaryObjectExpr>(
this))
608 return TOE->getBeginLoc();
613 if (
const auto *TOE = dyn_cast<CXXTemporaryObjectExpr>(
this))
614 return TOE->getEndLoc();
616 if (ParenOrBraceRange.isValid())
617 return ParenOrBraceRange.getEnd();
639 ADLCallKind UsesADL,
bool IsReversed)
640 :
CallExpr(CXXOperatorCallExprClass, Fn, {}, Args, Ty,
VK,
641 OperatorLoc, FPFeatures, 0, UsesADL) {
642 CXXOperatorCallExprBits.OperatorKind = OpKind;
643 CXXOperatorCallExprBits.IsReversed = IsReversed;
645 (CXXOperatorCallExprBits.OperatorKind ==
static_cast<unsigned>(OpKind)) &&
646 "OperatorKind overflow!");
647 BeginLoc = getSourceRangeImpl().getBegin();
650CXXOperatorCallExpr::CXXOperatorCallExpr(
unsigned NumArgs,
bool HasFPFeatures,
652 :
CallExpr(CXXOperatorCallExprClass, 0, NumArgs,
653 HasFPFeatures,
Empty) {}
661 unsigned NumArgs = Args.size();
666 SizeOfTrailingObjects),
667 alignof(CXXOperatorCallExpr));
668 return new (Mem) CXXOperatorCallExpr(OpKind, Fn, Args, Ty,
VK, OperatorLoc,
669 FPFeatures,
UsesADL, IsReversed);
677 unsigned SizeOfTrailingObjects =
681 SizeOfTrailingObjects),
682 alignof(CXXOperatorCallExpr));
683 return new (Mem) CXXOperatorCallExpr(NumArgs, HasFPFeatures,
Empty);
686SourceRange CXXOperatorCallExpr::getSourceRangeImpl()
const {
688 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
695 }
else if (Kind == OO_Arrow) {
697 }
else if (Kind == OO_Call) {
699 }
else if (Kind == OO_Subscript) {
717 :
CallExpr(CXXMemberCallExprClass,
Fn, {}, Args, Ty, VK, RP,
720CXXMemberCallExpr::CXXMemberCallExpr(
unsigned NumArgs,
bool HasFPFeatures,
722 :
CallExpr(CXXMemberCallExprClass, 0, NumArgs, HasFPFeatures,
730 unsigned MinNumArgs) {
732 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
736 SizeOfTrailingObjects),
737 alignof(CXXMemberCallExpr));
739 CXXMemberCallExpr(Fn, Args, Ty,
VK, RP, FPFeatures, MinNumArgs);
747 unsigned SizeOfTrailingObjects =
750 SizeOfTrailingObjects),
751 alignof(CXXMemberCallExpr));
752 return new (Mem) CXXMemberCallExpr(NumArgs, HasFPFeatures,
Empty);
757 if (
const auto *MemExpr = dyn_cast<MemberExpr>(Callee))
758 return MemExpr->getBase();
759 if (
const auto *BO = dyn_cast<BinaryOperator>(Callee))
760 if (BO->getOpcode() == BO_PtrMemD || BO->getOpcode() == BO_PtrMemI)
803 case CXXStaticCastExprClass:
return "static_cast";
804 case CXXDynamicCastExprClass:
return "dynamic_cast";
805 case CXXReinterpretCastExprClass:
return "reinterpret_cast";
806 case CXXConstCastExprClass:
return "const_cast";
807 case CXXAddrspaceCastExprClass:
return "addrspace_cast";
808 default:
return "<invalid cast>";
818 unsigned PathSize = (BasePath ? BasePath->size() : 0);
820 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
822 auto *E =
new (Buffer) CXXStaticCastExpr(
T,
VK, K, Op, PathSize, WrittenTy,
823 FPO, L, RParenLoc, AngleBrackets);
825 llvm::uninitialized_copy(*BasePath,
832 bool HasFPFeatures) {
834 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
835 PathSize, HasFPFeatures));
836 return new (Buffer) CXXStaticCastExpr(
EmptyShell(), PathSize, HasFPFeatures);
847 unsigned PathSize = (BasePath ? BasePath->size() : 0);
848 void *Buffer =
C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
850 new (Buffer) CXXDynamicCastExpr(
T,
VK, K, Op, PathSize, WrittenTy, L,
851 RParenLoc, AngleBrackets);
853 llvm::uninitialized_copy(*BasePath, E->getTrailingObjects());
859 void *Buffer =
C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
860 return new (Buffer) CXXDynamicCastExpr(
EmptyShell(), PathSize);
888 assert(SrcRD && DestRD);
890 if (SrcRD->isEffectivelyFinal()) {
891 assert(!SrcRD->isDerivedFrom(DestRD) &&
892 "upcasts should not use CK_Dynamic");
896 if (DestRD->isEffectivelyFinal() && !DestRD->isDerivedFrom(SrcRD))
909 unsigned PathSize = (BasePath ? BasePath->size() : 0);
910 void *Buffer =
C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
912 new (Buffer) CXXReinterpretCastExpr(
T,
VK, K, Op, PathSize, WrittenTy, L,
913 RParenLoc, AngleBrackets);
915 llvm::uninitialized_copy(*BasePath, E->getTrailingObjects());
921 void *Buffer =
C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
922 return new (Buffer) CXXReinterpretCastExpr(
EmptyShell(), PathSize);
931 return new (
C) CXXConstCastExpr(
T,
VK, Op, WrittenTy, L, RParenLoc, AngleBrackets);
943 return new (
C) CXXAddrspaceCastExpr(
T,
VK, K, Op, WrittenTy, L, RParenLoc,
955 unsigned PathSize = (BasePath ? BasePath->size() : 0);
957 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
959 auto *E =
new (Buffer)
960 CXXFunctionalCastExpr(
T,
VK, Written, K, Op, PathSize, FPO, L, R);
962 llvm::uninitialized_copy(*BasePath,
969 bool HasFPFeatures) {
971 C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *, FPOptionsOverride>(
972 PathSize, HasFPFeatures));
974 CXXFunctionalCastExpr(
EmptyShell(), PathSize, HasFPFeatures);
990 :
CallExpr(UserDefinedLiteralClass, Fn, {}, Args, Ty,
VK,
991 LitEndLoc, FPFeatures, 0, NotADL),
992 UDSuffixLoc(SuffixLoc) {}
994UserDefinedLiteral::UserDefinedLiteral(
unsigned NumArgs,
bool HasFPFeatures,
996 :
CallExpr(UserDefinedLiteralClass, 0, NumArgs,
997 HasFPFeatures,
Empty) {}
1006 unsigned NumArgs = Args.size();
1011 SizeOfTrailingObjects),
1012 alignof(UserDefinedLiteral));
1014 UserDefinedLiteral(Fn, Args, Ty,
VK, LitEndLoc, SuffixLoc, FPFeatures);
1022 unsigned SizeOfTrailingObjects =
1026 SizeOfTrailingObjects),
1027 alignof(UserDefinedLiteral));
1028 return new (Mem) UserDefinedLiteral(NumArgs, HasFPOptions,
Empty);
1038 assert(
getNumArgs() == 1 &&
"unexpected #args in literal operator call");
1050 llvm_unreachable(
"unknown kind of literal operator");
1066 bool HasRewrittenInit) {
1067 size_t Size = totalSizeToAlloc<Expr *>(HasRewrittenInit);
1068 auto *Mem =
C.Allocate(Size,
alignof(CXXDefaultArgExpr));
1069 return new (Mem) CXXDefaultArgExpr(
EmptyShell(), HasRewrittenInit);
1075 Expr *RewrittenExpr,
1077 size_t Size = totalSizeToAlloc<Expr *>(RewrittenExpr !=
nullptr);
1078 auto *Mem =
C.Allocate(Size,
alignof(CXXDefaultArgExpr));
1079 return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
1080 RewrittenExpr, UsedContext);
1090 "expected this CXXDefaultArgExpr to have a rewritten init.");
1092 if (
auto *E = dyn_cast_if_present<FullExpr>(
Init))
1094 return E->getSubExpr();
1098CXXDefaultInitExpr::CXXDefaultInitExpr(
const ASTContext &Ctx,
1101 Expr *RewrittenInitExpr)
1102 :
Expr(CXXDefaultInitExprClass, Ty.getNonLValueExprType(Ctx),
1104 : Ty->isRValueReferenceType() ?
VK_XValue
1107 Field(Field), UsedContext(UsedContext) {
1112 *getTrailingObjects() = RewrittenInitExpr;
1114 assert(Field->hasInClassInitializer());
1120 bool HasRewrittenInit) {
1121 size_t Size = totalSizeToAlloc<Expr *>(HasRewrittenInit);
1122 auto *Mem =
C.Allocate(Size,
alignof(CXXDefaultInitExpr));
1123 return new (Mem) CXXDefaultInitExpr(
EmptyShell(), HasRewrittenInit);
1130 Expr *RewrittenInitExpr) {
1132 size_t Size = totalSizeToAlloc<Expr *>(RewrittenInitExpr !=
nullptr);
1133 auto *Mem = Ctx.
Allocate(Size,
alignof(CXXDefaultInitExpr));
1134 return new (Mem) CXXDefaultInitExpr(Ctx, Loc, Field, Field->getType(),
1135 UsedContext, RewrittenInitExpr);
1139 assert(Field->getInClassInitializer() &&
"initializer hasn't been parsed");
1143 return Field->getInClassInitializer();
1148 return new (
C) CXXTemporary(Destructor);
1154 assert((SubExpr->getType()->isRecordType() ||
1155 SubExpr->getType()->isArrayType()) &&
1156 "Expression bound to a temporary must have record or array type!");
1158 return new (
C) CXXBindTemporaryExpr(Temp, SubExpr);
1161CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(
1164 bool HadMultipleCandidates,
bool ListInitialization,
1165 bool StdInitListInitialization,
bool ZeroInitialization)
1167 CXXTemporaryObjectExprClass, Ty, TSI->getTypeLoc().getBeginLoc(),
1168 Cons,
false, Args, HadMultipleCandidates,
1169 ListInitialization, StdInitListInitialization, ZeroInitialization,
1175CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(EmptyShell
Empty,
1182 bool HadMultipleCandidates,
bool ListInitialization,
1183 bool StdInitListInitialization,
bool ZeroInitialization) {
1186 Ctx.
Allocate(
sizeof(CXXTemporaryObjectExpr) + SizeOfTrailingObjects,
1187 alignof(CXXTemporaryObjectExpr));
1188 return new (Mem) CXXTemporaryObjectExpr(
1189 Cons, Ty, TSI, Args, ParenOrBraceRange, HadMultipleCandidates,
1190 ListInitialization, StdInitListInitialization, ZeroInitialization);
1197 Ctx.
Allocate(
sizeof(CXXTemporaryObjectExpr) + SizeOfTrailingObjects,
1198 alignof(CXXTemporaryObjectExpr));
1199 return new (Mem) CXXTemporaryObjectExpr(
EmptyShell(), NumArgs);
1216 bool HadMultipleCandidates,
bool ListInitialization,
1217 bool StdInitListInitialization,
bool ZeroInitialization,
1223 CXXConstructExprClass, Ty, Loc, Ctor, Elidable, Args,
1224 HadMultipleCandidates, ListInitialization, StdInitListInitialization,
1225 ZeroInitialization, ConstructKind, ParenOrBraceRange);
1240 bool ListInitialization,
bool StdInitListInitialization,
1244 ParenOrBraceRange(ParenOrBraceRange), NumArgs(Args.size()) {
1254 Stmt **TrailingArgs = getTrailingArgs();
1255 llvm::copy(Args, TrailingArgs);
1256 assert(!llvm::is_contained(Args,
nullptr));
1259 if (SC == CXXConstructExprClass)
1270 : DeclAndBits(Var, 0), Loc(Loc), EllipsisLoc(EllipsisLoc) {
1273 Bits |= Capture_Implicit;
1277 Bits |= Capture_ByCopy;
1280 assert(!Var &&
"'this' capture cannot have a variable!");
1281 Bits |= Capture_This;
1285 Bits |= Capture_ByCopy;
1288 assert(Var &&
"capture must have a variable!");
1291 assert(!Var &&
"VLA type capture cannot have a variable!");
1294 DeclAndBits.setInt(Bits);
1300 bool CapByCopy = DeclAndBits.getInt() & Capture_ByCopy;
1311 bool ContainsUnexpandedParameterPack)
1313 IntroducerRange(IntroducerRange), CaptureDefaultLoc(CaptureDefaultLoc),
1314 ClosingBrace(ClosingBrace) {
1315 LambdaExprBits.NumCaptures = CaptureInits.size();
1316 LambdaExprBits.CaptureDefault = CaptureDefault;
1317 LambdaExprBits.ExplicitParams = ExplicitParams;
1318 LambdaExprBits.ExplicitResultType = ExplicitResultType;
1322 assert(capture_size() ==
Class->capture_size() &&
"Wrong number of captures");
1323 assert(getCaptureDefault() ==
Class->getLambdaCaptureDefault());
1326 Stmt **Stored = getStoredStmts();
1327 for (
unsigned I = 0, N = CaptureInits.size(); I != N; ++I)
1328 *Stored++ = CaptureInits[I];
1331 *Stored++ = getCallOperator()->getBody();
1336LambdaExpr::LambdaExpr(EmptyShell
Empty,
unsigned NumCaptures)
1338 LambdaExprBits.NumCaptures = NumCaptures;
1342 getStoredStmts()[NumCaptures] =
nullptr;
1349 bool ExplicitParams,
bool ExplicitResultType,
1352 bool ContainsUnexpandedParameterPack) {
1357 unsigned Size = totalSizeToAlloc<Stmt *>(CaptureInits.size() + 1);
1358 void *Mem = Context.Allocate(Size);
1360 LambdaExpr(
T, IntroducerRange, CaptureDefault, CaptureDefaultLoc,
1361 ExplicitParams, ExplicitResultType, CaptureInits, ClosingBrace,
1362 ContainsUnexpandedParameterPack);
1366 unsigned NumCaptures) {
1367 unsigned Size = totalSizeToAlloc<Stmt *>(NumCaptures + 1);
1368 void *Mem =
C.Allocate(Size);
1372void LambdaExpr::initBodyIfNeeded()
const {
1386 if (
const auto *CoroBody = dyn_cast<CoroutineBodyStmt>(Body))
1392 return C->capturesVariable() &&
C->getCapturedVar()->isInitCapture() &&
1439 return Record->getLambdaCallOperator();
1444 return Record->getDependentLambdaCallOperator();
1449 return Record->getGenericLambdaTemplateParameterList();
1454 return Record->getLambdaExplicitTemplateParameters();
1474ExprWithCleanups::ExprWithCleanups(
Expr *subexpr,
1475 bool CleanupsHaveSideEffects,
1477 :
FullExpr(ExprWithCleanupsClass, subexpr) {
1480 llvm::copy(objects, getTrailingObjects());
1484 bool CleanupsHaveSideEffects,
1486 void *buffer =
C.Allocate(totalSizeToAlloc<CleanupObject>(objects.size()),
1487 alignof(ExprWithCleanups));
1489 ExprWithCleanups(subexpr, CleanupsHaveSideEffects, objects);
1492ExprWithCleanups::ExprWithCleanups(EmptyShell empty,
unsigned numObjects)
1493 :
FullExpr(ExprWithCleanupsClass, empty) {
1499 unsigned numObjects) {
1500 void *buffer =
C.Allocate(totalSizeToAlloc<CleanupObject>(numObjects),
1501 alignof(ExprWithCleanups));
1502 return new (buffer) ExprWithCleanups(empty, numObjects);
1505CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(
1508 :
Expr(CXXUnresolvedConstructExprClass,
T,
1513 TypeAndInitForm(TSI, IsListInit), LParenLoc(LParenLoc),
1514 RParenLoc(RParenLoc) {
1516 auto **StoredArgs = getTrailingObjects();
1517 llvm::copy(Args, StoredArgs);
1525 void *Mem = Context.Allocate(totalSizeToAlloc<Expr *>(Args.size()));
1526 return new (Mem) CXXUnresolvedConstructExpr(
T, TSI, LParenLoc, Args,
1527 RParenLoc, IsListInit);
1533 void *Mem = Context.Allocate(totalSizeToAlloc<Expr *>(NumArgs));
1534 return new (Mem) CXXUnresolvedConstructExpr(
EmptyShell(), NumArgs);
1538 return TypeAndInitForm.getPointer()->getTypeLoc().getBeginLoc();
1541CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(
1547 :
Expr(CXXDependentScopeMemberExprClass, Ctx.DependentTy,
VK_LValue,
1549 Base(
Base), BaseType(BaseType), QualifierLoc(QualifierLoc),
1550 MemberNameInfo(MemberNameInfo) {
1553 (TemplateArgs !=
nullptr) || TemplateKWLoc.
isValid();
1555 FirstQualifierFoundInScope !=
nullptr;
1559 auto Deps = TemplateArgumentDependence::None;
1560 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1561 TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1563 }
else if (TemplateKWLoc.
isValid()) {
1564 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1568 if (hasFirstQualifierFoundInScope())
1569 *getTrailingObjects<NamedDecl *>() = FirstQualifierFoundInScope;
1573CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(
1574 EmptyShell
Empty,
bool HasTemplateKWAndArgsInfo,
1575 bool HasFirstQualifierFoundInScope)
1576 :
Expr(CXXDependentScopeMemberExprClass,
Empty) {
1578 HasTemplateKWAndArgsInfo;
1580 HasFirstQualifierFoundInScope;
1589 bool HasTemplateKWAndArgsInfo =
1590 (TemplateArgs !=
nullptr) || TemplateKWLoc.
isValid();
1591 unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->
size() : 0;
1592 bool HasFirstQualifierFoundInScope = FirstQualifierFoundInScope !=
nullptr;
1596 HasTemplateKWAndArgsInfo, NumTemplateArgs, HasFirstQualifierFoundInScope);
1598 void *Mem = Ctx.
Allocate(Size,
alignof(CXXDependentScopeMemberExpr));
1599 return new (Mem) CXXDependentScopeMemberExpr(
1600 Ctx, Base, BaseType, IsArrow, OperatorLoc, QualifierLoc, TemplateKWLoc,
1601 FirstQualifierFoundInScope, MemberNameInfo, TemplateArgs);
1605 const ASTContext &Ctx,
bool HasTemplateKWAndArgsInfo,
1606 unsigned NumTemplateArgs,
bool HasFirstQualifierFoundInScope) {
1607 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
1611 HasTemplateKWAndArgsInfo, NumTemplateArgs, HasFirstQualifierFoundInScope);
1613 void *Mem = Ctx.
Allocate(Size,
alignof(CXXDependentScopeMemberExpr));
1614 return new (Mem) CXXDependentScopeMemberExpr(
1615 EmptyShell(), HasTemplateKWAndArgsInfo, HasFirstQualifierFoundInScope);
1620 return new (Ctx) CXXThisExpr(L, Ty, IsImplicit,
1639 }
while (++begin != end);
1644UnresolvedMemberExpr::UnresolvedMemberExpr(
1652 UnresolvedMemberExprClass, Context, QualifierLoc, TemplateKWLoc,
1653 MemberNameInfo, TemplateArgs, Begin, End,
1655 ((
Base &&
Base->isTypeDependent()) || BaseType->isDependentType()),
1656 ((
Base &&
Base->isInstantiationDependent()) ||
1657 BaseType->isInstantiationDependentType()),
1659 ((
Base &&
Base->containsUnexpandedParameterPack()) ||
1660 BaseType->containsUnexpandedParameterPack())),
1661 Base(
Base), BaseType(BaseType), OperatorLoc(OperatorLoc) {
1662 UnresolvedMemberExprBits.IsArrow = IsArrow;
1663 UnresolvedMemberExprBits.HasUnresolvedUsing = HasUnresolvedUsing;
1668 setType(Context.BoundMemberTy);
1671UnresolvedMemberExpr::UnresolvedMemberExpr(EmptyShell
Empty,
1672 unsigned NumResults,
1673 bool HasTemplateKWAndArgsInfo)
1675 HasTemplateKWAndArgsInfo) {}
1681 return cast<Expr>(Base)->isImplicitCXXThis();
1691 unsigned NumResults = End - Begin;
1692 bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.
isValid();
1693 unsigned NumTemplateArgs = TemplateArgs ? TemplateArgs->
size() : 0;
1696 NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
1697 void *Mem = Context.Allocate(Size,
alignof(UnresolvedMemberExpr));
1698 return new (Mem) UnresolvedMemberExpr(
1699 Context, HasUnresolvedUsing, Base, BaseType, IsArrow, OperatorLoc,
1700 QualifierLoc, TemplateKWLoc, MemberNameInfo, TemplateArgs, Begin, End);
1704 const ASTContext &Context,
unsigned NumResults,
1705 bool HasTemplateKWAndArgsInfo,
unsigned NumTemplateArgs) {
1706 assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
1709 NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
1710 void *Mem = Context.Allocate(Size,
alignof(UnresolvedMemberExpr));
1712 UnresolvedMemberExpr(
EmptyShell(), NumResults, HasTemplateKWAndArgsInfo);
1725 Record =
T->getAsCXXRecordDecl();
1726 assert(
Record &&
"qualifier in member expression does not name record");
1734 Record = BaseType->getAsCXXRecordDecl();
1735 assert(
Record &&
"base of member expression does not name record");
1748 Context.Allocate(totalSizeToAlloc<TemplateArgument>(PartialArgs.size()));
1749 return new (Storage) SizeOfPackExpr(Context.getSizeType(), OperatorLoc, Pack,
1750 PackLoc, RParenLoc, Length, PartialArgs);
1754 unsigned NumPartialArgs) {
1756 Context.Allocate(totalSizeToAlloc<TemplateArgument>(NumPartialArgs));
1757 return new (Storage) SizeOfPackExpr(
EmptyShell(), NumPartialArgs);
1767 Expr *PackIdExpr,
Expr *IndexExpr, std::optional<int64_t> Index,
1770 if (Index && FullySubstituted && !SubstitutedExprs.empty())
1771 Type = SubstitutedExprs[*Index]->getType();
1776 Context.Allocate(totalSizeToAlloc<Expr *>(SubstitutedExprs.size()));
1777 return new (Storage)
1778 PackIndexingExpr(
Type, EllipsisLoc, RSquareLoc, PackIdExpr, IndexExpr,
1779 SubstitutedExprs, FullySubstituted);
1784 return D->getDecl();
1786 assert(
false &&
"invalid declaration kind in pack indexing expression");
1792 unsigned NumTransformedExprs) {
1794 Context.Allocate(totalSizeToAlloc<Expr *>(NumTransformedExprs));
1795 return new (Storage) PackIndexingExpr(
EmptyShell{});
1798SubstNonTypeTemplateParmPackExpr::SubstNonTypeTemplateParmPackExpr(
1803 AssociatedDecl(AssociatedDecl), Arguments(ArgPack.pack_begin()),
1804 NumArguments(ArgPack.pack_size()), Final(Final), Index(Index),
1806 assert(AssociatedDecl !=
nullptr);
1808 ExprDependence::UnexpandedPack);
1826 ParamPack(ParamPack), NameLoc(NameLoc), NumParameters(NumParams) {
1828 std::uninitialized_copy(Params, Params + NumParams, getTrailingObjects());
1830 ExprDependence::UnexpandedPack);
1837 return new (Context.Allocate(totalSizeToAlloc<ValueDecl *>(Params.size())))
1838 FunctionParmPackExpr(
T, ParamPack, NameLoc, Params.size(), Params.data());
1843 unsigned NumParams) {
1844 return new (Context.Allocate(totalSizeToAlloc<ValueDecl *>(NumParams)))
1851 :
Expr(MaterializeTemporaryExprClass,
T,
1855 MTD->ExprWithTemporary = Temporary;
1863 unsigned ManglingNumber) {
1875 ES->ExtendingDecl = ExtendedBy;
1876 ES->ManglingNumber = ManglingNumber;
1890 VD->isUsableInConstantExpressions(Context);
1893TypeTraitExpr::TypeTraitExpr(
1896 std::variant<bool, APValue, ComparisonCategoryResult>
Value)
1898 RParenLoc(RParenLoc) {
1899 assert(Kind <= TT_Last &&
"invalid enum value!");
1903 "TypeTraitExprBits.Kind overflow!");
1907 std::holds_alternative<ComparisonCategoryResult>(
Value);
1911 if (
auto *CCR = std::get_if<ComparisonCategoryResult>(&
Value)) {
1912 llvm::APSInt EncodedValue = llvm::APSInt::get(llvm::to_underlying(*CCR));
1913 ::new (getTrailingObjects<APValue>())
APValue(
std::move(EncodedValue));
1915 ::new (getTrailingObjects<
APValue>())
1921 "TypeTraitExprBits.NumArgs overflow!");
1923 llvm::copy(Args, ToArgs);
1928 getAPValue().isInt() || getAPValue().isAbsent()) &&
1929 "Only int values are supported by clang");
1935 if (!IsStoredAsBool)
1936 ::new (getTrailingObjects<APValue>())
APValue();
1946 C.Allocate(totalSizeToAlloc<APValue, TypeSourceInfo *>(0, Args.size()));
1947 return new (Mem) TypeTraitExpr(
T, Loc, Kind, Args, RParenLoc,
Value);
1955 C.Allocate(totalSizeToAlloc<APValue, TypeSourceInfo *>(1, Args.size()));
1956 return new (Mem) TypeTraitExpr(
T, Loc, Kind, Args, RParenLoc,
Value);
1965 C.Allocate(totalSizeToAlloc<APValue, TypeSourceInfo *>(1, Args.size()));
1966 return new (Mem) TypeTraitExpr(
T, Loc, Kind, Args, RParenLoc,
Value);
1970 bool IsStoredAsBool,
1972 void *Mem =
C.Allocate(totalSizeToAlloc<APValue, TypeSourceInfo *>(
1973 IsStoredAsBool ? 0 : 1, NumArgs));
1974 return new (Mem) TypeTraitExpr(
EmptyShell(), IsStoredAsBool);
1977CXXReflectExpr::CXXReflectExpr(EmptyShell
Empty)
1983 CaretCaretLoc(CaretCaretLoc), Operand(TSI) {}
1988 return new (
C) CXXReflectExpr(CaretCaretLoc, TSI);
1995CUDAKernelCallExpr::CUDAKernelCallExpr(
Expr *Fn,
CallExpr *Config,
1999 unsigned MinNumArgs)
2000 :
CallExpr(CUDAKernelCallExprClass, Fn, Config, Args, Ty,
VK,
2001 RP, FPFeatures, MinNumArgs, NotADL) {}
2003CUDAKernelCallExpr::CUDAKernelCallExpr(
unsigned NumArgs,
bool HasFPFeatures,
2005 :
CallExpr(CUDAKernelCallExprClass, END_PREARG, NumArgs,
2006 HasFPFeatures,
Empty) {}
2012 unsigned MinNumArgs) {
2014 unsigned NumArgs = std::max<unsigned>(Args.size(), MinNumArgs);
2019 SizeOfTrailingObjects),
2020 alignof(CUDAKernelCallExpr));
2022 CUDAKernelCallExpr(Fn, Config, Args, Ty,
VK, RP, FPFeatures, MinNumArgs);
2031 END_PREARG, NumArgs, HasFPFeatures);
2034 SizeOfTrailingObjects),
2035 alignof(CUDAKernelCallExpr));
2036 return new (Mem) CUDAKernelCallExpr(NumArgs, HasFPFeatures,
Empty);
2041 unsigned NumUserSpecifiedExprs,
2044 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(Args.size()));
2045 return new (Mem) CXXParenListInitExpr(Args,
T, NumUserSpecifiedExprs, InitLoc,
2046 LParenLoc, RParenLoc);
2052 void *Mem =
C.Allocate(totalSizeToAlloc<Expr *>(NumExprs),
2053 alignof(CXXParenListInitExpr));
2054 return new (Mem) CXXParenListInitExpr(
Empty, NumExprs);
2063 EllipsisLoc(EllipsisLoc), RParenLoc(RParenLoc),
2064 NumExpansions(NumExpansions) {
2068 assert(LHS->containsUnexpandedParameterPack() !=
2069 RHS->containsUnexpandedParameterPack() &&
2070 "Exactly one of LHS or RHS should contain an unexpanded pack");
2071 SubExprs[SubExpr::Callee] = Callee;
2072 SubExprs[SubExpr::LHS] = LHS;
2073 SubExprs[SubExpr::RHS] = RHS;
2078 :
Expr(CXXExpansionSelectExprClass,
Empty) {}
2085 SubExprs[RANGE] = Range;
2086 SubExprs[INDEX] = Idx;
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
static bool hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin, UnresolvedSetIterator end)
static bool isGLValueFromPointerDeref(const Expr *E)
Defines the clang::Expr interface and subclasses for C++ expressions.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
llvm::MachO::Record Record
Defines an enumeration for C++ overloaded operators.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
a trap message and trap category.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const LangOptions & getLangOpts() const
void * Allocate(size_t Size, unsigned Align=8) const
Represents a call to a CUDA kernel function.
static CUDAKernelCallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
static CUDAKernelCallExpr * Create(const ASTContext &Ctx, Expr *Fn, CallExpr *Config, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
A C++ addrspace_cast expression (currently only enabled for OpenCL).
static CXXAddrspaceCastExpr * CreateEmpty(const ASTContext &Context)
static CXXAddrspaceCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
Represents a base class of a C++ class.
static CXXBindTemporaryExpr * Create(const ASTContext &C, CXXTemporary *Temp, Expr *SubExpr)
static CXXConstCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, Expr *Op, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
static CXXConstCastExpr * CreateEmpty(const ASTContext &Context)
Represents a call to a C++ constructor.
SourceRange getParenOrBraceRange() const
static CXXConstructExpr * Create(const ASTContext &Ctx, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Create a C++ construction expression.
Expr * getArg(unsigned Arg)
Return the specified argument.
CXXConstructExpr(StmtClass SC, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Build a C++ construction expression.
SourceLocation getLocation() const
static unsigned sizeOfTrailingObjects(unsigned NumArgs)
Return the size in bytes of the trailing objects.
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
static CXXConstructExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs)
Create an empty C++ construction expression.
Represents a C++ constructor within a class.
const ParmVarDecl * getParam() const
Expr * getRewrittenExpr()
Expr * getAdjustedRewrittenExpr()
static CXXDefaultArgExpr * Create(const ASTContext &C, SourceLocation Loc, ParmVarDecl *Param, Expr *RewrittenExpr, DeclContext *UsedContext)
static CXXDefaultArgExpr * CreateEmpty(const ASTContext &C, bool HasRewrittenInit)
bool hasRewrittenInit() const
static CXXDefaultInitExpr * Create(const ASTContext &Ctx, SourceLocation Loc, FieldDecl *Field, DeclContext *UsedContext, Expr *RewrittenInitExpr)
Field is the non-static data member whose default initializer is used by this expression.
const Expr * getRewrittenExpr() const
Retrieve the initializing expression with evaluated immediate calls, if any.
bool hasRewrittenInit() const
Expr * getExpr()
Get the initialization expression that will be used.
static CXXDefaultInitExpr * CreateEmpty(const ASTContext &C, bool HasRewrittenInit)
FunctionDecl * getOperatorDelete() const
QualType getDestroyedType() const
Retrieve the type being destroyed.
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
static CXXDependentScopeMemberExpr * CreateEmpty(const ASTContext &Ctx, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs, bool HasFirstQualifierFoundInScope)
Represents a C++ destructor within a class.
static CXXDynamicCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
static CXXDynamicCastExpr * CreateEmpty(const ASTContext &Context, unsigned pathSize)
bool isAlwaysNull() const
isAlwaysNull - Return whether the result of the dynamic_cast is proven to always be null.
CXXExpansionSelectExpr(EmptyShell Empty)
CXXFoldExpr(QualType T, UnresolvedLookupExpr *Callee, SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Opcode, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, UnsignedOrNone NumExpansions)
static CXXFunctionalCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getEndLoc() const LLVM_READONLY
static CXXFunctionalCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, TypeSourceInfo *Written, CastKind Kind, Expr *Op, const CXXCastPath *Path, FPOptionsOverride FPO, SourceLocation LPLoc, SourceLocation RPLoc)
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Expr * getImplicitObjectArgument() const
Retrieve the implicit object argument for the member call.
static CXXMemberCallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
static CXXMemberCallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RP, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0)
QualType getObjectType() const
Retrieve the type of the object argument.
CXXRecordDecl * getRecordDecl() const
Retrieve the CXXRecordDecl for the underlying type of the implicit object argument.
Represents a static or instance method of a struct/union/class.
const char * getCastName() const
getCastName - Get the name of the C++ cast being used, e.g., "static_cast", "dynamic_cast",...
static CXXNewExpr * Create(const ASTContext &Ctx, bool IsGlobalNew, FunctionDecl *OperatorNew, FunctionDecl *OperatorDelete, const ImplicitAllocationParameters &IAP, bool UsualArrayDeleteWantsSize, ArrayRef< Expr * > PlacementArgs, SourceRange TypeIdParens, std::optional< Expr * > ArraySize, CXXNewInitializationStyle InitializationStyle, Expr *Initializer, QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, SourceRange DirectInitRange)
Create a c++ new expression.
static CXXNewExpr * CreateEmpty(const ASTContext &Ctx, bool IsArray, bool HasInit, unsigned NumPlacementArgs, bool IsParenTypeId)
Create an empty c++ new expression.
bool shouldNullCheckAllocation() const
True if the allocation result needs to be null-checked.
FunctionDecl * getOperatorNew() const
bool isInfixBinaryOp() const
Is this written as an infix binary operator?
SourceLocation getOperatorLoc() const
Returns the location of the operator symbol in the expression.
static CXXOperatorCallExpr * Create(const ASTContext &Ctx, OverloadedOperatorKind OpKind, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation OperatorLoc, FPOptionsOverride FPFeatures, ADLCallKind UsesADL=NotADL, bool IsReversed=false)
SourceLocation getEndLoc() const
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
static CXXOperatorCallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
SourceLocation getBeginLoc() const
Represents a list-initialization with parenthesis.
static CXXParenListInitExpr * Create(ASTContext &C, ArrayRef< Expr * > Args, QualType T, unsigned NumUserSpecifiedExprs, SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
static CXXParenListInitExpr * CreateEmpty(ASTContext &C, unsigned numExprs, EmptyShell Empty)
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
CXXPseudoDestructorExpr(const ASTContext &Context, Expr *Base, bool isArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, TypeSourceInfo *ScopeType, SourceLocation ColonColonLoc, SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
SourceLocation getEndLoc() const LLVM_READONLY
QualType getDestroyedType() const
Retrieve the type being destroyed.
Represents a C++ struct/union/class.
capture_const_iterator captures_end() const
capture_const_iterator captures_begin() const
static CXXReflectExpr * Create(ASTContext &C, SourceLocation OperatorLoc, TypeSourceInfo *TL)
static CXXReflectExpr * CreateEmpty(ASTContext &C)
A C++ reinterpret_cast expression (C++ [expr.reinterpret.cast]).
static CXXReinterpretCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind Kind, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
static CXXReinterpretCastExpr * CreateEmpty(const ASTContext &Context, unsigned pathSize)
Expr * getSemanticForm()
Get an equivalent semantic form for this expression.
bool isReversed() const
Determine whether this expression was rewritten in reverse form.
DecomposedForm getDecomposedForm() const LLVM_READONLY
Decompose this operator into its syntactic form.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getRParenLoc() const
A C++ static_cast expression (C++ [expr.static.cast]).
static CXXStaticCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *Path, TypeSourceInfo *Written, FPOptionsOverride FPO, SourceLocation L, SourceLocation RParenLoc, SourceRange AngleBrackets)
static CXXStaticCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool hasFPFeatures)
Represents a C++ functional cast expression that builds a temporary object.
static CXXTemporaryObjectExpr * Create(const ASTContext &Ctx, CXXConstructorDecl *Cons, QualType Ty, TypeSourceInfo *TSI, ArrayRef< Expr * > Args, SourceRange ParenOrBraceRange, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization)
TypeSourceInfo * getTypeSourceInfo() const
SourceLocation getEndLoc() const LLVM_READONLY
static CXXTemporaryObjectExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs)
SourceLocation getBeginLoc() const LLVM_READONLY
Represents a C++ temporary.
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
static CXXThisExpr * CreateEmpty(const ASTContext &Ctx)
static CXXThisExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType Ty, bool IsImplicit)
bool isTypeOperand() const
QualType getTypeOperand(const ASTContext &Context) const
Retrieves the type operand of this typeid() expression after various required adjustments (removing r...
Expr * getExprOperand() const
bool isMostDerived(const ASTContext &Context) const
Best-effort check if the expression operand refers to a most derived object.
bool isPotentiallyEvaluated() const
Determine whether this typeid has a type operand which is potentially evaluated, per C++11 [expr....
bool hasNullCheck() const
Whether this is of a form like "typeid(*ptr)" that can throw a std::bad_typeid if a pointer is a null...
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
static CXXUnresolvedConstructExpr * Create(const ASTContext &Context, QualType T, TypeSourceInfo *TSI, SourceLocation LParenLoc, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool IsListInit)
SourceLocation getBeginLoc() const LLVM_READONLY
static CXXUnresolvedConstructExpr * CreateEmpty(const ASTContext &Context, unsigned NumArgs)
QualType getTypeOperand(ASTContext &Context) const
Retrieves the type operand of this __uuidof() expression after various required adjustments (removing...
bool isTypeOperand() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
static unsigned sizeOfTrailingObjects(unsigned NumPreArgs, unsigned NumArgs, bool HasFPFeatures)
Return the size in bytes needed for the trailing objects.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
CallExpr(StmtClass SC, Expr *Fn, ArrayRef< Expr * > PreArgs, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs, ADLCallKind UsesADL)
Build a call expression, assuming that appropriate storage has been allocated for the trailing object...
static constexpr unsigned sizeToAllocateForCallExprSubclass(unsigned SizeOfTrailingObjects)
SourceLocation getRParenLoc() const
static constexpr ADLCallKind UsesADL
CastKind getCastKind() const
CompoundStmt - This represents a group of statements like { stmt stmt }.
A POD class for pairing a NamedDecl* with an access specifier.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Decl - This represents one declaration (or definition), e.g.
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
A qualified reference to a name whose declaration cannot yet be resolved.
static DependentScopeDeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
static DependentScopeDeclRefExpr * CreateEmpty(const ASTContext &Context, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
A template-id naming a variable template or a concept through a template template parameter.
static DependentTemplateIdExpr * Create(const ASTContext &Context, const DeclarationNameInfo &NameInfo, TemplateName Name, const TemplateArgumentListInfo &TemplateArgs)
static DependentTemplateIdExpr * CreateEmpty(const ASTContext &Context, unsigned NumTemplateArgs)
TypeSourceInfo * getTypeInfoAsWritten() const
getTypeInfoAsWritten - Returns the type source info for the type that this expression is casting to.
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
This represents one expression.
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isDefaultArgument() const
Determine whether this expression is a default function argument.
void setDependence(ExprDependence Deps)
Each concrete expr subclass is expected to compute its dependence and call this in the constructor.
Represents difference between two FPOptions values.
bool requiresTrailingStorage() const
Represents a member of a struct/union/class.
FullExpr - Represents a "full-expression" node.
Represents a function declaration or definition.
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
bool isReservedGlobalPlacementOperator() const
Determines whether this operator new or delete is one of the reserved global placement operators: voi...
Represents a reference to a function parameter pack, init-capture pack, or binding pack that has been...
static FunctionParmPackExpr * Create(const ASTContext &Context, QualType T, ValueDecl *ParamPack, SourceLocation NameLoc, ArrayRef< ValueDecl * > Params)
static FunctionParmPackExpr * CreateEmpty(const ASTContext &Context, unsigned NumParams)
Represents a prototype with parameter type info, e.g.
Declaration of a template function.
One of these records is kept for each identifier that is lexed.
Describes an C or C++ initializer list.
Describes the capture of a variable or of this, or of a C++1y init-capture.
bool capturesVLAType() const
Determine whether this captures a variable length array bound expression.
LambdaCapture(SourceLocation Loc, bool Implicit, LambdaCaptureKind Kind, ValueDecl *Var=nullptr, SourceLocation EllipsisLoc=SourceLocation())
Create a new capture of a variable or of this.
LambdaCaptureKind getCaptureKind() const
Determine the kind of capture.
bool capturesThis() const
Determine whether this capture handles the C++ this pointer.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
capture_iterator capture_begin() const
Retrieve an iterator pointing to the first lambda capture.
static LambdaExpr * CreateDeserialized(const ASTContext &C, unsigned NumCaptures)
Construct a new lambda expression that will be deserialized from an external source.
static LambdaExpr * Create(const ASTContext &C, CXXRecordDecl *Class, SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, bool ExplicitParams, bool ExplicitResultType, ArrayRef< Expr * > CaptureInits, SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack)
Construct a new lambda expression.
Stmt * getBody() const
Retrieve the body of the lambda.
bool isMutable() const
Determine whether the lambda is mutable, meaning that any captures values can be modified.
capture_iterator implicit_capture_end() const
Retrieve an iterator pointing past the end of the sequence of implicit lambda captures.
unsigned capture_size() const
Determine the number of captures in this lambda.
capture_range explicit_captures() const
Retrieve this lambda's explicit captures.
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
CXXMethodDecl * getCallOperator() const
Retrieve the function call operator associated with this lambda expression.
const CompoundStmt * getCompoundStmtBody() const
Retrieve the CompoundStmt representing the body of the lambda.
capture_range implicit_captures() const
Retrieve this lambda's implicit captures.
const AssociatedConstraint & getTrailingRequiresClause() const
Get the trailing requires clause, if any.
TemplateParameterList * getTemplateParameterList() const
If this is a generic lambda expression, retrieve the template parameter list associated with it,...
ArrayRef< NamedDecl * > getExplicitTemplateParameters() const
Get the template parameters were explicitly specified (as opposed to being invented by use of an auto...
capture_iterator implicit_capture_begin() const
Retrieve an iterator pointing to the first implicit lambda capture.
capture_iterator explicit_capture_end() const
Retrieve an iterator pointing past the end of the sequence of explicit lambda captures.
capture_iterator capture_end() const
Retrieve an iterator pointing past the end of the sequence of lambda captures.
llvm::iterator_range< capture_iterator > capture_range
An iterator over a range of lambda captures.
const LambdaCapture * capture_iterator
An iterator that walks over the captures of the lambda, both implicit and explicit.
capture_iterator explicit_capture_begin() const
Retrieve an iterator pointing to the first explicit lambda capture.
child_range children()
Includes the captures and the body of the lambda.
FunctionTemplateDecl * getDependentCallOperator() const
Retrieve the function template call operator associated with this lambda expression.
capture_range captures() const
Retrieve this lambda's captures.
CXXRecordDecl * getLambdaClass() const
Retrieve the class that corresponds to the lambda.
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
static LifetimeExtendedTemporaryDecl * Create(Expr *Temp, ValueDecl *EDec, unsigned Mangling)
MaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference, LifetimeExtendedTemporaryDecl *MTD=nullptr)
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
bool isUsableInConstantExpressions(const ASTContext &Context) const
Determine whether this temporary object is usable in constant expressions, as specified in C++20 [exp...
void setExtendingDecl(ValueDecl *ExtendedBy, unsigned ManglingNumber)
This represents a decl that may have a name.
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
const Type * getAsType() const
@ Type
A type, stored as a Type*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
ASTTemplateKWAndArgsInfo * getTrailingASTTemplateKWAndArgsInfo()
Return the optional template keyword and arguments info.
NestedNameSpecifier getQualifier() const
Fetches the nested-name qualifier, if one was given.
TemplateArgumentLoc * getTrailingTemplateArgumentLoc()
Return the optional template arguments.
DeclAccessPair * getTrailingResults()
Return the results. Defined after UnresolvedMemberExpr.
OverloadExpr(StmtClass SC, const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent, bool KnownContainsUnexpandedParameterPack)
NamedDecl * getPackDecl() const
static PackIndexingExpr * CreateDeserialized(ASTContext &Context, unsigned NumTransformedExprs)
Expr * getPackIdExpression() const
static PackIndexingExpr * Create(ASTContext &Context, SourceLocation EllipsisLoc, SourceLocation RSquareLoc, Expr *PackIdExpr, Expr *IndexExpr, std::optional< int64_t > Index, ArrayRef< Expr * > SubstitutedExprs={}, bool FullySubstituted=false)
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
Stores the type being destroyed by a pseudo-destructor expression.
PseudoDestructorTypeStorage()=default
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isConstant(const ASTContext &Ctx) const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
The collection of all-type qualifiers we support.
static SizeOfPackExpr * CreateDeserialized(ASTContext &Context, unsigned NumPartialArgs)
static SizeOfPackExpr * Create(ASTContext &Context, SourceLocation OperatorLoc, NamedDecl *Pack, SourceLocation PackLoc, SourceLocation RParenLoc, UnsignedOrNone Length=std::nullopt, ArrayRef< TemplateArgument > PartialArgs={})
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
void setEnd(SourceLocation e)
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
CXXUnresolvedConstructExprBitfields CXXUnresolvedConstructExprBits
UnresolvedLookupExprBitfields UnresolvedLookupExprBits
ExprWithCleanupsBitfields ExprWithCleanupsBits
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
OverloadExprBitfields OverloadExprBits
CXXConstructExprBitfields CXXConstructExprBits
CXXDependentScopeMemberExprBitfields CXXDependentScopeMemberExprBits
TypeTraitExprBitfields TypeTraitExprBits
CXXNewExprBitfields CXXNewExprBits
llvm::iterator_range< child_iterator > child_range
CXXFoldExprBitfields CXXFoldExprBits
CXXOperatorCallExprBitfields CXXOperatorCallExprBits
CXXDefaultInitExprBitfields CXXDefaultInitExprBits
DependentScopeDeclRefExprBitfields DependentScopeDeclRefExprBits
llvm::iterator_range< const_child_iterator > const_child_range
CXXDefaultArgExprBitfields CXXDefaultArgExprBits
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
NonTypeTemplateParmDecl * getParameter() const
TemplateArgument getArgumentPack() const
Retrieve the template argument pack containing the substituted template arguments.
NonTypeTemplateParmDecl * getParameterPack() const
Retrieve the non-type template parameter pack being substituted.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
A convenient class for passing around template argument information.
Location wrapper for a TemplateArgument.
Represents a template argument.
Represents a C++ template name within the type system.
Stores a list of template parameters for a TemplateDecl and its derived classes.
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
static TypeTraitExpr * Create(const ASTContext &C, QualType T, SourceLocation Loc, TypeTrait Kind, ArrayRef< TypeSourceInfo * > Args, SourceLocation RParenLoc, bool Value)
Create a new type trait expression.
static TypeTraitExpr * CreateDeserialized(const ASTContext &C, bool IsStoredAsBool, unsigned NumArgs)
The base class of the type hierarchy.
bool isLiteralType(const ASTContext &Ctx) const
Return true if this is a literal type (C++11 [basic.types]p10)
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isVoidPointerType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isAnyCharacterType() const
Determine whether this type is any of the built-in character types.
bool isPointerOrReferenceType() const
bool isFloatingType() const
bool isAnyPointerType() const
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
static UnresolvedLookupExpr * CreateEmpty(const ASTContext &Context, unsigned NumResults, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
QualType getBaseType() const
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
static UnresolvedMemberExpr * Create(const ASTContext &Context, bool HasUnresolvedUsing, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs, UnresolvedSetIterator Begin, UnresolvedSetIterator End)
CXXRecordDecl * getNamingClass()
Retrieve the naming class of this lookup.
bool isImplicitAccess() const
True if this is an implicit access, i.e., one in which the member being accessed was not written in t...
static UnresolvedMemberExpr * CreateEmpty(const ASTContext &Context, unsigned NumResults, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
The iterator over UnresolvedSets.
LiteralOperatorKind getLiteralOperatorKind() const
Returns the kind of literal operator invocation which this expression represents.
const IdentifierInfo * getUDSuffix() const
Returns the ud-suffix specified for this literal.
static UserDefinedLiteral * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation LitEndLoc, SourceLocation SuffixLoc, FPOptionsOverride FPFeatures)
static UserDefinedLiteral * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPOptions, EmptyShell Empty)
Expr * getCookedLiteral()
If this is not a raw user-defined literal, get the underlying cooked literal (representing the litera...
LiteralOperatorKind
The kind of literal operator which is invoked.
@ LOK_String
operator "" X (const CharT *, size_t)
@ LOK_Raw
Raw form: operator "" X (const char *)
@ LOK_Floating
operator "" X (long double)
@ LOK_Integer
operator "" X (unsigned long long)
@ LOK_Template
Raw form: operator "" X<cs...> ()
@ LOK_Character
operator "" X (CharT)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isa(CodeGen::Address addr)
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ OK_Ordinary
An ordinary object is located at an address in memory.
LambdaCaptureKind
The different capture forms in a lambda introducer.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
ExprDependence computeDependence(FullExpr *E)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool isAlignedAllocation(AlignedAllocationMode Mode)
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
@ Result
The result type of a method or function.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
bool isTypeAwareAllocation(TypeAwareAllocationMode Mode)
CastKind
CastKind - The kind of operation required for a conversion.
std::tuple< NamedDecl *, TemplateArgument > getReplacedTemplateParameter(Decl *D, unsigned Index)
Internal helper used by Subst* nodes to retrieve a parameter from the AssociatedDecl,...
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
U cast(CodeGen::Address addr)
@ Class
The "class" keyword introduces the elaborated-type-specifier.
CXXNewInitializationStyle
@ Parens
New-expression has a C++98 paren-delimited initializer.
@ None
New-expression has no initializer as written.
@ Braces
New-expression has a C++11 list-initializer.
@ Implicit
An implicit conversion.
Diagnostic wrappers for TextAPI types for error reporting.
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
void initializeFrom(SourceLocation TemplateKWLoc, const TemplateArgumentListInfo &List, TemplateArgumentLoc *OutArgArray)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
AlignedAllocationMode PassAlignment
TypeAwareAllocationMode PassTypeIdentity
A placeholder type used to construct an empty shell of a type, that will be filled in later (e....