14#ifndef LLVM_CLANG_AST_EXPRCXX_H
15#define LLVM_CLANG_AST_EXPRCXX_H
42#include "llvm/ADT/ArrayRef.h"
43#include "llvm/ADT/PointerUnion.h"
44#include "llvm/ADT/StringRef.h"
45#include "llvm/ADT/iterator_range.h"
46#include "llvm/Support/Casting.h"
47#include "llvm/Support/Compiler.h"
48#include "llvm/Support/TrailingObjects.h"
61class NonTypeTemplateParmDecl;
62class TemplateParameterList;
90 SourceRange getSourceRangeImpl() const LLVM_READONLY;
107 unsigned NumArgs,
bool HasFPFeatures,
117 return Opc == OO_Equal || Opc == OO_StarEqual || Opc == OO_SlashEqual ||
118 Opc == OO_PercentEqual || Opc == OO_PlusEqual ||
119 Opc == OO_MinusEqual || Opc == OO_LessLessEqual ||
120 Opc == OO_GreaterGreaterEqual || Opc == OO_AmpEqual ||
121 Opc == OO_CaretEqual || Opc == OO_PipeEqual;
128 case OO_ExclaimEqual:
130 case OO_GreaterEqual:
153 return (Operator < OO_Plus || Operator >= OO_Arrow ||
154 Operator == OO_PlusPlus || Operator == OO_MinusMinus)
164 return T->getStmtClass() == CXXOperatorCallExprClass;
191 unsigned MinNumArgs = 0);
226 return T->getStmtClass() == CXXMemberCallExprClass;
234 enum { CONFIG, END_PREARG };
251 unsigned MinNumArgs = 0);
254 unsigned NumArgs,
bool HasFPFeatures,
258 return cast_or_null<CallExpr>(
getPreArg(CONFIG));
263 return T->getStmtClass() == CUDAKernelCallExprClass;
291 :
Expr(CXXRewrittenBinaryOperatorClass, SemanticForm->
getType(),
293 SemanticForm(SemanticForm) {
298 :
Expr(CXXRewrittenBinaryOperatorClass,
Empty), SemanticForm() {}
357 return child_range(&SemanticForm, &SemanticForm + 1);
361 return T->getStmtClass() == CXXRewrittenBinaryOperatorClass;
387 Expr *op,
unsigned PathSize,
bool HasFPFeatures,
392 Loc(l), RParenLoc(RParenLoc), AngleBrackets(AngleBrackets) {}
413 switch (
T->getStmtClass()) {
414 case CXXStaticCastExprClass:
415 case CXXDynamicCastExprClass:
416 case CXXReinterpretCastExprClass:
417 case CXXConstCastExprClass:
418 case CXXAddrspaceCastExprClass:
432 private llvm::TrailingObjects<CXXStaticCastExpr, CXXBaseSpecifier *,
450 unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>)
const {
464 unsigned PathSize,
bool hasFPFeatures);
467 return T->getStmtClass() == CXXStaticCastExprClass;
478 private llvm::TrailingObjects<CXXDynamicCastExpr, CXXBaseSpecifier *> {
484 false, writtenTy, l, RParenLoc,
508 return T->getStmtClass() == CXXDynamicCastExprClass;
522 private llvm::TrailingObjects<CXXReinterpretCastExpr,
523 CXXBaseSpecifier *> {
529 pathSize,
false, writtenTy, l,
530 RParenLoc, AngleBrackets) {}
550 return T->getStmtClass() == CXXReinterpretCastExprClass;
563 private llvm::TrailingObjects<CXXConstCastExpr, CXXBaseSpecifier *> {
568 false, writtenTy, l, RParenLoc,
587 return T->getStmtClass() == CXXConstCastExprClass;
601 private llvm::TrailingObjects<CXXAddrspaceCastExpr, CXXBaseSpecifier *> {
606 false, writtenTy, l, RParenLoc,
624 return T->getStmtClass() == CXXAddrspaceCastExprClass;
661 unsigned NumArgs,
bool HasFPOptions,
715 return S->getStmtClass() == UserDefinedLiteralClass;
730 :
Expr(CXXBoolLiteralExprClass,
Empty) {}
747 return T->getStmtClass() == CXXBoolLiteralExprClass;
774 :
Expr(CXXNullPtrLiteralExprClass,
Empty) {}
783 return T->getStmtClass() == CXXNullPtrLiteralExprClass;
798 Stmt *SubExpr =
nullptr;
801 :
Expr(CXXStdInitializerListExprClass,
Empty) {}
830 return S->getStmtClass() == CXXStdInitializerListExprClass;
849 llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
868 Operand = (
Expr*)
nullptr;
889 assert(
isTypeOperand() &&
"Cannot call getTypeOperand for typeid(expr)");
890 return cast<TypeSourceInfo *>(Operand);
893 assert(!
isTypeOperand() &&
"Cannot call getExprOperand for typeid(type)");
894 return static_cast<Expr *
>(cast<Stmt *>(Operand));
903 return T->getStmtClass() == CXXTypeidExprClass;
910 auto **begin =
reinterpret_cast<Stmt **
>(&Operand);
946 :
Expr(MSPropertyRefExprClass, ty, VK,
OK_Ordinary), BaseExpr(baseExpr),
947 TheDecl(
decl), MemberLoc(nameLoc), IsArrow(
isArrow),
948 QualifierLoc(qualifierLoc) {
965 else if (QualifierLoc)
983 return T->getStmtClass() == MSPropertyRefExprClass;
1007 enum { BASE_EXPR, IDX_EXPR, NUM_SUBEXPRS = 2 };
1009 Stmt *SubExprs[NUM_SUBEXPRS];
1012 void setBase(
Expr *
Base) { SubExprs[BASE_EXPR] =
Base; }
1013 void setIdx(
Expr *Idx) { SubExprs[IDX_EXPR] = Idx; }
1018 :
Expr(MSPropertySubscriptExprClass, Ty, VK, OK),
1019 RBracketLoc(RBracketLoc) {
1020 SubExprs[BASE_EXPR] =
Base;
1021 SubExprs[IDX_EXPR] = Idx;
1027 :
Expr(MSPropertySubscriptExprClass, Shell) {}
1030 const Expr *
getBase()
const {
return cast<Expr>(SubExprs[BASE_EXPR]); }
1033 const Expr *
getIdx()
const {
return cast<Expr>(SubExprs[IDX_EXPR]); }
1049 return T->getStmtClass() == MSPropertySubscriptExprClass;
1054 return child_range(&SubExprs[0], &SubExprs[0] + NUM_SUBEXPRS);
1070 llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
1078 Guid(Guid),
Range(R) {
1084 Guid(Guid),
Range(R) {
1091 Operand = (
Expr*)
nullptr;
1104 assert(
isTypeOperand() &&
"Cannot call getTypeOperand for __uuidof(expr)");
1105 return cast<TypeSourceInfo *>(Operand);
1108 assert(!
isTypeOperand() &&
"Cannot call getExprOperand for __uuidof(type)");
1109 return static_cast<Expr *
>(cast<Stmt *>(Operand));
1120 return T->getStmtClass() == CXXUuidofExprClass;
1127 auto **begin =
reinterpret_cast<Stmt **
>(&Operand);
1156 CXXThisExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter =
false;
1179 return CXXThisExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter;
1188 return T->getStmtClass() == CXXThisExprClass;
1218 bool IsThrownVariableInScope)
1248 return T->getStmtClass() == CXXThrowExprClass;
1253 return child_range(&Operand, Operand ? &Operand + 1 : &Operand);
1268 private llvm::TrailingObjects<CXXDefaultArgExpr, Expr *> {
1271 friend TrailingObjects;
1282 Param->hasUnparsedDefaultArg()
1283 ? Param->
getType().getNonReferenceType()
1284 : Param->getDefaultArg()->
getType(),
1287 Param(Param), UsedContext(UsedContext) {
1291 *getTrailingObjects<Expr *>() = RewrittenExpr;
1301 static CXXDefaultArgExpr *
CreateEmpty(
const ASTContext &
C,
1302 bool HasRewrittenInit);
1306 static CXXDefaultArgExpr *
Create(
const ASTContext &
C, SourceLocation
Loc,
1307 ParmVarDecl *Param,
Expr *RewrittenExpr,
1308 DeclContext *UsedContext);
1352 return T->getStmtClass() == CXXDefaultArgExprClass;
1375 private llvm::TrailingObjects<CXXDefaultInitExpr, Expr *> {
1379 friend TrailingObjects;
1388 Expr *RewrittenInitExpr);
1391 :
Expr(CXXDefaultInitExprClass,
Empty) {
1397 bool HasRewrittenInit);
1402 Expr *RewrittenInitExpr);
1422 return *getTrailingObjects<Expr *>();
1429 return *getTrailingObjects<Expr *>();
1443 return T->getStmtClass() == CXXDefaultInitExprClass;
1462 : Destructor(destructor) {}
1493 Stmt *SubExpr =
nullptr;
1496 :
Expr(CXXBindTemporaryExprClass, SubExpr->getType(),
VK_PRValue,
1498 Temp(temp), SubExpr(SubExpr) {
1504 :
Expr(CXXBindTemporaryExprClass,
Empty) {}
1527 return T->getStmtClass() == CXXBindTemporaryExprClass;
1573 inline Stmt **getTrailingArgs();
1574 const Stmt *
const *getTrailingArgs()
const {
1583 bool ListInitialization,
bool StdInitListInitialization,
1593 return NumArgs *
sizeof(
Stmt *);
1601 bool HadMultipleCandidates,
bool ListInitialization,
1602 bool StdInitListInitialization,
bool ZeroInitialization,
1682 return reinterpret_cast<const Expr *
const *
>(getTrailingArgs());
1690 assert(Arg <
getNumArgs() &&
"Arg access out of range!");
1694 assert(Arg <
getNumArgs() &&
"Arg access out of range!");
1700 assert(Arg <
getNumArgs() &&
"Arg access out of range!");
1718 return T->getStmtClass() == CXXConstructExprClass ||
1719 T->getStmtClass() == CXXTemporaryObjectExprClass;
1745 LLVM_PREFERRED_TYPE(
bool)
1746 unsigned ConstructsVirtualBase : 1;
1750 LLVM_PREFERRED_TYPE(
bool)
1751 unsigned InheritedFromVirtualBase : 1;
1759 bool InheritedFromVirtualBase)
1761 Constructor(Ctor),
Loc(
Loc),
1762 ConstructsVirtualBase(ConstructsVirtualBase),
1763 InheritedFromVirtualBase(InheritedFromVirtualBase) {
1770 :
Expr(CXXInheritedCtorInitExprClass,
Empty),
1771 ConstructsVirtualBase(
false), InheritedFromVirtualBase(
false) {}
1795 return T->getStmtClass() == CXXInheritedCtorInitExprClass;
1816 private llvm::TrailingObjects<CXXFunctionalCastExpr, CXXBaseSpecifier *,
1817 FPOptionsOverride> {
1828 LParenLoc(lParenLoc), RParenLoc(rParenLoc) {
1838 unsigned numTrailingObjects(OverloadToken<CXXBaseSpecifier *>)
const {
1866 return T->getStmtClass() == CXXFunctionalCastExprClass;
1897 bool HadMultipleCandidates,
bool ListInitialization,
1898 bool StdInitListInitialization,
1899 bool ZeroInitialization);
1907 SourceRange ParenOrBraceRange,
bool HadMultipleCandidates,
1908 bool ListInitialization,
bool StdInitListInitialization,
1909 bool ZeroInitialization);
1920 return T->getStmtClass() == CXXTemporaryObjectExprClass;
1924Stmt **CXXConstructExpr::getTrailingArgs() {
1925 if (
auto *
E = dyn_cast<CXXTemporaryObjectExpr>(
this))
1926 return reinterpret_cast<Stmt **
>(
E + 1);
1928 "Unexpected class deriving from CXXConstructExpr!");
1929 return reinterpret_cast<Stmt **
>(
this + 1);
1954 private llvm::TrailingObjects<LambdaExpr, Stmt *> {
1978 SourceLocation ClosingBrace,
bool ContainsUnexpandedParameterPack);
1983 Stmt **getStoredStmts() {
return getTrailingObjects<Stmt *>(); }
1984 Stmt *
const *getStoredStmts()
const {
return getTrailingObjects<Stmt *>(); }
1986 void initBodyIfNeeded()
const;
1997 bool ExplicitParams,
bool ExplicitResultType,
1999 bool ContainsUnexpandedParameterPack);
2004 unsigned NumCaptures);
2081 return reinterpret_cast<Expr **
>(getStoredStmts());
2087 return reinterpret_cast<Expr *
const *
>(getStoredStmts());
2147 const auto *ConstThis =
this;
2148 return const_cast<CompoundStmt *
>(ConstThis->getCompoundStmtBody());
2165 return T->getStmtClass() == LambdaExprClass;
2169 return IntroducerRange.getBegin();
2199 :
Expr(CXXScalarValueInitExprClass, Shell) {}
2213 return T->getStmtClass() == CXXScalarValueInitExprClass;
2241 private llvm::TrailingObjects<CXXNewExpr, Stmt *, SourceRange> {
2244 friend TrailingObjects;
2276 unsigned arraySizeOffset()
const {
return 0; }
2277 unsigned initExprOffset()
const {
return arraySizeOffset() +
isArray(); }
2278 unsigned placementNewArgsOffset()
const {
2282 unsigned numTrailingObjects(OverloadToken<Stmt *>)
const {
2286 unsigned numTrailingObjects(OverloadToken<SourceRange>)
const {
2291 CXXNewExpr(
bool IsGlobalNew, FunctionDecl *OperatorNew,
2292 FunctionDecl *OperatorDelete,
bool ShouldPassAlignment,
2293 bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs,
2294 SourceRange TypeIdParens, std::optional<Expr *> ArraySize,
2296 QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange
Range,
2297 SourceRange DirectInitRange);
2300 CXXNewExpr(EmptyShell
Empty,
bool IsArray,
unsigned NumPlacementArgs,
2301 bool IsParenTypeId);
2306 Create(
const ASTContext &Ctx,
bool IsGlobalNew, FunctionDecl *OperatorNew,
2307 FunctionDecl *OperatorDelete,
bool ShouldPassAlignment,
2308 bool UsualArrayDeleteWantsSize, ArrayRef<Expr *> PlacementArgs,
2309 SourceRange TypeIdParens, std::optional<Expr *> ArraySize,
2311 QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange
Range,
2312 SourceRange DirectInitRange);
2315 static CXXNewExpr *
CreateEmpty(
const ASTContext &Ctx,
bool IsArray,
2316 bool HasInit,
unsigned NumPlacementArgs,
2317 bool IsParenTypeId);
2324 return AllocatedTypeInfo;
2356 return std::nullopt;
2359 cast_or_null<Expr>(getTrailingObjects<Stmt *>()[arraySizeOffset()]))
2362 return std::nullopt;
2370 return std::nullopt;
2373 cast_or_null<Expr>(getTrailingObjects<Stmt *>()[arraySizeOffset()]))
2376 return std::nullopt;
2384 return reinterpret_cast<Expr **
>(getTrailingObjects<Stmt *>() +
2385 placementNewArgsOffset());
2398 return isParenTypeId() ? getTrailingObjects<SourceRange>()[0]
2416 ? cast<Expr>(getTrailingObjects<Stmt *>()[initExprOffset()])
2421 ? cast<Expr>(getTrailingObjects<Stmt *>()[initExprOffset()])
2453 return getTrailingObjects<Stmt *>() + placementNewArgsOffset();
2459 return getTrailingObjects<Stmt *>() + placementNewArgsOffset();
2469 return raw_arg_begin() + numTrailingObjects(OverloadToken<Stmt *>());
2472 return getTrailingObjects<Stmt *>();
2475 return raw_arg_begin() + numTrailingObjects(OverloadToken<Stmt *>());
2485 return T->getStmtClass() == CXXNewExprClass;
2505 Stmt *Argument =
nullptr;
2509 bool ArrayFormAsWritten,
bool UsualArrayDeleteWantsSize,
2512 OperatorDelete(OperatorDelete), Argument(Arg) {
2554 return T->getStmtClass() == CXXDeleteExprClass;
2569 llvm::PointerUnion<TypeSourceInfo *, const IdentifierInfo *>
Type;
2625 LLVM_PREFERRED_TYPE(
bool)
2659 :
Expr(CXXPseudoDestructorExprClass, Shell), IsArrow(
false) {}
2742 return Base->getBeginLoc();
2747 return T->getStmtClass() == CXXPseudoDestructorExprClass;
2768 private llvm::TrailingObjects<TypeTraitExpr, TypeSourceInfo *> {
2785 size_t numTrailingObjects(OverloadToken<TypeSourceInfo *>)
const {
2819 assert(I <
getNumArgs() &&
"Argument out-of-range");
2832 return T->getStmtClass() == TypeTraitExprClass;
2880 Value(value), Dimension(dimension),
Loc(loc), RParen(rparen),
2881 QueriedType(queried) {
2882 assert(att <=
ATT_Last &&
"invalid enum value!");
2883 assert(
static_cast<unsigned>(att) == ATT &&
"ATT overflow!");
2888 :
Expr(ArrayTypeTraitExprClass,
Empty), ATT(0) {}
2904 return T->getStmtClass() == ArrayTypeTraitExprClass;
2930 LLVM_PREFERRED_TYPE(
bool)
2940 Expr* QueriedExpression =
nullptr;
2948 ET(et),
Value(value),
Loc(loc), RParen(rparen),
2949 QueriedExpression(queried) {
2950 assert(et <=
ET_Last &&
"invalid enum value!");
2951 assert(
static_cast<unsigned>(et) == ET &&
"ET overflow!");
2968 return T->getStmtClass() == ExpressionTraitExprClass;
3000 bool KnownDependent,
bool KnownInstantiationDependent,
3001 bool KnownContainsUnexpandedParameterPack);
3004 bool HasTemplateKWAndArgsInfo);
3045 assert(
E->getType()->isSpecificBuiltinType(BuiltinType::Overload));
3048 bool HasParen = isa<ParenExpr>(
E);
3050 E =
E->IgnoreParens();
3051 if (isa<UnaryOperator>(
E)) {
3052 assert(cast<UnaryOperator>(
E)->getOpcode() == UO_AddrOf);
3053 E = cast<UnaryOperator>(
E)->getSubExpr();
3054 auto *Ovl = cast<OverloadExpr>(
E->IgnoreParens());
3056 Result.HasFormOfMemberPointer = (
E == Ovl && Ovl->getQualifier());
3057 Result.IsAddressOfOperand =
true;
3058 Result.IsAddressOfOperandWithParen = HasParen;
3061 Result.Expression = cast<OverloadExpr>(
E);
3082 llvm::iterator_range<decls_iterator>
decls()
const {
3161 return T->getStmtClass() == UnresolvedLookupExprClass ||
3162 T->getStmtClass() == UnresolvedMemberExprClass;
3201 private llvm::TrailingObjects<UnresolvedLookupExpr, DeclAccessPair,
3202 ASTTemplateKWAndArgsInfo,
3203 TemplateArgumentLoc> {
3206 friend TrailingObjects;
3233 bool KnownDependent,
bool KnownInstantiationDependent);
3236 bool HasTemplateKWAndArgsInfo);
3238 unsigned numTrailingObjects(OverloadToken<DeclAccessPair>)
const {
3242 unsigned numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>)
const {
3247 static UnresolvedLookupExpr *
3248 Create(
const ASTContext &Context, CXXRecordDecl *NamingClass,
3249 NestedNameSpecifierLoc QualifierLoc,
3250 const DeclarationNameInfo &NameInfo,
bool RequiresADL,
3251 UnresolvedSetIterator
Begin, UnresolvedSetIterator End,
3252 bool KnownDependent,
bool KnownInstantiationDependent);
3257 static UnresolvedLookupExpr *
3258 Create(
const ASTContext &Context, CXXRecordDecl *NamingClass,
3259 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
3260 const DeclarationNameInfo &NameInfo,
bool RequiresADL,
3261 const TemplateArgumentListInfo *Args, UnresolvedSetIterator
Begin,
3262 UnresolvedSetIterator End,
bool KnownDependent,
3263 bool KnownInstantiationDependent);
3265 static UnresolvedLookupExpr *
CreateEmpty(
const ASTContext &Context,
3266 unsigned NumResults,
3267 bool HasTemplateKWAndArgsInfo,
3268 unsigned NumTemplateArgs);
3282 return l.getBeginLoc();
3301 return T->getStmtClass() == UnresolvedLookupExprClass;
3321 private llvm::TrailingObjects<DependentScopeDeclRefExpr,
3322 ASTTemplateKWAndArgsInfo,
3323 TemplateArgumentLoc> {
3326 friend TrailingObjects;
3340 size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>)
const {
3341 return hasTemplateKWAndArgsInfo();
3344 bool hasTemplateKWAndArgsInfo()
const {
3349 static DependentScopeDeclRefExpr *
3350 Create(
const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
3351 SourceLocation TemplateKWLoc,
const DeclarationNameInfo &NameInfo,
3352 const TemplateArgumentListInfo *TemplateArgs);
3354 static DependentScopeDeclRefExpr *
CreateEmpty(
const ASTContext &Context,
3355 bool HasTemplateKWAndArgsInfo,
3356 unsigned NumTemplateArgs);
3382 if (!hasTemplateKWAndArgsInfo())
3384 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
3390 if (!hasTemplateKWAndArgsInfo())
3392 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
3398 if (!hasTemplateKWAndArgsInfo())
3400 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
3413 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
3414 getTrailingObjects<TemplateArgumentLoc>(), List);
3421 return getTrailingObjects<TemplateArgumentLoc>();
3428 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
3448 return T->getStmtClass() == DependentScopeDeclRefExprClass;
3472 private llvm::TrailingObjects<
3474 llvm::PointerUnion<BlockDecl *, CompoundLiteralExpr *>> {
3484 friend TrailingObjects;
3492 unsigned numObjects);
3495 bool CleanupsHaveSideEffects,
3523 return T->getStmtClass() == ExprWithCleanupsClass;
3557 private llvm::TrailingObjects<CXXUnresolvedConstructExpr, Expr *> {
3559 friend TrailingObjects;
3563 llvm::PointerIntPair<TypeSourceInfo *, 1> TypeAndInitForm;
3576 :
Expr(CXXUnresolvedConstructExprClass,
Empty) {
3596 return TypeAndInitForm.getPointer();
3634 assert(I <
getNumArgs() &&
"Argument index out-of-range");
3639 assert(I <
getNumArgs() &&
"Argument index out-of-range");
3644 assert(I <
getNumArgs() &&
"Argument index out-of-range");
3656 return T->getStmtClass() == CXXUnresolvedConstructExprClass;
3666 auto **begin =
reinterpret_cast<Stmt **
>(
3681 private llvm::TrailingObjects<CXXDependentScopeMemberExpr,
3682 ASTTemplateKWAndArgsInfo,
3683 TemplateArgumentLoc, NamedDecl *> {
3686 friend TrailingObjects;
3722 bool hasTemplateKWAndArgsInfo()
const {
3726 bool hasFirstQualifierFoundInScope()
const {
3730 unsigned numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>)
const {
3731 return hasTemplateKWAndArgsInfo();
3734 unsigned numTrailingObjects(OverloadToken<TemplateArgumentLoc>)
const {
3738 unsigned numTrailingObjects(OverloadToken<NamedDecl *>)
const {
3739 return hasFirstQualifierFoundInScope();
3742 CXXDependentScopeMemberExpr(
const ASTContext &Ctx,
Expr *
Base,
3743 QualType BaseType,
bool IsArrow,
3744 SourceLocation OperatorLoc,
3745 NestedNameSpecifierLoc QualifierLoc,
3746 SourceLocation TemplateKWLoc,
3747 NamedDecl *FirstQualifierFoundInScope,
3748 DeclarationNameInfo MemberNameInfo,
3749 const TemplateArgumentListInfo *TemplateArgs);
3751 CXXDependentScopeMemberExpr(EmptyShell
Empty,
bool HasTemplateKWAndArgsInfo,
3752 bool HasFirstQualifierFoundInScope);
3755 static CXXDependentScopeMemberExpr *
3756 Create(
const ASTContext &Ctx,
Expr *
Base, QualType BaseType,
bool IsArrow,
3757 SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc,
3758 SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope,
3759 DeclarationNameInfo MemberNameInfo,
3760 const TemplateArgumentListInfo *TemplateArgs);
3762 static CXXDependentScopeMemberExpr *
3763 CreateEmpty(
const ASTContext &Ctx,
bool HasTemplateKWAndArgsInfo,
3764 unsigned NumTemplateArgs,
bool HasFirstQualifierFoundInScope);
3772 return cast<Expr>(
Base)->isImplicitCXXThis();
3779 return cast<Expr>(
Base);
3814 if (!hasFirstQualifierFoundInScope())
3816 return *getTrailingObjects<NamedDecl *>();
3821 return MemberNameInfo;
3834 if (!hasTemplateKWAndArgsInfo())
3836 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
3842 if (!hasTemplateKWAndArgsInfo())
3844 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
3850 if (!hasTemplateKWAndArgsInfo())
3852 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
3866 getTrailingObjects<ASTTemplateKWAndArgsInfo>()->copyInto(
3867 getTrailingObjects<TemplateArgumentLoc>(), List);
3876 return getTrailingObjects<TemplateArgumentLoc>();
3885 return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
3894 return Base->getBeginLoc();
3907 return T->getStmtClass() == CXXDependentScopeMemberExprClass;
3941 private llvm::TrailingObjects<UnresolvedMemberExpr, DeclAccessPair,
3942 ASTTemplateKWAndArgsInfo,
3943 TemplateArgumentLoc> {
3946 friend TrailingObjects;
3984 bool HasTemplateKWAndArgsInfo);
3986 unsigned numTrailingObjects(OverloadToken<DeclAccessPair>)
const {
3990 unsigned numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>)
const {
3995 static UnresolvedMemberExpr *
3996 Create(
const ASTContext &Context,
bool HasUnresolvedUsing, Expr *
Base,
3997 QualType BaseType,
bool IsArrow, SourceLocation OperatorLoc,
3998 NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
3999 const DeclarationNameInfo &MemberNameInfo,
4000 const TemplateArgumentListInfo *TemplateArgs,
4001 UnresolvedSetIterator
Begin, UnresolvedSetIterator End);
4003 static UnresolvedMemberExpr *
CreateEmpty(
const ASTContext &Context,
4004 unsigned NumResults,
4005 bool HasTemplateKWAndArgsInfo,
4006 unsigned NumTemplateArgs);
4018 return cast<Expr>(
Base);
4022 return cast<Expr>(
Base);
4063 return Base->getBeginLoc();
4065 return l.getBeginLoc();
4076 return T->getStmtClass() == UnresolvedMemberExprClass;
4094 if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(
this))
4096 return cast<UnresolvedMemberExpr>(
this)->getTrailingObjects<
DeclAccessPair>();
4103 if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(
this))
4105 return cast<UnresolvedMemberExpr>(
this)
4110 if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(
this))
4112 return cast<UnresolvedMemberExpr>(
this)
4117 if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(
this))
4118 return ULE->getNamingClass();
4119 return cast<UnresolvedMemberExpr>(
this)->getNamingClass();
4136 Operand(Operand),
Range(Keyword, RParen) {
4152 return T->getStmtClass() == CXXNoexceptExprClass;
4191 unsigned NumExpansions;
4197 std::optional<unsigned> NumExpansions)
4200 EllipsisLoc(EllipsisLoc),
4201 NumExpansions(NumExpansions ? *NumExpansions + 1 : 0),
4222 return NumExpansions - 1;
4224 return std::nullopt;
4234 return T->getStmtClass() == PackExpansionExprClass;
4258 private llvm::TrailingObjects<SizeOfPackExpr, TemplateArgument> {
4261 friend TrailingObjects;
4291 std::optional<unsigned> Length,
4294 OperatorLoc(OperatorLoc), PackLoc(PackLoc), RParenLoc(RParenLoc),
4295 Length(Length ? *Length : PartialArgs.size()), Pack(Pack) {
4296 assert((!Length || PartialArgs.empty()) &&
4297 "have partial args for non-dependent sizeof... expression");
4298 auto *Args = getTrailingObjects<TemplateArgument>();
4299 std::uninitialized_copy(PartialArgs.begin(), PartialArgs.end(), Args);
4301 : ExprDependence::ValueInstantiation);
4306 :
Expr(SizeOfPackExprClass,
Empty), Length(NumPartialArgs) {}
4309 static SizeOfPackExpr *
Create(ASTContext &Context, SourceLocation OperatorLoc,
4310 NamedDecl *Pack, SourceLocation PackLoc,
4311 SourceLocation RParenLoc,
4312 std::optional<unsigned> Length = std::nullopt,
4313 ArrayRef<TemplateArgument> PartialArgs = {});
4315 unsigned NumPartialArgs);
4337 "Cannot get the length of a value-dependent pack size expression");
4353 const auto *Args = getTrailingObjects<TemplateArgument>();
4361 return T->getStmtClass() == SizeOfPackExprClass;
4376 private llvm::TrailingObjects<PackIndexingExpr, Expr *> {
4379 friend TrailingObjects;
4390 unsigned TransformedExpressions : 31;
4392 LLVM_PREFERRED_TYPE(
bool)
4393 unsigned FullySubstituted : 1;
4398 bool FullySubstituted =
false)
4400 EllipsisLoc(EllipsisLoc), RSquareLoc(RSquareLoc),
4401 SubExprs{PackIdExpr, IndexExpr},
4402 TransformedExpressions(SubstitutedExprs.size()),
4403 FullySubstituted(FullySubstituted) {
4405 auto *Exprs = getTrailingObjects<Expr *>();
4406 std::uninitialized_copy(SubstitutedExprs.begin(), SubstitutedExprs.end(),
4415 PackIndexingExpr(EmptyShell
Empty) :
Expr(PackIndexingExprClass,
Empty) {}
4417 unsigned numTrailingObjects(OverloadToken<Expr *>)
const {
4418 return TransformedExpressions;