13#ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14#define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
48#include "llvm/ADT/ArrayRef.h"
49#include "llvm/Support/ErrorHandling.h"
53using namespace llvm::omp;
109template<
typename Derived>
114 class ForgetPartiallySubstitutedPackRAII {
122 ForgetPartiallySubstitutedPackRAII(Derived &Self)
123 : Self(Self), ResetPackSubstIndex(Self.getSema(), -1) {
124 Old = Self.ForgetPartiallySubstitutedPack();
127 ~ForgetPartiallySubstitutedPackRAII() {
128 Self.RememberPartiallySubstitutedPack(Old);
145 Derived &
getDerived() {
return static_cast<Derived&
>(*this); }
149 return static_cast<const Derived&
>(*this);
214 OldLocation = Self.getDerived().getBaseLocation();
215 OldEntity = Self.getDerived().getBaseEntity();
218 Self.getDerived().setBase(Location, Entity);
222 Self.getDerived().setBase(OldLocation, OldEntity);
252 return E->isDefaultArgument();
295 bool &ShouldExpand,
bool &RetainExpansion,
296 std::optional<unsigned> &NumExpansions) {
297 ShouldExpand =
false;
412 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
413#include "clang/Basic/AttrList.inc"
423 const X##Attr *TransformStmt##X##Attr(const Stmt *, const Stmt *, \
424 const X##Attr *A) { \
425 return getDerived().Transform##X##Attr(A); \
427#include "clang/Basic/AttrList.inc"
473 bool *ArgChanged =
nullptr);
482 llvm::DenseMap<Decl *, Decl *>::iterator Known
485 return Known->second;
513 assert(New.size() == 1 &&
514 "must override transformedLocalDecl if performing pack expansion");
552 NamedDecl *FirstQualifierInScope =
nullptr);
597 NamedDecl *FirstQualifierInScope =
nullptr,
598 bool AllowInjectedClassName =
false);
610 bool Uneval =
false);
633 bool Uneval =
false) {
652 template<
typename InputIterator>
656 bool Uneval =
false);
668#define ABSTRACT_TYPELOC(CLASS, PARENT)
669#define TYPELOC(CLASS, PARENT) \
670 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
671#include "clang/AST/TypeLocNodes.def"
675 bool SuppressObjCLifetime);
679 bool SuppressObjCLifetime);
681 template<
typename Fn>
734 return getDerived().TransformFunctionTypeParams(
735 Loc, Params, ParamTypes, ParamInfos, PTypes, PVars, PInfos,
nullptr);
753 KWLoc, Params,
nullptr,
754 nullptr, PTypes, &TransParams, PInfos))
767 std::optional<unsigned> NumExpansions,
768 bool ExpectParameterPack);
795 bool IsAddressOfOperand,
803 bool IsAddressOfOperand);
811#define STMT(Node, Parent) \
812 LLVM_ATTRIBUTE_NOINLINE \
813 StmtResult Transform##Node(Node *S);
814#define VALUESTMT(Node, Parent) \
815 LLVM_ATTRIBUTE_NOINLINE \
816 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
817#define EXPR(Node, Parent) \
818 LLVM_ATTRIBUTE_NOINLINE \
819 ExprResult Transform##Node(Node *E);
820#define ABSTRACT_STMT(Stmt)
821#include "clang/AST/StmtNodes.inc"
823#define GEN_CLANG_CLAUSE_CLASS
824#define CLAUSE_CLASS(Enum, Str, Class) \
825 LLVM_ATTRIBUTE_NOINLINE \
826 OMPClause *Transform##Class(Class *S);
827#include "llvm/Frontend/OpenMP/OMP.inc"
904 const llvm::APInt *Size,
Expr *SizeExpr,
905 unsigned IndexTypeQuals,
SourceRange BracketsRange);
914 const llvm::APInt &Size,
Expr *SizeExpr,
915 unsigned IndexTypeQuals,
925 unsigned IndexTypeQuals,
935 unsigned IndexTypeQuals,
946 unsigned IndexTypeQuals,
984 unsigned NumColumns);
1001 Expr *AddrSpaceExpr,
1071 bool FullySubstituted,
1085 TypeConstraintConcept,
1086 TypeConstraintArgs);
1094 Template, Deduced,
false);
1140 bool AllowInjectedClassName) {
1144 SS.
Adopt(QualifierLoc);
1146 SS, TemplateKWLoc, *Name, NameLoc,
QualType(),
nullptr,
1147 AllowInjectedClassName);
1161 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1178 bool DeducedTSTContext) {
1180 SS.
Adopt(QualifierLoc);
1193 *
Id, IdLoc, DeducedTSTContext);
1211 switch (
Result.getResultKind()) {
1222 llvm_unreachable(
"Tag lookup cannot find non-tags");
1234 switch (
Result.getResultKind()) {
1240 SemaRef.
Diag(IdLoc, diag::err_tag_reference_non_tag)
1241 << SomeDecl << NTK << llvm::to_underlying(Kind);
1247 << llvm::to_underlying(Kind) <<
Id << DC
1256 SemaRef.
Diag(KeywordLoc, diag::err_use_with_wrong_tag) <<
Id;
1257 SemaRef.
Diag(Tag->getLocation(), diag::note_previous_use);
1274 std::optional<unsigned> NumExpansions) {
1319 bool AllowInjectedClassName);
1332 bool AllowInjectedClassName);
1342 Decl *AssociatedDecl,
unsigned Index,
1345 ArgPack, AssociatedDecl, Index, Final);
1423 Then, ElseLoc, Else);
1477 Inc, RParenLoc, Body);
1522 bool IsVolatile,
unsigned NumOutputs,
1529 NumInputs, Names, Constraints, Exprs,
1530 AsmString, Clobbers, NumLabels, RParenLoc);
1539 StringRef AsmString,
1540 unsigned NumOutputs,
unsigned NumInputs,
1546 NumOutputs, NumInputs,
1547 Constraints, Clobbers, Exprs, EndLoc);
1576 CoawaitLoc, Operand, OpCoawaitLookup);
1580 Suspend.
get(),
true);
1681 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1693 Kind, DirName, Clauses, AStmt, StartLoc, EndLoc);
1707 NameModifier,
Condition, StartLoc, LParenLoc, NameModifierLoc, ColonLoc,
1818 Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
1831 Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
1844 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1895 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1922 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1923 ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1937 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1938 ReductionId, UnresolvedReductions);
1953 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1954 ReductionId, UnresolvedReductions);
1967 VarList, Step, StartLoc, LParenLoc, Modifier, ModifierLoc, ColonLoc,
1968 StepModifierLoc, EndLoc);
1981 VarList, Alignment, StartLoc, LParenLoc, ColonLoc, EndLoc);
2041 Data, DepModifier, VarList, StartLoc, LParenLoc, EndLoc);
2054 Modifier,
Device, StartLoc, LParenLoc, ModifierLoc, EndLoc);
2069 IteratorModifier, MapTypeModifiers, MapTypeModifiersLoc,
2070 MapperIdScopeSpec, MapperId, MapType, IsMapTypeImplicit, MapLoc,
2071 ColonLoc, VarList, Locs,
2072 false, UnresolvedMappers);
2089 Allocate, Alignment, FirstModifier, FirstModifierLoc, SecondModifier,
2090 SecondModifierLoc, VarList, StartLoc, LParenLoc, ColonLoc, EndLoc);
2138 Modifier,
Device, StartLoc, LParenLoc, ModifierLoc, EndLoc);
2151 Modifier, NumTasks, StartLoc, LParenLoc, ModifierLoc, EndLoc);
2186 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2201 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2202 ColonLoc, VarList, Locs, UnresolvedMappers);
2217 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2218 ColonLoc, VarList, Locs, UnresolvedMappers);
2269 M, Kind, StartLoc, LParenLoc, MLoc, KindLoc, EndLoc);
2316 StartLoc, LParenLoc, EndLoc,
Data);
2329 StartLoc, LParenLoc, ColonLoc, EndLoc, Modifier, Locators);
2341 Modifier, Kind, StartLoc, LParenLoc, ModifierKwLoc, KindKwLoc, EndLoc);
2354 InteropVar, InteropInfo, StartLoc, LParenLoc, VarLoc, EndLoc);
2365 LParenLoc, VarLoc, EndLoc);
2377 InteropVar, StartLoc, LParenLoc, VarLoc, EndLoc);
2516 DepType, DepLoc, ColonLoc, VarList, StartLoc, LParenLoc, EndLoc);
2564 ForLoc, Element, Collection, RParenLoc);
2582 StartLoc, IdLoc,
Id);
2620 if (RangeStmt->isSingleDecl()) {
2621 if (
VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2622 if (RangeVar->isInvalidDecl())
2625 Expr *RangeExpr = RangeVar->getInit();
2632 diag::err_objc_for_range_init_stmt)
2633 <<
Init->getSourceRange();
2636 ForLoc, LoopVar, RangeExpr, RParenLoc);
2643 ForLoc, CoawaitLoc,
Init, ColonLoc,
Range,
Begin, End, Cond, Inc,
2657 QualifierLoc, NameInfo, Nested);
2719 SS.
Adopt(QualifierLoc);
2831 if (IsOMPArraySection)
2833 Base, LBracketLoc, LowerBound, ColonLocFirst, ColonLocSecond, Length,
2834 Stride, RBracketLoc);
2836 assert(Stride ==
nullptr && !ColonLocSecond.
isValid() &&
2837 "Stride/second colon not allowed for OpenACC");
2840 Base, LBracketLoc, LowerBound, ColonLocFirst, Length, RBracketLoc);
2852 Base, LParenLoc, RParenLoc, Dims, BracketsRanges);
2864 nullptr, IteratorKwLoc, LLoc, RLoc,
Data);
2874 Expr *ExecConfig =
nullptr) {
2876 nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2883 nullptr, Callee, LParenLoc, Args, RParenLoc);
2901 if (!
Member->getDeclName()) {
2905 assert(
Member->getType()->isRecordType() &&
2906 "unnamed member not of record type?");
2919 if (!isArrow &&
Base->isPRValue()) {
2928 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(
Member),
2934 SS.
Adopt(QualifierLoc);
2937 if (
Base->containsErrors())
2951 if (
getSema().isUnevaluatedContext() &&
Base->isImplicitCXXThis() &&
2952 isa<FieldDecl, IndirectFieldDecl, MSPropertyDecl>(
Member)) {
2953 if (
auto *ThisClass = cast<CXXThisExpr>(
Base)
2956 ->getAsCXXRecordDecl()) {
2957 auto *
Class = cast<CXXRecordDecl>(
Member->getDeclContext());
2960 if (!ThisClass->Equals(
Class) && !ThisClass->isDerivedFrom(
Class))
2968 FirstQualifierInScope,
2969 R, ExplicitTemplateArgs,
3147 Expr *ControllingExpr,
3152 ControllingExpr, Types, Exprs);
3167 ControllingType, Types, Exprs);
3200 case Stmt::CXXStaticCastExprClass:
3201 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
3202 RAngleLoc, LParenLoc,
3203 SubExpr, RParenLoc);
3205 case Stmt::CXXDynamicCastExprClass:
3206 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
3207 RAngleLoc, LParenLoc,
3208 SubExpr, RParenLoc);
3210 case Stmt::CXXReinterpretCastExprClass:
3211 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
3212 RAngleLoc, LParenLoc,
3216 case Stmt::CXXConstCastExprClass:
3217 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
3218 RAngleLoc, LParenLoc,
3219 SubExpr, RParenLoc);
3221 case Stmt::CXXAddrspaceCastExprClass:
3222 return getDerived().RebuildCXXAddrspaceCastExpr(
3223 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
3226 llvm_unreachable(
"Invalid C++ named cast");
3304 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3316 bool ListInitialization) {
3320 if (
auto *PLE = dyn_cast<ParenListExpr>(Sub))
3322 TInfo, LParenLoc,
MultiExprArg(PLE->getExprs(), PLE->getNumExprs()),
3323 RParenLoc, ListInitialization);
3326 ListInitialization);
3390 if (
getSema().CheckCXXThisType(ThisLoc, ThisType))
3400 bool IsThrownVariableInScope) {
3410 Expr *RewrittenExpr) {
3412 RewrittenExpr,
getSema().CurContext);
3446 std::optional<Expr *> ArraySize,
3465 bool IsGlobalDelete,
3516 bool IsAddressOfOperand,
3519 SS.
Adopt(QualifierLoc);
3521 if (TemplateArgs || TemplateKWLoc.
isValid())
3523 SS, TemplateKWLoc, NameInfo, TemplateArgs, IsAddressOfOperand);
3526 SS, NameInfo, IsAddressOfOperand, RecoveryTSI);
3548 bool IsElidable,
MultiExprArg Args,
bool HadMultipleCandidates,
3549 bool ListInitialization,
bool StdInitListInitialization,
3555 if (Constructor->isInheritingConstructor())
3556 FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3559 if (
getSema().CompleteConstructorCall(FoundCtor,
T, Args,
Loc,
3566 HadMultipleCandidates,
3568 StdInitListInitialization,
3569 RequiresZeroInit, ConstructKind,
3577 bool ConstructsVBase,
3578 bool InheritedFromVBase) {
3580 Loc,
T, Constructor, ConstructsVBase, InheritedFromVBase);
3591 bool ListInitialization) {
3593 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3604 bool ListInitialization) {
3606 RParenLoc, ListInitialization);
3623 SS.
Adopt(QualifierLoc);
3626 OperatorLoc, IsArrow,
3628 FirstQualifierInScope,
3630 TemplateArgs,
nullptr);
3646 SS.
Adopt(QualifierLoc);
3649 OperatorLoc, IsArrow,
3651 FirstQualifierInScope,
3652 R, TemplateArgs,
nullptr);
3667 std::optional<unsigned> Length,
3670 RParenLoc, Length, PartialArgs);
3675 Expr *PackIdExpression,
Expr *IndexExpr,
3677 bool FullySubstituted =
false) {
3679 IndexExpr, RSquareLoc, ExpandedExprs,
3709 NamedConcept, TALI);
3727 LocalParameters, RParenLoc, Requirements,
3781 Expr **Elements,
unsigned NumElements) {
3791 RB,
Base, Key, getterMethod, setterMethod);
3823 ReceiverTypeInfo, ReceiverTypeInfo->
getType(),
3838 Sel, Method, LBracLoc,
3839 SelectorLocs, RBracLoc, Args);
3853 nullptr, SuperType, SuperLoc, Sel, Method, LBracLoc,
3854 SelectorLocs, RBracLoc, Args)
3856 Sel, Method, LBracLoc,
3857 SelectorLocs, RBracLoc, Args);
3866 bool IsArrow,
bool IsFreeIvar) {
3875 if (IsFreeIvar &&
Result.isUsable())
3876 cast<ObjCIvarRefExpr>(
Result.get())->setIsFreeIvar(IsFreeIvar);
3912 PropertyLoc,
Base));
3944 assert(!Lookup.
empty() &&
"No __builtin_shufflevector?");
3953 CK_BuiltinFnToFnPtr).
get();
3979 std::optional<unsigned> NumExpansions) {
3984 EllipsisLoc, NumExpansions);
4006 llvm_unreachable(
"Pack expansion pattern has no parameter packs");
4027 std::optional<unsigned> NumExpansions) {
4040 std::optional<unsigned> NumExpansions) {
4042 EllipsisLoc, RHS, RParenLoc,
4051 Init->containsUnexpandedParameterPack();
4052 else if (PVD->hasUninstantiatedDefaultArg())
4054 PVD->getUninstantiatedDefaultArg()
4055 ->containsUnexpandedParameterPack();
4200 Exprs.push_back(DevNumExpr);
4201 Exprs.insert(Exprs.end(), QueueIdExprs.begin(), QueueIdExprs.end());
4204 Exprs, RParenLoc, EndLoc, Clauses, {});
4228 bool DeducibleTSTContext);
4240template <
typename Derived>
4245 switch (S->getStmtClass()) {
4250#define STMT(Node, Parent) \
4251 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
4252#define VALUESTMT(Node, Parent) \
4253 case Stmt::Node##Class: \
4254 return getDerived().Transform##Node(cast<Node>(S), SDK);
4255#define ABSTRACT_STMT(Node)
4256#define EXPR(Node, Parent)
4257#include "clang/AST/StmtNodes.inc"
4260#define STMT(Node, Parent)
4261#define ABSTRACT_STMT(Stmt)
4262#define EXPR(Node, Parent) case Stmt::Node##Class:
4263#include "clang/AST/StmtNodes.inc"
4265 ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
4267 if (SDK == SDK_StmtExprResult)
4268 E = getSema().ActOnStmtExprResult(
E);
4269 return getSema().ActOnExprStmt(
E, SDK == SDK_Discarded);
4276template<
typename Derived>
4281 switch (S->getClauseKind()) {
4284#define GEN_CLANG_CLAUSE_CLASS
4285#define CLAUSE_CLASS(Enum, Str, Class) \
4287 return getDerived().Transform##Class(cast<Class>(S));
4288#include "llvm/Frontend/OpenMP/OMP.inc"
4295template<
typename Derived>
4302#define STMT(Node, Parent) case Stmt::Node##Class: break;
4303#define ABSTRACT_STMT(Stmt)
4304#define EXPR(Node, Parent) \
4305 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
4306#include "clang/AST/StmtNodes.inc"
4312template<
typename Derived>
4320 if (
auto *FE = dyn_cast<FullExpr>(
Init))
4321 Init = FE->getSubExpr();
4323 if (
auto *AIL = dyn_cast<ArrayInitLoopExpr>(
Init)) {
4329 Init = MTE->getSubExpr();
4332 Init = Binder->getSubExpr();
4335 Init = ICE->getSubExprAsWritten();
4338 dyn_cast<CXXStdInitializerListExpr>(
Init))
4339 return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
4346 return getDerived().TransformExpr(
Init);
4351 return getDerived().RebuildParenListExpr(
Parens.getBegin(), {},
4356 if (isa<ImplicitValueInitExpr>(
Init))
4362 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
4363 return getDerived().TransformExpr(
Init);
4368 return TransformInitializer(Construct->
getArg(0), NotCopyInit);
4375 getSema().currentEvaluationContext().InLifetimeExtendingContext =
4376 getSema().parentEvaluationContext().InLifetimeExtendingContext;
4377 getSema().currentEvaluationContext().RebuildDefaultArgOrDefaultInit =
4378 getSema().parentEvaluationContext().RebuildDefaultArgOrDefaultInit;
4380 bool ArgChanged =
false;
4382 true, NewArgs, &ArgChanged))
4387 return getDerived().RebuildInitList(Construct->
getBeginLoc(), NewArgs,
4392 if (
Parens.isInvalid()) {
4395 assert(NewArgs.empty() &&
4396 "no parens or braces but have direct init with arguments?");
4399 return getDerived().RebuildParenListExpr(
Parens.getBegin(), NewArgs,
4403template<
typename Derived>
4409 for (
unsigned I = 0; I != NumInputs; ++I) {
4411 if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
4419 Expr *Pattern = Expansion->getPattern();
4422 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4423 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
4428 bool RetainExpansion =
false;
4429 std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
4430 std::optional<unsigned> NumExpansions = OrigNumExpansions;
4431 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
4434 Expand, RetainExpansion,
4443 ExprResult OutPattern = getDerived().TransformExpr(Pattern);
4447 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.
get(),
4448 Expansion->getEllipsisLoc(),
4450 if (Out.isInvalid())
4455 Outputs.push_back(Out.get());
4461 if (ArgChanged) *ArgChanged =
true;
4465 for (
unsigned I = 0; I != *NumExpansions; ++I) {
4467 ExprResult Out = getDerived().TransformExpr(Pattern);
4468 if (Out.isInvalid())
4471 if (Out.get()->containsUnexpandedParameterPack()) {
4472 Out = getDerived().RebuildPackExpansion(
4473 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4474 if (Out.isInvalid())
4478 Outputs.push_back(Out.get());
4483 if (RetainExpansion) {
4484 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4486 ExprResult Out = getDerived().TransformExpr(Pattern);
4487 if (Out.isInvalid())
4490 Out = getDerived().RebuildPackExpansion(
4491 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4492 if (Out.isInvalid())
4495 Outputs.push_back(Out.get());
4502 IsCall ? getDerived().TransformInitializer(Inputs[I],
false)
4503 : getDerived().TransformExpr(Inputs[I]);
4507 if (
Result.get() != Inputs[I] && ArgChanged)
4510 Outputs.push_back(
Result.get());
4516template <
typename Derived>
4520 VarDecl *ConditionVar = cast_or_null<VarDecl>(
4521 getDerived().TransformDefinition(Var->
getLocation(), Var));
4526 return getSema().ActOnConditionVariable(ConditionVar,
Loc, Kind);
4535 return getSema().ActOnCondition(
nullptr,
Loc, CondExpr.
get(), Kind,
4542template <
typename Derived>
4550 Qualifier = Qualifier.getPrefix())
4566 SS, FirstQualifierInScope,
false))
4573 cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4581 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4596 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4605 FirstQualifierInScope, SS);
4615 diag::warn_cxx98_compat_enum_nested_name_spec);
4618 SS.
Adopt(ETL.getQualifierLoc());
4619 TL = ETL.getNamedTypeLoc();
4638 FirstQualifierInScope =
nullptr;
4644 !getDerived().AlwaysRebuild())
4657template<
typename Derived>
4665 switch (Name.getNameKind()) {
4676 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4677 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4678 getDerived().TransformDecl(NameInfo.
getLoc(), OldTemplate));
4694 NewTInfo = getDerived().TransformType(OldTInfo);
4702 QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4718 llvm_unreachable(
"Unknown name kind.");
4721template<
typename Derived>
4728 bool AllowInjectedClassName) {
4730 TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl();
4731 assert(Template &&
"qualified template name must refer to a template");
4734 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4739 if (!getDerived().AlwaysRebuild() &&
4741 TransTemplate == Template)
4744 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4752 FirstQualifierInScope =
nullptr;
4755 if (!getDerived().AlwaysRebuild() &&
4763 if (DTN->isIdentifier()) {
4764 return getDerived().RebuildTemplateName(SS,
4766 *DTN->getIdentifier(),
4769 FirstQualifierInScope,
4770 AllowInjectedClassName);
4773 return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4774 DTN->getOperator(), NameLoc,
4775 ObjectType, AllowInjectedClassName);
4779 if (
TemplateDecl *Template = Name.getAsTemplateDecl()) {
4781 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4786 return getDerived().RebuildTemplateName(SS,
false,
4791 = Name.getAsSubstTemplateTemplateParmPack()) {
4792 return getDerived().RebuildTemplateName(
4793 SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(),
4794 SubstPack->getIndex(), SubstPack->getFinal());
4798 llvm_unreachable(
"overloaded function decl survived to here");
4801template<
typename Derived>
4805 Output = getSema().getTrivialTemplateArgumentLoc(
4806 Arg,
QualType(), getDerived().getBaseLocation());
4809template <
typename Derived>
4817 llvm_unreachable(
"Unexpected TemplateArgument");
4827 QualType NewT = getDerived().TransformType(
T);
4834 ValueDecl *NewD =
D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4835 getDerived().getBaseLocation(),
D))
4840 if (NewT ==
T &&
D == NewD)
4857 llvm_unreachable(
"unexpected template argument kind");
4867 DI = getDerived().TransformType(DI);
4878 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4884 SS.
Adopt(QualifierLoc);
4885 TemplateName Template = getDerived().TransformTemplateName(
4896 llvm_unreachable(
"Caller should expand pack expansions");
4911 ExprResult E = getDerived().TransformExpr(InputExpr);
4926template<
typename Derived,
typename InputIterator>
4934 typedef typename std::iterator_traits<InputIterator>::difference_type
4964 Self.InventTemplateArgumentLoc(*
Iter,
Result);
4972 return X.Iter == Y.Iter;
4977 return X.Iter != Y.Iter;
4981template<
typename Derived>
4982template<
typename InputIterator>
4999 if (TransformTemplateArguments(PackLocIterator(*
this,
5000 In.getArgument().pack_begin()),
5001 PackLocIterator(*
this,
5002 In.getArgument().pack_end()),
5009 if (In.getArgument().isPackExpansion()) {
5013 std::optional<unsigned> OrigNumExpansions;
5015 = getSema().getTemplateArgumentPackExpansionPattern(
5016 In, Ellipsis, OrigNumExpansions);
5019 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5020 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
5025 bool RetainExpansion =
false;
5026 std::optional<unsigned> NumExpansions = OrigNumExpansions;
5027 if (getDerived().TryExpandParameterPacks(Ellipsis,
5041 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
5044 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
5046 if (Out.getArgument().isNull())
5055 for (
unsigned I = 0; I != *NumExpansions; ++I) {
5058 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
5061 if (Out.getArgument().containsUnexpandedParameterPack()) {
5062 Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
5064 if (Out.getArgument().isNull())
5073 if (RetainExpansion) {
5074 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5076 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
5079 Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
5081 if (Out.getArgument().isNull())
5091 if (getDerived().TransformTemplateArgument(In, Out, Uneval))
5105template<
typename Derived>
5107 if (getDerived().AlreadyTransformed(
T))
5113 getDerived().getBaseLocation());
5123template<
typename Derived>
5127 getDerived().getBaseEntity());
5128 if (getDerived().AlreadyTransformed(DI->
getType()))
5143template<
typename Derived>
5146 switch (
T.getTypeLocClass()) {
5147#define ABSTRACT_TYPELOC(CLASS, PARENT)
5148#define TYPELOC(CLASS, PARENT) \
5149 case TypeLoc::CLASS: \
5150 return getDerived().Transform##CLASS##Type(TLB, \
5151 T.castAs<CLASS##TypeLoc>());
5152#include "clang/AST/TypeLocNodes.def"
5155 llvm_unreachable(
"unhandled type loc!");
5158template<
typename Derived>
5160 if (!isa<DependentNameType>(
T))
5161 return TransformType(
T);
5163 if (getDerived().AlreadyTransformed(
T))
5166 getDerived().getBaseLocation());
5167 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
5171template<
typename Derived>
5174 if (!isa<DependentNameType>(DI->
getType()))
5175 return TransformType(DI);
5179 getDerived().getBaseEntity());
5180 if (getDerived().AlreadyTransformed(DI->
getType()))
5200 Result = getDerived().RebuildQualifiedType(
Result, QTL);
5209template<
typename Derived>
5214 TypeLoc UnqualTL =
T.getUnqualifiedLoc();
5215 auto SuppressObjCLifetime =
5216 T.getType().getLocalQualifiers().hasObjCLifetime();
5218 Result = getDerived().TransformTemplateTypeParmType(TLB, TTP,
5219 SuppressObjCLifetime);
5220 }
else if (
auto STTP = UnqualTL.
getAs<SubstTemplateTypeParmPackTypeLoc>()) {
5221 Result = getDerived().TransformSubstTemplateTypeParmPackType(
5222 TLB, STTP, SuppressObjCLifetime);
5224 Result = getDerived().TransformType(TLB, UnqualTL);
5243template <
typename Derived>
5253 SemaRef.
Diag(
Loc, diag::err_address_space_mismatch_templ_inst)
5284 else if (
T.getObjCLifetime()) {
5289 if ((AutoTy = dyn_cast<AutoType>(
T)) && AutoTy->
isDeduced()) {
5305 SemaRef.
Diag(
Loc, diag::err_attr_objc_ownership_redundant) <<
T;
5314template<
typename Derived>
5320 if (getDerived().AlreadyTransformed(TL.
getType()))
5324 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
5330template<
typename Derived>
5332TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
5333 QualType ObjectType,
5334 NamedDecl *UnqualLookup,
5336 if (getDerived().AlreadyTransformed(TSInfo->getType()))
5339 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
5343template <
typename Derived>
5344TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
5345 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
5347 QualType
T = TL.getType();
5348 assert(!getDerived().AlreadyTransformed(
T));
5353 if (isa<TemplateSpecializationType>(
T)) {
5354 TemplateSpecializationTypeLoc SpecTL =
5355 TL.castAs<TemplateSpecializationTypeLoc>();
5357 TemplateName Template = getDerived().TransformTemplateName(
5358 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
5359 ObjectType, UnqualLookup,
true);
5360 if (Template.isNull())
5363 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
5365 }
else if (isa<DependentTemplateSpecializationType>(
T)) {
5366 DependentTemplateSpecializationTypeLoc SpecTL =
5367 TL.castAs<DependentTemplateSpecializationTypeLoc>();
5369 TemplateName Template
5370 = getDerived().RebuildTemplateName(SS,
5371 SpecTL.getTemplateKeywordLoc(),
5372 *SpecTL.getTypePtr()->getIdentifier(),
5373 SpecTL.getTemplateNameLoc(),
5374 ObjectType, UnqualLookup,
5376 if (Template.isNull())
5379 Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
5385 Result = getDerived().TransformType(TLB, TL);
5394template <
class TyLoc>
static inline
5396 TyLoc NewT = TLB.
push<TyLoc>(
T.getType());
5397 NewT.setNameLoc(
T.getNameLoc());
5401template<
typename Derived>
5402QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
5404 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(
T.getType());
5405 NewT.setBuiltinLoc(
T.getBuiltinLoc());
5406 if (
T.needsExtraLocalData())
5407 NewT.getWrittenBuiltinSpecs() =
T.getWrittenBuiltinSpecs();
5411template<
typename Derived>
5412QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
5418template <
typename Derived>
5419QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
5420 AdjustedTypeLoc TL) {
5422 return getDerived().TransformType(TLB, TL.getOriginalLoc());
5425template<
typename Derived>
5426QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
5427 DecayedTypeLoc TL) {
5428 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
5429 if (OriginalType.isNull())
5432 QualType
Result = TL.getType();
5433 if (getDerived().AlwaysRebuild() ||
5434 OriginalType != TL.getOriginalLoc().getType())
5436 TLB.push<DecayedTypeLoc>(
Result);
5441template <
typename Derived>
5443TreeTransform<Derived>::TransformArrayParameterType(TypeLocBuilder &TLB,
5444 ArrayParameterTypeLoc TL) {
5445 QualType OriginalType = getDerived().TransformType(TLB, TL.getElementLoc());
5446 if (OriginalType.isNull())
5449 QualType
Result = TL.getType();
5450 if (getDerived().AlwaysRebuild() ||
5451 OriginalType != TL.getElementLoc().getType())
5453 TLB.push<ArrayParameterTypeLoc>(
Result);
5458template<
typename Derived>
5459QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
5460 PointerTypeLoc TL) {
5461 QualType PointeeType
5462 = getDerived().TransformType(TLB, TL.getPointeeLoc());
5463 if (PointeeType.isNull())
5466 QualType
Result = TL.getType();
5467 if (PointeeType->getAs<ObjCObjectType>()) {
5474 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(
Result);
5475 NewT.setStarLoc(TL.getStarLoc());
5479 if (getDerived().AlwaysRebuild() ||
5480 PointeeType != TL.getPointeeLoc().getType()) {
5481 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5488 TLB.TypeWasModifiedSafely(
Result->getPointeeType());
5490 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(
Result);
5491 NewT.setSigilLoc(TL.getSigilLoc());
5495template<
typename Derived>
5497TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5498 BlockPointerTypeLoc TL) {
5499 QualType PointeeType
5500 = getDerived().TransformType(TLB, TL.getPointeeLoc());
5501 if (PointeeType.isNull())
5504 QualType
Result = TL.getType();
5505 if (getDerived().AlwaysRebuild() ||
5506 PointeeType != TL.getPointeeLoc().getType()) {
5507 Result = getDerived().RebuildBlockPointerType(PointeeType,
5513 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(
Result);
5514 NewT.setSigilLoc(TL.getSigilLoc());
5522template<
typename Derived>
5530 if (PointeeType.
isNull())
5534 if (getDerived().AlwaysRebuild() ||
5535 PointeeType !=
T->getPointeeTypeAsWritten()) {
5536 Result = getDerived().RebuildReferenceType(PointeeType,
5537 T->isSpelledAsLValue(),
5550 if (isa<LValueReferenceType>(
Result))
5559template<
typename Derived>
5563 return TransformReferenceType(TLB, TL);
5566template<
typename Derived>
5568TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5569 RValueReferenceTypeLoc TL) {
5570 return TransformReferenceType(TLB, TL);
5573template<
typename Derived>
5575TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5576 MemberPointerTypeLoc TL) {
5577 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5578 if (PointeeType.isNull())
5581 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5582 TypeSourceInfo *NewClsTInfo =
nullptr;
5584 NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5589 const MemberPointerType *
T = TL.getTypePtr();
5590 QualType OldClsType = QualType(
T->getClass(), 0);
5591 QualType NewClsType;
5593 NewClsType = NewClsTInfo->getType();
5595 NewClsType = getDerived().TransformType(OldClsType);
5596 if (NewClsType.isNull())
5600 QualType
Result = TL.getType();
5601 if (getDerived().AlwaysRebuild() ||
5603 NewClsType != OldClsType) {
5604 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5612 const MemberPointerType *MPT =
Result->getAs<MemberPointerType>();
5613 if (MPT && PointeeType != MPT->getPointeeType()) {
5614 assert(isa<AdjustedType>(MPT->getPointeeType()));
5615 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5618 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(
Result);
5619 NewTL.setSigilLoc(TL.getSigilLoc());
5620 NewTL.setClassTInfo(NewClsTInfo);
5625template<
typename Derived>
5627TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5628 ConstantArrayTypeLoc TL) {
5629 const ConstantArrayType *
T = TL.getTypePtr();
5630 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5631 if (ElementType.isNull())
5635 Expr *
OldSize = TL.getSizeExpr();
5637 OldSize =
const_cast<Expr*
>(
T->getSizeExpr());
5638 Expr *NewSize =
nullptr;
5642 NewSize = getDerived().TransformExpr(
OldSize).template getAs<Expr>();
5646 QualType
Result = TL.getType();
5647 if (getDerived().AlwaysRebuild() ||
5648 ElementType !=
T->getElementType() ||
5649 (
T->getSizeExpr() && NewSize !=
OldSize)) {
5650 Result = getDerived().RebuildConstantArrayType(ElementType,
5651 T->getSizeModifier(),
5652 T->getSize(), NewSize,
5653 T->getIndexTypeCVRQualifiers(),
5654 TL.getBracketsRange());
5663 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(
Result);
5664 NewTL.setLBracketLoc(TL.getLBracketLoc());
5665 NewTL.setRBracketLoc(TL.getRBracketLoc());
5666 NewTL.setSizeExpr(NewSize);
5671template<
typename Derived>
5672QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5673 TypeLocBuilder &TLB,
5674 IncompleteArrayTypeLoc TL) {
5675 const IncompleteArrayType *
T = TL.getTypePtr();
5676 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5677 if (ElementType.isNull())
5680 QualType
Result = TL.getType();
5681 if (getDerived().AlwaysRebuild() ||
5682 ElementType !=
T->getElementType()) {
5683 Result = getDerived().RebuildIncompleteArrayType(ElementType,
5684 T->getSizeModifier(),
5685 T->getIndexTypeCVRQualifiers(),
5686 TL.getBracketsRange());
5691 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(
Result);
5692 NewTL.setLBracketLoc(TL.getLBracketLoc());
5693 NewTL.setRBracketLoc(TL.getRBracketLoc());
5694 NewTL.setSizeExpr(
nullptr);
5699template<
typename Derived>
5701TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5702 VariableArrayTypeLoc TL) {
5703 const VariableArrayType *
T = TL.getTypePtr();
5704 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5705 if (ElementType.isNull())
5710 EnterExpressionEvaluationContext Context(
5712 SizeResult = getDerived().TransformExpr(
T->getSizeExpr());
5714 if (SizeResult.isInvalid())
5718 if (SizeResult.isInvalid())
5721 Expr *
Size = SizeResult.get();
5723 QualType
Result = TL.getType();
5724 if (getDerived().AlwaysRebuild() ||
5725 ElementType !=
T->getElementType() ||
5726 Size !=
T->getSizeExpr()) {
5727 Result = getDerived().RebuildVariableArrayType(ElementType,
5728 T->getSizeModifier(),
5730 T->getIndexTypeCVRQualifiers(),
5731 TL.getBracketsRange());
5738 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(
Result);
5739 NewTL.setLBracketLoc(TL.getLBracketLoc());
5740 NewTL.setRBracketLoc(TL.getRBracketLoc());
5741 NewTL.setSizeExpr(Size);
5746template<
typename Derived>
5748TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5749 DependentSizedArrayTypeLoc TL) {
5750 const DependentSizedArrayType *
T = TL.getTypePtr();
5751 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5752 if (ElementType.isNull())
5760 SemaRef.
ExprEvalContexts.back().InConditionallyConstantEvaluateContext =
true;
5763 Expr *origSize = TL.getSizeExpr();
5764 if (!origSize) origSize =
T->getSizeExpr();
5767 = getDerived().TransformExpr(origSize);
5769 if (sizeResult.isInvalid())
5772 Expr *size = sizeResult.get();
5774 QualType
Result = TL.getType();
5775 if (getDerived().AlwaysRebuild() ||
5776 ElementType !=
T->getElementType() ||
5778 Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5779 T->getSizeModifier(),
5781 T->getIndexTypeCVRQualifiers(),
5782 TL.getBracketsRange());
5789 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(
Result);
5790 NewTL.setLBracketLoc(TL.getLBracketLoc());
5791 NewTL.setRBracketLoc(TL.getRBracketLoc());
5792 NewTL.setSizeExpr(size);
5797template <
typename Derived>
5798QualType TreeTransform<Derived>::TransformDependentVectorType(
5799 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5800 const DependentVectorType *
T = TL.getTypePtr();
5801 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5802 if (ElementType.isNull())
5810 if (
Size.isInvalid())
5813 QualType
Result = TL.getType();
5814 if (getDerived().AlwaysRebuild() || ElementType !=
T->getElementType() ||
5815 Size.get() !=
T->getSizeExpr()) {
5816 Result = getDerived().RebuildDependentVectorType(
5817 ElementType,
Size.get(),
T->getAttributeLoc(),
T->getVectorKind());
5823 if (isa<DependentVectorType>(
Result)) {
5824 DependentVectorTypeLoc NewTL =
5825 TLB.push<DependentVectorTypeLoc>(
Result);
5826 NewTL.setNameLoc(TL.getNameLoc());
5828 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(
Result);
5829 NewTL.setNameLoc(TL.getNameLoc());
5835template<
typename Derived>
5836QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5837 TypeLocBuilder &TLB,
5838 DependentSizedExtVectorTypeLoc TL) {
5839 const DependentSizedExtVectorType *
T = TL.getTypePtr();
5842 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5843 if (ElementType.isNull())
5852 if (
Size.isInvalid())
5855 QualType
Result = TL.getType();
5856 if (getDerived().AlwaysRebuild() ||
5857 ElementType !=
T->getElementType() ||
5858 Size.get() !=
T->getSizeExpr()) {
5859 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5861 T->getAttributeLoc());
5867 if (isa<DependentSizedExtVectorType>(
Result)) {
5868 DependentSizedExtVectorTypeLoc NewTL
5869 = TLB.push<DependentSizedExtVectorTypeLoc>(
Result);
5870 NewTL.setNameLoc(TL.getNameLoc());
5872 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(
Result);
5873 NewTL.setNameLoc(TL.getNameLoc());
5879template <
typename Derived>
5881TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5882 ConstantMatrixTypeLoc TL) {
5883 const ConstantMatrixType *
T = TL.getTypePtr();
5884 QualType ElementType = getDerived().TransformType(
T->getElementType());
5885 if (ElementType.isNull())
5888 QualType
Result = TL.getType();
5889 if (getDerived().AlwaysRebuild() || ElementType !=
T->getElementType()) {
5890 Result = getDerived().RebuildConstantMatrixType(
5891 ElementType,
T->getNumRows(),
T->getNumColumns());
5896 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(
Result);
5897 NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5898 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5899 NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5900 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5905template <
typename Derived>
5906QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5907 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5908 const DependentSizedMatrixType *
T = TL.getTypePtr();
5910 QualType ElementType = getDerived().TransformType(
T->getElementType());
5911 if (ElementType.isNull()) {
5919 Expr *origRows = TL.getAttrRowOperand();
5921 origRows =
T->getRowExpr();
5922 Expr *origColumns = TL.getAttrColumnOperand();
5924 origColumns =
T->getColumnExpr();
5926 ExprResult rowResult = getDerived().TransformExpr(origRows);
5928 if (rowResult.isInvalid())
5931 ExprResult columnResult = getDerived().TransformExpr(origColumns);
5933 if (columnResult.isInvalid())
5936 Expr *rows = rowResult.get();
5937 Expr *columns = columnResult.get();
5939 QualType
Result = TL.getType();
5940 if (getDerived().AlwaysRebuild() || ElementType !=
T->getElementType() ||
5941 rows != origRows || columns != origColumns) {
5942 Result = getDerived().RebuildDependentSizedMatrixType(
5943 ElementType, rows, columns,
T->getAttributeLoc());
5951 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(
Result);
5952 NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5953 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5954 NewTL.setAttrRowOperand(rows);
5955 NewTL.setAttrColumnOperand(columns);
5959template <
typename Derived>
5960QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5961 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5962 const DependentAddressSpaceType *
T = TL.getTypePtr();
5964 QualType pointeeType =
5965 getDerived().TransformType(TLB, TL.getPointeeTypeLoc());
5967 if (pointeeType.isNull())
5974 ExprResult AddrSpace = getDerived().TransformExpr(
T->getAddrSpaceExpr());
5976 if (AddrSpace.isInvalid())
5979 QualType
Result = TL.getType();
5980 if (getDerived().AlwaysRebuild() || pointeeType !=
T->
getPointeeType() ||
5981 AddrSpace.get() !=
T->getAddrSpaceExpr()) {
5982 Result = getDerived().RebuildDependentAddressSpaceType(
5983 pointeeType, AddrSpace.get(),
T->getAttributeLoc());
5989 if (isa<DependentAddressSpaceType>(
Result)) {
5990 DependentAddressSpaceTypeLoc NewTL =
5991 TLB.push<DependentAddressSpaceTypeLoc>(
Result);
5993 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5994 NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5995 NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5998 TLB.TypeWasModifiedSafely(
Result);
6004template <
typename Derived>
6005QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
6007 const VectorType *
T = TL.getTypePtr();
6008 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
6009 if (ElementType.isNull())
6012 QualType
Result = TL.getType();
6013 if (getDerived().AlwaysRebuild() ||
6014 ElementType !=
T->getElementType()) {
6015 Result = getDerived().RebuildVectorType(ElementType,
T->getNumElements(),
6016 T->getVectorKind());
6021 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(
Result);
6022 NewTL.setNameLoc(TL.getNameLoc());
6027template<
typename Derived>
6028QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
6029 ExtVectorTypeLoc TL) {
6030 const VectorType *
T = TL.getTypePtr();
6031 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
6032 if (ElementType.isNull())
6035 QualType
Result = TL.getType();
6036 if (getDerived().AlwaysRebuild() ||
6037 ElementType !=
T->getElementType()) {
6038 Result = getDerived().RebuildExtVectorType(ElementType,
6039 T->getNumElements(),
6045 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(
Result);
6046 NewTL.setNameLoc(TL.getNameLoc());
6051template <
typename Derived>
6054 std::optional<unsigned> NumExpansions,
bool ExpectParameterPack) {
6058 if (NumExpansions && isa<PackExpansionType>(OldDI->
getType())) {
6085 NewDI = getDerived().TransformType(OldDI);
6089 if (NewDI == OldDI && indexAdjustment == 0)
6103 transformedLocalDecl(OldParm, {newParm});
6107template <
typename Derived>
6115 unsigned *LastParamTransformed) {
6116 int indexAdjustment = 0;
6118 unsigned NumParams = Params.size();
6119 for (
unsigned i = 0; i != NumParams; ++i) {
6120 if (LastParamTransformed)
6121 *LastParamTransformed = i;
6123 assert(OldParm->getFunctionScopeIndex() == i);
6125 std::optional<unsigned> NumExpansions;
6127 if (OldParm->isParameterPack()) {
6132 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
6138 bool ShouldExpand =
false;
6139 bool RetainExpansion =
false;
6140 std::optional<unsigned> OrigNumExpansions;
6141 if (Unexpanded.size() > 0) {
6143 NumExpansions = OrigNumExpansions;
6144 if (getDerived().TryExpandParameterPacks(ExpansionTL.
getEllipsisLoc(),
6145 Pattern.getSourceRange(),
6157 "Could not find parameter packs or undeduced auto type!");
6164 getDerived().ExpandingFunctionParameterPack(OldParm);
6165 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6168 = getDerived().TransformFunctionTypeParam(OldParm,
6176 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6177 OutParamTypes.push_back(NewParm->
getType());
6179 PVars->push_back(NewParm);
6184 if (RetainExpansion) {
6185 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6187 = getDerived().TransformFunctionTypeParam(OldParm,
6195 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6196 OutParamTypes.push_back(NewParm->
getType());
6198 PVars->push_back(NewParm);
6214 NewParm = getDerived().TransformFunctionTypeParam(OldParm,
6219 "Parameter pack no longer a parameter pack after "
6222 NewParm = getDerived().TransformFunctionTypeParam(
6223 OldParm, indexAdjustment, std::nullopt,
6231 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6232 OutParamTypes.push_back(NewParm->
getType());
6234 PVars->push_back(NewParm);
6242 bool IsPackExpansion =
false;
6243 std::optional<unsigned> NumExpansions;
6246 = dyn_cast<PackExpansionType>(OldType)) {
6248 QualType Pattern = Expansion->getPattern();
6250 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
6253 bool ShouldExpand =
false;
6254 bool RetainExpansion =
false;
6266 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6268 QualType NewType = getDerived().TransformType(Pattern);
6273 NewType = getSema().getASTContext().getPackExpansionType(
6274 NewType, std::nullopt);
6281 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6282 OutParamTypes.push_back(NewType);
6284 PVars->push_back(
nullptr);
6293 if (RetainExpansion) {
6294 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6295 QualType NewType = getDerived().TransformType(Pattern);
6300 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6301 OutParamTypes.push_back(NewType);
6303 PVars->push_back(
nullptr);
6308 OldType = Expansion->getPattern();
6309 IsPackExpansion =
true;
6311 NewType = getDerived().TransformType(OldType);
6313 NewType = getDerived().TransformType(OldType);
6319 if (IsPackExpansion)
6320 NewType = getSema().Context.getPackExpansionType(NewType,
6324 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6325 OutParamTypes.push_back(NewType);
6327 PVars->push_back(
nullptr);
6332 for (
unsigned i = 0, e = PVars->size(); i != e; ++i)
6334 assert(parm->getFunctionScopeIndex() == i);
6341template<
typename Derived>
6346 return getDerived().TransformFunctionProtoType(
6349 return getDerived().TransformExceptionSpec(TL.
getBeginLoc(), ESI,
6350 ExceptionStorage, Changed);
6354template<
typename Derived>
template<
typename Fn>
6357 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
6374 if (getDerived().TransformFunctionTypeParams(
6378 ParamTypes, &ParamDecls, ExtParamInfos))
6390 SemaRef, !ThisContext && RD ? RD : ThisContext, ThisTypeQuals);
6392 ResultType = getDerived().TransformType(TLB, TL.
getReturnLoc());
6398 ResultType = getDerived().TransformType(TLB, TL.
getReturnLoc());
6402 if (getDerived().TransformFunctionTypeParams(
6406 ParamTypes, &ParamDecls, ExtParamInfos))
6412 bool EPIChanged =
false;
6417 if (
auto NewExtParamInfos =
6433 std::optional<FunctionEffectSet> NewFX;
6442 ExprResult NewExpr = getDerived().TransformExpr(CondExpr);
6445 std::optional<FunctionEffectMode> Mode =
6465 "FunctionEffectMode::None shouldn't be possible here");
6471 NewFX->insert(NewEC, Errs);
6472 assert(Errs.empty());
6480 if (getDerived().AlwaysRebuild() || ResultType !=
T->
getReturnType() ||
6482 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
6493 for (
unsigned i = 0, e = NewTL.
getNumParams(); i != e; ++i)
6499template<
typename Derived>
6509 auto *Method = dyn_cast_if_present<CXXMethodDecl>(ESI.
SourceTemplate);
6511 SemaRef, Method ? Method->getParent() :
nullptr,
6512 Method ? Method->getMethodQualifiers() :
Qualifiers{},
6522 getSema().ActOnNoexceptSpec(NoexceptExpr.
get(), EST);
6545 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
6550 bool Expand =
false;
6551 bool RetainExpansion =
false;
6552 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6555 if (getDerived().TryExpandParameterPacks(
6557 RetainExpansion, NumExpansions))
6565 QualType U = getDerived().TransformType(PackExpansion->getPattern());
6570 Exceptions.push_back(
U);
6576 for (
unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6579 QualType U = getDerived().TransformType(PackExpansion->getPattern());
6583 Exceptions.push_back(
U);
6592 Exceptions.push_back(
U);
6602template<
typename Derived>
6612 if (getDerived().AlwaysRebuild() || ResultType !=
T->
getReturnType())
6613 Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6624template <
typename Derived>
6625QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6626 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6627 const UnresolvedUsingType *
T = TL.getTypePtr();
6628 Decl *
D = getDerived().TransformDecl(TL.getNameLoc(),
T->getDecl());
6632 QualType
Result = TL.getType();
6633 if (getDerived().AlwaysRebuild() ||
D !=
T->getDecl()) {
6634 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(),
D);
6641 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(
Result);
6642 NewTL.setNameLoc(TL.getNameLoc());
6647template <
typename Derived>
6648QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6650 const UsingType *
T = TL.getTypePtr();
6652 auto *
Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6653 TL.getLocalSourceRange().getBegin(),
T->getFoundDecl()));
6657 QualType Underlying = getDerived().TransformType(
T->
desugar());
6658 if (Underlying.isNull())
6661 QualType
Result = TL.getType();
6662 if (getDerived().AlwaysRebuild() ||
Found !=
T->getFoundDecl() ||
6663 Underlying !=
T->getUnderlyingType()) {
6664 Result = getDerived().RebuildUsingType(
Found, Underlying);
6669 TLB.pushTypeSpec(
Result).setNameLoc(TL.getNameLoc());
6673template<
typename Derived>
6674QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6675 TypedefTypeLoc TL) {
6676 const TypedefType *
T = TL.getTypePtr();
6677 TypedefNameDecl *Typedef
6678 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6683 QualType
Result = TL.getType();
6684 if (getDerived().AlwaysRebuild() ||
6685 Typedef !=
T->getDecl()) {
6686 Result = getDerived().RebuildTypedefType(Typedef);
6691 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(
Result);
6692 NewTL.setNameLoc(TL.getNameLoc());
6697template<
typename Derived>
6698QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6699 TypeOfExprTypeLoc TL) {
6705 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6713 QualType
Result = TL.getType();
6715 if (getDerived().AlwaysRebuild() ||
E.get() != TL.getUnderlyingExpr()) {
6717 getDerived().RebuildTypeOfExprType(
E.get(), TL.getTypeofLoc(), Kind);
6722 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(
Result);
6723 NewTL.setTypeofLoc(TL.getTypeofLoc());
6724 NewTL.setLParenLoc(TL.getLParenLoc());
6725 NewTL.setRParenLoc(TL.getRParenLoc());
6730template<
typename Derived>
6731QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6733 TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo();
6734 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6738 QualType
Result = TL.getType();
6740 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6741 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind);
6746 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(
Result);
6747 NewTL.setTypeofLoc(TL.getTypeofLoc());
6748 NewTL.setLParenLoc(TL.getLParenLoc());
6749 NewTL.setRParenLoc(TL.getRParenLoc());
6750 NewTL.setUnmodifiedTInfo(New_Under_TI);
6755template<
typename Derived>
6756QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6757 DecltypeTypeLoc TL) {
6758 const DecltypeType *
T = TL.getTypePtr();
6765 ExprResult E = getDerived().TransformExpr(
T->getUnderlyingExpr());
6769 E = getSema().ActOnDecltypeExpression(
E.get());
6773 QualType
Result = TL.getType();
6774 if (getDerived().AlwaysRebuild() ||
6775 E.get() !=
T->getUnderlyingExpr()) {
6776 Result = getDerived().RebuildDecltypeType(
E.get(), TL.getDecltypeLoc());
6782 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(
Result);
6783 NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6784 NewTL.setRParenLoc(TL.getRParenLoc());
6788template <
typename Derived>
6790TreeTransform<Derived>::TransformPackIndexingType(TypeLocBuilder &TLB,
6791 PackIndexingTypeLoc TL) {
6795 EnterExpressionEvaluationContext ConstantContext(
6798 IndexExpr = getDerived().TransformExpr(TL.getIndexExpr());
6799 if (IndexExpr.isInvalid())
6802 QualType Pattern = TL.getPattern();
6804 const PackIndexingType *PIT = TL.getTypePtr();
6808 bool NotYetExpanded = Types.empty();
6809 bool FullySubstituted =
true;
6811 if (Types.empty() && !PIT->expandsToEmptyPack())
6814 for (QualType
T : Types) {
6816 QualType Transformed = getDerived().TransformType(
T);
6817 if (Transformed.isNull())
6819 SubtitutedTypes.push_back(Transformed);
6824 getSema().collectUnexpandedParameterPacks(
T, Unexpanded);
6825 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
6828 bool ShouldExpand =
true;
6829 bool RetainExpansion =
false;
6830 std::optional<unsigned> OrigNumExpansions;
6831 std::optional<unsigned> NumExpansions = OrigNumExpansions;
6832 if (getDerived().TryExpandParameterPacks(TL.getEllipsisLoc(), SourceRange(),
6833 Unexpanded, ShouldExpand,
6834 RetainExpansion, NumExpansions))
6836 if (!ShouldExpand) {
6837 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6840 TypeSourceInfo *TI =
6842 QualType Pack = getDerived().TransformType(TLB, TI->getTypeLoc());
6845 if (NotYetExpanded) {
6846 FullySubstituted =
false;
6847 QualType Out = getDerived().RebuildPackIndexingType(
6848 Pack, IndexExpr.get(), SourceLocation(), TL.getEllipsisLoc(),
6853 PackIndexingTypeLoc
Loc = TLB.push<PackIndexingTypeLoc>(Out);
6854 Loc.setEllipsisLoc(TL.getEllipsisLoc());
6857 SubtitutedTypes.push_back(Pack);
6860 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6861 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
6862 QualType Out = getDerived().TransformType(
T);
6865 SubtitutedTypes.push_back(Out);
6866 FullySubstituted &= !Out->containsUnexpandedParameterPack();
6870 if (RetainExpansion) {
6871 FullySubstituted =
false;
6872 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6873 QualType Out = getDerived().TransformType(
T);
6876 SubtitutedTypes.push_back(Out);
6883 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6884 QualType
Result = getDerived().TransformType(TLB, TL.getPatternLoc());
6886 QualType Out = getDerived().RebuildPackIndexingType(
6887 Result, IndexExpr.get(), SourceLocation(), TL.getEllipsisLoc(),
6888 FullySubstituted, SubtitutedTypes);
6892 PackIndexingTypeLoc
Loc = TLB.push<PackIndexingTypeLoc>(Out);
6893 Loc.setEllipsisLoc(TL.getEllipsisLoc());
6897template<
typename Derived>
6898QualType TreeTransform<Derived>::TransformUnaryTransformType(
6899 TypeLocBuilder &TLB,
6900 UnaryTransformTypeLoc TL) {
6901 QualType
Result = TL.getType();
6902 if (
Result->isDependentType()) {
6903 const UnaryTransformType *
T = TL.getTypePtr();
6905 TypeSourceInfo *NewBaseTSI =
6906 getDerived().TransformType(TL.getUnderlyingTInfo());
6909 QualType NewBase = NewBaseTSI->getType();
6911 Result = getDerived().RebuildUnaryTransformType(NewBase,
6918 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(
Result);
6919 NewTL.setKWLoc(TL.getKWLoc());
6920 NewTL.setParensRange(TL.getParensRange());
6921 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6925template<
typename Derived>
6926QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6927 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6928 const DeducedTemplateSpecializationType *
T = TL.getTypePtr();
6931 TemplateName TemplateName = getDerived().TransformTemplateName(
6932 SS,
T->getTemplateName(), TL.getTemplateNameLoc());
6933 if (TemplateName.isNull())
6936 QualType OldDeduced =
T->getDeducedType();
6937 QualType NewDeduced;
6938 if (!OldDeduced.isNull()) {
6939 NewDeduced = getDerived().TransformType(OldDeduced);
6940 if (NewDeduced.isNull())
6944 QualType
Result = getDerived().RebuildDeducedTemplateSpecializationType(
6945 TemplateName, NewDeduced);
6949 DeducedTemplateSpecializationTypeLoc NewTL =
6950 TLB.push<DeducedTemplateSpecializationTypeLoc>(
Result);
6951 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6956template<
typename Derived>
6957QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6959 const RecordType *
T = TL.getTypePtr();
6961 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6966 QualType
Result = TL.getType();
6967 if (getDerived().AlwaysRebuild() ||
6974 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(
Result);
6975 NewTL.setNameLoc(TL.getNameLoc());
6980template<
typename Derived>
6981QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6983 const EnumType *
T = TL.getTypePtr();
6985 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6990 QualType
Result = TL.getType();
6991 if (getDerived().AlwaysRebuild() ||
6992 Enum !=
T->getDecl()) {
6998 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(
Result);
6999 NewTL.setNameLoc(TL.getNameLoc());
7004template<
typename Derived>
7005QualType TreeTransform<Derived>::TransformInjectedClassNameType(
7006 TypeLocBuilder &TLB,
7007 InjectedClassNameTypeLoc TL) {
7008 Decl *
D = getDerived().TransformDecl(TL.getNameLoc(),
7009 TL.getTypePtr()->getDecl());
7010 if (!
D)
return QualType();
7013 TLB.pushTypeSpec(
T).setNameLoc(TL.getNameLoc());
7017template<
typename Derived>
7021 return getDerived().TransformTemplateTypeParmType(
7026template <
typename Derived>
7032template<
typename Derived>
7033QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
7034 TypeLocBuilder &TLB,
7035 SubstTemplateTypeParmTypeLoc TL) {
7036 const SubstTemplateTypeParmType *
T = TL.getTypePtr();
7039 getDerived().TransformDecl(TL.getNameLoc(),
T->getAssociatedDecl());
7044 TemporaryBase Rebase(*
this, TL.getNameLoc(), DeclarationName());
7045 QualType Replacement = getDerived().TransformType(
T->getReplacementType());
7046 if (Replacement.isNull())
7050 Replacement, NewReplaced,
T->getIndex(),
T->getPackIndex());
7053 SubstTemplateTypeParmTypeLoc NewTL
7054 = TLB.push<SubstTemplateTypeParmTypeLoc>(
Result);
7055 NewTL.setNameLoc(TL.getNameLoc());
7060template<
typename Derived>
7064 return getDerived().TransformSubstTemplateTypeParmPackType(
7068template <
typename Derived>
7074template<
typename Derived>
7084 = getDerived().TransformTemplateName(SS,
T->getTemplateName(),
7089 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
7092template<
typename Derived>
7100 if (getDerived().AlwaysRebuild() ||
7102 Result = getDerived().RebuildAtomicType(ValueType, TL.
getKWLoc());
7107 AtomicTypeLoc NewTL = TLB.
push<AtomicTypeLoc>(
Result);
7115template <
typename Derived>
7116QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
7118 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
7119 if (ValueType.isNull())
7122 QualType
Result = TL.getType();
7123 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
7124 const PipeType *PT =
Result->castAs<PipeType>();
7125 bool isReadPipe = PT->isReadOnly();
7126 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
7131 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(
Result);
7132 NewTL.setKWLoc(TL.getKWLoc());
7137template <
typename Derived>
7138QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
7140 const BitIntType *EIT = TL.getTypePtr();
7141 QualType
Result = TL.getType();
7143 if (getDerived().AlwaysRebuild()) {
7144 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
7145 EIT->getNumBits(), TL.getNameLoc());
7150 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(
Result);
7151 NewTL.setNameLoc(TL.getNameLoc());
7155template <
typename Derived>
7156QualType TreeTransform<Derived>::TransformDependentBitIntType(
7157 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
7158 const DependentBitIntType *EIT = TL.getTypePtr();
7162 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
7165 if (BitsExpr.isInvalid())
7168 QualType
Result = TL.getType();
7170 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
7171 Result = getDerived().RebuildDependentBitIntType(
7172 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
7178 if (isa<DependentBitIntType>(
Result)) {
7179 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(
Result);
7180 NewTL.setNameLoc(TL.getNameLoc());
7182 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(
Result);
7183 NewTL.setNameLoc(TL.getNameLoc());
7193 template<
typename ArgLocContainer>
7195 ArgLocContainer *Container;
7220 : Container(&Container), Index(Index) { }
7234 return Container->getArgLoc(Index);
7238 return pointer(Container->getArgLoc(Index));
7243 return X.Container == Y.Container &&
X.Index == Y.Index;
7252template<
typename Derived>
7253QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
7255 const AutoType *
T = TL.getTypePtr();
7256 QualType OldDeduced =
T->getDeducedType();
7257 QualType NewDeduced;
7258 if (!OldDeduced.isNull()) {
7259 NewDeduced = getDerived().TransformType(OldDeduced);
7260 if (NewDeduced.isNull())
7264 ConceptDecl *NewCD =
nullptr;
7265 TemplateArgumentListInfo NewTemplateArgs;
7266 NestedNameSpecifierLoc NewNestedNameSpec;
7267 if (
T->isConstrained()) {
7268 assert(TL.getConceptReference());
7269 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
7270 TL.getConceptNameLoc(),
T->getTypeConstraintConcept()));
7272 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7273 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7274 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
7275 if (getDerived().TransformTemplateArguments(
7276 ArgIterator(TL, 0), ArgIterator(TL, TL.getNumArgs()),
7280 if (TL.getNestedNameSpecifierLoc()) {
7282 = getDerived().TransformNestedNameSpecifierLoc(
7283 TL.getNestedNameSpecifierLoc());
7284 if (!NewNestedNameSpec)
7289 QualType
Result = TL.getType();
7290 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
7294 NewArgList.reserve(NewTemplateArgs.size());
7295 for (
const auto &ArgLoc : NewTemplateArgs.arguments())
7296 NewArgList.push_back(ArgLoc.getArgument());
7297 Result = getDerived().RebuildAutoType(NewDeduced,
T->getKeyword(), NewCD,
7303 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(
Result);
7304 NewTL.setNameLoc(TL.getNameLoc());
7305 NewTL.setRParenLoc(TL.getRParenLoc());
7306 NewTL.setConceptReference(
nullptr);
7308 if (
T->isConstrained()) {
7309 DeclarationNameInfo DNI = DeclarationNameInfo(
7310 TL.getTypePtr()->getTypeConstraintConcept()->getDeclName(),
7311 TL.getConceptNameLoc(),
7312 TL.getTypePtr()->getTypeConstraintConcept()->getDeclName());
7314 SemaRef.
Context, NewNestedNameSpec, TL.getTemplateKWLoc(), DNI,
7315 TL.getFoundDecl(), TL.getTypePtr()->getTypeConstraintConcept(),
7317 NewTL.setConceptReference(CR);
7323template <
typename Derived>
7325 TypeLocBuilder &TLB,
7326 TemplateSpecializationTypeLoc TL,
7327 TemplateName Template) {
7328 TemplateArgumentListInfo NewTemplateArgs;
7329 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7330 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7331 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
7333 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7334 ArgIterator(TL, TL.getNumArgs()),
7341 getDerived().RebuildTemplateSpecializationType(Template,
7342 TL.getTemplateNameLoc(),
7350 if (isa<DependentTemplateSpecializationType>(
Result)) {
7351 DependentTemplateSpecializationTypeLoc NewTL
7352 = TLB.push<DependentTemplateSpecializationTypeLoc>(
Result);
7353 NewTL.setElaboratedKeywordLoc(SourceLocation());
7354 NewTL.setQualifierLoc(NestedNameSpecifierLoc());
7355 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7356 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7357 NewTL.setLAngleLoc(TL.getLAngleLoc());
7358 NewTL.setRAngleLoc(TL.getRAngleLoc());
7359 for (
unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
7360 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
7364 TemplateSpecializationTypeLoc NewTL
7365 = TLB.push<TemplateSpecializationTypeLoc>(
Result);
7366 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7367 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7368 NewTL.setLAngleLoc(TL.getLAngleLoc());
7369 NewTL.setRAngleLoc(TL.getRAngleLoc());
7370 for (
unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
7371 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
7377template <
typename Derived>
7388 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7396 QualType Result = getSema().Context.getDependentTemplateSpecializationType(
7398 DTN->getIdentifier(), NewTemplateArgs.
arguments());
7408 for (
unsigned i = 0, e = NewTemplateArgs.
size(); i != e; ++i)
7414 = getDerived().RebuildTemplateSpecializationType(Template,
7426 for (
unsigned i = 0, e = NewTemplateArgs.
size(); i != e; ++i)
7433template<
typename Derived>
7448 QualType NamedT = getDerived().TransformType(TLB, TL.
getNamedTypeLoc());
7449 if (NamedT.isNull())
7458 if (
const TemplateSpecializationType *TST =
7459 NamedT->getAs<TemplateSpecializationType>()) {
7460 TemplateName Template = TST->getTemplateName();
7461 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
7462 Template.getAsTemplateDecl())) {
7464 diag::err_tag_reference_non_tag)
7466 << llvm::to_underlying(
7468 SemaRef.
Diag(TAT->getLocation(), diag::note_declared_at);
7474 if (getDerived().AlwaysRebuild() ||
7476 NamedT !=
T->getNamedType()) {
7479 QualifierLoc, NamedT);
7484 ElaboratedTypeLoc NewTL = TLB.
push<ElaboratedTypeLoc>(
Result);
7486 NewTL.setQualifierLoc(QualifierLoc);
7490template <
typename Derived>
7491QualType TreeTransform<Derived>::TransformAttributedType(TypeLocBuilder &TLB,
7492 AttributedTypeLoc TL) {
7494 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
7495 if (modifiedType.isNull())
7499 const Attr *oldAttr = TL.getAttr();
7500 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) :
nullptr;
7501 if (oldAttr && !newAttr)
7504 QualType result = TL.getType();
7507 if (getDerived().AlwaysRebuild() ||
7508 modifiedType != oldType->getModifiedType()) {
7521 QualType equivalentType = modifiedType;
7522 if (TL.getModifiedLoc().getType() != TL.getEquivalentTypeLoc().getType()) {
7523 TypeLocBuilder AuxiliaryTLB;
7524 AuxiliaryTLB.reserve(TL.getFullDataSize());
7526 getDerived().TransformType(AuxiliaryTLB, TL.getEquivalentTypeLoc());
7527 if (equivalentType.isNull())
7533 if (
auto nullability = oldType->getImmediateNullability()) {
7534 if (!modifiedType->canHaveNullability()) {
7535 SemaRef.
Diag((TL.getAttr() ? TL.getAttr()->getLocation()
7536 : TL.getModifiedLoc().getBeginLoc()),
7537 diag::err_nullability_nonpointer)
7549 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
7550 newTL.setAttr(newAttr);
7554template <
typename Derived>
7555QualType TreeTransform<Derived>::TransformCountAttributedType(
7556 TypeLocBuilder &TLB, CountAttributedTypeLoc TL) {
7557 const CountAttributedType *OldTy = TL.
getTypePtr();
7558 QualType InnerTy = getDerived().TransformType(TLB, TL.getInnerLoc());
7559 if (InnerTy.isNull())
7562 Expr *OldCount = TL.getCountExpr();
7563 Expr *NewCount =
nullptr;
7565 ExprResult CountResult = getDerived().TransformExpr(OldCount);
7566 if (CountResult.isInvalid())
7568 NewCount = CountResult.get();
7571 QualType
Result = TL.getType();
7572 if (getDerived().AlwaysRebuild() || InnerTy != OldTy->desugar() ||
7573 OldCount != NewCount) {
7576 InnerTy, NewCount, OldTy->isCountInBytes(), OldTy->isOrNull());
7579 TLB.push<CountAttributedTypeLoc>(
Result);
7583template <
typename Derived>
7584QualType TreeTransform<Derived>::TransformBTFTagAttributedType(
7585 TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) {
7587 llvm_unreachable(
"Unexpected TreeTransform for BTFTagAttributedType");
7590template <
typename Derived>
7591QualType TreeTransform<Derived>::TransformHLSLAttributedResourceType(
7592 TypeLocBuilder &TLB, HLSLAttributedResourceTypeLoc TL) {
7594 const HLSLAttributedResourceType *oldType = TL.getTypePtr();
7596 QualType WrappedTy = getDerived().TransformType(TLB, TL.getWrappedLoc());
7597 if (WrappedTy.isNull())
7600 QualType ContainedTy = QualType();
7601 QualType OldContainedTy = oldType->getContainedType();
7602 if (!OldContainedTy.isNull()) {
7603 TypeSourceInfo *oldContainedTSI = TL.getContainedTypeSourceInfo();
7604 if (!oldContainedTSI)
7605 oldContainedTSI = getSema().getASTContext().getTrivialTypeSourceInfo(
7606 OldContainedTy, SourceLocation());
7607 TypeSourceInfo *ContainedTSI = getDerived().TransformType(oldContainedTSI);
7610 ContainedTy = ContainedTSI->getType();
7613 QualType
Result = TL.getType();
7614 if (getDerived().AlwaysRebuild() || WrappedTy != oldType->getWrappedType() ||
7615 ContainedTy != oldType->getContainedType()) {
7617 WrappedTy, ContainedTy, oldType->getAttrs());
7620 TLB.push<HLSLAttributedResourceTypeLoc>(
Result);
7624template<
typename Derived>
7626TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
7628 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7632 QualType
Result = TL.getType();
7633 if (getDerived().AlwaysRebuild() ||
7634 Inner != TL.getInnerLoc().getType()) {
7635 Result = getDerived().RebuildParenType(Inner);
7640 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(
Result);
7641 NewTL.setLParenLoc(TL.getLParenLoc());
7642 NewTL.setRParenLoc(TL.getRParenLoc());
7646template <
typename Derived>
7648TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
7649 MacroQualifiedTypeLoc TL) {
7650 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7654 QualType
Result = TL.getType();
7655 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
7657 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
7662 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(
Result);
7663 NewTL.setExpansionLoc(TL.getExpansionLoc());
7667template<
typename Derived>
7668QualType TreeTransform<Derived>::TransformDependentNameType(
7669 TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
7670 return TransformDependentNameType(TLB, TL,
false);
7673template<
typename Derived>
7674QualType TreeTransform<Derived>::TransformDependentNameType(
7675 TypeLocBuilder &TLB, DependentNameTypeLoc TL,
bool DeducedTSTContext) {
7676 const DependentNameType *
T = TL.getTypePtr();
7678 NestedNameSpecifierLoc QualifierLoc
7679 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7684 = getDerived().RebuildDependentNameType(
T->getKeyword(),
7685 TL.getElaboratedKeywordLoc(),
7693 if (
const ElaboratedType* ElabT =
Result->getAs<ElaboratedType>()) {
7694 QualType NamedT = ElabT->getNamedType();
7695 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
7697 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(
Result);
7698 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7699 NewTL.setQualifierLoc(QualifierLoc);
7701 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(
Result);
7702 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7703 NewTL.setQualifierLoc(QualifierLoc);
7704 NewTL.setNameLoc(TL.getNameLoc());
7709template<
typename Derived>
7712 DependentTemplateSpecializationTypeLoc TL) {
7713 NestedNameSpecifierLoc QualifierLoc;
7714 if (TL.getQualifierLoc()) {
7716 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7722 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
7725template<
typename Derived>
7738 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7743 QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
7751 QualType NamedT = ElabT->getNamedType();
7760 for (
unsigned I = 0,
E = NewTemplateArgs.
size(); I !=
E; ++I)
7767 }
else if (isa<DependentTemplateSpecializationType>(
Result)) {
7776 for (
unsigned I = 0,
E = NewTemplateArgs.
size(); I !=
E; ++I)
7785 for (
unsigned I = 0,
E = NewTemplateArgs.
size(); I !=
E; ++I)
7791template<
typename Derived>
7800 if (getDerived().AlwaysRebuild() ||
7802 Result = getDerived().RebuildPackExpansionType(Pattern,
7810 PackExpansionTypeLoc NewT = TLB.
push<PackExpansionTypeLoc>(
Result);
7815template<
typename Derived>
7817TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7818 ObjCInterfaceTypeLoc TL) {
7820 TLB.pushFullCopy(TL);
7821 return TL.getType();
7824template<
typename Derived>
7826TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7827 ObjCTypeParamTypeLoc TL) {
7828 const ObjCTypeParamType *
T = TL.getTypePtr();
7829 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7830 getDerived().TransformDecl(
T->getDecl()->getLocation(),
T->getDecl()));
7834 QualType
Result = TL.getType();
7835 if (getDerived().AlwaysRebuild() ||
7836 OTP !=
T->getDecl()) {
7837 Result = getDerived().RebuildObjCTypeParamType(
7838 OTP, TL.getProtocolLAngleLoc(),
7839 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7840 TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7845 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(
Result);
7846 if (TL.getNumProtocols()) {
7847 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7848 for (
unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7849 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7850 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7855template<
typename Derived>
7857TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7858 ObjCObjectTypeLoc TL) {
7860 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7861 if (BaseType.isNull())
7864 bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7868 for (
unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7869 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7870 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7871 QualType TypeArg = TypeArgInfo->getType();
7872 if (
auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7876 const auto *PackExpansion = PackExpansionLoc.getType()
7877 ->castAs<PackExpansionType>();
7881 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
7885 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7886 bool Expand =
false;
7887 bool RetainExpansion =
false;
7888 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7889 if (getDerived().TryExpandParameterPacks(
7890 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7891 Unexpanded, Expand, RetainExpansion, NumExpansions))
7898 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7900 TypeLocBuilder TypeArgBuilder;
7901 TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7902 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7904 if (NewPatternType.isNull())
7908 NewPatternType, NumExpansions);
7909 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7910 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7911 NewTypeArgInfos.push_back(
7912 TypeArgBuilder.getTypeSourceInfo(SemaRef.
Context, NewExpansionType));
7918 for (
unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7919 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7921 TypeLocBuilder TypeArgBuilder;
7922 TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7924 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7926 if (NewTypeArg.isNull())
7929 NewTypeArgInfos.push_back(
7930 TypeArgBuilder.getTypeSourceInfo(SemaRef.
Context, NewTypeArg));
7936 TypeLocBuilder TypeArgBuilder;
7937 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7938 QualType NewTypeArg =
7939 getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7940 if (NewTypeArg.isNull())
7944 if (NewTypeArg == TypeArg) {
7945 NewTypeArgInfos.push_back(TypeArgInfo);
7949 NewTypeArgInfos.push_back(
7950 TypeArgBuilder.getTypeSourceInfo(SemaRef.
Context, NewTypeArg));
7954 QualType
Result = TL.getType();
7955 if (getDerived().AlwaysRebuild() || AnyChanged) {
7957 Result = getDerived().RebuildObjCObjectType(
7958 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7959 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7960 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7961 TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7967 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(
Result);
7968 NewT.setHasBaseTypeAsWritten(
true);
7969 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7970 for (
unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7971 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7972 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7973 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7974 for (
unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7975 NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7976 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7980template<
typename Derived>
7982TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7983 ObjCObjectPointerTypeLoc TL) {
7984 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7985 if (PointeeType.isNull())
7988 QualType
Result = TL.getType();
7989 if (getDerived().AlwaysRebuild() ||
7990 PointeeType != TL.getPointeeLoc().getType()) {
7991 Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7997 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(
Result);
7998 NewT.setStarLoc(TL.getStarLoc());
8005template<
typename Derived>
8007TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
8011template<
typename Derived>
8014 return getDerived().TransformCompoundStmt(S,
false);
8017template<
typename Derived>
8023 if (S->hasStoredFPFeatures())
8024 getSema().resetFPOptions(
8025 S->getStoredFPFeatures().applyOverrides(getSema().getLangOpts()));
8028 bool SubStmtInvalid =
false;
8029 bool SubStmtChanged =
false;
8031 for (
auto *B : S->body()) {
8033 B, IsStmtExpr && B ==
ExprResult ? SDK_StmtExprResult : SDK_Discarded);
8035 if (
Result.isInvalid()) {
8038 if (isa<DeclStmt>(B))
8042 SubStmtInvalid =
true;
8046 SubStmtChanged = SubStmtChanged ||
Result.get() != B;
8047 Statements.push_back(
Result.getAs<Stmt>());
8053 if (!getDerived().AlwaysRebuild() &&
8057 return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
8063template<
typename Derived>
8065TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
8072 LHS = getDerived().TransformExpr(S->getLHS());
8074 if (LHS.isInvalid())
8078 RHS = getDerived().TransformExpr(S->getRHS());
8080 if (RHS.isInvalid())
8087 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
8089 S->getEllipsisLoc(),
8092 if (Case.isInvalid())
8097 getDerived().TransformStmt(S->getSubStmt());
8098 if (SubStmt.isInvalid())
8102 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
8105template <
typename Derived>
8106StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
8109 getDerived().TransformStmt(S->getSubStmt());
8110 if (SubStmt.isInvalid())
8114 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
8118template<
typename Derived>
8120TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
8121 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
8122 if (SubStmt.isInvalid())
8125 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
8133 if (LD == S->getDecl())
8134 S->getDecl()->setStmt(
nullptr);
8137 return getDerived().RebuildLabelStmt(S->getIdentLoc(),
8138 cast<LabelDecl>(LD), SourceLocation(),
8142template <
typename Derived>
8151 return getDerived().Transform##X##Attr(cast<X##Attr>(R));
8152#include "clang/Basic/AttrList.inc"
8157template <
typename Derived>
8168 return getDerived().TransformStmt##X##Attr(OrigS, InstS, cast<X##Attr>(R));
8169#include "clang/Basic/AttrList.inc"
8171 return TransformAttr(R);
8174template <
typename Derived>
8177 StmtDiscardKind SDK) {
8178 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
8182 bool AttrsChanged =
false;
8186 for (
const auto *I : S->getAttrs()) {
8188 getDerived().TransformStmtAttr(S->getSubStmt(), SubStmt.
get(), I);
8189 AttrsChanged |= (I != R);
8194 if (SubStmt.
get() == S->getSubStmt() && !AttrsChanged)
8202 return getDerived().RebuildAttributedStmt(S->
getAttrLoc(), Attrs,
8206template<
typename Derived>
8208TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
8211 if (
Init.isInvalid())
8214 Sema::ConditionResult Cond;
8215 if (!S->isConsteval()) {
8217 Cond = getDerived().TransformCondition(
8218 S->getIfLoc(), S->getConditionVariable(), S->getCond(),
8221 if (Cond.isInvalid())
8226 std::optional<bool> ConstexprConditionValue;
8227 if (S->isConstexpr())
8228 ConstexprConditionValue = Cond.getKnownValue();
8232 if (!ConstexprConditionValue || *ConstexprConditionValue) {
8233 EnterExpressionEvaluationContext Ctx(
8236 S->isNonNegatedConsteval());
8238 Then = getDerived().TransformStmt(S->getThen());
8239 if (Then.isInvalid())
8245 Then =
new (getSema().Context)
8246 CompoundStmt(S->getThen()->getBeginLoc(), S->getThen()->getEndLoc());
8251 if (!ConstexprConditionValue || !*ConstexprConditionValue) {
8252 EnterExpressionEvaluationContext Ctx(
8255 S->isNegatedConsteval());
8257 Else = getDerived().TransformStmt(S->getElse());
8258 if (Else.isInvalid())
8260 }
else if (S->getElse() && ConstexprConditionValue &&
8261 *ConstexprConditionValue) {
8265 Else =
new (getSema().Context)
8266 CompoundStmt(S->getElse()->getBeginLoc(), S->getElse()->getEndLoc());
8269 if (!getDerived().AlwaysRebuild() &&
8270 Init.get() == S->getInit() &&
8271 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
8272 Then.get() == S->getThen() &&
8273 Else.get() == S->getElse())
8276 return getDerived().RebuildIfStmt(
8277 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
8278 S->getRParenLoc(),
Init.get(), Then.get(), S->getElseLoc(), Else.get());
8281template<
typename Derived>
8283TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
8286 if (
Init.isInvalid())
8290 Sema::ConditionResult Cond = getDerived().TransformCondition(
8291 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
8293 if (Cond.isInvalid())
8298 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
8299 Init.get(), Cond, S->getRParenLoc());
8304 StmtResult Body = getDerived().TransformStmt(S->getBody());
8305 if (Body.isInvalid())
8309 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(),
Switch.get(),
8313template<
typename Derived>
8315TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
8317 Sema::ConditionResult Cond = getDerived().TransformCondition(
8318 S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
8320 if (Cond.isInvalid())
8325 SemaOpenACC::LoopInConstructRAII LCR{SemaRef.
OpenACC()};
8329 StmtResult Body = getDerived().TransformStmt(S->getBody());
8330 if (Body.isInvalid())
8333 if (!getDerived().AlwaysRebuild() &&
8334 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
8335 Body.get() == S->getBody())
8338 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
8339 Cond, S->getRParenLoc(), Body.get());
8342template<
typename Derived>
8344TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
8347 SemaOpenACC::LoopInConstructRAII LCR{SemaRef.
OpenACC()};
8351 StmtResult Body = getDerived().TransformStmt(S->getBody());
8352 if (Body.isInvalid())
8356 ExprResult Cond = getDerived().TransformExpr(S->getCond());
8357 if (Cond.isInvalid())
8360 if (!getDerived().AlwaysRebuild() &&
8361 Cond.get() == S->getCond() &&
8362 Body.get() == S->getBody())
8365 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
8366 S->getWhileLoc(), Cond.get(),
8370template<
typename Derived>
8372TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
8373 if (getSema().getLangOpts().OpenMP)
8374 getSema().OpenMP().startOpenMPLoop();
8378 if (
Init.isInvalid())
8383 if (getSema().getLangOpts().OpenMP &&
Init.isUsable())
8384 getSema().OpenMP().ActOnOpenMPLoopInitialization(S->getForLoc(),
8388 Sema::ConditionResult Cond = getDerived().TransformCondition(
8389 S->getForLoc(), S->getConditionVariable(), S->getCond(),
8391 if (Cond.isInvalid())
8396 if (
Inc.isInvalid())
8399 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(
Inc.get()));
8400 if (S->getInc() && !FullInc.get())
8405 SemaOpenACC::LoopInConstructRAII LCR{SemaRef.
OpenACC()};
8407 S->getBeginLoc(), S->getInit(),
Init.get(), S->getCond(),
8408 Cond.get().second, S->getInc(),
Inc.get());
8411 StmtResult Body = getDerived().TransformStmt(S->getBody());
8412 if (Body.isInvalid())
8417 if (!getDerived().AlwaysRebuild() &&
8418 Init.get() == S->getInit() &&
8419 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
8420 Inc.get() == S->getInc() &&
8421 Body.get() == S->getBody())
8424 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
8425 Init.get(), Cond, FullInc,
8426 S->getRParenLoc(), Body.get());
8429template<
typename Derived>
8431TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
8432 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
8438 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
8439 cast<LabelDecl>(LD));
8442template<
typename Derived>
8444TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
8450 if (!getDerived().AlwaysRebuild() &&
8451 Target.get() == S->getTarget())
8454 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
8458template<
typename Derived>
8460TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
8464template<
typename Derived>
8466TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
8470template<
typename Derived>
8472TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
8480 return getDerived().RebuildReturnStmt(S->getReturnLoc(),
Result.get());
8483template<
typename Derived>
8485TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
8486 bool DeclChanged =
false;
8488 LambdaScopeInfo *LSI = getSema().getCurLambda();
8489 for (
auto *
D : S->decls()) {
8494 if (Transformed !=
D)
8498 if (
auto *TD = dyn_cast<TypeDecl>(Transformed))
8499 LSI->ContainsUnexpandedParameterPack |=
8502 .getTypeDeclType(TD)
8503 .getSingleStepDesugaredType(getSema().getASTContext())
8504 ->containsUnexpandedParameterPack();
8506 if (
auto *VD = dyn_cast<VarDecl>(Transformed))
8507 LSI->ContainsUnexpandedParameterPack |=
8508 VD->getType()->containsUnexpandedParameterPack();
8511 Decls.push_back(Transformed);
8514 if (!getDerived().AlwaysRebuild() && !DeclChanged)
8517 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
8520template<
typename Derived>
8522TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
8531 bool ExprsChanged =
false;
8534 for (
unsigned I = 0,
E = S->getNumOutputs(); I !=
E; ++I) {
8535 Names.push_back(S->getOutputIdentifier(I));
8538 Constraints.push_back(S->getOutputConstraintLiteral(I));
8541 Expr *OutputExpr = S->getOutputExpr(I);
8546 ExprsChanged |=
Result.get() != OutputExpr;
8548 Exprs.push_back(
Result.get());
8552 for (
unsigned I = 0,
E = S->getNumInputs(); I !=
E; ++I) {
8553 Names.push_back(S->getInputIdentifier(I));
8556 Constraints.push_back(S->getInputConstraintLiteral(I));
8559 Expr *InputExpr = S->getInputExpr(I);
8564 ExprsChanged |=
Result.get() != InputExpr;
8566 Exprs.push_back(
Result.get());
8570 for (
unsigned I = 0,
E = S->getNumLabels(); I !=
E; ++I) {
8571 Names.push_back(S->getLabelIdentifier(I));
8576 ExprsChanged |=
Result.get() != S->getLabelExpr(I);
8577 Exprs.push_back(
Result.get());
8579 if (!getDerived().AlwaysRebuild() && !ExprsChanged)
8583 for (
unsigned I = 0,
E = S->getNumClobbers(); I !=
E; ++I)
8584 Clobbers.push_back(S->getClobberStringLiteral(I));
8587 AsmString = S->getAsmString();
8588 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
8589 S->isVolatile(), S->getNumOutputs(),
8590 S->getNumInputs(), Names.data(),
8591 Constraints, Exprs, AsmString.get(),
8592 Clobbers, S->getNumLabels(),
8596template<
typename Derived>
8598TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
8601 bool HadError =
false, HadChange =
false;
8605 TransformedExprs.reserve(SrcExprs.size());
8606 for (
unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
8608 if (!
Result.isUsable()) {
8611 HadChange |= (
Result.get() != SrcExprs[i]);
8612 TransformedExprs.push_back(
Result.get());
8617 if (!HadChange && !getDerived().AlwaysRebuild())
8620 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
8621 AsmToks, S->getAsmString(),
8622 S->getNumOutputs(), S->getNumInputs(),
8623 S->getAllConstraints(), S->getClobbers(),
8624 TransformedExprs, S->getEndLoc());
8628template<
typename Derived>
8630TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
8632 auto *FD = cast<FunctionDecl>(SemaRef.
CurContext);
8633 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
8634 ScopeInfo->NeedsCoroutineSuspends &&
8635 ScopeInfo->CoroutineSuspends.first ==
nullptr &&
8636 ScopeInfo->CoroutineSuspends.second ==
nullptr &&
8637 "expected clean scope info");
8641 ScopeInfo->setNeedsCoroutineSuspends(
false);
8654 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
8655 ScopeInfo->CoroutinePromise = Promise;
8660 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
8661 if (InitSuspend.isInvalid())
8664 getDerived().TransformStmt(S->getFinalSuspendStmt());
8665 if (FinalSuspend.isInvalid() ||
8668 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
8669 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
8671 StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
8672 if (BodyRes.isInvalid())
8675 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
8676 if (Builder.isInvalid())
8679 Expr *ReturnObject = S->getReturnValueInit();
8680 assert(ReturnObject &&
"the return object is expected to be valid");
8681 ExprResult Res = getDerived().TransformInitializer(ReturnObject,
8683 if (Res.isInvalid())
8685 Builder.ReturnValue = Res.get();
8690 if (S->hasDependentPromiseType()) {
8693 if (!Promise->getType()->isDependentType()) {
8694 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
8695 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
8696 "these nodes should not have been built yet");
8697 if (!Builder.buildDependentStatements())
8701 if (
auto *OnFallthrough = S->getFallthroughHandler()) {
8702 StmtResult Res = getDerived().TransformStmt(OnFallthrough);
8703 if (Res.isInvalid())
8705 Builder.OnFallthrough = Res.get();
8708 if (
auto *OnException = S->getExceptionHandler()) {
8709 StmtResult Res = getDerived().TransformStmt(OnException);
8710 if (Res.isInvalid())
8712 Builder.OnException = Res.get();
8715 if (
auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
8716 StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
8717 if (Res.isInvalid())
8719 Builder.ReturnStmtOnAllocFailure = Res.get();
8723 assert(S->getAllocate() && S->getDeallocate() &&
8724 "allocation and deallocation calls must already be built");
8725 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
8726 if (AllocRes.isInvalid())
8728 Builder.Allocate = AllocRes.get();
8730 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
8731 if (DeallocRes.isInvalid())
8733 Builder.Deallocate = DeallocRes.get();
8735 if (
auto *ResultDecl = S->getResultDecl()) {
8736 StmtResult Res = getDerived().TransformStmt(ResultDecl);
8737 if (Res.isInvalid())
8739 Builder.ResultDecl = Res.get();
8742 if (
auto *ReturnStmt = S->getReturnStmt()) {
8743 StmtResult Res = getDerived().TransformStmt(ReturnStmt);
8744 if (Res.isInvalid())
8746 Builder.ReturnStmt = Res.get();
8750 return getDerived().RebuildCoroutineBodyStmt(Builder);
8753template<
typename Derived>
8755TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
8763 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(),
Result.get(),
8767template <
typename Derived>
8768ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *
E) {
8780 ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr(
8781 getSema().getCurScope(),
E->getKeywordLoc());
8785 return getDerived().RebuildCoawaitExpr(
8787 cast<UnresolvedLookupExpr>(Lookup.get()),
E->isImplicit());
8790template <
typename Derived>
8792TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *
E) {
8793 ExprResult OperandResult = getDerived().TransformInitializer(
E->getOperand(),
8795 if (OperandResult.isInvalid())
8798 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
8799 E->getOperatorCoawaitLookup());
8801 if (LookupResult.isInvalid())
8806 return getDerived().RebuildDependentCoawaitExpr(
8807 E->getKeywordLoc(), OperandResult.get(),
8808 cast<UnresolvedLookupExpr>(LookupResult.get()));
8811template<
typename Derived>
8813TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *
E) {
8821 return getDerived().RebuildCoyieldExpr(
E->getKeywordLoc(),
Result.get());
8826template<
typename Derived>
8828TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
8830 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
8831 if (TryBody.isInvalid())
8835 bool AnyCatchChanged =
false;
8837 for (
unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
8838 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8839 if (Catch.isInvalid())
8841 if (Catch.get() != S->getCatchStmt(I))
8842 AnyCatchChanged =
true;
8843 CatchStmts.push_back(Catch.get());
8848 if (S->getFinallyStmt()) {
8849 Finally = getDerived().TransformStmt(S->getFinallyStmt());
8850 if (Finally.isInvalid())
8855 if (!getDerived().AlwaysRebuild() &&
8856 TryBody.get() == S->getTryBody() &&
8858 Finally.get() == S->getFinallyStmt())
8862 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8863 CatchStmts, Finally.get());
8866template<
typename Derived>
8868TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8870 VarDecl *Var =
nullptr;
8871 if (VarDecl *FromVar = S->getCatchParamDecl()) {
8872 TypeSourceInfo *TSInfo =
nullptr;
8873 if (FromVar->getTypeSourceInfo()) {
8874 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8881 T = TSInfo->getType();
8883 T = getDerived().TransformType(FromVar->getType());
8888 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo,
T);
8893 StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8894 if (Body.isInvalid())
8897 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8902template<
typename Derived>
8904TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8906 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8907 if (Body.isInvalid())
8911 if (!getDerived().AlwaysRebuild() &&
8912 Body.get() == S->getFinallyBody())
8916 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8920template<
typename Derived>
8922TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8924 if (S->getThrowExpr()) {
8925 Operand = getDerived().TransformExpr(S->getThrowExpr());
8930 if (!getDerived().AlwaysRebuild() &&
8931 Operand.get() == S->getThrowExpr())
8934 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(),
Operand.get());
8937template<
typename Derived>
8939TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8940 ObjCAtSynchronizedStmt *S) {
8946 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8952 StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8953 if (Body.isInvalid())
8957 if (!getDerived().AlwaysRebuild() &&
8958 Object.get() == S->getSynchExpr() &&
8959 Body.get() == S->getSynchBody())
8963 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8964 Object.get(), Body.get());
8967template<
typename Derived>
8969TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8970 ObjCAutoreleasePoolStmt *S) {
8972 StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8973 if (Body.isInvalid())
8977 if (!getDerived().AlwaysRebuild() &&
8978 Body.get() == S->getSubStmt())
8982 return getDerived().RebuildObjCAutoreleasePoolStmt(
8983 S->getAtLoc(), Body.get());
8986template<
typename Derived>
8988TreeTransform<Derived>::TransformObjCForCollectionStmt(
8989 ObjCForCollectionStmt *S) {
8992 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8993 if (Element.isInvalid())
8997 ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8998 if (Collection.isInvalid())
9002 StmtResult Body = getDerived().TransformStmt(S->getBody());
9003 if (Body.isInvalid())
9007 if (!getDerived().AlwaysRebuild() &&
9008 Element.get() == S->getElement() &&
9009 Collection.get() == S->getCollection() &&
9010 Body.get() == S->getBody())
9014 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
9021template <
typename Derived>
9022StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
9024 VarDecl *Var =
nullptr;
9025 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
9027 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
9031 Var = getDerived().RebuildExceptionDecl(
9032 ExceptionDecl,
T, ExceptionDecl->getInnerLocStart(),
9033 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
9034 if (!Var || Var->isInvalidDecl())
9039 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
9040 if (Handler.isInvalid())
9043 if (!getDerived().AlwaysRebuild() && !Var &&
9044 Handler.get() == S->getHandlerBlock())
9047 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
9050template <
typename Derived>
9051StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
9053 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
9054 if (TryBlock.isInvalid())
9058 bool HandlerChanged =
false;
9060 for (
unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
9061 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
9062 if (Handler.isInvalid())
9065 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
9066 Handlers.push_back(Handler.getAs<Stmt>());
9069 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
9073 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
9077template<
typename Derived>
9079TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
9080 EnterExpressionEvaluationContext ForRangeInitContext(
9088 auto &LastRecord = getSema().currentEvaluationContext();
9089 LastRecord.InLifetimeExtendingContext =
true;
9090 LastRecord.RebuildDefaultArgOrDefaultInit =
true;
9093 S->getInit() ? getDerived().TransformStmt(S->getInit()) :
StmtResult();
9094 if (
Init.isInvalid())
9103 getSema().ExprEvalContexts.back().ForRangeLifetimeExtendTemps.empty());
9104 auto ForRangeLifetimeExtendTemps =
9105 getSema().ExprEvalContexts.back().ForRangeLifetimeExtendTemps;
9110 StmtResult End = getDerived().TransformStmt(S->getEndStmt());
9111 if (End.isInvalid())
9114 ExprResult Cond = getDerived().TransformExpr(S->getCond());
9115 if (Cond.isInvalid())
9119 if (Cond.isInvalid())
9125 if (
Inc.isInvalid())
9130 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
9131 if (LoopVar.isInvalid())
9135 if (getDerived().AlwaysRebuild() ||
9136 Init.get() != S->getInit() ||
9137 Range.get() != S->getRangeStmt() ||
9138 Begin.get() != S->getBeginStmt() ||
9139 End.get() != S->getEndStmt() ||
9140 Cond.get() != S->getCond() ||
9141 Inc.get() != S->getInc() ||
9142 LoopVar.get() != S->getLoopVarStmt()) {
9143 NewStmt = getDerived().RebuildCXXForRangeStmt(
9144 S->getForLoc(), S->getCoawaitLoc(),
Init.get(), S->getColonLoc(),
9146 LoopVar.get(), S->getRParenLoc(), ForRangeLifetimeExtendTemps);
9147 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
9150 cast<DeclStmt>(LoopVar.get())->getSingleDecl());
9157 SemaOpenACC::LoopInConstructRAII LCR{SemaRef.
OpenACC()};
9160 StmtResult Body = getDerived().TransformStmt(S->getBody());
9161 if (Body.isInvalid())
9168 if (Body.get() != S->getBody() && NewStmt.get() == S) {
9169 NewStmt = getDerived().RebuildCXXForRangeStmt(
9170 S->getForLoc(), S->getCoawaitLoc(),
Init.get(), S->getColonLoc(),
9172 LoopVar.get(), S->getRParenLoc(), ForRangeLifetimeExtendTemps);
9173 if (NewStmt.isInvalid())
9177 if (NewStmt.get() == S)
9180 return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
9183template<
typename Derived>
9185TreeTransform<Derived>::TransformMSDependentExistsStmt(
9186 MSDependentExistsStmt *S) {
9188 NestedNameSpecifierLoc QualifierLoc;
9189 if (S->getQualifierLoc()) {
9191 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
9197 DeclarationNameInfo NameInfo = S->getNameInfo();
9198 if (NameInfo.getName()) {
9199 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9200 if (!NameInfo.getName())
9205 if (!getDerived().AlwaysRebuild() &&
9206 QualifierLoc == S->getQualifierLoc() &&
9207 NameInfo.getName() == S->getNameInfo().getName())
9212 SS.Adopt(QualifierLoc);
9214 switch (getSema().CheckMicrosoftIfExistsSymbol(
nullptr, SS, NameInfo)) {
9216 if (S->isIfExists())
9219 return new (getSema().Context) NullStmt(S->getKeywordLoc());
9222 if (S->isIfNotExists())
9225 return new (getSema().Context) NullStmt(S->getKeywordLoc());
9236 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
9237 if (SubStmt.isInvalid())
9245 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
9252template<
typename Derived>
9254TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *
E) {
9255 NestedNameSpecifierLoc QualifierLoc;
9256 if (
E->getQualifierLoc()) {
9258 = getDerived().TransformNestedNameSpecifierLoc(
E->getQualifierLoc());
9263 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
9264 getDerived().TransformDecl(
E->getMemberLoc(),
E->getPropertyDecl()));
9269 if (
Base.isInvalid())
9273 MSPropertyRefExpr(
Base.get(), PD,
E->isArrow(),
9275 QualifierLoc,
E->getMemberLoc());
9278template <
typename Derived>
9279ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
9280 MSPropertySubscriptExpr *
E) {
9281 auto BaseRes = getDerived().TransformExpr(
E->getBase());
9282 if (BaseRes.isInvalid())
9284 auto IdxRes = getDerived().TransformExpr(
E->getIdx());
9285 if (IdxRes.isInvalid())
9288 if (!getDerived().AlwaysRebuild() &&
9289 BaseRes.get() ==
E->getBase() &&
9290 IdxRes.get() ==
E->getIdx())
9293 return getDerived().RebuildArraySubscriptExpr(
9294 BaseRes.get(), SourceLocation(), IdxRes.get(),
E->getRBracketLoc());
9297template <
typename Derived>
9298StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
9299 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
9300 if (TryBlock.isInvalid())
9303 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
9304 if (Handler.isInvalid())
9307 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
9308 Handler.get() == S->getHandler())
9311 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
9312 TryBlock.get(), Handler.get());
9315template <
typename Derived>
9316StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
9318 if (
Block.isInvalid())
9321 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(),
Block.get());
9324template <
typename Derived>
9325StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
9326 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
9327 if (FilterExpr.isInvalid())
9331 if (
Block.isInvalid())
9334 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
9338template <
typename Derived>
9340 if (isa<SEHFinallyStmt>(Handler))
9341 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
9343 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
9346template<
typename Derived>
9356template <
typename Derived>
9358TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
9362 return getDerived().TransformStmt(L->getLoopStmt());
9365template <
typename Derived>
9372 TClauses.reserve(Clauses.size());
9376 getDerived().getSema().OpenMP().StartOpenMPClause((*I)->getClauseKind());
9377 OMPClause *Clause = getDerived().TransformOMPClause(*I);
9378 getDerived().getSema().OpenMP().EndOpenMPClause();
9380 TClauses.push_back(Clause);
9382 TClauses.push_back(
nullptr);
9386 if (
D->hasAssociatedStmt() &&
D->getAssociatedStmt()) {
9387 getDerived().getSema().OpenMP().ActOnOpenMPRegionStart(
9388 D->getDirectiveKind(),
9394 if (
D->getDirectiveKind() == OMPD_atomic ||
9395 D->getDirectiveKind() == OMPD_critical ||
9396 D->getDirectiveKind() == OMPD_section ||
9397 D->getDirectiveKind() == OMPD_master)
9398 CS =
D->getAssociatedStmt();
9400 CS =
D->getRawStmt();
9401 Body = getDerived().TransformStmt(CS);
9403 getSema().getLangOpts().OpenMPIRBuilder)
9404 Body = getDerived().RebuildOMPCanonicalLoop(Body.
get());
9407 getDerived().getSema().OpenMP().ActOnOpenMPRegionEnd(Body, TClauses);
9412 if (TClauses.size() != Clauses.size()) {
9418 if (
D->getDirectiveKind() == OMPD_critical) {
9419 DirName = cast<OMPCriticalDirective>(
D)->getDirectiveName();
9420 DirName = getDerived().TransformDeclarationNameInfo(DirName);
9423 if (
D->getDirectiveKind() == OMPD_cancellation_point) {
9424 CancelRegion = cast<OMPCancellationPointDirective>(
D)->getCancelRegion();
9425 }
else if (
D->getDirectiveKind() == OMPD_cancel) {
9426 CancelRegion = cast<OMPCancelDirective>(
D)->getCancelRegion();
9429 return getDerived().RebuildOMPExecutableDirective(
9430 D->getDirectiveKind(), DirName, CancelRegion, TClauses,
9439template <
typename Derived>
9446 TClauses.reserve(Clauses.size());
9449 getDerived().getSema().OpenMP().StartOpenMPClause(
C->getClauseKind());
9450 OMPClause *Clause = getDerived().TransformOMPClause(
C);
9451 getDerived().getSema().OpenMP().EndOpenMPClause();
9453 TClauses.push_back(Clause);
9455 TClauses.push_back(
nullptr);
9459 if (
D->hasAssociatedStmt() &&
D->getAssociatedStmt()) {
9460 getDerived().getSema().OpenMP().ActOnOpenMPRegionStart(
9461 D->getDirectiveKind(),
9466 assert(
D->getDirectiveKind() == OMPD_assume &&
9467 "Unexpected informational directive");
9468 Stmt *CS =
D->getAssociatedStmt();
9469 Body = getDerived().TransformStmt(CS);
9472 getDerived().getSema().OpenMP().ActOnOpenMPRegionEnd(Body, TClauses);
9476 if (TClauses.size() != Clauses.size())
9481 return getDerived().RebuildOMPInformationalDirective(
9482 D->getDirectiveKind(), DirName, TClauses, AssociatedStmt.
get(),
9486template <
typename Derived>
9491 << getOpenMPDirectiveName(
D->getDirectiveKind());
9495template <
typename Derived>
9497TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *
D) {
9498 DeclarationNameInfo DirName;
9499 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9501 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9502 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9506template <
typename Derived>
9508TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *
D) {
9509 DeclarationNameInfo DirName;
9510 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9512 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9513 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9517template <
typename Derived>
9519TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *
D) {
9520 DeclarationNameInfo DirName;
9521 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9523 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9524 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9528template <
typename Derived>
9530TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *
D) {
9531 DeclarationNameInfo DirName;
9532 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9534 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9535 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9539template <
typename Derived>
9541TreeTransform<Derived>::TransformOMPReverseDirective(OMPReverseDirective *
D) {
9542 DeclarationNameInfo DirName;
9543 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9545 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9546 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9550template <
typename Derived>
9551StmtResult TreeTransform<Derived>::TransformOMPInterchangeDirective(
9552 OMPInterchangeDirective *
D) {
9553 DeclarationNameInfo DirName;
9554 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9556 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9557 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9561template <
typename Derived>
9563TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *
D) {
9564 DeclarationNameInfo DirName;
9565 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9567 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9568 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9572template <
typename Derived>
9574TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *
D) {
9575 DeclarationNameInfo DirName;
9576 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9578 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9579 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9583template <
typename Derived>
9585TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *
D) {
9586 DeclarationNameInfo DirName;
9587 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9589 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9590 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9594template <
typename Derived>
9596TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *
D) {
9597 DeclarationNameInfo DirName;
9598 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9600 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9601 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9605template <
typename Derived>
9607TreeTransform<Derived>::TransformOMPScopeDirective(OMPScopeDirective *
D) {
9608 DeclarationNameInfo DirName;
9609 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9611 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9612 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9616template <
typename Derived>
9618TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *
D) {
9619 DeclarationNameInfo DirName;
9620 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9622 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9623 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9627template <
typename Derived>
9629TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *
D) {
9630 DeclarationNameInfo DirName;
9631 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9633 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9634 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9638template <
typename Derived>
9640TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *
D) {
9641 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9642 OMPD_critical,
D->getDirectiveName(),
nullptr,
D->
getBeginLoc());
9643 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9644 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9648template <
typename Derived>
9649StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
9650 OMPParallelForDirective *
D) {
9651 DeclarationNameInfo DirName;
9652 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9653 OMPD_parallel_for, DirName,
nullptr,
D->
getBeginLoc());
9654 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9655 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9659template <
typename Derived>
9660StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
9661 OMPParallelForSimdDirective *
D) {
9662 DeclarationNameInfo DirName;
9663 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9664 OMPD_parallel_for_simd, DirName,
nullptr,
D->
getBeginLoc());
9665 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9666 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9670template <
typename Derived>
9671StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
9672 OMPParallelMasterDirective *
D) {
9673 DeclarationNameInfo DirName;
9674 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9675 OMPD_parallel_master, DirName,
nullptr,
D->
getBeginLoc());
9676 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9677 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9681template <
typename Derived>
9682StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective(
9683 OMPParallelMaskedDirective *
D) {
9684 DeclarationNameInfo DirName;
9685 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9686 OMPD_parallel_masked, DirName,
nullptr,
D->
getBeginLoc());
9687 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9688 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9692template <
typename Derived>
9693StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
9694 OMPParallelSectionsDirective *
D) {
9695 DeclarationNameInfo DirName;
9696 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9697 OMPD_parallel_sections, DirName,
nullptr,
D->
getBeginLoc());
9698 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9699 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9703template <
typename Derived>
9705TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *
D) {
9706 DeclarationNameInfo DirName;
9707 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9709 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9710 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9714template <
typename Derived>
9715StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
9716 OMPTaskyieldDirective *
D) {
9717 DeclarationNameInfo DirName;
9718 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9720 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9721 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9725template <
typename Derived>
9727TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *
D) {
9728 DeclarationNameInfo DirName;
9729 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9731 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9732 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9736template <
typename Derived>
9738TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *
D) {
9739 DeclarationNameInfo DirName;
9740 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9742 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9743 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9747template <
typename Derived>
9749TreeTransform<Derived>::TransformOMPAssumeDirective(OMPAssumeDirective *
D) {
9750 DeclarationNameInfo DirName;
9751 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9753 StmtResult Res = getDerived().TransformOMPInformationalDirective(
D);
9754 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9758template <
typename Derived>
9760TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *
D) {
9761 DeclarationNameInfo DirName;
9762 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9764 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9765 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9769template <
typename Derived>
9770StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
9771 OMPTaskgroupDirective *
D) {
9772 DeclarationNameInfo DirName;
9773 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9775 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9776 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9780template <
typename Derived>
9782TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *
D) {
9783 DeclarationNameInfo DirName;
9784 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9786 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9787 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9791template <
typename Derived>
9793TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *
D) {
9794 DeclarationNameInfo DirName;
9795 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9797 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9798 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9802template <
typename Derived>
9804TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *
D) {
9805 DeclarationNameInfo DirName;
9806 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9808 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9809 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9813template <
typename Derived>
9815TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *
D) {
9816 DeclarationNameInfo DirName;
9817 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9819 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9820 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9824template <
typename Derived>
9826TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *
D) {
9827 DeclarationNameInfo DirName;
9828 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9830 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9831 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9835template <
typename Derived>
9837TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *
D) {
9838 DeclarationNameInfo DirName;
9839 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9841 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9842 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9846template <
typename Derived>
9847StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
9848 OMPTargetDataDirective *
D) {
9849 DeclarationNameInfo DirName;
9850 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9852 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9853 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9857template <
typename Derived>
9858StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
9859 OMPTargetEnterDataDirective *
D) {
9860 DeclarationNameInfo DirName;
9861 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9862 OMPD_target_enter_data, DirName,
nullptr,
D->
getBeginLoc());
9863 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9864 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9868template <
typename Derived>
9869StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
9870 OMPTargetExitDataDirective *
D) {
9871 DeclarationNameInfo DirName;
9872 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9873 OMPD_target_exit_data, DirName,
nullptr,
D->
getBeginLoc());
9874 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9875 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9879template <
typename Derived>
9880StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
9881 OMPTargetParallelDirective *
D) {
9882 DeclarationNameInfo DirName;
9883 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9884 OMPD_target_parallel, DirName,
nullptr,
D->
getBeginLoc());
9885 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9886 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9890template <
typename Derived>
9891StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
9892 OMPTargetParallelForDirective *
D) {
9893 DeclarationNameInfo DirName;
9894 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9895 OMPD_target_parallel_for, DirName,
nullptr,
D->
getBeginLoc());
9896 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9897 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9901template <
typename Derived>
9902StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
9903 OMPTargetUpdateDirective *
D) {
9904 DeclarationNameInfo DirName;
9905 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9906 OMPD_target_update, DirName,
nullptr,
D->
getBeginLoc());
9907 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9908 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9912template <
typename Derived>
9914TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *
D) {
9915 DeclarationNameInfo DirName;
9916 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9918 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9919 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9923template <
typename Derived>
9924StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
9925 OMPCancellationPointDirective *
D) {
9926 DeclarationNameInfo DirName;
9927 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9928 OMPD_cancellation_point, DirName,
nullptr,
D->
getBeginLoc());
9929 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9930 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9934template <
typename Derived>
9936TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *
D) {
9937 DeclarationNameInfo DirName;
9938 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9940 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9941 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9945template <
typename Derived>
9947TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *
D) {
9948 DeclarationNameInfo DirName;
9949 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9951 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9952 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9956template <
typename Derived>
9957StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
9958 OMPTaskLoopSimdDirective *
D) {
9959 DeclarationNameInfo DirName;
9960 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9961 OMPD_taskloop_simd, DirName,
nullptr,
D->
getBeginLoc());
9962 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9963 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9967template <
typename Derived>
9968StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
9969 OMPMasterTaskLoopDirective *
D) {
9970 DeclarationNameInfo DirName;
9971 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9972 OMPD_master_taskloop, DirName,
nullptr,
D->
getBeginLoc());
9973 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9974 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9978template <
typename Derived>
9979StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective(
9980 OMPMaskedTaskLoopDirective *
D) {
9981 DeclarationNameInfo DirName;
9982 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9983 OMPD_masked_taskloop, DirName,
nullptr,
D->
getBeginLoc());
9984 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9985 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9989template <
typename Derived>
9990StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
9991 OMPMasterTaskLoopSimdDirective *
D) {
9992 DeclarationNameInfo DirName;
9993 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9994 OMPD_master_taskloop_simd, DirName,
nullptr,
D->
getBeginLoc());
9995 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9996 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10000template <
typename Derived>
10001StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective(
10002 OMPMaskedTaskLoopSimdDirective *
D) {
10003 DeclarationNameInfo DirName;
10004 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10005 OMPD_masked_taskloop_simd, DirName,
nullptr,
D->
getBeginLoc());
10006 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10007 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10011template <
typename Derived>
10012StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
10013 OMPParallelMasterTaskLoopDirective *
D) {
10014 DeclarationNameInfo DirName;
10015 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10016 OMPD_parallel_master_taskloop, DirName,
nullptr,
D->
getBeginLoc());
10017 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10018 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10022template <
typename Derived>
10023StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective(
10024 OMPParallelMaskedTaskLoopDirective *
D) {
10025 DeclarationNameInfo DirName;
10026 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10027 OMPD_parallel_masked_taskloop, DirName,
nullptr,
D->
getBeginLoc());
10028 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10029 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10033template <
typename Derived>
10035TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
10036 OMPParallelMasterTaskLoopSimdDirective *
D) {
10037 DeclarationNameInfo DirName;
10038 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10039 OMPD_parallel_master_taskloop_simd, DirName,
nullptr,
D->
getBeginLoc());
10040 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10041 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10045template <
typename Derived>
10047TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective(
10048 OMPParallelMaskedTaskLoopSimdDirective *
D) {
10049 DeclarationNameInfo DirName;
10050 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10051 OMPD_parallel_masked_taskloop_simd, DirName,
nullptr,
D->
getBeginLoc());
10052 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10053 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10057template <
typename Derived>
10058StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
10059 OMPDistributeDirective *
D) {
10060 DeclarationNameInfo DirName;
10061 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10063 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10064 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10068template <
typename Derived>
10069StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
10070 OMPDistributeParallelForDirective *
D) {
10071 DeclarationNameInfo DirName;
10072 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10073 OMPD_distribute_parallel_for, DirName,
nullptr,
D->
getBeginLoc());
10074 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10075 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10079template <
typename Derived>
10081TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
10082 OMPDistributeParallelForSimdDirective *
D) {
10083 DeclarationNameInfo DirName;
10084 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10085 OMPD_distribute_parallel_for_simd, DirName,
nullptr,
D->
getBeginLoc());
10086 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10087 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10091template <
typename Derived>
10092StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
10093 OMPDistributeSimdDirective *
D) {
10094 DeclarationNameInfo DirName;
10095 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10096 OMPD_distribute_simd, DirName,
nullptr,
D->
getBeginLoc());
10097 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10098 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10102template <
typename Derived>
10103StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
10104 OMPTargetParallelForSimdDirective *
D) {
10105 DeclarationNameInfo DirName;
10106 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10107 OMPD_target_parallel_for_simd, DirName,
nullptr,
D->
getBeginLoc());
10108 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10109 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10113template <
typename Derived>
10114StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
10115 OMPTargetSimdDirective *
D) {
10116 DeclarationNameInfo DirName;
10117 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10118 OMPD_target_simd, DirName,
nullptr,
D->
getBeginLoc());
10119 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10120 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10124template <
typename Derived>
10125StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
10126 OMPTeamsDistributeDirective *
D) {
10127 DeclarationNameInfo DirName;
10128 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10129 OMPD_teams_distribute, DirName,
nullptr,
D->
getBeginLoc());
10130 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10131 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10135template <
typename Derived>
10136StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
10137 OMPTeamsDistributeSimdDirective *
D) {
10138 DeclarationNameInfo DirName;
10139 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10140 OMPD_teams_distribute_simd, DirName,
nullptr,
D->
getBeginLoc());
10141 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10142 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10146template <
typename Derived>
10147StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
10148 OMPTeamsDistributeParallelForSimdDirective *
D) {
10149 DeclarationNameInfo DirName;
10150 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10151 OMPD_teams_distribute_parallel_for_simd, DirName,
nullptr,
10153 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10154 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10158template <
typename Derived>
10159StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
10160 OMPTeamsDistributeParallelForDirective *
D) {
10161 DeclarationNameInfo DirName;
10162 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10163 OMPD_teams_distribute_parallel_for, DirName,
nullptr,
D->
getBeginLoc());
10164 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10165 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10169template <
typename Derived>
10170StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
10171 OMPTargetTeamsDirective *
D) {
10172 DeclarationNameInfo DirName;
10173 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10174 OMPD_target_teams, DirName,
nullptr,
D->
getBeginLoc());
10175 auto Res = getDerived().TransformOMPExecutableDirective(
D);
10176 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10180template <
typename Derived>
10181StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
10182 OMPTargetTeamsDistributeDirective *
D) {
10183 DeclarationNameInfo DirName;
10184 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10185 OMPD_target_teams_distribute, DirName,
nullptr,
D->
getBeginLoc());
10186 auto Res = getDerived().TransformOMPExecutableDirective(
D);
10187 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10191template <
typename Derived>
10193TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
10194 OMPTargetTeamsDistributeParallelForDirective *
D) {
10195 DeclarationNameInfo DirName;
10196 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10197 OMPD_target_teams_distribute_parallel_for, DirName,
nullptr,
10199 auto Res = getDerived().TransformOMPExecutableDirective(
D);
10200 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10204template <
typename Derived>
10206 TransformOMPTargetTeamsDistributeParallelForSimdDirective(
10207 OMPTargetTeamsDistributeParallelForSimdDirective *
D) {
10208 DeclarationNameInfo DirName;
10209 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10210 OMPD_target_teams_distribute_parallel_for_simd, DirName,
nullptr,
10212 auto Res = getDerived().TransformOMPExecutableDirective(
D);
10213 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10217template <
typename Derived>
10219TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
10220 OMPTargetTeamsDistributeSimdDirective *
D) {
10221 DeclarationNameInfo DirName;
10222 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10223 OMPD_target_teams_distribute_simd, DirName,
nullptr,
D->
getBeginLoc());
10224 auto Res = getDerived().TransformOMPExecutableDirective(
D);
10225 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10229template <
typename Derived>
10231TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *
D) {
10232 DeclarationNameInfo DirName;
10233 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10235 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10236 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10240template <
typename Derived>
10242TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *
D) {
10243 DeclarationNameInfo DirName;
10244 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10246 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10247 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10251template <
typename Derived>
10253TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *
D) {
10254 DeclarationNameInfo DirName;
10255 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10257 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10258 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10262template <
typename Derived>
10263StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
10264 OMPGenericLoopDirective *
D) {
10265 DeclarationNameInfo DirName;
10266 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10268 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10269 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10273template <
typename Derived>
10274StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective(
10275 OMPTeamsGenericLoopDirective *
D) {
10276 DeclarationNameInfo DirName;
10277 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10279 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10280 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10284template <
typename Derived>
10285StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective(
10286 OMPTargetTeamsGenericLoopDirective *
D) {
10287 DeclarationNameInfo DirName;
10288 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10289 OMPD_target_teams_loop, DirName,
nullptr,
D->
getBeginLoc());
10290 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10291 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10295template <
typename Derived>
10296StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective(
10297 OMPParallelGenericLoopDirective *
D) {
10298 DeclarationNameInfo DirName;
10299 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10300 OMPD_parallel_loop, DirName,
nullptr,
D->
getBeginLoc());
10301 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10302 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10306template <
typename Derived>
10308TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective(
10309 OMPTargetParallelGenericLoopDirective *
D) {
10310 DeclarationNameInfo DirName;
10311 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10312 OMPD_target_parallel_loop, DirName,
nullptr,
D->
getBeginLoc());
10313 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10314 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10321template <
typename Derived>
10322OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *
C) {
10323 ExprResult Cond = getDerived().TransformExpr(
C->getCondition());
10324 if (Cond.isInvalid())
10326 return getDerived().RebuildOMPIfClause(
10327 C->getNameModifier(), Cond.get(),
C->getBeginLoc(),
C->getLParenLoc(),
10328 C->getNameModifierLoc(),
C->getColonLoc(),
C->getEndLoc());
10331template <
typename Derived>
10332OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *
C) {
10333 ExprResult Cond = getDerived().TransformExpr(
C->getCondition());
10334 if (Cond.isInvalid())
10336 return getDerived().RebuildOMPFinalClause(Cond.get(),
C->getBeginLoc(),
10337 C->getLParenLoc(),
C->getEndLoc());
10340template <
typename Derived>
10342TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *
C) {
10343 ExprResult NumThreads = getDerived().TransformExpr(
C->getNumThreads());
10344 if (NumThreads.isInvalid())
10346 return getDerived().RebuildOMPNumThreadsClause(
10347 NumThreads.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10350template <
typename Derived>
10352TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *
C) {
10353 ExprResult E = getDerived().TransformExpr(
C->getSafelen());
10356 return getDerived().RebuildOMPSafelenClause(
10357 E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10360template <
typename Derived>
10362TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *
C) {
10363 ExprResult E = getDerived().TransformExpr(
C->getAllocator());
10366 return getDerived().RebuildOMPAllocatorClause(
10367 E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10370template <
typename Derived>
10372TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *
C) {
10373 ExprResult E = getDerived().TransformExpr(
C->getSimdlen());
10376 return getDerived().RebuildOMPSimdlenClause(
10377 E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10380template <
typename Derived>
10381OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *
C) {
10383 TransformedSizes.reserve(
C->getNumSizes());
10385 for (Expr *
E :
C->getSizesRefs()) {
10387 TransformedSizes.push_back(
nullptr);
10396 TransformedSizes.push_back(
T.get());
10399 if (!Changed && !getDerived().AlwaysRebuild())
10401 return RebuildOMPSizesClause(TransformedSizes,
C->getBeginLoc(),
10402 C->getLParenLoc(),
C->getEndLoc());
10405template <
typename Derived>
10407TreeTransform<Derived>::TransformOMPPermutationClause(OMPPermutationClause *
C) {
10409 TransformedArgs.reserve(
C->getNumLoops());
10411 for (Expr *
E :
C->getArgsRefs()) {
10413 TransformedArgs.push_back(
nullptr);
10422 TransformedArgs.push_back(
T.get());
10425 if (!Changed && !getDerived().AlwaysRebuild())
10427 return RebuildOMPPermutationClause(TransformedArgs,
C->getBeginLoc(),
10428 C->getLParenLoc(),
C->getEndLoc());
10431template <
typename Derived>
10432OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *
C) {
10433 if (!getDerived().AlwaysRebuild())
10435 return RebuildOMPFullClause(
C->getBeginLoc(),
C->getEndLoc());
10438template <
typename Derived>
10440TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *
C) {
10441 ExprResult T = getDerived().TransformExpr(
C->getFactor());
10444 Expr *Factor =
T.get();
10445 bool Changed = Factor !=
C->getFactor();
10447 if (!Changed && !getDerived().AlwaysRebuild())
10449 return RebuildOMPPartialClause(Factor,
C->getBeginLoc(),
C->getLParenLoc(),
10453template <
typename Derived>
10455TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *
C) {
10456 ExprResult E = getDerived().TransformExpr(
C->getNumForLoops());
10459 return getDerived().RebuildOMPCollapseClause(
10460 E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10463template <
typename Derived>
10465TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *
C) {
10466 return getDerived().RebuildOMPDefaultClause(
10467 C->getDefaultKind(),
C->getDefaultKindKwLoc(),
C->getBeginLoc(),
10468 C->getLParenLoc(),
C->getEndLoc());
10471template <
typename Derived>
10473TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *
C) {
10474 return getDerived().RebuildOMPProcBindClause(
10475 C->getProcBindKind(),
C->getProcBindKindKwLoc(),
C->getBeginLoc(),
10476 C->getLParenLoc(),
C->getEndLoc());
10479template <
typename Derived>
10481TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *
C) {
10482 ExprResult E = getDerived().TransformExpr(
C->getChunkSize());
10485 return getDerived().RebuildOMPScheduleClause(
10486 C->getFirstScheduleModifier(),
C->getSecondScheduleModifier(),
10487 C->getScheduleKind(),
E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
10488 C->getFirstScheduleModifierLoc(),
C->getSecondScheduleModifierLoc(),
10489 C->getScheduleKindLoc(),
C->getCommaLoc(),
C->getEndLoc());
10492template <
typename Derived>
10494TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *
C) {
10496 if (
auto *
Num =
C->getNumForLoops()) {
10497 E = getDerived().TransformExpr(
Num);
10501 return getDerived().RebuildOMPOrderedClause(
C->getBeginLoc(),
C->getEndLoc(),
10502 C->getLParenLoc(),
E.get());
10505template <
typename Derived>
10507TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *
C) {
10509 if (Expr *Evt =
C->getEventHandler()) {
10510 E = getDerived().TransformExpr(Evt);
10514 return getDerived().RebuildOMPDetachClause(
E.get(),
C->getBeginLoc(),
10515 C->getLParenLoc(),
C->getEndLoc());
10518template <
typename Derived>
10520TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *
C) {
10525template <
typename Derived>
10527TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *
C) {
10532template <
typename Derived>
10534TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *
C) {
10539template <
typename Derived>
10540OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *
C) {
10545template <
typename Derived>
10546OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *
C) {
10551template <
typename Derived>
10553TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *
C) {
10558template <
typename Derived>
10560TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *
C) {
10565template <
typename Derived>
10567TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *
C) {
10572template <
typename Derived>
10573OMPClause *TreeTransform<Derived>::TransformOMPFailClause(OMPFailClause *
C) {
10578template <
typename Derived>
10580TreeTransform<Derived>::TransformOMPAbsentClause(OMPAbsentClause *
C) {
10584template <
typename Derived>
10585OMPClause *TreeTransform<Derived>::TransformOMPHoldsClause(OMPHoldsClause *
C) {
10586 ExprResult E = getDerived().TransformExpr(
C->getExpr());
10589 return getDerived().RebuildOMPHoldsClause(
E.get(),
C->getBeginLoc(),
10590 C->getLParenLoc(),
C->getEndLoc());
10593template <
typename Derived>
10595TreeTransform<Derived>::TransformOMPContainsClause(OMPContainsClause *
C) {
10599template <
typename Derived>
10601TreeTransform<Derived>::TransformOMPNoOpenMPClause(OMPNoOpenMPClause *
C) {
10604template <
typename Derived>
10605OMPClause *TreeTransform<Derived>::TransformOMPNoOpenMPRoutinesClause(
10606 OMPNoOpenMPRoutinesClause *
C) {
10609template <
typename Derived>
10610OMPClause *TreeTransform<Derived>::TransformOMPNoParallelismClause(
10611 OMPNoParallelismClause *
C) {
10615template <
typename Derived>
10617TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *
C) {
10622template <
typename Derived>
10624TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *
C) {
10629template <
typename Derived>
10631TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *
C) {
10636template <
typename Derived>
10638TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *
C) {
10643template <
typename Derived>
10645TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *
C) {
10650template <
typename Derived>
10651OMPClause *TreeTransform<Derived>::TransformOMPWeakClause(OMPWeakClause *
C) {
10656template <
typename Derived>
10658TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *
C) {
10663template <
typename Derived>
10664OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *
C) {
10669template <
typename Derived>
10671TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *
C) {
10676template <
typename Derived>
10677OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *
C) {
10678 ExprResult IVR = getDerived().TransformExpr(
C->getInteropVar());
10679 if (IVR.isInvalid())
10682 OMPInteropInfo InteropInfo(
C->getIsTarget(),
C->getIsTargetSync());
10683 InteropInfo.PreferTypes.reserve(
C->varlist_size() - 1);
10684 for (Expr *
E : llvm::drop_begin(
C->varlist())) {
10685 ExprResult ER = getDerived().TransformExpr(cast<Expr>(
E));
10686 if (ER.isInvalid())
10688 InteropInfo.PreferTypes.push_back(ER.get());
10690 return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo,
10691 C->getBeginLoc(),
C->getLParenLoc(),
10692 C->getVarLoc(),
C->getEndLoc());
10695template <
typename Derived>
10696OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *
C) {
10697 ExprResult ER = getDerived().TransformExpr(
C->getInteropVar());
10698 if (ER.isInvalid())
10700 return getDerived().RebuildOMPUseClause(ER.get(),
C->getBeginLoc(),
10701 C->getLParenLoc(),
C->getVarLoc(),
10705template <
typename Derived>
10707TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *
C) {
10709 if (Expr *IV =
C->getInteropVar()) {
10710 ER = getDerived().TransformExpr(IV);
10711 if (ER.isInvalid())
10714 return getDerived().RebuildOMPDestroyClause(ER.get(),
C->getBeginLoc(),
10715 C->getLParenLoc(),
C->getVarLoc(),
10719template <
typename Derived>
10721TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *
C) {
10722 ExprResult Cond = getDerived().TransformExpr(
C->getCondition());
10723 if (Cond.isInvalid())
10725 return getDerived().RebuildOMPNovariantsClause(
10726 Cond.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10729template <
typename Derived>
10731TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *
C) {
10732 ExprResult Cond = getDerived().TransformExpr(
C->getCondition());
10733 if (Cond.isInvalid())
10735 return getDerived().RebuildOMPNocontextClause(
10736 Cond.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10739template <
typename Derived>
10741TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *
C) {
10742 ExprResult ThreadID = getDerived().TransformExpr(
C->getThreadID());
10743 if (ThreadID.isInvalid())
10745 return getDerived().RebuildOMPFilterClause(ThreadID.get(),
C->getBeginLoc(),
10746 C->getLParenLoc(),
C->getEndLoc());
10749template <
typename Derived>
10750OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *
C) {
10751 ExprResult E = getDerived().TransformExpr(
C->getAlignment());
10754 return getDerived().RebuildOMPAlignClause(
E.get(),
C->getBeginLoc(),
10755 C->getLParenLoc(),
C->getEndLoc());
10758template <
typename Derived>
10759OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
10760 OMPUnifiedAddressClause *
C) {
10761 llvm_unreachable(
"unified_address clause cannot appear in dependent context");
10764template <
typename Derived>
10765OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
10766 OMPUnifiedSharedMemoryClause *
C) {
10768 "unified_shared_memory clause cannot appear in dependent context");
10771template <
typename Derived>
10772OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
10773 OMPReverseOffloadClause *
C) {
10774 llvm_unreachable(
"reverse_offload clause cannot appear in dependent context");
10777template <
typename Derived>
10778OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
10779 OMPDynamicAllocatorsClause *
C) {
10781 "dynamic_allocators clause cannot appear in dependent context");
10784template <
typename Derived>
10785OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
10786 OMPAtomicDefaultMemOrderClause *
C) {
10788 "atomic_default_mem_order clause cannot appear in dependent context");
10791template <
typename Derived>
10792OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *
C) {
10793 return getDerived().RebuildOMPAtClause(
C->getAtKind(),
C->getAtKindKwLoc(),
10794 C->getBeginLoc(),
C->getLParenLoc(),
10798template <
typename Derived>
10800TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *
C) {
10801 return getDerived().RebuildOMPSeverityClause(
10802 C->getSeverityKind(),
C->getSeverityKindKwLoc(),
C->getBeginLoc(),
10803 C->getLParenLoc(),
C->getEndLoc());
10806template <
typename Derived>
10808TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *
C) {
10809 ExprResult E = getDerived().TransformExpr(
C->getMessageString());
10812 return getDerived().RebuildOMPMessageClause(
10813 C->getMessageString(),
C->getBeginLoc(),
C->getLParenLoc(),
10817template <
typename Derived>
10819TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *
C) {
10821 Vars.reserve(
C->varlist_size());
10822 for (
auto *VE :
C->varlist()) {
10823 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10824 if (EVar.isInvalid())
10826 Vars.push_back(EVar.get());
10828 return getDerived().RebuildOMPPrivateClause(
10829 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10832template <
typename Derived>
10833OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
10834 OMPFirstprivateClause *
C) {
10836 Vars.reserve(
C->varlist_size());
10837 for (
auto *VE :
C->varlist()) {
10838 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10839 if (EVar.isInvalid())
10841 Vars.push_back(EVar.get());
10843 return getDerived().RebuildOMPFirstprivateClause(
10844 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10847template <
typename Derived>
10849TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *
C) {
10851 Vars.reserve(
C->varlist_size());
10852 for (
auto *VE :
C->varlist()) {
10853 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10854 if (EVar.isInvalid())
10856 Vars.push_back(EVar.get());
10858 return getDerived().RebuildOMPLastprivateClause(
10859 Vars,
C->getKind(),
C->getKindLoc(),
C->getColonLoc(),
C->getBeginLoc(),
10860 C->getLParenLoc(),
C->getEndLoc());
10863template <
typename Derived>
10865TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *
C) {
10867 Vars.reserve(
C->varlist_size());
10868 for (
auto *VE :
C->varlist()) {
10869 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10870 if (EVar.isInvalid())
10872 Vars.push_back(EVar.get());
10874 return getDerived().RebuildOMPSharedClause(Vars,
C->getBeginLoc(),
10875 C->getLParenLoc(),
C->getEndLoc());
10878template <
typename Derived>
10880TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *
C) {
10882 Vars.reserve(
C->varlist_size());
10883 for (
auto *VE :
C->varlist()) {
10884 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10885 if (EVar.isInvalid())
10887 Vars.push_back(EVar.get());
10889 CXXScopeSpec ReductionIdScopeSpec;
10890 ReductionIdScopeSpec.Adopt(
C->getQualifierLoc());
10892 DeclarationNameInfo NameInfo =
C->getNameInfo();
10893 if (NameInfo.getName()) {
10894 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10895 if (!NameInfo.getName())
10901 for (
auto *
E :
C->reduction_ops()) {
10904 auto *ULE = cast<UnresolvedLookupExpr>(
E);
10905 UnresolvedSet<8> Decls;
10906 for (
auto *
D : ULE->decls()) {
10908 cast<NamedDecl>(getDerived().TransformDecl(
E->
getExprLoc(),
D));
10909 Decls.addDecl(InstD, InstD->getAccess());
10913 ReductionIdScopeSpec.getWithLocInContext(SemaRef.
Context), NameInfo,
10914 true, Decls.begin(), Decls.end(),
10917 UnresolvedReductions.push_back(
nullptr);
10919 return getDerived().RebuildOMPReductionClause(
10920 Vars,
C->getModifier(),
C->getBeginLoc(),
C->getLParenLoc(),
10921 C->getModifierLoc(),
C->getColonLoc(),
C->getEndLoc(),
10922 ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10925template <
typename Derived>
10926OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
10927 OMPTaskReductionClause *
C) {
10929 Vars.reserve(
C->varlist_size());
10930 for (
auto *VE :
C->varlist()) {
10931 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10932 if (EVar.isInvalid())
10934 Vars.push_back(EVar.get());
10936 CXXScopeSpec ReductionIdScopeSpec;
10937 ReductionIdScopeSpec.Adopt(
C->getQualifierLoc());
10939 DeclarationNameInfo NameInfo =
C->getNameInfo();
10940 if (NameInfo.getName()) {
10941 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10942 if (!NameInfo.getName())
10948 for (
auto *
E :
C->reduction_ops()) {
10951 auto *ULE = cast<UnresolvedLookupExpr>(
E);
10952 UnresolvedSet<8> Decls;
10953 for (
auto *
D : ULE->decls()) {
10955 cast<NamedDecl>(getDerived().TransformDecl(
E->
getExprLoc(),
D));
10956 Decls.addDecl(InstD, InstD->getAccess());
10960 ReductionIdScopeSpec.getWithLocInContext(SemaRef.
Context), NameInfo,
10961 true, Decls.begin(), Decls.end(),
10964 UnresolvedReductions.push_back(
nullptr);
10966 return getDerived().RebuildOMPTaskReductionClause(
10967 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getColonLoc(),
10968 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10971template <
typename Derived>
10973TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *
C) {
10975 Vars.reserve(
C->varlist_size());
10976 for (
auto *VE :
C->varlist()) {
10977 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10978 if (EVar.isInvalid())
10980 Vars.push_back(EVar.get());
10982 CXXScopeSpec ReductionIdScopeSpec;
10983 ReductionIdScopeSpec.Adopt(
C->getQualifierLoc());
10985 DeclarationNameInfo NameInfo =
C->getNameInfo();
10986 if (NameInfo.getName()) {
10987 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10988 if (!NameInfo.getName())
10994 for (
auto *
E :
C->reduction_ops()) {
10997 auto *ULE = cast<UnresolvedLookupExpr>(
E);
10998 UnresolvedSet<8> Decls;
10999 for (
auto *
D : ULE->decls()) {
11001 cast<NamedDecl>(getDerived().TransformDecl(
E->
getExprLoc(),
D));
11002 Decls.addDecl(InstD, InstD->getAccess());
11006 ReductionIdScopeSpec.getWithLocInContext(SemaRef.
Context), NameInfo,
11007 true, Decls.begin(), Decls.end(),
11010 UnresolvedReductions.push_back(
nullptr);
11012 return getDerived().RebuildOMPInReductionClause(
11013 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getColonLoc(),
11014 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
11017template <
typename Derived>
11019TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *
C) {
11021 Vars.reserve(
C->varlist_size());
11022 for (
auto *VE :
C->varlist()) {
11023 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11024 if (EVar.isInvalid())
11026 Vars.push_back(EVar.get());
11028 ExprResult Step = getDerived().TransformExpr(
C->getStep());
11029 if (Step.isInvalid())
11031 return getDerived().RebuildOMPLinearClause(
11032 Vars, Step.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getModifier(),
11033 C->getModifierLoc(),
C->getColonLoc(),
C->getStepModifierLoc(),
11037template <
typename Derived>
11039TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *
C) {
11041 Vars.reserve(
C->varlist_size());
11042 for (
auto *VE :
C->varlist()) {
11043 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11044 if (EVar.isInvalid())
11046 Vars.push_back(EVar.get());
11048 ExprResult Alignment = getDerived().TransformExpr(
C->getAlignment());
11049 if (Alignment.isInvalid())
11051 return getDerived().RebuildOMPAlignedClause(
11052 Vars, Alignment.get(),
C->getBeginLoc(),
C->getLParenLoc(),
11053 C->getColonLoc(),
C->getEndLoc());
11056template <
typename Derived>
11058TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *
C) {
11060 Vars.reserve(
C->varlist_size());
11061 for (
auto *VE :
C->varlist()) {
11062 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11063 if (EVar.isInvalid())
11065 Vars.push_back(EVar.get());
11067 return getDerived().RebuildOMPCopyinClause(Vars,
C->getBeginLoc(),
11068 C->getLParenLoc(),
C->getEndLoc());
11071template <
typename Derived>
11073TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *
C) {
11075 Vars.reserve(
C->varlist_size());
11076 for (
auto *VE :
C->varlist()) {
11077 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11078 if (EVar.isInvalid())
11080 Vars.push_back(EVar.get());
11082 return getDerived().RebuildOMPCopyprivateClause(
11083 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11086template <
typename Derived>
11087OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *
C) {
11089 Vars.reserve(
C->varlist_size());
11090 for (
auto *VE :
C->varlist()) {
11091 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11092 if (EVar.isInvalid())
11094 Vars.push_back(EVar.get());
11096 return getDerived().RebuildOMPFlushClause(Vars,
C->getBeginLoc(),
11097 C->getLParenLoc(),
C->getEndLoc());
11100template <
typename Derived>
11102TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *
C) {
11103 ExprResult E = getDerived().TransformExpr(
C->getDepobj());
11106 return getDerived().RebuildOMPDepobjClause(
E.get(),
C->getBeginLoc(),
11107 C->getLParenLoc(),
C->getEndLoc());
11110template <
typename Derived>
11112TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *
C) {
11114 Expr *DepModifier =
C->getModifier();
11116 ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
11117 if (DepModRes.isInvalid())
11119 DepModifier = DepModRes.
get();
11121 Vars.reserve(
C->varlist_size());
11122 for (
auto *VE :
C->varlist()) {
11123 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11124 if (EVar.isInvalid())
11126 Vars.push_back(EVar.get());
11128 return getDerived().RebuildOMPDependClause(
11129 {
C->getDependencyKind(),
C->getDependencyLoc(),
C->getColonLoc(),
11130 C->getOmpAllMemoryLoc()},
11131 DepModifier, Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11134template <
typename Derived>
11136TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *
C) {
11137 ExprResult E = getDerived().TransformExpr(
C->getDevice());
11140 return getDerived().RebuildOMPDeviceClause(
11141 C->getModifier(),
E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
11142 C->getModifierLoc(),
C->getEndLoc());
11145template <
typename Derived,
class T>
11152 Vars.reserve(
C->varlist_size());
11153 for (
auto *VE :
C->varlist()) {
11157 Vars.push_back(EVar.
get());
11161 if (
C->getMapperQualifierLoc()) {
11162 QualifierLoc = TT.
getDerived().TransformNestedNameSpecifierLoc(
11163 C->getMapperQualifierLoc());
11167 MapperIdScopeSpec.
Adopt(QualifierLoc);
11168 MapperIdInfo =
C->getMapperIdInfo();
11169 if (MapperIdInfo.
getName()) {
11170 MapperIdInfo = TT.
getDerived().TransformDeclarationNameInfo(MapperIdInfo);
11176 for (
auto *
E :
C->mapperlists()) {
11179 auto *ULE = cast<UnresolvedLookupExpr>(
E);
11181 for (
auto *
D : ULE->decls()) {
11189 MapperIdInfo,
true, Decls.
begin(), Decls.
end(),
11192 UnresolvedMappers.push_back(
nullptr);
11198template <
typename Derived>
11199OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *
C) {
11200 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11202 Expr *IteratorModifier =
C->getIteratorModifier();
11203 if (IteratorModifier) {
11204 ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier);
11205 if (MapModRes.isInvalid())
11207 IteratorModifier = MapModRes.
get();
11209 CXXScopeSpec MapperIdScopeSpec;
11210 DeclarationNameInfo MapperIdInfo;
11212 if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
11213 *
this,
C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
11215 return getDerived().RebuildOMPMapClause(
11216 IteratorModifier,
C->getMapTypeModifiers(),
C->getMapTypeModifiersLoc(),
11217 MapperIdScopeSpec, MapperIdInfo,
C->getMapType(),
C->isImplicitMapType(),
11218 C->getMapLoc(),
C->getColonLoc(), Vars, Locs, UnresolvedMappers);
11221template <
typename Derived>
11223TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *
C) {
11224 Expr *Allocator =
C->getAllocator();
11226 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
11227 if (AllocatorRes.isInvalid())
11229 Allocator = AllocatorRes.get();
11231 Expr *Alignment =
C->getAlignment();
11233 ExprResult AlignmentRes = getDerived().TransformExpr(Alignment);
11234 if (AlignmentRes.isInvalid())
11236 Alignment = AlignmentRes.
get();
11239 Vars.reserve(
C->varlist_size());
11240 for (
auto *VE :
C->varlist()) {
11241 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11242 if (EVar.isInvalid())
11244 Vars.push_back(EVar.get());
11246 return getDerived().RebuildOMPAllocateClause(
11247 Allocator, Alignment,
C->getFirstAllocateModifier(),
11248 C->getFirstAllocateModifierLoc(),
C->getSecondAllocateModifier(),
11249 C->getSecondAllocateModifierLoc(), Vars,
C->getBeginLoc(),
11250 C->getLParenLoc(),
C->getColonLoc(),
C->getEndLoc());
11253template <
typename Derived>
11255TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *
C) {
11257 Vars.reserve(
C->varlist_size());
11258 for (
auto *VE :
C->varlist()) {
11259 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11260 if (EVar.isInvalid())
11262 Vars.push_back(EVar.get());
11264 return getDerived().RebuildOMPNumTeamsClause(
11265 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11268template <
typename Derived>
11270TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *
C) {
11272 Vars.reserve(
C->varlist_size());
11273 for (
auto *VE :
C->varlist()) {
11274 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11275 if (EVar.isInvalid())
11277 Vars.push_back(EVar.get());
11279 return getDerived().RebuildOMPThreadLimitClause(
11280 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11283template <
typename Derived>
11285TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *
C) {
11286 ExprResult E = getDerived().TransformExpr(
C->getPriority());
11289 return getDerived().RebuildOMPPriorityClause(
11290 E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11293template <
typename Derived>
11295TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *
C) {
11296 ExprResult E = getDerived().TransformExpr(
C->getGrainsize());
11299 return getDerived().RebuildOMPGrainsizeClause(
11300 C->getModifier(),
E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
11301 C->getModifierLoc(),
C->getEndLoc());
11304template <
typename Derived>
11306TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *
C) {
11307 ExprResult E = getDerived().TransformExpr(
C->getNumTasks());
11310 return getDerived().RebuildOMPNumTasksClause(
11311 C->getModifier(),
E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
11312 C->getModifierLoc(),
C->getEndLoc());
11315template <
typename Derived>
11316OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *
C) {
11317 ExprResult E = getDerived().TransformExpr(
C->getHint());
11320 return getDerived().RebuildOMPHintClause(
E.get(),
C->getBeginLoc(),
11321 C->getLParenLoc(),
C->getEndLoc());
11324template <
typename Derived>
11325OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
11326 OMPDistScheduleClause *
C) {
11327 ExprResult E = getDerived().TransformExpr(
C->getChunkSize());
11330 return getDerived().RebuildOMPDistScheduleClause(
11331 C->getDistScheduleKind(),
E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
11332 C->getDistScheduleKindLoc(),
C->getCommaLoc(),
C->getEndLoc());
11335template <
typename Derived>
11337TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *
C) {
11340 return getDerived().RebuildOMPDefaultmapClause(
C->getDefaultmapModifier(),
11341 C->getDefaultmapKind(),
11344 C->getDefaultmapModifierLoc(),
11345 C->getDefaultmapKindLoc(),
11349template <
typename Derived>
11350OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *
C) {
11351 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11353 CXXScopeSpec MapperIdScopeSpec;
11354 DeclarationNameInfo MapperIdInfo;
11356 if (transformOMPMappableExprListClause<Derived, OMPToClause>(
11357 *
this,
C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
11359 return getDerived().RebuildOMPToClause(
11360 C->getMotionModifiers(),
C->getMotionModifiersLoc(), MapperIdScopeSpec,
11361 MapperIdInfo,
C->getColonLoc(), Vars, Locs, UnresolvedMappers);
11364template <
typename Derived>
11365OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *
C) {
11366 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11368 CXXScopeSpec MapperIdScopeSpec;
11369 DeclarationNameInfo MapperIdInfo;
11371 if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
11372 *
this,
C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
11374 return getDerived().RebuildOMPFromClause(
11375 C->getMotionModifiers(),
C->getMotionModifiersLoc(), MapperIdScopeSpec,
11376 MapperIdInfo,
C->getColonLoc(), Vars, Locs, UnresolvedMappers);
11379template <
typename Derived>
11380OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
11381 OMPUseDevicePtrClause *
C) {
11383 Vars.reserve(
C->varlist_size());
11384 for (
auto *VE :
C->varlist()) {
11385 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11386 if (EVar.isInvalid())
11388 Vars.push_back(EVar.get());
11390 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11391 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
11394template <
typename Derived>
11395OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
11396 OMPUseDeviceAddrClause *
C) {
11398 Vars.reserve(
C->varlist_size());
11399 for (
auto *VE :
C->varlist()) {
11400 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11401 if (EVar.isInvalid())
11403 Vars.push_back(EVar.get());
11405 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11406 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
11409template <
typename Derived>
11411TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
11413 Vars.reserve(
C->varlist_size());
11414 for (
auto *VE :
C->varlist()) {
11415 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11416 if (EVar.isInvalid())
11418 Vars.push_back(EVar.get());
11420 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11421 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
11424template <
typename Derived>
11425OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause(
11426 OMPHasDeviceAddrClause *
C) {
11428 Vars.reserve(
C->varlist_size());
11429 for (
auto *VE :
C->varlist()) {
11430 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11431 if (EVar.isInvalid())
11433 Vars.push_back(EVar.get());
11435 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11436 return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs);
11439template <
typename Derived>
11441TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *
C) {
11443 Vars.reserve(
C->varlist_size());
11444 for (
auto *VE :
C->varlist()) {
11445 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11446 if (EVar.isInvalid())
11448 Vars.push_back(EVar.get());
11450 return getDerived().RebuildOMPNontemporalClause(
11451 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11454template <
typename Derived>
11456TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *
C) {
11458 Vars.reserve(
C->varlist_size());
11459 for (
auto *VE :
C->varlist()) {
11460 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11461 if (EVar.isInvalid())
11463 Vars.push_back(EVar.get());
11465 return getDerived().RebuildOMPInclusiveClause(
11466 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11469template <
typename Derived>
11471TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *
C) {
11473 Vars.reserve(
C->varlist_size());
11474 for (
auto *VE :
C->varlist()) {
11475 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11476 if (EVar.isInvalid())
11478 Vars.push_back(EVar.get());
11480 return getDerived().RebuildOMPExclusiveClause(
11481 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11484template <
typename Derived>
11485OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
11486 OMPUsesAllocatorsClause *
C) {
11488 Data.reserve(
C->getNumberOfAllocators());
11489 for (
unsigned I = 0,
E =
C->getNumberOfAllocators(); I <
E; ++I) {
11490 OMPUsesAllocatorsClause::Data
D =
C->getAllocatorData(I);
11491 ExprResult Allocator = getDerived().TransformExpr(
D.Allocator);
11492 if (Allocator.isInvalid())
11495 if (Expr *AT =
D.AllocatorTraits) {
11496 AllocatorTraits = getDerived().TransformExpr(AT);
11497 if (AllocatorTraits.isInvalid())
11500 SemaOpenMP::UsesAllocatorsData &NewD =
Data.emplace_back();
11501 NewD.Allocator = Allocator.get();
11502 NewD.AllocatorTraits = AllocatorTraits.get();
11503 NewD.LParenLoc =
D.LParenLoc;
11504 NewD.RParenLoc =
D.RParenLoc;
11506 return getDerived().RebuildOMPUsesAllocatorsClause(
11507 Data,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11510template <
typename Derived>
11512TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *
C) {
11514 Locators.reserve(
C->varlist_size());
11516 if (Expr *Modifier =
C->getModifier()) {
11517 ModifierRes = getDerived().TransformExpr(Modifier);
11518 if (ModifierRes.isInvalid())
11521 for (Expr *
E :
C->varlist()) {
11522 ExprResult Locator = getDerived().TransformExpr(
E);
11523 if (Locator.isInvalid())
11525 Locators.push_back(Locator.get());
11527 return getDerived().RebuildOMPAffinityClause(
11528 C->getBeginLoc(),
C->getLParenLoc(),
C->getColonLoc(),
C->getEndLoc(),
11529 ModifierRes.get(), Locators);
11532template <
typename Derived>
11533OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *
C) {
11534 return getDerived().RebuildOMPOrderClause(
11535 C->getKind(),
C->getKindKwLoc(),
C->getBeginLoc(),
C->getLParenLoc(),
11536 C->getEndLoc(),
C->getModifier(),
C->getModifierKwLoc());
11539template <
typename Derived>
11540OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *
C) {
11541 return getDerived().RebuildOMPBindClause(
11542 C->getBindKind(),
C->getBindKindLoc(),
C->getBeginLoc(),
11543 C->getLParenLoc(),
C->getEndLoc());
11546template <
typename Derived>
11547OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause(
11548 OMPXDynCGroupMemClause *
C) {
11550 if (
Size.isInvalid())
11552 return getDerived().RebuildOMPXDynCGroupMemClause(
11553 Size.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11556template <
typename Derived>
11558TreeTransform<Derived>::TransformOMPDoacrossClause(OMPDoacrossClause *
C) {
11560 Vars.reserve(
C->varlist_size());
11561 for (
auto *VE :
C->varlist()) {
11562 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11563 if (EVar.isInvalid())
11565 Vars.push_back(EVar.get());
11567 return getDerived().RebuildOMPDoacrossClause(
11568 C->getDependenceType(),
C->getDependenceLoc(),
C->getColonLoc(), Vars,
11569 C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11572template <
typename Derived>
11574TreeTransform<Derived>::TransformOMPXAttributeClause(OMPXAttributeClause *
C) {
11576 for (
auto *A :
C->getAttrs())
11577 NewAttrs.push_back(getDerived().TransformAttr(A));
11578 return getDerived().RebuildOMPXAttributeClause(
11579 NewAttrs,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11582template <
typename Derived>
11583OMPClause *TreeTransform<Derived>::TransformOMPXBareClause(OMPXBareClause *
C) {
11584 return getDerived().RebuildOMPXBareClause(
C->getBeginLoc(),
C->getEndLoc());
11591template <
typename Derived>
11592class OpenACCClauseTransform final
11593 :
public OpenACCClauseVisitor<OpenACCClauseTransform<Derived>> {
11594 TreeTransform<Derived> &Self;
11596 SemaOpenACC::OpenACCParsedClause &ParsedClause;
11597 OpenACCClause *NewClause =
nullptr;
11601 for (Expr *CurVar : VarList) {
11602 ExprResult Res = Self.TransformExpr(CurVar);
11604 if (!Res.isUsable())
11607 Res = Self.getSema().OpenACC().ActOnVar(ParsedClause.getClauseKind(),
11610 if (Res.isUsable())
11611 InstantiatedVarList.push_back(Res.get());
11614 return InstantiatedVarList;
11618 OpenACCClauseTransform(TreeTransform<Derived> &Self,
11620 SemaOpenACC::OpenACCParsedClause &PC)
11621 : Self(Self), ExistingClauses(ExistingClauses), ParsedClause(PC) {}
11623 OpenACCClause *CreatedClause()
const {
return NewClause; }
11625#define VISIT_CLAUSE(CLAUSE_NAME) \
11626 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
11627#include "clang/Basic/OpenACCClauses.def"
11630template <
typename Derived>
11631void OpenACCClauseTransform<Derived>::VisitDefaultClause(
11632 const OpenACCDefaultClause &
C) {
11641template <
typename Derived>
11642void OpenACCClauseTransform<Derived>::VisitIfClause(
const OpenACCIfClause &
C) {
11643 Expr *Cond =
const_cast<Expr *
>(
C.getConditionExpr());
11644 assert(Cond &&
"If constructed with invalid Condition");
11645 Sema::ConditionResult Res =
Self.TransformCondition(
11648 if (Res.isInvalid() || !Res.get().second)
11659template <
typename Derived>
11660void OpenACCClauseTransform<Derived>::VisitSelfClause(
11661 const OpenACCSelfClause &
C) {
11666 for (Expr *CurVar :
C.getVarList()) {
11669 if (!Res.isUsable())
11675 if (Res.isUsable())
11676 InstantiatedVarList.push_back(Res.get());
11688 if (
C.hasConditionExpr()) {
11689 Expr *Cond =
const_cast<Expr *
>(
C.getConditionExpr());
11690 Sema::ConditionResult Res =
11691 Self.TransformCondition(Cond->getExprLoc(),
nullptr, Cond,
11694 if (Res.isInvalid() || !Res.get().second)
11707template <
typename Derived>
11708void OpenACCClauseTransform<Derived>::VisitNumGangsClause(
11709 const OpenACCNumGangsClause &
C) {
11712 for (Expr *CurIntExpr :
C.getIntExprs()) {
11715 if (!Res.isUsable())
11720 C.getBeginLoc(), Res.get());
11721 if (!Res.isUsable())
11724 InstantiatedIntExprs.push_back(Res.get());
11734template <
typename Derived>
11735void OpenACCClauseTransform<Derived>::VisitPrivateClause(
11736 const OpenACCPrivateClause &
C) {
11746template <
typename Derived>
11747void OpenACCClauseTransform<Derived>::VisitHostClause(
11748 const OpenACCHostClause &
C) {
11758template <
typename Derived>
11759void OpenACCClauseTransform<Derived>::VisitDeviceClause(
11760 const OpenACCDeviceClause &
C) {
11770template <
typename Derived>
11771void OpenACCClauseTransform<Derived>::VisitFirstPrivateClause(
11772 const OpenACCFirstPrivateClause &
C) {
11782template <
typename Derived>
11783void OpenACCClauseTransform<Derived>::VisitNoCreateClause(
11784 const OpenACCNoCreateClause &
C) {
11794template <
typename Derived>
11795void OpenACCClauseTransform<Derived>::VisitPresentClause(
11796 const OpenACCPresentClause &
C) {
11806template <
typename Derived>
11807void OpenACCClauseTransform<Derived>::VisitCopyClause(
11808 const OpenACCCopyClause &
C) {
11818template <
typename Derived>
11819void OpenACCClauseTransform<Derived>::VisitCopyInClause(
11820 const OpenACCCopyInClause &
C) {
11831template <
typename Derived>
11832void OpenACCClauseTransform<Derived>::VisitCopyOutClause(
11833 const OpenACCCopyOutClause &
C) {
11835 false,
C.isZero());
11844template <
typename Derived>
11845void OpenACCClauseTransform<Derived>::VisitCreateClause(
11846 const OpenACCCreateClause &
C) {
11848 false,
C.isZero());
11856template <
typename Derived>
11857void OpenACCClauseTransform<Derived>::VisitAttachClause(
11858 const OpenACCAttachClause &
C) {
11862 VarList.erase(std::remove_if(VarList.begin(), VarList.end(), [&](Expr *
E) {
11863 return Self.getSema().OpenACC().CheckVarIsPointerType(
11864 OpenACCClauseKind::Attach, E);
11865 }), VarList.end());
11875template <
typename Derived>
11876void OpenACCClauseTransform<Derived>::VisitDetachClause(
11877 const OpenACCDetachClause &
C) {
11882 std::remove_if(VarList.begin(), VarList.end(),
11884 return Self.getSema().OpenACC().CheckVarIsPointerType(
11885 OpenACCClauseKind::Detach, E);
11897template <
typename Derived>
11898void OpenACCClauseTransform<Derived>::VisitDeleteClause(
11899 const OpenACCDeleteClause &
C) {
11908template <
typename Derived>
11909void OpenACCClauseTransform<Derived>::VisitUseDeviceClause(
11910 const OpenACCUseDeviceClause &
C) {
11919template <
typename Derived>
11920void OpenACCClauseTransform<Derived>::VisitDevicePtrClause(
11921 const OpenACCDevicePtrClause &
C) {
11925 VarList.erase(std::remove_if(VarList.begin(), VarList.end(), [&](Expr *
E) {
11926 return Self.getSema().OpenACC().CheckVarIsPointerType(
11927 OpenACCClauseKind::DevicePtr, E);
11928 }), VarList.end());
11938template <
typename Derived>
11939void OpenACCClauseTransform<Derived>::VisitNumWorkersClause(
11940 const OpenACCNumWorkersClause &
C) {
11941 Expr *IntExpr =
const_cast<Expr *
>(
C.getIntExpr());
11942 assert(IntExpr &&
"num_workers clause constructed with invalid int expr");
11945 if (!Res.isUsable())
11950 C.getBeginLoc(), Res.get());
11951 if (!Res.isUsable())
11961template <
typename Derived>
11962void OpenACCClauseTransform<Derived>::VisitDeviceNumClause (
11963 const OpenACCDeviceNumClause &
C) {
11964 Expr *IntExpr =
const_cast<Expr *
>(
C.getIntExpr());
11965 assert(IntExpr &&
"device_num clause constructed with invalid int expr");
11968 if (!Res.isUsable())
11973 C.getBeginLoc(), Res.get());
11974 if (!Res.isUsable())
11984template <
typename Derived>
11985void OpenACCClauseTransform<Derived>::VisitDefaultAsyncClause(
11986 const OpenACCDefaultAsyncClause &
C) {
11987 Expr *IntExpr =
const_cast<Expr *
>(
C.getIntExpr());
11988 assert(IntExpr &&
"default_async clause constructed with invalid int expr");
11991 if (!Res.isUsable())
11996 C.getBeginLoc(), Res.get());
11997 if (!Res.isUsable())
12007template <
typename Derived>
12008void OpenACCClauseTransform<Derived>::VisitVectorLengthClause(
12009 const OpenACCVectorLengthClause &
C) {
12010 Expr *IntExpr =
const_cast<Expr *
>(
C.getIntExpr());
12011 assert(IntExpr &&
"vector_length clause constructed with invalid int expr");
12014 if (!Res.isUsable())
12019 C.getBeginLoc(), Res.get());
12020 if (!Res.isUsable())
12030template <
typename Derived>
12031void OpenACCClauseTransform<Derived>::VisitAsyncClause(
12032 const OpenACCAsyncClause &
C) {
12033 if (
C.hasIntExpr()) {
12034 ExprResult Res =
Self.TransformExpr(
const_cast<Expr *
>(
C.getIntExpr()));
12035 if (!Res.isUsable())
12040 C.getBeginLoc(), Res.get());
12041 if (!Res.isUsable())
12054template <
typename Derived>
12055void OpenACCClauseTransform<Derived>::VisitWorkerClause(
12056 const OpenACCWorkerClause &
C) {
12057 if (
C.hasIntExpr()) {
12061 ExprResult Res =
Self.TransformExpr(
const_cast<Expr *
>(
C.getIntExpr()));
12062 if (!Res.isUsable())
12067 C.getBeginLoc(), Res.get());
12068 if (!Res.isUsable())
12081template <
typename Derived>
12082void OpenACCClauseTransform<Derived>::VisitVectorClause(
12083 const OpenACCVectorClause &
C) {
12084 if (
C.hasIntExpr()) {
12088 ExprResult Res =
Self.TransformExpr(
const_cast<Expr *
>(
C.getIntExpr()));
12089 if (!Res.isUsable())
12094 C.getBeginLoc(), Res.get());
12095 if (!Res.isUsable())
12108template <
typename Derived>
12109void OpenACCClauseTransform<Derived>::VisitWaitClause(
12110 const OpenACCWaitClause &
C) {
12111 if (!
C.getLParenLoc().isInvalid()) {
12112 Expr *DevNumExpr =
nullptr;
12116 if (
C.getDevNumExpr()) {
12118 if (!Res.isUsable())
12122 C.getBeginLoc(), Res.get());
12123 if (!Res.isUsable())
12126 DevNumExpr = Res.get();
12130 for (Expr *CurQueueIdExpr :
C.getQueueIdExprs()) {
12132 if (!Res.isUsable())
12136 C.getBeginLoc(), Res.get());
12137 if (!Res.isUsable())
12140 InstantiatedQueueIdExprs.push_back(Res.get());
12144 std::move(InstantiatedQueueIdExprs));
12154template <
typename Derived>
12155void OpenACCClauseTransform<Derived>::VisitDeviceTypeClause(
12156 const OpenACCDeviceTypeClause &
C) {
12159 Self.getSema().getASTContext(),
C.getClauseKind(),
12161 C.getArchitectures(), ParsedClause.
getEndLoc());
12164template <
typename Derived>
12165void OpenACCClauseTransform<Derived>::VisitAutoClause(
12166 const OpenACCAutoClause &
C) {
12173template <
typename Derived>
12174void OpenACCClauseTransform<Derived>::VisitIndependentClause(
12175 const OpenACCIndependentClause &
C) {
12181template <
typename Derived>
12182void OpenACCClauseTransform<Derived>::VisitSeqClause(
12183 const OpenACCSeqClause &
C) {
12188template <
typename Derived>
12189void OpenACCClauseTransform<Derived>::VisitFinalizeClause(
12190 const OpenACCFinalizeClause &
C) {
12196template <
typename Derived>
12197void OpenACCClauseTransform<Derived>::VisitIfPresentClause(
12198 const OpenACCIfPresentClause &
C) {
12204template <
typename Derived>
12205void OpenACCClauseTransform<Derived>::VisitReductionClause(
12206 const OpenACCReductionClause &
C) {
12210 for (Expr *Var : TransformedVars) {
12213 if (Res.isUsable())
12214 ValidVars.push_back(Res.get());
12217 NewClause =
Self.getSema().OpenACC().CheckReductionClause(
12220 C.getReductionOp(), ValidVars, ParsedClause.
getEndLoc());
12223template <
typename Derived>
12224void OpenACCClauseTransform<Derived>::VisitCollapseClause(
12225 const OpenACCCollapseClause &
C) {
12226 Expr *LoopCount =
const_cast<Expr *
>(
C.getLoopCount());
12227 assert(LoopCount &&
"collapse clause constructed with invalid loop count");
12231 NewLoopCount =
Self.getSema().OpenACC().ActOnIntExpr(
12233 NewLoopCount.get()->getBeginLoc(), NewLoopCount.get());
12236 Self.getSema().OpenACC().CheckCollapseLoopCount(NewLoopCount.get());
12238 if (!NewLoopCount.isUsable())
12248template <
typename Derived>
12249void OpenACCClauseTransform<Derived>::VisitTileClause(
12250 const OpenACCTileClause &
C) {
12254 for (Expr *
E :
C.getSizeExprs()) {
12257 if (!NewSizeExpr.isUsable())
12260 NewSizeExpr =
Self.getSema().OpenACC().ActOnIntExpr(
12262 NewSizeExpr.get()->getBeginLoc(), NewSizeExpr.get());
12264 NewSizeExpr =
Self.getSema().OpenACC().CheckTileSizeExpr(NewSizeExpr.get());
12266 if (!NewSizeExpr.isUsable())
12268 TransformedExprs.push_back(NewSizeExpr.get());
12277template <
typename Derived>
12278void OpenACCClauseTransform<Derived>::VisitGangClause(
12279 const OpenACCGangClause &
C) {
12283 for (
unsigned I = 0; I <
C.getNumExprs(); ++I) {
12284 ExprResult ER =
Self.TransformExpr(
const_cast<Expr *
>(
C.getExpr(I).second));
12285 if (!ER.isUsable())
12288 ER =
Self.getSema().OpenACC().CheckGangExpr(ExistingClauses,
12290 C.getExpr(I).first, ER.get());
12291 if (!ER.isUsable())
12293 TransformedGangKinds.push_back(
C.getExpr(I).first);
12294 TransformedIntExprs.push_back(ER.get());
12297 NewClause =
Self.getSema().OpenACC().CheckGangClause(
12300 TransformedGangKinds, TransformedIntExprs, ParsedClause.
getEndLoc());
12303template <
typename Derived>
12304OpenACCClause *TreeTransform<Derived>::TransformOpenACCClause(
12308 SemaOpenACC::OpenACCParsedClause ParsedClause(
12309 DirKind, OldClause->getClauseKind(), OldClause->getBeginLoc());
12310 ParsedClause.
setEndLoc(OldClause->getEndLoc());
12312 if (
const auto *WithParms = dyn_cast<OpenACCClauseWithParams>(OldClause))
12315 OpenACCClauseTransform<Derived> Transform{*
this, ExistingClauses,
12317 Transform.Visit(OldClause);
12319 return Transform.CreatedClause();
12322template <
typename Derived>
12324TreeTransform<Derived>::TransformOpenACCClauseList(
12327 for (
const auto *Clause : OldClauses) {
12328 if (OpenACCClause *TransformedClause = getDerived().TransformOpenACCClause(
12329 TransformedClauses, DirKind, Clause))
12330 TransformedClauses.push_back(TransformedClause);
12332 return TransformedClauses;
12335template <
typename Derived>
12336StmtResult TreeTransform<Derived>::TransformOpenACCComputeConstruct(
12337 OpenACCComputeConstruct *
C) {
12338 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12341 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12344 if (getSema().OpenACC().ActOnStartStmtDirective(
12345 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12349 SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12350 getSema().OpenACC(),
C->getDirectiveKind(),
C->getDirectiveLoc(),
12351 C->clauses(), TransformedClauses);
12352 StmtResult StrBlock = getDerived().TransformStmt(
C->getStructuredBlock());
12353 StrBlock = getSema().OpenACC().ActOnAssociatedStmt(
12354 C->getBeginLoc(),
C->getDirectiveKind(), TransformedClauses, StrBlock);
12356 return getDerived().RebuildOpenACCComputeConstruct(
12357 C->getDirectiveKind(),
C->getBeginLoc(),
C->getDirectiveLoc(),
12358 C->getEndLoc(), TransformedClauses, StrBlock);
12361template <
typename Derived>
12363TreeTransform<Derived>::TransformOpenACCLoopConstruct(OpenACCLoopConstruct *
C) {
12365 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12368 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12371 if (getSema().OpenACC().ActOnStartStmtDirective(
12372 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12376 SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12377 getSema().OpenACC(),
C->getDirectiveKind(),
C->getDirectiveLoc(),
12378 C->clauses(), TransformedClauses);
12380 Loop = getSema().OpenACC().ActOnAssociatedStmt(
12381 C->getBeginLoc(),
C->getDirectiveKind(), TransformedClauses,
Loop);
12383 return getDerived().RebuildOpenACCLoopConstruct(
12384 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12385 TransformedClauses,
Loop);
12388template <
typename Derived>
12389StmtResult TreeTransform<Derived>::TransformOpenACCCombinedConstruct(
12390 OpenACCCombinedConstruct *
C) {
12391 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12394 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12397 if (getSema().OpenACC().ActOnStartStmtDirective(
12398 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12402 SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12403 getSema().OpenACC(),
C->getDirectiveKind(),
C->getDirectiveLoc(),
12404 C->clauses(), TransformedClauses);
12406 Loop = getSema().OpenACC().ActOnAssociatedStmt(
12407 C->getBeginLoc(),
C->getDirectiveKind(), TransformedClauses,
Loop);
12409 return getDerived().RebuildOpenACCCombinedConstruct(
12410 C->getDirectiveKind(),
C->getBeginLoc(),
C->getDirectiveLoc(),
12411 C->getEndLoc(), TransformedClauses,
Loop);
12414template <
typename Derived>
12416TreeTransform<Derived>::TransformOpenACCDataConstruct(OpenACCDataConstruct *
C) {
12417 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12420 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12422 if (getSema().OpenACC().ActOnStartStmtDirective(
12423 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12426 SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12427 getSema().OpenACC(),
C->getDirectiveKind(),
C->getDirectiveLoc(),
12428 C->clauses(), TransformedClauses);
12429 StmtResult StrBlock = getDerived().TransformStmt(
C->getStructuredBlock());
12430 StrBlock = getSema().OpenACC().ActOnAssociatedStmt(
12431 C->getBeginLoc(),
C->getDirectiveKind(), TransformedClauses, StrBlock);
12433 return getDerived().RebuildOpenACCDataConstruct(
12434 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12435 TransformedClauses, StrBlock);
12438template <
typename Derived>
12439StmtResult TreeTransform<Derived>::TransformOpenACCEnterDataConstruct(
12440 OpenACCEnterDataConstruct *
C) {
12441 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12444 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12446 if (getSema().OpenACC().ActOnStartStmtDirective(
12447 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12450 return getDerived().RebuildOpenACCEnterDataConstruct(
12451 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12452 TransformedClauses);
12455template <
typename Derived>
12456StmtResult TreeTransform<Derived>::TransformOpenACCExitDataConstruct(
12457 OpenACCExitDataConstruct *
C) {
12458 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12461 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12463 if (getSema().OpenACC().ActOnStartStmtDirective(
12464 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12467 return getDerived().RebuildOpenACCExitDataConstruct(
12468 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12469 TransformedClauses);
12472template <
typename Derived>
12473StmtResult TreeTransform<Derived>::TransformOpenACCHostDataConstruct(
12474 OpenACCHostDataConstruct *
C) {
12475 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12478 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12480 if (getSema().OpenACC().ActOnStartStmtDirective(
12481 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12484 SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12485 getSema().OpenACC(),
C->getDirectiveKind(),
C->getDirectiveLoc(),
12486 C->clauses(), TransformedClauses);
12487 StmtResult StrBlock = getDerived().TransformStmt(
C->getStructuredBlock());
12488 StrBlock = getSema().OpenACC().ActOnAssociatedStmt(
12489 C->getBeginLoc(),
C->getDirectiveKind(), TransformedClauses, StrBlock);
12491 return getDerived().RebuildOpenACCHostDataConstruct(
12492 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12493 TransformedClauses, StrBlock);
12496template <
typename Derived>
12498TreeTransform<Derived>::TransformOpenACCInitConstruct(OpenACCInitConstruct *
C) {
12499 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12502 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12504 if (getSema().OpenACC().ActOnStartStmtDirective(
12505 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12508 return getDerived().RebuildOpenACCInitConstruct(
12509 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12510 TransformedClauses);
12513template <
typename Derived>
12514StmtResult TreeTransform<Derived>::TransformOpenACCShutdownConstruct(
12515 OpenACCShutdownConstruct *
C) {
12516 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12519 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12521 if (getSema().OpenACC().ActOnStartStmtDirective(
12522 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12525 return getDerived().RebuildOpenACCShutdownConstruct(
12526 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12527 TransformedClauses);
12529template <
typename Derived>
12531TreeTransform<Derived>::TransformOpenACCSetConstruct(OpenACCSetConstruct *
C) {
12532 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12535 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12537 if (getSema().OpenACC().ActOnStartStmtDirective(
12538 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12541 return getDerived().RebuildOpenACCSetConstruct(
12542 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12543 TransformedClauses);
12546template <
typename Derived>
12547StmtResult TreeTransform<Derived>::TransformOpenACCUpdateConstruct(
12548 OpenACCUpdateConstruct *
C) {
12549 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12552 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12554 if (getSema().OpenACC().ActOnStartStmtDirective(
12555 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12558 return getDerived().RebuildOpenACCUpdateConstruct(
12559 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12560 TransformedClauses);
12563template <
typename Derived>
12565TreeTransform<Derived>::TransformOpenACCWaitConstruct(OpenACCWaitConstruct *
C) {
12566 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12569 if (
C->hasDevNumExpr()) {
12570 DevNumExpr = getDerived().TransformExpr(
C->getDevNumExpr());
12572 if (DevNumExpr.isUsable())
12573 DevNumExpr = getSema().OpenACC().ActOnIntExpr(
12575 C->getBeginLoc(), DevNumExpr.get());
12580 for (Expr *QE :
C->getQueueIdExprs()) {
12581 assert(QE &&
"Null queue id expr?");
12582 ExprResult NewEQ = getDerived().TransformExpr(QE);
12584 if (!NewEQ.isUsable())
12588 C->getBeginLoc(), NewEQ.get());
12589 if (NewEQ.isUsable())
12590 QueueIdExprs.push_back(NewEQ.get());
12594 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12597 if (getSema().OpenACC().ActOnStartStmtDirective(
12598 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12601 return getDerived().RebuildOpenACCWaitConstruct(
12602 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getLParenLoc(),
12603 DevNumExpr.isUsable() ? DevNumExpr.get() :
nullptr,
C->getQueuesLoc(),
12604 QueueIdExprs,
C->getRParenLoc(),
C->getEndLoc(), TransformedClauses);
12607template <
typename Derived>
12608ExprResult TreeTransform<Derived>::TransformOpenACCAsteriskSizeExpr(
12609 OpenACCAsteriskSizeExpr *
E) {
12610 if (getDerived().AlwaysRebuild())
12611 return getDerived().RebuildOpenACCAsteriskSizeExpr(
E->getLocation());
12619template<
typename Derived>
12621TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *
E) {
12622 return TransformExpr(
E->getSubExpr());
12625template <
typename Derived>
12626ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
12627 SYCLUniqueStableNameExpr *
E) {
12631 TypeSourceInfo *NewT = getDerived().TransformType(
E->getTypeSourceInfo());
12636 if (!getDerived().AlwaysRebuild() &&
E->getTypeSourceInfo() == NewT)
12639 return getDerived().RebuildSYCLUniqueStableNameExpr(
12640 E->getLocation(),
E->getLParenLocation(),
E->getRParenLocation(), NewT);
12643template<
typename Derived>
12645TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *
E) {
12649 return getDerived().RebuildPredefinedExpr(
E->getLocation(),
12650 E->getIdentKind());
12653template<
typename Derived>
12655TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *
E) {
12656 NestedNameSpecifierLoc QualifierLoc;
12657 if (
E->getQualifierLoc()) {
12659 = getDerived().TransformNestedNameSpecifierLoc(
E->getQualifierLoc());
12665 = cast_or_null<ValueDecl>(getDerived().TransformDecl(
E->getLocation(),
12670 NamedDecl *
Found = ND;
12671 if (
E->getFoundDecl() !=
E->getDecl()) {
12672 Found = cast_or_null<NamedDecl>(
12673 getDerived().TransformDecl(
E->getLocation(),
E->getFoundDecl()));
12678 DeclarationNameInfo NameInfo =
E->getNameInfo();
12679 if (NameInfo.getName()) {
12680 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
12681 if (!NameInfo.getName())
12685 if (!getDerived().AlwaysRebuild() &&
12686 !
E->isCapturedByCopyInLambdaWithExplicitObjectParameter() &&
12687 QualifierLoc ==
E->getQualifierLoc() && ND ==
E->getDecl() &&
12688 Found ==
E->getFoundDecl() &&
12689 NameInfo.getName() ==
E->getDecl()->getDeclName() &&
12690 !
E->hasExplicitTemplateArgs()) {
12699 TemplateArgumentListInfo TransArgs, *TemplateArgs =
nullptr;
12700 if (
E->hasExplicitTemplateArgs()) {
12701 TemplateArgs = &TransArgs;
12702 TransArgs.setLAngleLoc(
E->getLAngleLoc());
12703 TransArgs.setRAngleLoc(
E->getRAngleLoc());
12704 if (getDerived().TransformTemplateArguments(
E->getTemplateArgs(),
12705 E->getNumTemplateArgs(),
12710 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
12711 Found, TemplateArgs);
12714template<
typename Derived>
12716TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *
E) {
12720template <
typename Derived>
12721ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
12722 FixedPointLiteral *
E) {
12726template<
typename Derived>
12728TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *
E) {
12732template<
typename Derived>
12734TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *
E) {
12738template<
typename Derived>
12740TreeTransform<Derived>::TransformStringLiteral(StringLiteral *
E) {
12744template<
typename Derived>
12746TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *
E) {
12750template<
typename Derived>
12752TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *
E) {
12753 return getDerived().TransformCallExpr(
E);
12756template<
typename Derived>
12758TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *
E) {
12760 TypeSourceInfo *ControllingType =
nullptr;
12761 if (
E->isExprPredicate())
12762 ControllingExpr = getDerived().TransformExpr(
E->getControllingExpr());
12764 ControllingType = getDerived().TransformType(
E->getControllingType());
12766 if (ControllingExpr.isInvalid() && !ControllingType)
12772 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
12774 TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
12777 AssocTypes.push_back(AssocType);
12779 AssocTypes.push_back(
nullptr);
12783 getDerived().TransformExpr(Assoc.getAssociationExpr());
12784 if (AssocExpr.isInvalid())
12786 AssocExprs.push_back(AssocExpr.get());
12789 if (!ControllingType)
12790 return getDerived().RebuildGenericSelectionExpr(
E->getGenericLoc(),
12791 E->getDefaultLoc(),
12793 ControllingExpr.get(),
12796 return getDerived().RebuildGenericSelectionExpr(
12797 E->getGenericLoc(),
E->getDefaultLoc(),
E->getRParenLoc(),
12798 ControllingType, AssocTypes, AssocExprs);
12801template<
typename Derived>
12803TreeTransform<Derived>::TransformParenExpr(ParenExpr *
E) {
12804 ExprResult SubExpr = getDerived().TransformExpr(
E->getSubExpr());
12805 if (SubExpr.isInvalid())
12808 if (!getDerived().AlwaysRebuild() && SubExpr.get() ==
E->getSubExpr())
12811 return getDerived().RebuildParenExpr(SubExpr.get(),
E->getLParen(),
12818template<
typename Derived>
12822 return getDerived().TransformDependentScopeDeclRefExpr(
12823 DRE,
true,
nullptr);
12825 return getDerived().TransformUnresolvedLookupExpr(
12828 return getDerived().TransformExpr(
E);
12831template<
typename Derived>
12835 if (
E->getOpcode() == UO_AddrOf)
12836 SubExpr = TransformAddressOfOperand(
E->getSubExpr());
12838 SubExpr = TransformExpr(
E->getSubExpr());
12842 if (!getDerived().AlwaysRebuild() && SubExpr.
get() ==
E->getSubExpr())
12845 return getDerived().RebuildUnaryOperator(
E->getOperatorLoc(),
12850template<
typename Derived>
12852TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *
E) {
12854 TypeSourceInfo *
Type = getDerived().TransformType(
E->getTypeSourceInfo());
12864 bool ExprChanged =
false;
12865 typedef Sema::OffsetOfComponent Component;
12867 for (
unsigned I = 0, N =
E->getNumComponents(); I != N; ++I) {
12868 const OffsetOfNode &ON =
E->getComponent(I);
12870 Comp.isBrackets =
true;
12871 Comp.LocStart = ON.getSourceRange().getBegin();
12872 Comp.LocEnd = ON.getSourceRange().getEnd();
12873 switch (ON.getKind()) {
12875 Expr *FromIndex =
E->getIndexExpr(ON.getArrayExprIndex());
12876 ExprResult Index = getDerived().TransformExpr(FromIndex);
12877 if (Index.isInvalid())
12880 ExprChanged = ExprChanged || Index.get() != FromIndex;
12881 Comp.isBrackets =
true;
12882 Comp.U.E = Index.get();
12888 Comp.isBrackets =
false;
12889 Comp.U.IdentInfo = ON.getFieldName();
12890 if (!
Comp.U.IdentInfo)
12900 Components.push_back(Comp);
12904 if (!getDerived().AlwaysRebuild() &&
12905 Type ==
E->getTypeSourceInfo() &&
12910 return getDerived().RebuildOffsetOfExpr(
E->getOperatorLoc(), Type,
12911 Components,
E->getRParenLoc());
12914template<
typename Derived>
12916TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *
E) {
12917 assert((!
E->getSourceExpr() || getDerived().AlreadyTransformed(
E->
getType())) &&
12918 "opaque value expression requires transformation");
12922template<
typename Derived>
12924TreeTransform<Derived>::TransformTypoExpr(TypoExpr *
E) {
12928template <
typename Derived>
12929ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *
E) {
12932 for (Expr *
C :
E->subExpressions()) {
12934 if (NewC.isInvalid())
12936 Children.push_back(NewC.get());
12940 if (!getDerived().AlwaysRebuild() && !Changed)
12946template<
typename Derived>
12948TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *
E) {
12956 ExprResult result = getDerived().TransformExpr(newSyntacticForm);
12957 if (result.isInvalid())
return ExprError();
12962 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
12968template<
typename Derived>
12970TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
12971 UnaryExprOrTypeTraitExpr *
E) {
12972 if (
E->isArgumentType()) {
12973 TypeSourceInfo *OldT =
E->getArgumentTypeInfo();
12975 TypeSourceInfo *NewT = getDerived().TransformType(OldT);
12979 if (!getDerived().AlwaysRebuild() && OldT == NewT)
12982 return getDerived().RebuildUnaryExprOrTypeTrait(NewT,
E->getOperatorLoc(),
12996 TypeSourceInfo *RecoveryTSI =
nullptr;
12998 auto *PE = dyn_cast<ParenExpr>(
E->getArgumentExpr());
13000 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) :
nullptr)
13001 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
13002 PE, DRE,
false, &RecoveryTSI);
13004 SubExpr = getDerived().TransformExpr(
E->getArgumentExpr());
13007 return getDerived().RebuildUnaryExprOrTypeTrait(
13009 }
else if (SubExpr.isInvalid())
13012 if (!getDerived().AlwaysRebuild() && SubExpr.get() ==
E->getArgumentExpr())
13015 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
13016 E->getOperatorLoc(),
13021template<
typename Derived>
13023TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *
E) {
13024 ExprResult LHS = getDerived().TransformExpr(
E->getLHS());
13025 if (LHS.isInvalid())
13028 ExprResult RHS = getDerived().TransformExpr(
E->getRHS());
13029 if (RHS.isInvalid())
13033 if (!getDerived().AlwaysRebuild() &&
13034 LHS.get() ==
E->getLHS() &&
13035 RHS.get() ==
E->getRHS())
13038 return getDerived().RebuildArraySubscriptExpr(
13040 E->getLHS()->
getBeginLoc(), RHS.get(),
E->getRBracketLoc());
13043template <
typename Derived>
13045TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *
E) {
13047 if (
Base.isInvalid())
13050 ExprResult RowIdx = getDerived().TransformExpr(
E->getRowIdx());
13051 if (RowIdx.isInvalid())
13054 ExprResult ColumnIdx = getDerived().TransformExpr(
E->getColumnIdx());
13055 if (ColumnIdx.isInvalid())
13058 if (!getDerived().AlwaysRebuild() &&
Base.get() ==
E->getBase() &&
13059 RowIdx.get() ==
E->getRowIdx() && ColumnIdx.get() ==
E->getColumnIdx())
13062 return getDerived().RebuildMatrixSubscriptExpr(
13063 Base.get(), RowIdx.get(), ColumnIdx.get(),
E->getRBracketLoc());
13066template <
typename Derived>
13068TreeTransform<Derived>::TransformArraySectionExpr(ArraySectionExpr *
E) {
13070 if (
Base.isInvalid())
13074 if (
E->getLowerBound()) {
13075 LowerBound = getDerived().TransformExpr(
E->getLowerBound());
13076 if (LowerBound.isInvalid())
13081 if (
E->getLength()) {
13082 Length = getDerived().TransformExpr(
E->getLength());
13083 if (Length.isInvalid())
13088 if (
E->isOMPArraySection()) {
13089 if (Expr *Str =
E->getStride()) {
13090 Stride = getDerived().TransformExpr(Str);
13091 if (Stride.isInvalid())
13096 if (!getDerived().AlwaysRebuild() &&
Base.get() ==
E->getBase() &&
13097 LowerBound.get() ==
E->getLowerBound() &&
13098 Length.get() ==
E->getLength() &&
13099 (
E->isOpenACCArraySection() || Stride.get() ==
E->getStride()))
13102 return getDerived().RebuildArraySectionExpr(
13104 LowerBound.get(),
E->getColonLocFirst(),
13105 E->isOMPArraySection() ?
E->getColonLocSecond() : SourceLocation{},
13106 Length.get(), Stride.get(),
E->getRBracketLoc());
13109template <
typename Derived>
13111TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *
E) {
13113 if (
Base.isInvalid())
13117 bool ErrorFound =
false;
13118 for (Expr *
Dim :
E->getDimensions()) {
13120 if (DimRes.isInvalid()) {
13124 Dims.push_back(DimRes.get());
13129 return getDerived().RebuildOMPArrayShapingExpr(
Base.get(),
E->getLParenLoc(),
13130 E->getRParenLoc(), Dims,
13131 E->getBracketsRanges());
13134template <
typename Derived>
13136TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *
E) {
13137 unsigned NumIterators =
E->numOfIterators();
13140 bool ErrorFound =
false;
13141 bool NeedToRebuild = getDerived().AlwaysRebuild();
13142 for (
unsigned I = 0; I < NumIterators; ++I) {
13143 auto *
D = cast<VarDecl>(
E->getIteratorDecl(I));
13144 Data[I].DeclIdent =
D->getIdentifier();
13148 "Implicit type must be int.");
13150 TypeSourceInfo *TSI = getDerived().TransformType(
D->getTypeSourceInfo());
13151 QualType
DeclTy = getDerived().TransformType(
D->getType());
13154 OMPIteratorExpr::IteratorRange
Range =
E->getIteratorRange(I);
13158 ErrorFound = ErrorFound ||
13159 !(!
D->getTypeSourceInfo() || (
Data[I].Type.getAsOpaquePtr() &&
13160 !
Data[I].Type.get().isNull())) ||
13165 Data[I].Range.End = End.get();
13166 Data[I].Range.Step = Step.get();
13167 Data[I].AssignLoc =
E->getAssignLoc(I);
13168 Data[I].ColonLoc =
E->getColonLoc(I);
13169 Data[I].SecColonLoc =
E->getSecondColonLoc(I);
13172 (
D->getTypeSourceInfo() &&
Data[I].Type.get().getTypePtrOrNull() !=
13173 D->getType().getTypePtrOrNull()) ||
13179 if (!NeedToRebuild)
13182 ExprResult Res = getDerived().RebuildOMPIteratorExpr(
13183 E->getIteratorKwLoc(),
E->getLParenLoc(),
E->getRParenLoc(),
Data);
13184 if (!Res.isUsable())
13186 auto *IE = cast<OMPIteratorExpr>(Res.get());
13187 for (
unsigned I = 0; I < NumIterators; ++I)
13188 getDerived().transformedLocalDecl(
E->getIteratorDecl(I),
13189 IE->getIteratorDecl(I));
13193template<
typename Derived>
13195TreeTransform<Derived>::TransformCallExpr(CallExpr *
E) {
13202 bool ArgChanged =
false;
13204 if (getDerived().TransformExprs(
E->getArgs(),
E->getNumArgs(),
true, Args,
13208 if (!getDerived().AlwaysRebuild() &&
13209 Callee.get() ==
E->getCallee() &&
13214 SourceLocation FakeLParenLoc
13217 Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13218 if (
E->hasStoredFPFeatures()) {
13219 FPOptionsOverride NewOverrides =
E->getFPFeatures();
13220 getSema().CurFPFeatures =
13221 NewOverrides.applyOverrides(getSema().getLangOpts());
13222 getSema().FpPragmaStack.CurrentValue = NewOverrides;
13225 return getDerived().RebuildCallExpr(
Callee.get(), FakeLParenLoc,
13227 E->getRParenLoc());
13230template<
typename Derived>
13232TreeTransform<Derived>::TransformMemberExpr(MemberExpr *
E) {
13234 if (
Base.isInvalid())
13237 NestedNameSpecifierLoc QualifierLoc;
13238 if (
E->hasQualifier()) {
13240 = getDerived().TransformNestedNameSpecifierLoc(
E->getQualifierLoc());
13245 SourceLocation TemplateKWLoc =
E->getTemplateKeywordLoc();
13248 = cast_or_null<ValueDecl>(getDerived().TransformDecl(
E->getMemberLoc(),
13249 E->getMemberDecl()));
13253 NamedDecl *FoundDecl =
E->getFoundDecl();
13254 if (FoundDecl ==
E->getMemberDecl()) {
13257 FoundDecl = cast_or_null<NamedDecl>(
13258 getDerived().TransformDecl(
E->getMemberLoc(), FoundDecl));
13263 if (!getDerived().AlwaysRebuild() &&
13264 Base.get() ==
E->getBase() &&
13265 QualifierLoc ==
E->getQualifierLoc() &&
13266 Member ==
E->getMemberDecl() &&
13267 FoundDecl ==
E->getFoundDecl() &&
13268 !
E->hasExplicitTemplateArgs()) {
13272 if (!(isa<CXXThisExpr>(
E->getBase()) &&
13273 getSema().OpenMP().isOpenMPRebuildMemberExpr(
13274 cast<ValueDecl>(
Member)))) {
13282 TemplateArgumentListInfo TransArgs;
13283 if (
E->hasExplicitTemplateArgs()) {
13284 TransArgs.setLAngleLoc(
E->getLAngleLoc());
13285 TransArgs.setRAngleLoc(
E->getRAngleLoc());
13286 if (getDerived().TransformTemplateArguments(
E->getTemplateArgs(),
13287 E->getNumTemplateArgs(),
13293 SourceLocation FakeOperatorLoc =
13300 NamedDecl *FirstQualifierInScope =
nullptr;
13301 DeclarationNameInfo MemberNameInfo =
E->getMemberNameInfo();
13302 if (MemberNameInfo.getName()) {
13303 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
13304 if (!MemberNameInfo.getName())
13308 return getDerived().RebuildMemberExpr(
Base.get(), FakeOperatorLoc,
13315 (
E->hasExplicitTemplateArgs()
13316 ? &TransArgs :
nullptr),
13317 FirstQualifierInScope);
13320template<
typename Derived>
13322TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *
E) {
13323 ExprResult LHS = getDerived().TransformExpr(
E->getLHS());
13324 if (LHS.isInvalid())
13328 getDerived().TransformInitializer(
E->getRHS(),
false);
13329 if (RHS.isInvalid())
13332 if (!getDerived().AlwaysRebuild() &&
13333 LHS.get() ==
E->getLHS() &&
13334 RHS.get() ==
E->getRHS())
13337 if (
E->isCompoundAssignmentOp())
13339 return getDerived().RebuildBinaryOperator(
13340 E->getOperatorLoc(),
E->getOpcode(), LHS.get(), RHS.get());
13341 Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13342 FPOptionsOverride NewOverrides(
E->getFPFeatures());
13343 getSema().CurFPFeatures =
13344 NewOverrides.applyOverrides(getSema().getLangOpts());
13345 getSema().FpPragmaStack.CurrentValue = NewOverrides;
13346 return getDerived().RebuildBinaryOperator(
E->getOperatorLoc(),
E->getOpcode(),
13347 LHS.get(), RHS.get());
13350template <
typename Derived>
13351ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
13352 CXXRewrittenBinaryOperator *
E) {
13353 CXXRewrittenBinaryOperator::DecomposedForm Decomp =
E->getDecomposedForm();
13355 ExprResult LHS = getDerived().TransformExpr(
const_cast<Expr*
>(Decomp.LHS));
13356 if (LHS.isInvalid())
13359 ExprResult RHS = getDerived().TransformExpr(
const_cast<Expr*
>(Decomp.RHS));
13360 if (RHS.isInvalid())
13365 UnresolvedSet<2> UnqualLookups;
13366 bool ChangedAnyLookups =
false;
13367 Expr *PossibleBinOps[] = {
E->getSemanticForm(),
13368 const_cast<Expr *
>(Decomp.InnerBinOp)};
13369 for (Expr *PossibleBinOp : PossibleBinOps) {
13370 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
13373 auto *
Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
13374 if (!Callee || isa<CXXMethodDecl>(
Callee->getDecl()))
13379 NamedDecl *
Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
13380 E->getOperatorLoc(),
Callee->getFoundDecl()));
13384 ChangedAnyLookups =
true;
13385 UnqualLookups.addDecl(
Found);
13388 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
13389 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
13395 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
13400 return getDerived().RebuildCXXRewrittenBinaryOperator(
13401 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
13404template<
typename Derived>
13406TreeTransform<Derived>::TransformCompoundAssignOperator(
13407 CompoundAssignOperator *
E) {
13408 Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13409 FPOptionsOverride NewOverrides(
E->getFPFeatures());
13410 getSema().CurFPFeatures =
13411 NewOverrides.applyOverrides(getSema().getLangOpts());
13412 getSema().FpPragmaStack.CurrentValue = NewOverrides;
13413 return getDerived().TransformBinaryOperator(
E);
13416template<
typename Derived>
13418TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
13422 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
13423 if (commonExpr.isInvalid())
13426 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
13427 if (rhs.isInvalid())
13430 if (!getDerived().AlwaysRebuild() &&
13431 commonExpr.get() == e->getCommon() &&
13432 rhs.get() == e->getFalseExpr())
13435 return getDerived().RebuildConditionalOperator(commonExpr.get(),
13436 e->getQuestionLoc(),
13442template<
typename Derived>
13444TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *
E) {
13445 ExprResult Cond = getDerived().TransformExpr(
E->getCond());
13446 if (Cond.isInvalid())
13449 ExprResult LHS = getDerived().TransformExpr(
E->getLHS());
13450 if (LHS.isInvalid())
13453 ExprResult RHS = getDerived().TransformExpr(
E->getRHS());
13454 if (RHS.isInvalid())
13457 if (!getDerived().AlwaysRebuild() &&
13458 Cond.get() ==
E->getCond() &&
13459 LHS.get() ==
E->getLHS() &&
13460 RHS.get() ==
E->getRHS())
13463 return getDerived().RebuildConditionalOperator(Cond.get(),
13464 E->getQuestionLoc(),
13470template<
typename Derived>
13472TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *
E) {
13475 return getDerived().TransformExpr(
E->getSubExprAsWritten());
13478template<
typename Derived>
13480TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *
E) {
13481 TypeSourceInfo *
Type = getDerived().TransformType(
E->getTypeInfoAsWritten());
13486 = getDerived().TransformExpr(
E->getSubExprAsWritten());
13487 if (SubExpr.isInvalid())
13490 if (!getDerived().AlwaysRebuild() &&
13491 Type ==
E->getTypeInfoAsWritten() &&
13492 SubExpr.get() ==
E->getSubExpr())
13495 return getDerived().RebuildCStyleCastExpr(
E->getLParenLoc(),
13501template<
typename Derived>
13503TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *
E) {
13504 TypeSourceInfo *OldT =
E->getTypeSourceInfo();
13505 TypeSourceInfo *NewT = getDerived().TransformType(OldT);
13510 if (
Init.isInvalid())
13513 if (!getDerived().AlwaysRebuild() &&
13515 Init.get() ==
E->getInitializer())
13522 return getDerived().RebuildCompoundLiteralExpr(
13523 E->getLParenLoc(), NewT,
13527template<
typename Derived>
13529TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *
E) {
13531 if (
Base.isInvalid())
13534 if (!getDerived().AlwaysRebuild() &&
13535 Base.get() ==
E->getBase())
13539 SourceLocation FakeOperatorLoc =
13541 return getDerived().RebuildExtVectorElementExpr(
13542 Base.get(), FakeOperatorLoc,
E->isArrow(),
E->getAccessorLoc(),
13546template<
typename Derived>
13548TreeTransform<Derived>::TransformInitListExpr(InitListExpr *
E) {
13549 if (InitListExpr *Syntactic =
E->getSyntacticForm())
13552 bool InitChanged =
false;
13554 EnterExpressionEvaluationContext Context(
13558 if (getDerived().TransformExprs(
E->getInits(),
E->getNumInits(),
false,
13559 Inits, &InitChanged))
13562 if (!getDerived().AlwaysRebuild() && !InitChanged) {
13569 return getDerived().RebuildInitList(
E->getLBraceLoc(), Inits,
13570 E->getRBraceLoc());
13573template<
typename Derived>
13575TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *
E) {
13580 if (
Init.isInvalid())
13585 bool ExprChanged =
false;
13586 for (
const DesignatedInitExpr::Designator &
D :
E->designators()) {
13587 if (
D.isFieldDesignator()) {
13588 if (
D.getFieldDecl()) {
13589 FieldDecl *
Field = cast_or_null<FieldDecl>(
13590 getDerived().TransformDecl(
D.getFieldLoc(),
D.getFieldDecl()));
13591 if (Field !=
D.getFieldDecl())
13594 ExprChanged =
true;
13595 if (
Field->isAnonymousStructOrUnion())
13601 ExprChanged =
true;
13604 D.getFieldName(),
D.getDotLoc(),
D.getFieldLoc()));
13608 if (
D.isArrayDesignator()) {
13609 ExprResult Index = getDerived().TransformExpr(
E->getArrayIndex(
D));
13610 if (Index.isInvalid())
13613 Desig.AddDesignator(
13616 ExprChanged = ExprChanged ||
Init.get() !=
E->getArrayIndex(
D);
13617 ArrayExprs.push_back(Index.get());
13621 assert(
D.isArrayRangeDesignator() &&
"New kind of designator?");
13623 = getDerived().TransformExpr(
E->getArrayRangeStart(
D));
13624 if (Start.isInvalid())
13627 ExprResult End = getDerived().TransformExpr(
E->getArrayRangeEnd(
D));
13628 if (End.isInvalid())
13632 Start.get(), End.get(),
D.getLBracketLoc(),
D.getEllipsisLoc()));
13634 ExprChanged = ExprChanged || Start.get() !=
E->getArrayRangeStart(
D) ||
13635 End.get() !=
E->getArrayRangeEnd(
D);
13637 ArrayExprs.push_back(Start.get());
13638 ArrayExprs.push_back(End.get());
13641 if (!getDerived().AlwaysRebuild() &&
13642 Init.get() ==
E->getInit() &&
13646 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
13647 E->getEqualOrColonLoc(),
13648 E->usesGNUSyntax(),
Init.get());
13653template<
typename Derived>
13655TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
13656 DesignatedInitUpdateExpr *
E) {
13657 llvm_unreachable(
"Unexpected DesignatedInitUpdateExpr in syntactic form of "
13662template<
typename Derived>
13664TreeTransform<Derived>::TransformNoInitExpr(
13666 llvm_unreachable(
"Unexpected NoInitExpr in syntactic form of initializer");
13670template<
typename Derived>
13672TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *
E) {
13673 llvm_unreachable(
"Unexpected ArrayInitLoopExpr outside of initializer");
13677template<
typename Derived>
13679TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *
E) {
13680 llvm_unreachable(
"Unexpected ArrayInitIndexExpr outside of initializer");
13684template<
typename Derived>
13686TreeTransform<Derived>::TransformImplicitValueInitExpr(
13687 ImplicitValueInitExpr *
E) {
13688 TemporaryBase Rebase(*
this,
E->
getBeginLoc(), DeclarationName());
13692 QualType
T = getDerived().TransformType(
E->
getType());
13696 if (!getDerived().AlwaysRebuild() &&
13700 return getDerived().RebuildImplicitValueInitExpr(
T);
13703template<
typename Derived>
13705TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *
E) {
13706 TypeSourceInfo *TInfo = getDerived().TransformType(
E->getWrittenTypeInfo());
13710 ExprResult SubExpr = getDerived().TransformExpr(
E->getSubExpr());
13711 if (SubExpr.isInvalid())
13714 if (!getDerived().AlwaysRebuild() &&
13715 TInfo ==
E->getWrittenTypeInfo() &&
13716 SubExpr.get() ==
E->getSubExpr())
13719 return getDerived().RebuildVAArgExpr(
E->getBuiltinLoc(), SubExpr.get(),
13720 TInfo,
E->getRParenLoc());
13723template<
typename Derived>
13725TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *
E) {
13726 bool ArgumentChanged =
false;
13728 if (TransformExprs(
E->getExprs(),
E->getNumExprs(),
true, Inits,
13732 return getDerived().RebuildParenListExpr(
E->getLParenLoc(),
13734 E->getRParenLoc());
13742template<
typename Derived>
13744TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *
E) {
13745 Decl *LD = getDerived().TransformDecl(
E->getLabel()->getLocation(),
13750 return getDerived().RebuildAddrLabelExpr(
E->getAmpAmpLoc(),
E->getLabelLoc(),
13751 cast<LabelDecl>(LD));
13754template<
typename Derived>
13756TreeTransform<Derived>::TransformStmtExpr(StmtExpr *
E) {
13759 = getDerived().TransformCompoundStmt(
E->getSubStmt(),
true);
13760 if (SubStmt.isInvalid()) {
13765 unsigned OldDepth =
E->getTemplateDepth();
13766 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
13768 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
13769 SubStmt.get() ==
E->getSubStmt()) {
13775 return getDerived().RebuildStmtExpr(
E->getLParenLoc(), SubStmt.get(),
13776 E->getRParenLoc(), NewDepth);
13779template<
typename Derived>
13781TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *
E) {
13782 ExprResult Cond = getDerived().TransformExpr(
E->getCond());
13783 if (Cond.isInvalid())
13786 ExprResult LHS = getDerived().TransformExpr(
E->getLHS());
13787 if (LHS.isInvalid())
13790 ExprResult RHS = getDerived().TransformExpr(
E->getRHS());
13791 if (RHS.isInvalid())
13794 if (!getDerived().AlwaysRebuild() &&
13795 Cond.get() ==
E->getCond() &&
13796 LHS.get() ==
E->getLHS() &&
13797 RHS.get() ==
E->getRHS())
13800 return getDerived().RebuildChooseExpr(
E->getBuiltinLoc(),
13801 Cond.get(), LHS.get(), RHS.get(),
13802 E->getRParenLoc());
13805template<
typename Derived>
13807TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *
E) {
13811template<
typename Derived>
13813TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *
E) {
13814 switch (
E->getOperator()) {
13818 case OO_Array_Delete:
13819 llvm_unreachable(
"new and delete operators cannot use CXXOperatorCallExpr");
13824 assert(
E->getNumArgs() >= 1 &&
"Object call is missing arguments");
13833 static_cast<Expr *
>(
Object.get())->getEndLoc());
13837 if (getDerived().TransformExprs(
E->getArgs() + 1,
E->getNumArgs() - 1,
true,
13841 if (
E->getOperator() == OO_Subscript)
13842 return getDerived().RebuildCxxSubscriptExpr(
Object.get(), FakeLParenLoc,
13845 return getDerived().RebuildCallExpr(
Object.get(), FakeLParenLoc, Args,
13849#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
13853#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
13854#include "clang/Basic/OperatorKinds.def"
13856 case OO_Conditional:
13857 llvm_unreachable(
"conditional operator is not actually overloadable");
13861 llvm_unreachable(
"not an overloaded operator?");
13865 if (
E->getNumArgs() == 1 &&
E->getOperator() == OO_Amp)
13866 First = getDerived().TransformAddressOfOperand(
E->getArg(0));
13868 First = getDerived().TransformExpr(
E->getArg(0));
13869 if (
First.isInvalid())
13873 if (
E->getNumArgs() == 2) {
13875 getDerived().TransformInitializer(
E->getArg(1),
false);
13876 if (Second.isInvalid())
13880 Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13881 FPOptionsOverride NewOverrides(
E->getFPFeatures());
13882 getSema().CurFPFeatures =
13883 NewOverrides.applyOverrides(getSema().getLangOpts());
13884 getSema().FpPragmaStack.CurrentValue = NewOverrides;
13886 Expr *
Callee =
E->getCallee();
13887 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
13888 LookupResult R(SemaRef, ULE->getName(), ULE->getNameLoc(),
13890 if (getDerived().TransformOverloadExprDecls(ULE, ULE->requiresADL(), R))
13893 return getDerived().RebuildCXXOperatorCallExpr(
13894 E->getOperator(),
E->getOperatorLoc(),
Callee->getBeginLoc(),
13895 ULE->requiresADL(), R.asUnresolvedSet(),
First.get(), Second.get());
13898 UnresolvedSet<1> Functions;
13899 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
13900 Callee = ICE->getSubExprAsWritten();
13901 NamedDecl *DR = cast<DeclRefExpr>(Callee)->getDecl();
13902 ValueDecl *VD = cast_or_null<ValueDecl>(
13903 getDerived().TransformDecl(DR->getLocation(), DR));
13907 if (!isa<CXXMethodDecl>(VD))
13908 Functions.addDecl(VD);
13910 return getDerived().RebuildCXXOperatorCallExpr(
13911 E->getOperator(),
E->getOperatorLoc(),
Callee->getBeginLoc(),
13912 false, Functions,
First.get(), Second.get());
13915template<
typename Derived>
13917TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *
E) {
13918 return getDerived().TransformCallExpr(
E);
13921template <
typename Derived>
13922ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *
E) {
13924 getSema().CurContext !=
E->getParentContext();
13926 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
13929 return getDerived().RebuildSourceLocExpr(
E->getIdentKind(),
E->
getType(),
13931 getSema().CurContext);
13934template <
typename Derived>
13935ExprResult TreeTransform<Derived>::TransformEmbedExpr(EmbedExpr *
E) {
13939template<
typename Derived>
13941TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *
E) {
13948 ExprResult EC = getDerived().TransformCallExpr(
E->getConfig());
13949 if (EC.isInvalid())
13953 bool ArgChanged =
false;
13955 if (getDerived().TransformExprs(
E->getArgs(),
E->getNumArgs(),
true, Args,
13959 if (!getDerived().AlwaysRebuild() &&
13960 Callee.get() ==
E->getCallee() &&
13965 SourceLocation FakeLParenLoc
13967 return getDerived().RebuildCallExpr(
Callee.get(), FakeLParenLoc,
13969 E->getRParenLoc(), EC.get());
13972template<
typename Derived>
13980 = getDerived().TransformExpr(
E->getSubExprAsWritten());
13984 if (!getDerived().AlwaysRebuild() &&
13985 Type ==
E->getTypeInfoAsWritten() &&
13986 SubExpr.
get() ==
E->getSubExpr())
13988 return getDerived().RebuildCXXNamedCastExpr(
13989 E->getOperatorLoc(),
E->
getStmtClass(),
E->getAngleBrackets().getBegin(),
13990 Type,
E->getAngleBrackets().getEnd(),
13992 E->getAngleBrackets().getEnd(), SubExpr.
get(),
E->getRParenLoc());
13995template<
typename Derived>
14004 if (Sub.isInvalid())
14007 return getDerived().RebuildBuiltinBitCastExpr(BCE->
getBeginLoc(), TSI,
14011template<
typename Derived>
14013TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *
E) {
14014 return getDerived().TransformCXXNamedCastExpr(
E);
14017template<
typename Derived>
14019TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *
E) {
14020 return getDerived().TransformCXXNamedCastExpr(
E);
14023template<
typename Derived>
14025TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
14026 CXXReinterpretCastExpr *
E) {
14027 return getDerived().TransformCXXNamedCastExpr(
E);
14030template<
typename Derived>
14032TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *
E) {
14033 return getDerived().TransformCXXNamedCastExpr(
E);
14036template<
typename Derived>
14038TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *
E) {
14039 return getDerived().TransformCXXNamedCastExpr(
E);
14042template<
typename Derived>
14044TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
14045 CXXFunctionalCastExpr *
E) {
14046 TypeSourceInfo *
Type =
14047 getDerived().TransformTypeWithDeducedTST(
E->getTypeInfoAsWritten());
14052 = getDerived().TransformExpr(
E->getSubExprAsWritten());
14053 if (SubExpr.isInvalid())
14056 if (!getDerived().AlwaysRebuild() &&
14057 Type ==
E->getTypeInfoAsWritten() &&
14058 SubExpr.get() ==
E->getSubExpr())
14061 return getDerived().RebuildCXXFunctionalCastExpr(Type,
14065 E->isListInitialization());
14068template<
typename Derived>
14070TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *
E) {
14071 if (
E->isTypeOperand()) {
14072 TypeSourceInfo *TInfo
14073 = getDerived().TransformType(
E->getTypeOperandSourceInfo());
14077 if (!getDerived().AlwaysRebuild() &&
14078 TInfo ==
E->getTypeOperandSourceInfo())
14088 Expr *Op =
E->getExprOperand();
14091 if (
auto *RecordT = Op->getType()->getAs<RecordType>())
14092 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
14095 EnterExpressionEvaluationContext
Unevaluated(SemaRef, EvalCtx,
14098 ExprResult SubExpr = getDerived().TransformExpr(Op);
14099 if (SubExpr.isInvalid())
14102 if (!getDerived().AlwaysRebuild() &&
14103 SubExpr.get() ==
E->getExprOperand())
14110template<
typename Derived>
14112TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *
E) {
14113 if (
E->isTypeOperand()) {
14114 TypeSourceInfo *TInfo
14115 = getDerived().TransformType(
E->getTypeOperandSourceInfo());
14119 if (!getDerived().AlwaysRebuild() &&
14120 TInfo ==
E->getTypeOperandSourceInfo())
14130 ExprResult SubExpr = getDerived().TransformExpr(
E->getExprOperand());
14131 if (SubExpr.isInvalid())
14134 if (!getDerived().AlwaysRebuild() &&
14135 SubExpr.get() ==
E->getExprOperand())
14142template<
typename Derived>
14144TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *
E) {
14148template<
typename Derived>
14150TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
14151 CXXNullPtrLiteralExpr *
E) {
14155template<
typename Derived>
14157TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *
E) {
14168 QualType
T = [&]() {
14169 auto &S = getSema();
14170 if (
E->isCapturedByCopyInLambdaWithExplicitObjectParameter())
14173 return getDerived().TransformType(
E->
getType());
14177 if (!getDerived().AlwaysRebuild() &&
T ==
E->
getType()) {
14180 getSema().MarkThisReferenced(
E);
14184 return getDerived().RebuildCXXThisExpr(
E->
getBeginLoc(),
T,
E->isImplicit());
14187template<
typename Derived>
14189TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *
E) {
14190 ExprResult SubExpr = getDerived().TransformExpr(
E->getSubExpr());
14191 if (SubExpr.isInvalid())
14194 if (!getDerived().AlwaysRebuild() &&
14195 SubExpr.get() ==
E->getSubExpr())
14198 return getDerived().RebuildCXXThrowExpr(
E->getThrowLoc(), SubExpr.get(),
14199 E->isThrownVariableInScope());
14202template<
typename Derived>
14204TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *
E) {
14205 ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
14206 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getParam()));
14211 if (
E->hasRewrittenInit()) {
14212 InitRes = getDerived().TransformExpr(
E->getRewrittenExpr());
14213 if (InitRes.isInvalid())
14217 if (!getDerived().AlwaysRebuild() && Param ==
E->getParam() &&
14219 InitRes.get() ==
E->getRewrittenExpr())
14222 return getDerived().RebuildCXXDefaultArgExpr(
E->getUsedLocation(), Param,
14226template<
typename Derived>
14228TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *
E) {
14229 FieldDecl *
Field = cast_or_null<FieldDecl>(
14230 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getField()));
14234 if (!getDerived().AlwaysRebuild() && Field ==
E->getField() &&
14238 return getDerived().RebuildCXXDefaultInitExpr(
E->
getExprLoc(), Field);
14241template<
typename Derived>
14243TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
14244 CXXScalarValueInitExpr *
E) {
14245 TypeSourceInfo *
T = getDerived().TransformType(
E->getTypeSourceInfo());
14249 if (!getDerived().AlwaysRebuild() &&
14250 T ==
E->getTypeSourceInfo())
14253 return getDerived().RebuildCXXScalarValueInitExpr(
T,
14254 T->getTypeLoc().getEndLoc(),
14255 E->getRParenLoc());
14258template<
typename Derived>
14260TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *
E) {
14262 TypeSourceInfo *AllocTypeInfo =
14263 getDerived().TransformTypeWithDeducedTST(
E->getAllocatedTypeSourceInfo());
14264 if (!AllocTypeInfo)
14268 std::optional<Expr *> ArraySize;
14269 if (
E->isArray()) {
14271 if (std::optional<Expr *> OldArraySize =
E->getArraySize()) {
14272 NewArraySize = getDerived().TransformExpr(*OldArraySize);
14273 if (NewArraySize.isInvalid())
14276 ArraySize = NewArraySize.get();
14280 bool ArgumentChanged =
false;
14282 if (getDerived().TransformExprs(
E->getPlacementArgs(),
14283 E->getNumPlacementArgs(),
true,
14284 PlacementArgs, &ArgumentChanged))
14288 Expr *OldInit =
E->getInitializer();
14291 NewInit = getDerived().TransformInitializer(OldInit,
true);
14292 if (NewInit.isInvalid())
14296 FunctionDecl *OperatorNew =
nullptr;
14297 if (
E->getOperatorNew()) {
14298 OperatorNew = cast_or_null<FunctionDecl>(
14299 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getOperatorNew()));
14304 FunctionDecl *OperatorDelete =
nullptr;
14305 if (
E->getOperatorDelete()) {
14306 OperatorDelete = cast_or_null<FunctionDecl>(
14307 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getOperatorDelete()));
14308 if (!OperatorDelete)
14312 if (!getDerived().AlwaysRebuild() &&
14313 AllocTypeInfo ==
E->getAllocatedTypeSourceInfo() &&
14314 ArraySize ==
E->getArraySize() &&
14315 NewInit.get() == OldInit &&
14316 OperatorNew ==
E->getOperatorNew() &&
14317 OperatorDelete ==
E->getOperatorDelete() &&
14318 !ArgumentChanged) {
14323 if (OperatorDelete)
14326 if (
E->isArray() && !
E->getAllocatedType()->isDependentType()) {
14327 QualType ElementType
14329 if (
const RecordType *RecordT = ElementType->getAs<RecordType>()) {
14330 CXXRecordDecl *
Record = cast<CXXRecordDecl>(RecordT->getDecl());
14340 QualType AllocType = AllocTypeInfo->
getType();
14350 }
else if (
const ConstantArrayType *ConsArrayT
14351 = dyn_cast<ConstantArrayType>(ArrayT)) {
14355 AllocType = ConsArrayT->getElementType();
14356 }
else if (
const DependentSizedArrayType *DepArrayT
14357 = dyn_cast<DependentSizedArrayType>(ArrayT)) {
14358 if (DepArrayT->getSizeExpr()) {
14359 ArraySize = DepArrayT->getSizeExpr();
14360 AllocType = DepArrayT->getElementType();
14365 return getDerived().RebuildCXXNewExpr(
14369 AllocTypeInfo, ArraySize,
E->getDirectInitRange(), NewInit.get());
14372template<
typename Derived>
14374TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *
E) {
14380 FunctionDecl *OperatorDelete =
nullptr;
14381 if (
E->getOperatorDelete()) {
14382 OperatorDelete = cast_or_null<FunctionDecl>(
14383 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getOperatorDelete()));
14384 if (!OperatorDelete)
14388 if (!getDerived().AlwaysRebuild() &&
14389 Operand.get() ==
E->getArgument() &&
14390 OperatorDelete ==
E->getOperatorDelete()) {
14393 if (OperatorDelete)
14398 E->getDestroyedType());
14399 if (
const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
14400 CXXRecordDecl *
Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
14409 return getDerived().RebuildCXXDeleteExpr(
14413template<
typename Derived>
14415TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
14416 CXXPseudoDestructorExpr *
E) {
14418 if (
Base.isInvalid())
14422 bool MayBePseudoDestructor =
false;
14424 E->getOperatorLoc(),
14425 E->isArrow()? tok::arrow : tok::period,
14427 MayBePseudoDestructor);
14428 if (
Base.isInvalid())
14431 QualType ObjectType = ObjectTypePtr.get();
14432 NestedNameSpecifierLoc QualifierLoc =
E->getQualifierLoc();
14433 if (QualifierLoc) {
14435 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
14440 SS.Adopt(QualifierLoc);
14442 PseudoDestructorTypeStorage Destroyed;
14443 if (
E->getDestroyedTypeInfo()) {
14444 TypeSourceInfo *DestroyedTypeInfo
14445 = getDerived().TransformTypeInObjectScope(
E->getDestroyedTypeInfo(),
14446 ObjectType,
nullptr, SS);
14447 if (!DestroyedTypeInfo)
14449 Destroyed = DestroyedTypeInfo;
14450 }
else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
14453 Destroyed = PseudoDestructorTypeStorage(
E->getDestroyedTypeIdentifier(),
14454 E->getDestroyedTypeLoc());
14458 *
E->getDestroyedTypeIdentifier(),
E->getDestroyedTypeLoc(),
14459 nullptr, SS, ObjectTypePtr,
false);
14465 E->getDestroyedTypeLoc());
14468 TypeSourceInfo *ScopeTypeInfo =
nullptr;
14469 if (
E->getScopeTypeInfo()) {
14470 CXXScopeSpec EmptySS;
14471 ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
14472 E->getScopeTypeInfo(), ObjectType,
nullptr, EmptySS);
14473 if (!ScopeTypeInfo)
14477 return getDerived().RebuildCXXPseudoDestructorExpr(
Base.get(),
14478 E->getOperatorLoc(),
14482 E->getColonColonLoc(),
14487template <
typename Derived>
14492 bool AllEmptyPacks =
true;
14493 for (
auto *OldD : Old->
decls()) {
14494 Decl *InstD = getDerived().TransformDecl(Old->
getNameLoc(), OldD);
14498 if (isa<UsingShadowDecl>(OldD))
14507 NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
14509 if (
auto *UPD = dyn_cast<UsingPackDecl>(InstD))
14510 Decls = UPD->expansions();
14513 for (
auto *
D : Decls) {
14514 if (
auto *UD = dyn_cast<UsingDecl>(
D)) {
14515 for (
auto *SD : UD->shadows())
14522 AllEmptyPacks &= Decls.empty();
14531 if (AllEmptyPacks && !RequiresADL) {
14532 getSema().Diag(Old->
getNameLoc(), diag::err_using_pack_expansion_empty)
14533 << isa<UnresolvedMemberExpr>(Old) << Old->
getName();
14543 getSema().FilterAcceptableTemplateNames(R,
14550 diag::err_template_kw_refers_to_non_template)
14554 diag::note_template_kw_refers_to_non_template)
14563template <
typename Derived>
14566 return TransformUnresolvedLookupExpr(Old,
false);
14569template <
typename Derived>
14572 bool IsAddressOfOperand) {
14577 if (TransformOverloadExprDecls(Old, Old->
requiresADL(), R))
14584 = getDerived().TransformNestedNameSpecifierLoc(Old->
getQualifierLoc());
14588 SS.
Adopt(QualifierLoc);
14592 CXXRecordDecl *NamingClass
14593 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
14596 if (!NamingClass) {
14601 R.setNamingClass(NamingClass);
14622 SS, TemplateKWLoc, R,
14629 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->
requiresADL());
14632 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
14636template<
typename Derived>
14638TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *
E) {
14639 bool ArgChanged =
false;
14641 for (
unsigned I = 0, N =
E->getNumArgs(); I != N; ++I) {
14642 TypeSourceInfo *From =
E->getArg(I);
14643 TypeLoc FromTL = From->getTypeLoc();
14644 if (!FromTL.getAs<PackExpansionTypeLoc>()) {
14645 TypeLocBuilder TLB;
14646 TLB.reserve(FromTL.getFullDataSize());
14647 QualType To = getDerived().TransformType(TLB, FromTL);
14651 if (To == From->getType())
14652 Args.push_back(From);
14654 Args.push_back(TLB.getTypeSourceInfo(SemaRef.
Context, To));
14663 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
14664 TypeLoc PatternTL = ExpansionTL.getPatternLoc();
14670 bool Expand =
true;
14671 bool RetainExpansion =
false;
14672 std::optional<unsigned> OrigNumExpansions =
14673 ExpansionTL.getTypePtr()->getNumExpansions();
14674 std::optional<unsigned> NumExpansions = OrigNumExpansions;
14675 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
14676 PatternTL.getSourceRange(),
14678 Expand, RetainExpansion,
14686 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
14688 TypeLocBuilder TLB;
14689 TLB.reserve(From->getTypeLoc().getFullDataSize());
14691 QualType To = getDerived().TransformType(TLB, PatternTL);
14695 To = getDerived().RebuildPackExpansionType(To,
14696 PatternTL.getSourceRange(),
14697 ExpansionTL.getEllipsisLoc(),
14702 PackExpansionTypeLoc ToExpansionTL
14703 = TLB.push<PackExpansionTypeLoc>(To);
14704 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
14705 Args.push_back(TLB.getTypeSourceInfo(SemaRef.
Context, To));
14711 for (
unsigned I = 0; I != *NumExpansions; ++I) {
14712 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
14713 TypeLocBuilder TLB;
14714 TLB.reserve(PatternTL.getFullDataSize());
14715 QualType To = getDerived().TransformType(TLB, PatternTL);
14719 if (To->containsUnexpandedParameterPack()) {
14720 To = getDerived().RebuildPackExpansionType(To,
14721 PatternTL.getSourceRange(),
14722 ExpansionTL.getEllipsisLoc(),
14727 PackExpansionTypeLoc ToExpansionTL
14728 = TLB.push<PackExpansionTypeLoc>(To);
14729 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
14732 Args.push_back(TLB.getTypeSourceInfo(SemaRef.
Context, To));
14735 if (!RetainExpansion)
14740 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
14742 TypeLocBuilder TLB;
14743 TLB.reserve(From->getTypeLoc().getFullDataSize());
14745 QualType To = getDerived().TransformType(TLB, PatternTL);
14749 To = getDerived().RebuildPackExpansionType(To,
14750 PatternTL.getSourceRange(),
14751 ExpansionTL.getEllipsisLoc(),
14756 PackExpansionTypeLoc ToExpansionTL
14757 = TLB.push<PackExpansionTypeLoc>(To);
14758 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
14759 Args.push_back(TLB.getTypeSourceInfo(SemaRef.
Context, To));
14762 if (!getDerived().AlwaysRebuild() && !ArgChanged)
14765 return getDerived().RebuildTypeTrait(
E->getTrait(),
E->
getBeginLoc(), Args,
14769template<
typename Derived>
14771TreeTransform<Derived>::TransformConceptSpecializationExpr(
14772 ConceptSpecializationExpr *
E) {
14773 const ASTTemplateArgumentListInfo *Old =
E->getTemplateArgsAsWritten();
14774 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
14775 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
14776 Old->NumTemplateArgs, TransArgs))
14779 return getDerived().RebuildConceptSpecializationExpr(
14780 E->getNestedNameSpecifierLoc(),
E->getTemplateKWLoc(),
14781 E->getConceptNameInfo(),
E->getFoundDecl(),
E->getNamedConcept(),
14785template<
typename Derived>
14787TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *
E) {
14790 Sema::ExtParameterInfoBuilder ExtParamInfos;
14794 EnterExpressionEvaluationContext Ctx(
14799 getSema().Context, getSema().CurContext,
14802 Sema::ContextRAII SavedContext(getSema(), Body,
false);
14804 ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams(
14805 E->getRequiresKWLoc(),
E->getRBraceLoc(),
E, Body,
14806 E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos);
14808 for (ParmVarDecl *Param : TransParams)
14810 Param->setDeclContext(Body);
14816 if (!TypeParamResult.isUnset())
14817 return TypeParamResult;
14820 if (getDerived().TransformRequiresExprRequirements(
E->getRequirements(),
14824 for (concepts::Requirement *Req : TransReqs) {
14825 if (
auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
14826 if (ER->getReturnTypeRequirement().isTypeConstraint()) {
14827 ER->getReturnTypeRequirement()
14828 .getTypeConstraintTemplateParameterList()->getParam(0)
14829 ->setDeclContext(Body);
14834 return getDerived().RebuildRequiresExpr(
14835 E->getRequiresKWLoc(), Body,
E->getLParenLoc(), TransParams,
14836 E->getRParenLoc(), TransReqs,
E->getRBraceLoc());
14839template<
typename Derived>
14845 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
14846 TransReq = getDerived().TransformTypeRequirement(TypeReq);
14847 else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
14848 TransReq = getDerived().TransformExprRequirement(ExprReq);
14850 TransReq = getDerived().TransformNestedRequirement(
14851 cast<concepts::NestedRequirement>(Req));
14854 Transformed.push_back(TransReq);
14859template<
typename Derived>
14864 if (getDerived().AlwaysRebuild())
14865 return getDerived().RebuildTypeRequirement(
14872 return getDerived().RebuildTypeRequirement(TransType);
14875template<
typename Derived>
14878 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
14887 TransExpr = TransExprRes.
get();
14890 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
14892 if (RetReq.isEmpty())
14893 TransRetReq.emplace();
14894 else if (RetReq.isSubstitutionFailure())
14895 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
14896 else if (RetReq.isTypeConstraint()) {
14898 RetReq.getTypeConstraintTemplateParameterList();
14900 getDerived().TransformTemplateParameterList(OrigTPL);
14903 TransRetReq.emplace(TPL);
14905 assert(TransRetReq &&
"All code paths leading here must set TransRetReq");
14906 if (
Expr *
E = TransExpr.dyn_cast<
Expr *>())
14907 return getDerived().RebuildExprRequirement(
E, Req->
isSimple(),
14909 std::move(*TransRetReq));
14910 return getDerived().RebuildExprRequirement(
14911 cast<concepts::Requirement::SubstitutionDiagnostic *>(TransExpr),
14915template<
typename Derived>
14920 if (getDerived().AlwaysRebuild())
14921 return getDerived().RebuildNestedRequirement(
14929 return getDerived().RebuildNestedRequirement(TransConstraint.
get());
14932template<
typename Derived>
14935 TypeSourceInfo *
T = getDerived().TransformType(
E->getQueriedTypeSourceInfo());
14939 if (!getDerived().AlwaysRebuild() &&
14940 T ==
E->getQueriedTypeSourceInfo())
14947 SubExpr = getDerived().TransformExpr(
E->getDimensionExpression());
14951 if (!getDerived().AlwaysRebuild() && SubExpr.
get() ==
E->getDimensionExpression())
14955 return getDerived().RebuildArrayTypeTrait(
E->getTrait(),
E->
getBeginLoc(),
T,
14959template<
typename Derived>
14961TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *
E) {
14966 SubExpr = getDerived().TransformExpr(
E->getQueriedExpression());
14967 if (SubExpr.isInvalid())
14970 if (!getDerived().AlwaysRebuild() && SubExpr.get() ==
E->getQueriedExpression())
14974 return getDerived().RebuildExpressionTrait(
E->getTrait(),
E->
getBeginLoc(),
14978template <
typename Derived>
14982 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
14983 DRE, AddrTaken, RecoveryTSI);
14990 if (!getDerived().AlwaysRebuild() && NewDRE.
get() == DRE)
14992 return getDerived().RebuildParenExpr(NewDRE.
get(), PE->
getLParen(),
14996template <
typename Derived>
14999 return TransformDependentScopeDeclRefExpr(
E,
false,
15003template <
typename Derived>
15007 assert(
E->getQualifierLoc());
15009 getDerived().TransformNestedNameSpecifierLoc(
E->getQualifierLoc());
15019 getDerived().TransformDeclarationNameInfo(
E->getNameInfo());
15023 if (!
E->hasExplicitTemplateArgs()) {
15024 if (!getDerived().AlwaysRebuild() && QualifierLoc ==
E->getQualifierLoc() &&
15027 NameInfo.
getName() ==
E->getDeclName())
15030 return getDerived().RebuildDependentScopeDeclRefExpr(
15031 QualifierLoc, TemplateKWLoc, NameInfo,
nullptr,
15032 IsAddressOfOperand, RecoveryTSI);
15035 TemplateArgumentListInfo TransArgs(
E->getLAngleLoc(),
E->getRAngleLoc());
15036 if (getDerived().TransformTemplateArguments(
15037 E->getTemplateArgs(),
E->getNumTemplateArgs(), TransArgs))
15040 return getDerived().RebuildDependentScopeDeclRefExpr(
15041 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
15045template<
typename Derived>
15047TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *
E) {
15051 if (getDerived().AllowSkippingCXXConstructExpr() &&
15052 ((
E->getNumArgs() == 1 ||
15053 (
E->getNumArgs() > 1 && getDerived().DropCallArgument(
E->getArg(1)))) &&
15054 (!getDerived().DropCallArgument(
E->getArg(0))) &&
15055 !
E->isListInitialization()))
15056 return getDerived().TransformInitializer(
E->getArg(0),
15059 TemporaryBase Rebase(*
this,
E->
getBeginLoc(), DeclarationName());
15061 QualType
T = getDerived().TransformType(
E->
getType());
15065 CXXConstructorDecl *
Constructor = cast_or_null<CXXConstructorDecl>(
15066 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getConstructor()));
15070 bool ArgumentChanged =
false;
15073 EnterExpressionEvaluationContext Context(
15075 E->isListInitialization());
15076 if (getDerived().TransformExprs(
E->getArgs(),
E->getNumArgs(),
true, Args,
15081 if (!getDerived().AlwaysRebuild() &&
15083 Constructor ==
E->getConstructor() &&
15084 !ArgumentChanged) {
15091 return getDerived().RebuildCXXConstructExpr(
15093 E->hadMultipleCandidates(),
E->isListInitialization(),
15094 E->isStdInitListInitialization(),
E->requiresZeroInitialization(),
15095 E->getConstructionKind(),
E->getParenOrBraceRange());
15098template<
typename Derived>
15099ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
15100 CXXInheritedCtorInitExpr *
E) {
15101 QualType
T = getDerived().TransformType(
E->
getType());
15105 CXXConstructorDecl *
Constructor = cast_or_null<CXXConstructorDecl>(
15106 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getConstructor()));
15110 if (!getDerived().AlwaysRebuild() &&
15112 Constructor ==
E->getConstructor()) {
15119 return getDerived().RebuildCXXInheritedCtorInitExpr(
15120 T,
E->getLocation(), Constructor,
15121 E->constructsVBase(),
E->inheritedFromVBase());
15128template<
typename Derived>
15130TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *
E) {
15131 if (
auto *Dtor =
E->getTemporary()->getDestructor())
15133 const_cast<CXXDestructorDecl *
>(Dtor));
15134 return getDerived().TransformExpr(
E->getSubExpr());
15142template<
typename Derived>
15144TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *
E) {
15145 return getDerived().TransformExpr(
E->getSubExpr());
15148template<
typename Derived>
15150TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
15151 CXXTemporaryObjectExpr *
E) {
15152 TypeSourceInfo *
T =
15153 getDerived().TransformTypeWithDeducedTST(
E->getTypeSourceInfo());
15157 CXXConstructorDecl *
Constructor = cast_or_null<CXXConstructorDecl>(
15158 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getConstructor()));
15162 bool ArgumentChanged =
false;
15164 Args.reserve(
E->getNumArgs());
15166 EnterExpressionEvaluationContext Context(
15168 E->isListInitialization());
15169 if (TransformExprs(
E->getArgs(),
E->getNumArgs(),
true, Args,
15173 if (
E->isListInitialization() && !
E->isStdInitListInitialization()) {
15175 if (Res.isInvalid())
15177 Args = {Res.get()};
15181 if (!getDerived().AlwaysRebuild() &&
15182 T ==
E->getTypeSourceInfo() &&
15183 Constructor ==
E->getConstructor() &&
15184 !ArgumentChanged) {
15190 SourceLocation LParenLoc =
T->getTypeLoc().getEndLoc();
15191 return getDerived().RebuildCXXTemporaryObjectExpr(
15192 T, LParenLoc, Args,
E->
getEndLoc(),
E->isListInitialization());
15195template<
typename Derived>
15197TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *
E) {
15200 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
15201 struct TransformedInitCapture {
15203 SourceLocation EllipsisLoc;
15208 InitCaptures.resize(
E->explicit_capture_end() -
E->explicit_capture_begin());
15210 CEnd =
E->capture_end();
15212 if (!
E->isInitCapture(
C))
15215 TransformedInitCapture &
Result = InitCaptures[
C -
E->capture_begin()];
15216 auto *OldVD = cast<VarDecl>(
C->getCapturedVar());
15218 auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
15219 std::optional<unsigned> NumExpansions) {
15220 ExprResult NewExprInitResult = getDerived().TransformInitializer(
15223 if (NewExprInitResult.isInvalid()) {
15224 Result.Expansions.push_back(InitCaptureInfoTy(
ExprError(), QualType()));
15227 Expr *NewExprInit = NewExprInitResult.get();
15229 QualType NewInitCaptureType =
15230 getSema().buildLambdaInitCaptureInitialization(
15231 C->getLocation(),
C->getCaptureKind() ==
LCK_ByRef,
15232 EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
15233 cast<VarDecl>(
C->getCapturedVar())->getInitStyle() !=
15236 Result.Expansions.push_back(
15237 InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
15241 if (OldVD->isParameterPack()) {
15242 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
15244 .castAs<PackExpansionTypeLoc>();
15250 bool Expand =
true;
15251 bool RetainExpansion =
false;
15252 std::optional<unsigned> OrigNumExpansions =
15253 ExpansionTL.getTypePtr()->getNumExpansions();
15254 std::optional<unsigned> NumExpansions = OrigNumExpansions;
15255 if (getDerived().TryExpandParameterPacks(
15256 ExpansionTL.getEllipsisLoc(),
15257 OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
15258 RetainExpansion, NumExpansions))
15260 assert(!RetainExpansion &&
"Should not need to retain expansion after a "
15261 "capture since it cannot be extended");
15263 for (
unsigned I = 0; I != *NumExpansions; ++I) {
15264 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
15265 SubstInitCapture(SourceLocation(), std::nullopt);
15268 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
15269 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
15272 SubstInitCapture(SourceLocation(), std::nullopt);
15276 LambdaScopeInfo *LSI = getSema().PushLambdaScope();
15277 Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
15288 DeclContext *DC = getSema().CurContext;
15306 while (DC->isRequiresExprBody())
15307 DC = DC->getParent();
15308 if ((getSema().isUnevaluatedContext() ||
15309 getSema().isConstantEvaluatedContext()) &&
15310 (DC->isFileContext() || !DC->getParent()->isDependentContext()))
15313 CXXRecordDecl *OldClass =
E->getLambdaClass();
15314 CXXRecordDecl *
Class = getSema().createLambdaClosureType(
15315 E->getIntroducerRange(),
nullptr, DependencyKind,
15316 E->getCaptureDefault());
15317 getDerived().transformedLocalDecl(OldClass, {
Class});
15319 CXXMethodDecl *NewCallOperator =
15320 getSema().CreateLambdaCallOperator(
E->getIntroducerRange(),
Class);
15323 getSema().buildLambdaScope(LSI, NewCallOperator,
E->getIntroducerRange(),
15324 E->getCaptureDefault(),
E->getCaptureDefaultLoc(),
15325 E->hasExplicitParameters(),
E->isMutable());
15328 Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
15335 CEnd =
E->capture_end();
15339 if (
C->isImplicit())
15343 if (
C->capturesThis()) {
15349 Sema::CXXThisScopeRAII ThisScope(
15351 dyn_cast_if_present<CXXRecordDecl>(
15352 getSema().getFunctionLevelDeclContext()),
15354 getSema().CheckCXXThisCapture(
C->getLocation(),
C->isExplicit(),
15361 if (
C->capturesVLAType())
15365 if (
E->isInitCapture(
C)) {
15366 TransformedInitCapture &NewC = InitCaptures[
C -
E->capture_begin()];
15368 auto *OldVD = cast<VarDecl>(
C->getCapturedVar());
15371 for (InitCaptureInfoTy &Info : NewC.Expansions) {
15373 QualType InitQualType = Info.second;
15374 if (
Init.isInvalid() || InitQualType.isNull()) {
15378 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
15379 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
15380 OldVD->getIdentifier(), OldVD->getInitStyle(),
Init.get(),
15381 getSema().CurContext);
15386 NewVDs.push_back(NewVD);
15387 getSema().addInitCapture(LSI, NewVD,
C->getCaptureKind() ==
LCK_ByRef);
15392 if (NewC.EllipsisLoc.isInvalid())
15393 LSI->ContainsUnexpandedParameterPack |=
15394 Init.get()->containsUnexpandedParameterPack();
15400 getDerived().transformedLocalDecl(OldVD, NewVDs);
15404 assert(
C->capturesVariable() &&
"unexpected kind of lambda capture");
15412 SourceLocation EllipsisLoc;
15413 if (
C->isPackExpansion()) {
15415 bool ShouldExpand =
false;
15416 bool RetainExpansion =
false;
15417 std::optional<unsigned> NumExpansions;
15418 if (getDerived().TryExpandParameterPacks(
C->getEllipsisLoc(),
15421 ShouldExpand, RetainExpansion,
15427 if (ShouldExpand) {
15431 auto *Pack = cast<VarDecl>(
C->getCapturedVar());
15432 for (
unsigned I = 0; I != *NumExpansions; ++I) {
15433 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
15434 VarDecl *CapturedVar
15435 = cast_or_null<VarDecl>(getDerived().TransformDecl(
C->getLocation(),
15437 if (!CapturedVar) {
15443 getSema().tryCaptureVariable(CapturedVar,
C->getLocation(), Kind);
15451 EllipsisLoc =
C->getEllipsisLoc();
15455 auto *CapturedVar = cast_or_null<ValueDecl>(
15456 getDerived().TransformDecl(
C->getLocation(),
C->getCapturedVar()));
15457 if (!CapturedVar || CapturedVar->isInvalidDecl()) {
15464 if (
auto *VD = dyn_cast<VarDecl>(CapturedVar); VD && !
C->isPackExpansion())
15465 LSI->ContainsUnexpandedParameterPack |= VD->isParameterPack();
15468 getSema().tryCaptureVariable(CapturedVar,
C->getLocation(), Kind,
15471 getSema().finishLambdaExplicitCaptures(LSI);
15475 auto TPL = getDerived().TransformTemplateParameterList(
15476 E->getTemplateParameterList());
15477 LSI->GLTemplateParameterList = TPL;
15479 getSema().AddTemplateParametersToLambdaCallOperator(NewCallOperator,
Class,
15481 LSI->ContainsUnexpandedParameterPack |=
15482 TPL->containsUnexpandedParameterPack();
15485 TypeLocBuilder NewCallOpTLBuilder;
15486 TypeLoc OldCallOpTypeLoc =
15487 E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
15488 QualType NewCallOpType =
15489 getDerived().TransformType(NewCallOpTLBuilder, OldCallOpTypeLoc);
15490 if (NewCallOpType.isNull())
15492 LSI->ContainsUnexpandedParameterPack |=
15493 NewCallOpType->containsUnexpandedParameterPack();
15494 TypeSourceInfo *NewCallOpTSI =
15495 NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType);
15499 auto FPTL = NewCallOpTSI->getTypeLoc().getAsAdjusted<FunctionProtoTypeLoc>();
15500 assert(FPTL &&
"Not a FunctionProtoType?");
15502 getSema().CompleteLambdaCallOperator(
15503 NewCallOperator,
E->getCallOperator()->getLocation(),
15504 E->getCallOperator()->getInnerLocStart(),
15505 E->getCallOperator()->getTrailingRequiresClause(), NewCallOpTSI,
15506 E->getCallOperator()->getConstexprKind(),
15507 E->getCallOperator()->getStorageClass(), FPTL.getParams(),
15508 E->hasExplicitResultType());
15510 getDerived().transformAttrs(
E->getCallOperator(), NewCallOperator);
15511 getDerived().transformedLocalDecl(
E->getCallOperator(), {NewCallOperator});
15515 Sema::ContextRAII ManglingContext(getSema(),
Class->getDeclContext());
15517 std::optional<CXXRecordDecl::LambdaNumbering> Numbering;
15518 if (getDerived().ReplacingOriginal()) {
15519 Numbering = OldClass->getLambdaNumbering();
15522 getSema().handleLambdaNumbering(
Class, NewCallOperator, Numbering);
15527 getSema().PushExpressionEvaluationContext(
15528 E->getCallOperator()->isConsteval() ?
15531 getSema().currentEvaluationContext().InImmediateEscalatingFunctionContext =
15532 getSema().getLangOpts().CPlusPlus20 &&
15533 E->getCallOperator()->isImmediateEscalating();
15535 Sema::CodeSynthesisContext
C;
15538 getSema().pushCodeSynthesisContext(
C);
15544 getSema().popCodeSynthesisContext();
15547 FuncScopeCleanup.disable();
15549 if (Body.isInvalid()) {
15550 SavedContext.pop();
15559 auto LSICopy = *LSI;
15560 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
15562 SavedContext.pop();
15597 DependencyKind = getDerived().ComputeLambdaDependency(&LSICopy);
15598 Class->setLambdaDependencyKind(DependencyKind);
15601 Class->setTypeForDecl(
nullptr);
15602 getSema().Context.getTypeDeclType(
Class);
15604 return getDerived().RebuildLambdaExpr(
E->
getBeginLoc(),
15605 Body.get()->getEndLoc(), &LSICopy);
15608template<
typename Derived>
15611 return TransformStmt(S);
15614template<
typename Derived>
15619 CEnd =
E->capture_end();
15623 if (!
C->isImplicit())
15627 if (
C->capturesThis()) {
15628 getSema().CheckCXXThisCapture(
C->getLocation(),
C->isExplicit(),
15635 if (
C->capturesVLAType())
15638 assert(
C->capturesVariable() &&
"unexpected kind of lambda capture");
15639 assert(!
E->isInitCapture(
C) &&
"implicit init-capture?");
15642 VarDecl *CapturedVar = cast_or_null<VarDecl>(
15643 getDerived().TransformDecl(
C->getLocation(),
C->getCapturedVar()));
15648 getSema().tryCaptureVariable(CapturedVar,
C->getLocation());
15654template<
typename Derived>
15659 getDerived().TransformTypeWithDeducedTST(
E->getTypeSourceInfo());
15663 bool ArgumentChanged =
false;
15665 Args.reserve(
E->getNumArgs());
15669 E->isListInitialization());
15670 if (getDerived().TransformExprs(
E->arg_begin(),
E->getNumArgs(),
true, Args,
15675 if (!getDerived().AlwaysRebuild() &&
15676 T ==
E->getTypeSourceInfo() &&
15681 return getDerived().RebuildCXXUnresolvedConstructExpr(
15682 T,
E->getLParenLoc(), Args,
E->getRParenLoc(),
E->isListInitialization());
15685template<
typename Derived>
15687TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
15688 CXXDependentScopeMemberExpr *
E) {
15693 QualType ObjectType;
15694 if (!
E->isImplicitAccess()) {
15695 OldBase =
E->getBase();
15696 Base = getDerived().TransformExpr(OldBase);
15697 if (
Base.isInvalid())
15702 bool MayBePseudoDestructor =
false;
15704 E->getOperatorLoc(),
15705 E->isArrow()? tok::arrow : tok::period,
15707 MayBePseudoDestructor);
15708 if (
Base.isInvalid())
15711 ObjectType = ObjectTy.get();
15712 BaseType = ((Expr*)
Base.get())->getType();
15715 BaseType = getDerived().TransformType(
E->getBaseType());
15721 NamedDecl *FirstQualifierInScope
15722 = getDerived().TransformFirstQualifierInScope(
15723 E->getFirstQualifierFoundInScope(),
15726 NestedNameSpecifierLoc QualifierLoc;
15727 if (
E->getQualifier()) {
15729 = getDerived().TransformNestedNameSpecifierLoc(
E->getQualifierLoc(),
15731 FirstQualifierInScope);
15736 SourceLocation TemplateKWLoc =
E->getTemplateKeywordLoc();
15742 DeclarationNameInfo NameInfo
15743 = getDerived().TransformDeclarationNameInfo(
E->getMemberNameInfo());
15744 if (!NameInfo.getName())
15747 if (!
E->hasExplicitTemplateArgs()) {
15750 if (!getDerived().AlwaysRebuild() &&
15751 Base.get() == OldBase &&
15752 BaseType ==
E->getBaseType() &&
15753 QualifierLoc ==
E->getQualifierLoc() &&
15754 NameInfo.getName() ==
E->getMember() &&
15755 FirstQualifierInScope ==
E->getFirstQualifierFoundInScope())
15758 return getDerived().RebuildCXXDependentScopeMemberExpr(
Base.get(),
15761 E->getOperatorLoc(),
15764 FirstQualifierInScope,
15769 TemplateArgumentListInfo TransArgs(
E->getLAngleLoc(),
E->getRAngleLoc());
15770 if (getDerived().TransformTemplateArguments(
E->getTemplateArgs(),
15771 E->getNumTemplateArgs(),
15775 return getDerived().RebuildCXXDependentScopeMemberExpr(
Base.get(),
15778 E->getOperatorLoc(),
15781 FirstQualifierInScope,
15786template <
typename Derived>
15787ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
15788 UnresolvedMemberExpr *Old) {
15792 if (!Old->isImplicitAccess()) {
15793 Base = getDerived().TransformExpr(Old->getBase());
15794 if (
Base.isInvalid())
15797 getSema().PerformMemberExprBaseConversion(
Base.get(), Old->isArrow());
15798 if (
Base.isInvalid())
15800 BaseType =
Base.get()->getType();
15802 BaseType = getDerived().TransformType(Old->getBaseType());
15805 NestedNameSpecifierLoc QualifierLoc;
15806 if (Old->getQualifierLoc()) {
15808 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
15813 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
15818 if (TransformOverloadExprDecls(Old,
false, R))
15822 if (Old->getNamingClass()) {
15823 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
15824 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
15828 R.setNamingClass(NamingClass);
15831 TemplateArgumentListInfo TransArgs;
15832 if (Old->hasExplicitTemplateArgs()) {
15833 TransArgs.setLAngleLoc(Old->getLAngleLoc());
15834 TransArgs.setRAngleLoc(Old->getRAngleLoc());
15835 if (getDerived().TransformTemplateArguments(
15836 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
15844 NamedDecl *FirstQualifierInScope =
nullptr;
15846 return getDerived().RebuildUnresolvedMemberExpr(
15847 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
15848 TemplateKWLoc, FirstQualifierInScope, R,
15849 (Old->hasExplicitTemplateArgs() ? &TransArgs :
nullptr));
15852template<
typename Derived>
15854TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *
E) {
15857 ExprResult SubExpr = getDerived().TransformExpr(
E->getOperand());
15858 if (SubExpr.isInvalid())
15861 if (!getDerived().AlwaysRebuild() && SubExpr.get() ==
E->getOperand())
15864 return getDerived().RebuildCXXNoexceptExpr(
E->
getSourceRange(),SubExpr.get());
15867template<
typename Derived>
15869TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *
E) {
15870 ExprResult Pattern = getDerived().TransformExpr(
E->getPattern());
15871 if (Pattern.isInvalid())
15874 if (!getDerived().AlwaysRebuild() && Pattern.get() ==
E->getPattern())
15877 return getDerived().RebuildPackExpansion(Pattern.get(),
E->getEllipsisLoc(),
15878 E->getNumExpansions());
15881template<
typename Derived>
15883TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *
E) {
15893 TemplateArgument ArgStorage;
15896 if (
E->isPartiallySubstituted()) {
15897 PackArgs =
E->getPartialArguments();
15900 bool ShouldExpand =
false;
15901 bool RetainExpansion =
false;
15902 std::optional<unsigned> NumExpansions;
15903 if (getDerived().TryExpandParameterPacks(
E->getOperatorLoc(),
E->getPackLoc(),
15905 ShouldExpand, RetainExpansion,
15911 if (ShouldExpand) {
15912 auto *Pack =
E->getPack();
15913 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
15914 ArgStorage = getSema().Context.getPackExpansionType(
15916 }
else if (
auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
15917 ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt);
15919 auto *VD = cast<ValueDecl>(Pack);
15920 ExprResult DRE = getSema().BuildDeclRefExpr(
15921 VD, VD->getType().getNonLValueExprType(getSema().Context),
15924 if (DRE.isInvalid())
15926 ArgStorage =
new (getSema().Context)
15927 PackExpansionExpr(getSema().Context.DependentTy, DRE.get(),
15928 E->getPackLoc(), std::nullopt);
15930 PackArgs = ArgStorage;
15935 if (!PackArgs.size()) {
15936 auto *Pack = cast_or_null<NamedDecl>(
15937 getDerived().TransformDecl(
E->getPackLoc(),
E->getPack()));
15940 return getDerived().RebuildSizeOfPackExpr(
15941 E->getOperatorLoc(), Pack,
E->getPackLoc(),
E->getRParenLoc(),
15946 std::optional<unsigned>
Result = 0;
15947 for (
const TemplateArgument &Arg : PackArgs) {
15948 if (!Arg.isPackExpansion()) {
15953 TemplateArgumentLoc ArgLoc;
15954 InventTemplateArgumentLoc(Arg, ArgLoc);
15957 SourceLocation Ellipsis;
15958 std::optional<unsigned> OrigNumExpansions;
15959 TemplateArgumentLoc Pattern =
15960 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
15961 OrigNumExpansions);
15964 TemplateArgumentLoc OutPattern;
15965 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
15966 if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
15971 std::optional<unsigned> NumExpansions =
15972 getSema().getFullyPackExpandedSize(OutPattern.getArgument());
15973 if (!NumExpansions) {
15986 return getDerived().RebuildSizeOfPackExpr(
E->getOperatorLoc(),
E->getPack(),
15988 E->getRParenLoc(), *
Result, {});
15990 TemplateArgumentListInfo TransformedPackArgs(
E->getPackLoc(),
15993 TemporaryBase Rebase(*
this,
E->getPackLoc(), getBaseEntity());
15994 typedef TemplateArgumentLocInventIterator<
15995 Derived,
const TemplateArgument*> PackLocIterator;
15996 if (TransformTemplateArguments(PackLocIterator(*
this, PackArgs.begin()),
15997 PackLocIterator(*
this, PackArgs.end()),
15998 TransformedPackArgs,
true))
16005 bool PartialSubstitution =
false;
16006 for (
auto &
Loc : TransformedPackArgs.arguments()) {
16007 Args.push_back(
Loc.getArgument());
16008 if (
Loc.getArgument().isPackExpansion())
16009 PartialSubstitution =
true;
16012 if (PartialSubstitution)
16013 return getDerived().RebuildSizeOfPackExpr(
16014 E->getOperatorLoc(),
E->getPack(),
E->getPackLoc(),
E->getRParenLoc(),
16015 std::nullopt, Args);
16017 return getDerived().RebuildSizeOfPackExpr(
E->getOperatorLoc(),
E->getPack(),
16018 E->getPackLoc(),
E->getRParenLoc(),
16022template <
typename Derived>
16024TreeTransform<Derived>::TransformPackIndexingExpr(PackIndexingExpr *
E) {
16031 EnterExpressionEvaluationContext ConstantContext(
16033 IndexExpr = getDerived().TransformExpr(
E->getIndexExpr());
16034 if (IndexExpr.isInvalid())
16039 bool FullySubstituted =
true;
16040 if (!
E->expandsToEmptyPack() &&
E->getExpressions().empty()) {
16041 Expr *Pattern =
E->getPackIdExpression();
16043 getSema().collectUnexpandedParameterPacks(
E->getPackIdExpression(),
16045 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
16049 bool ShouldExpand =
true;
16050 bool RetainExpansion =
false;
16051 std::optional<unsigned> OrigNumExpansions;
16052 std::optional<unsigned> NumExpansions = OrigNumExpansions;
16053 if (getDerived().TryExpandParameterPacks(
16055 ShouldExpand, RetainExpansion, NumExpansions))
16057 if (!ShouldExpand) {
16058 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
16059 ExprResult Pack = getDerived().TransformExpr(Pattern);
16060 if (Pack.isInvalid())
16062 return getDerived().RebuildPackIndexingExpr(
16063 E->getEllipsisLoc(),
E->getRSquareLoc(), Pack.get(), IndexExpr.get(),
16066 for (
unsigned I = 0; I != *NumExpansions; ++I) {
16067 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
16068 ExprResult Out = getDerived().TransformExpr(Pattern);
16069 if (Out.isInvalid())
16071 if (Out.get()->containsUnexpandedParameterPack()) {
16072 Out = getDerived().RebuildPackExpansion(Out.get(),
E->getEllipsisLoc(),
16073 OrigNumExpansions);
16074 if (Out.isInvalid())
16076 FullySubstituted =
false;
16078 ExpandedExprs.push_back(Out.get());
16082 if (RetainExpansion) {
16083 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
16085 ExprResult Out = getDerived().TransformExpr(Pattern);
16086 if (Out.isInvalid())
16089 Out = getDerived().RebuildPackExpansion(Out.get(),
E->getEllipsisLoc(),
16090 OrigNumExpansions);
16091 if (Out.isInvalid())
16093 FullySubstituted =
false;
16094 ExpandedExprs.push_back(Out.get());
16096 }
else if (!
E->expandsToEmptyPack()) {
16097 if (getDerived().TransformExprs(
E->getExpressions().data(),
16098 E->getExpressions().size(),
false,
16103 return getDerived().RebuildPackIndexingExpr(
16104 E->getEllipsisLoc(),
E->getRSquareLoc(),
E->getPackIdExpression(),
16105 IndexExpr.get(), ExpandedExprs, FullySubstituted);
16108template<
typename Derived>
16110TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
16111 SubstNonTypeTemplateParmPackExpr *
E) {
16116template<
typename Derived>
16118TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
16119 SubstNonTypeTemplateParmExpr *
E) {
16124template<
typename Derived>
16126TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *
E) {
16131template<
typename Derived>
16133TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
16134 MaterializeTemporaryExpr *
E) {
16135 return getDerived().TransformExpr(
E->getSubExpr());
16138template<
typename Derived>
16140TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *
E) {
16141 UnresolvedLookupExpr *
Callee =
nullptr;
16142 if (Expr *OldCallee =
E->getCallee()) {
16143 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
16144 if (CalleeResult.isInvalid())
16146 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
16149 Expr *Pattern =
E->getPattern();
16152 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
16153 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
16157 bool Expand =
true;
16158 bool RetainExpansion =
false;
16159 std::optional<unsigned> OrigNumExpansions =
E->getNumExpansions(),
16160 NumExpansions = OrigNumExpansions;
16161 if (getDerived().TryExpandParameterPacks(
E->getEllipsisLoc(),
16164 Expand, RetainExpansion,
16171 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
16174 E->getLHS() ? getDerived().TransformExpr(
E->getLHS()) :
ExprResult();
16175 if (LHS.isInvalid())
16179 E->getRHS() ? getDerived().TransformExpr(
E->getRHS()) :
ExprResult();
16180 if (RHS.isInvalid())
16183 if (!getDerived().AlwaysRebuild() &&
16184 LHS.get() ==
E->getLHS() && RHS.get() ==
E->getRHS())
16187 return getDerived().RebuildCXXFoldExpr(
16189 E->getEllipsisLoc(), RHS.get(),
E->
getEndLoc(), NumExpansions);
16195 if (NumExpansions && SemaRef.
getLangOpts().BracketDepth < NumExpansions) {
16196 SemaRef.
Diag(
E->getEllipsisLoc(),
16197 clang::diag::err_fold_expression_limit_exceeded)
16198 << *NumExpansions << SemaRef.
getLangOpts().BracketDepth
16200 SemaRef.
Diag(
E->getEllipsisLoc(), diag::note_bracket_depth);
16209 bool LeftFold =
E->isLeftFold();
16213 if (!LeftFold && RetainExpansion) {
16214 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
16216 ExprResult Out = getDerived().TransformExpr(Pattern);
16217 if (Out.isInvalid())
16220 Result = getDerived().RebuildCXXFoldExpr(
16227 for (
unsigned I = 0; I != *NumExpansions; ++I) {
16228 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
16229 getSema(), LeftFold ? I : *NumExpansions - I - 1);
16230 ExprResult Out = getDerived().TransformExpr(Pattern);
16231 if (Out.isInvalid())
16234 if (Out.get()->containsUnexpandedParameterPack()) {
16236 Result = getDerived().RebuildCXXFoldExpr(
16238 E->getOperator(),
E->getEllipsisLoc(),
16240 OrigNumExpansions);
16241 }
else if (
Result.isUsable()) {
16243 Expr *LHS = LeftFold ?
Result.get() : Out.get();
16244 Expr *RHS = LeftFold ? Out.get() :
Result.get();
16246 UnresolvedSet<16> Functions;
16247 Functions.append(
Callee->decls_begin(),
Callee->decls_end());
16248 Result = getDerived().RebuildCXXOperatorCallExpr(
16250 E->getEllipsisLoc(),
Callee->getBeginLoc(),
Callee->requiresADL(),
16251 Functions, LHS, RHS);
16253 Result = getDerived().RebuildBinaryOperator(
E->getEllipsisLoc(),
16254 E->getOperator(), LHS, RHS);
16265 if (LeftFold && RetainExpansion) {
16266 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
16268 ExprResult Out = getDerived().TransformExpr(Pattern);
16269 if (Out.isInvalid())
16272 Result = getDerived().RebuildCXXFoldExpr(
16274 E->getEllipsisLoc(), Out.get(),
E->
getEndLoc(), OrigNumExpansions);
16279 if (ParenExpr *PE = dyn_cast_or_null<ParenExpr>(
Result.get()))
16280 PE->setIsProducedByFoldExpansion();
16285 return getDerived().RebuildEmptyCXXFoldExpr(
E->getEllipsisLoc(),
16290template <
typename Derived>
16292TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *
E) {
16295 if (TransformExprs(InitExprs.data(), InitExprs.size(),
true,
16299 return getDerived().RebuildParenListExpr(
E->
getBeginLoc(), TransformedInits,
16303template<
typename Derived>
16305TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
16306 CXXStdInitializerListExpr *
E) {
16307 return getDerived().TransformExpr(
E->getSubExpr());
16310template<
typename Derived>
16312TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *
E) {
16316template<
typename Derived>
16318TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *
E) {
16322template<
typename Derived>
16324TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *
E) {
16325 ExprResult SubExpr = getDerived().TransformExpr(
E->getSubExpr());
16326 if (SubExpr.isInvalid())
16329 if (!getDerived().AlwaysRebuild() &&
16330 SubExpr.get() ==
E->getSubExpr())
16333 return getDerived().RebuildObjCBoxedExpr(
E->
getSourceRange(), SubExpr.get());
16336template<
typename Derived>
16338TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *
E) {
16341 bool ArgChanged =
false;
16342 if (getDerived().TransformExprs(
E->getElements(),
E->getNumElements(),
16343 false, Elements, &ArgChanged))
16346 if (!getDerived().AlwaysRebuild() && !ArgChanged)
16354template<
typename Derived>
16356TreeTransform<Derived>::TransformObjCDictionaryLiteral(
16357 ObjCDictionaryLiteral *
E) {
16360 bool ArgChanged =
false;
16361 for (
unsigned I = 0, N =
E->getNumElements(); I != N; ++I) {
16362 ObjCDictionaryElement OrigElement =
E->getKeyValueElement(I);
16364 if (OrigElement.isPackExpansion()) {
16367 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
16368 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
16369 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
16373 bool Expand =
true;
16374 bool RetainExpansion =
false;
16375 std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
16376 std::optional<unsigned> NumExpansions = OrigNumExpansions;
16377 SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
16378 OrigElement.Value->getEndLoc());
16379 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
16380 PatternRange, Unexpanded, Expand,
16381 RetainExpansion, NumExpansions))
16388 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
16389 ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
16390 if (Key.isInvalid())
16393 if (Key.get() != OrigElement.Key)
16397 if (
Value.isInvalid())
16400 if (
Value.get() != OrigElement.Value)
16403 ObjCDictionaryElement Expansion = {
16404 Key.get(),
Value.get(), OrigElement.EllipsisLoc, NumExpansions
16406 Elements.push_back(Expansion);
16416 for (
unsigned I = 0; I != *NumExpansions; ++I) {
16417 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
16418 ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
16419 if (Key.isInvalid())
16423 if (
Value.isInvalid())
16426 ObjCDictionaryElement Element = {
16427 Key.get(),
Value.get(), SourceLocation(), NumExpansions
16433 if (Key.get()->containsUnexpandedParameterPack() ||
16434 Value.get()->containsUnexpandedParameterPack())
16435 Element.EllipsisLoc = OrigElement.EllipsisLoc;
16437 Elements.push_back(Element);
16447 ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
16448 if (Key.isInvalid())
16451 if (Key.get() != OrigElement.Key)
16456 = getDerived().TransformExpr(OrigElement.Value);
16457 if (
Value.isInvalid())
16460 if (
Value.get() != OrigElement.Value)
16463 ObjCDictionaryElement Element = {Key.get(),
Value.get(), SourceLocation(),
16465 Elements.push_back(Element);
16468 if (!getDerived().AlwaysRebuild() && !ArgChanged)
16471 return getDerived().RebuildObjCDictionaryLiteral(
E->
getSourceRange(),
16475template<
typename Derived>
16477TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *
E) {
16478 TypeSourceInfo *EncodedTypeInfo
16479 = getDerived().TransformType(
E->getEncodedTypeSourceInfo());
16480 if (!EncodedTypeInfo)
16483 if (!getDerived().AlwaysRebuild() &&
16484 EncodedTypeInfo ==
E->getEncodedTypeSourceInfo())
16487 return getDerived().RebuildObjCEncodeExpr(
E->getAtLoc(),
16489 E->getRParenLoc());
16492template<
typename Derived>
16494TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *
E) {
16499 return getDerived().TransformExpr(
E->getSubExpr());
16502template<
typename Derived>
16504TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *
E) {
16505 TypeSourceInfo *TSInfo
16506 = getDerived().TransformType(
E->getTypeInfoAsWritten());
16514 if (!getDerived().AlwaysRebuild() &&
16515 TSInfo ==
E->getTypeInfoAsWritten() &&
16516 Result.get() ==
E->getSubExpr())
16520 E->getLParenLoc(),
E->getBridgeKind(),
E->getBridgeKeywordLoc(), TSInfo,
16524template <
typename Derived>
16525ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
16526 ObjCAvailabilityCheckExpr *
E) {
16530template<
typename Derived>
16532TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *
E) {
16534 bool ArgChanged =
false;
16536 Args.reserve(
E->getNumArgs());
16537 if (getDerived().TransformExprs(
E->getArgs(),
E->getNumArgs(),
false, Args,
16543 TypeSourceInfo *ReceiverTypeInfo
16544 = getDerived().TransformType(
E->getClassReceiverTypeInfo());
16545 if (!ReceiverTypeInfo)
16549 if (!getDerived().AlwaysRebuild() &&
16550 ReceiverTypeInfo ==
E->getClassReceiverTypeInfo() && !ArgChanged)
16555 E->getSelectorLocs(SelLocs);
16556 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
16559 E->getMethodDecl(),
16566 if (!
E->getMethodDecl())
16571 E->getSelectorLocs(SelLocs);
16572 return getDerived().RebuildObjCMessageExpr(
E->getSuperLoc(),
16575 E->getReceiverType(),
16576 E->getMethodDecl(),
16584 "Only class and instance messages may be instantiated");
16586 = getDerived().TransformExpr(
E->getInstanceReceiver());
16587 if (Receiver.isInvalid())
16591 if (!getDerived().AlwaysRebuild() &&
16592 Receiver.get() ==
E->getInstanceReceiver() && !ArgChanged)
16597 E->getSelectorLocs(SelLocs);
16598 return getDerived().RebuildObjCMessageExpr(Receiver.get(),
16601 E->getMethodDecl(),
16607template<
typename Derived>
16609TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *
E) {
16613template<
typename Derived>
16615TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *
E) {
16619template<
typename Derived>
16621TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *
E) {
16624 if (
Base.isInvalid())
16630 if (!getDerived().AlwaysRebuild() &&
16631 Base.get() ==
E->getBase())
16634 return getDerived().RebuildObjCIvarRefExpr(
Base.get(),
E->getDecl(),
16636 E->isArrow(),
E->isFreeIvar());
16639template<
typename Derived>
16641TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *
E) {
16644 if (!
E->isObjectReceiver())
16649 if (
Base.isInvalid())
16655 if (!getDerived().AlwaysRebuild() &&
16656 Base.get() ==
E->getBase())
16659 if (
E->isExplicitProperty())
16660 return getDerived().RebuildObjCPropertyRefExpr(
Base.get(),
16661 E->getExplicitProperty(),
16664 return getDerived().RebuildObjCPropertyRefExpr(
Base.get(),
16666 E->getImplicitPropertyGetter(),
16667 E->getImplicitPropertySetter(),
16671template<
typename Derived>
16673TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *
E) {
16676 if (
Base.isInvalid())
16680 ExprResult Key = getDerived().TransformExpr(
E->getKeyExpr());
16681 if (Key.isInvalid())
16685 if (!getDerived().AlwaysRebuild() &&
16686 Key.get() ==
E->getKeyExpr() &&
Base.get() ==
E->getBaseExpr())
16689 return getDerived().RebuildObjCSubscriptRefExpr(
E->getRBracket(),
16690 Base.get(), Key.get(),
16691 E->getAtIndexMethodDecl(),
16692 E->setAtIndexMethodDecl());
16695template<
typename Derived>
16697TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *
E) {
16700 if (
Base.isInvalid())
16704 if (!getDerived().AlwaysRebuild() &&
16705 Base.get() ==
E->getBase())
16708 return getDerived().RebuildObjCIsaExpr(
Base.get(),
E->getIsaMemberLoc(),
16713template<
typename Derived>
16715TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *
E) {
16716 bool ArgumentChanged =
false;
16718 SubExprs.reserve(
E->getNumSubExprs());
16719 if (getDerived().TransformExprs(
E->getSubExprs(),
E->getNumSubExprs(),
false,
16720 SubExprs, &ArgumentChanged))
16723 if (!getDerived().AlwaysRebuild() &&
16727 return getDerived().RebuildShuffleVectorExpr(
E->getBuiltinLoc(),
16729 E->getRParenLoc());
16732template<
typename Derived>
16734TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *
E) {
16735 ExprResult SrcExpr = getDerived().TransformExpr(
E->getSrcExpr());
16736 if (SrcExpr.isInvalid())
16739 TypeSourceInfo *
Type = getDerived().TransformType(
E->getTypeSourceInfo());
16743 if (!getDerived().AlwaysRebuild() &&
16744 Type ==
E->getTypeSourceInfo() &&
16745 SrcExpr.get() ==
E->getSrcExpr())
16748 return getDerived().RebuildConvertVectorExpr(
E->getBuiltinLoc(),
16749 SrcExpr.get(), Type,
16750 E->getRParenLoc());
16753template<
typename Derived>
16755TreeTransform<Derived>::TransformBlockExpr(BlockExpr *
E) {
16756 BlockDecl *oldBlock =
E->getBlockDecl();
16759 BlockScopeInfo *blockScope = SemaRef.
getCurBlock();
16762 blockScope->TheDecl->setBlockMissingReturnType(
16763 oldBlock->blockMissingReturnType());
16768 const FunctionProtoType *exprFunctionType =
E->getFunctionType();
16771 Sema::ExtParameterInfoBuilder extParamInfos;
16772 if (getDerived().TransformFunctionTypeParams(
16773 E->getCaretLocation(), oldBlock->parameters(),
nullptr,
16774 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms,
16776 getSema().ActOnBlockError(
E->getCaretLocation(),
nullptr);
16780 QualType exprResultType =
16781 getDerived().TransformType(exprFunctionType->getReturnType());
16783 auto epi = exprFunctionType->getExtProtoInfo();
16784 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
16787 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
16791 if (!params.empty())
16792 blockScope->TheDecl->setParams(params);
16794 if (!oldBlock->blockMissingReturnType()) {
16795 blockScope->HasImplicitReturnType =
false;
16796 blockScope->ReturnType = exprResultType;
16800 StmtResult body = getDerived().TransformStmt(
E->getBody());
16801 if (body.isInvalid()) {
16802 getSema().ActOnBlockError(
E->getCaretLocation(),
nullptr);
16810 for (
const auto &I : oldBlock->captures()) {
16811 VarDecl *oldCapture = I.getVariable();
16814 if (oldCapture->isParameterPack())
16817 VarDecl *newCapture =
16818 cast<VarDecl>(getDerived().TransformDecl(
E->getCaretLocation(),
16820 assert(blockScope->CaptureMap.count(newCapture));
16826 assert((!blockScope->isCXXThisCaptured() || oldBlock->capturesCXXThis()) &&
16827 "this pointer isn't captured in the old block");
16835template<
typename Derived>
16837TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *
E) {
16838 ExprResult SrcExpr = getDerived().TransformExpr(
E->getSrcExpr());
16839 if (SrcExpr.isInvalid())
16842 QualType
Type = getDerived().TransformType(
E->
getType());
16845 E->getRParenLoc());
16848template<
typename Derived>
16850TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *
E) {
16851 bool ArgumentChanged =
false;
16853 SubExprs.reserve(
E->getNumSubExprs());
16854 if (getDerived().TransformExprs(
E->getSubExprs(),
E->getNumSubExprs(),
false,
16855 SubExprs, &ArgumentChanged))
16858 if (!getDerived().AlwaysRebuild() &&
16862 return getDerived().RebuildAtomicExpr(
E->getBuiltinLoc(), SubExprs,
16863 E->getOp(),
E->getRParenLoc());
16870template<
typename Derived>
16874 getDerived().getBaseEntity());
16877template<
typename Derived>
16881 getDerived().getBaseEntity());
16884template<
typename Derived>
16887 bool WrittenAsLValue,
16890 Sigil, getDerived().getBaseEntity());
16893template<
typename Derived>
16899 getDerived().getBaseEntity());
16902template<
typename Derived>
16910 Decl, ProtocolLAngleLoc, Protocols, ProtocolLocs, ProtocolRAngleLoc,
16914template<
typename Derived>
16926 BaseType,
Loc, TypeArgsLAngleLoc, TypeArgs, TypeArgsRAngleLoc,
16927 ProtocolLAngleLoc, Protocols, ProtocolLocs, ProtocolRAngleLoc,
16932template<
typename Derived>
16939template <
typename Derived>
16942 Expr *SizeExpr,
unsigned IndexTypeQuals,
SourceRange BracketsRange) {
16943 if (SizeExpr || !Size)
16945 IndexTypeQuals, BracketsRange,
16946 getDerived().getBaseEntity());
16954 for (
const auto &
T : Types)
16966 IndexTypeQuals, BracketsRange,
16967 getDerived().getBaseEntity());
16970template <
typename Derived>
16973 Expr *SizeExpr,
unsigned IndexTypeQuals,
SourceRange BracketsRange) {
16974 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
16975 IndexTypeQuals, BracketsRange);
16978template <
typename Derived>
16982 return getDerived().RebuildArrayType(ElementType, SizeMod,
nullptr,
nullptr,
16983 IndexTypeQuals, BracketsRange);
16986template <
typename Derived>
16989 unsigned IndexTypeQuals,
SourceRange BracketsRange) {
16990 return getDerived().RebuildArrayType(ElementType, SizeMod,
nullptr,
16992 IndexTypeQuals, BracketsRange);
16995template <
typename Derived>
16998 unsigned IndexTypeQuals,
SourceRange BracketsRange) {
16999 return getDerived().RebuildArrayType(ElementType, SizeMod,
nullptr,
17001 IndexTypeQuals, BracketsRange);
17004template <
typename Derived>
17011template <
typename Derived>
17013 unsigned NumElements,
17019template <
typename Derived>
17026template<
typename Derived>
17028 unsigned NumElements,
17031 NumElements,
true);
17038template<
typename Derived>
17046template <
typename Derived>
17048 QualType ElementType,
unsigned NumRows,
unsigned NumColumns) {
17053template <
typename Derived>
17061template <
typename Derived>
17066 getDerived().getBaseLocation(),
17067 getDerived().getBaseEntity(),
17071template<
typename Derived>
17076template<
typename Derived>
17079 assert(
D &&
"no decl found");
17083 if (
auto *UPD = dyn_cast<UsingPackDecl>(
D)) {
17087 if (UPD->expansions().empty()) {
17088 getSema().Diag(
Loc, diag::err_using_pack_expansion_empty)
17089 << UPD->isCXXClassMember() << UPD;
17098 for (
auto *
E : UPD->expansions()) {
17104 else if (
T.isNull())
17108 "mismatched resolved types in using pack expansion");
17110 return T.isNull() ? FallbackT :
T;
17111 }
else if (
auto *Using = dyn_cast<UsingDecl>(
D)) {
17112 assert(Using->hasTypename() &&
17113 "UnresolvedUsingTypenameDecl transformed to non-typename using");
17116 assert(++Using->shadow_begin() == Using->shadow_end());
17125 assert(isa<UnresolvedUsingTypenameDecl>(
D) &&
17126 "UnresolvedUsingTypenameDecl transformed to non-using decl");
17128 cast<UnresolvedUsingTypenameDecl>(
D));
17132template <
typename Derived>
17138template<
typename Derived>
17144template <
typename Derived>
17149template <
typename Derived>
17155 FullySubstituted, Expansions);
17158template<
typename Derived>
17165template<
typename Derived>
17173template<
typename Derived>
17179template<
typename Derived>
17187template <
typename Derived>
17198template <
typename Derived>
17204template<
typename Derived>
17213template<
typename Derived>
17221 bool AllowInjectedClassName) {
17225 getSema().ActOnTemplateName(
nullptr, SS, TemplateKWLoc,
17228 AllowInjectedClassName);
17229 return Template.
get();
17232template<
typename Derived>
17239 bool AllowInjectedClassName) {
17242 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
17243 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
17245 getSema().ActOnTemplateName(
17247 false, Template, AllowInjectedClassName);
17248 return Template.
get();
17251template <
typename Derived>
17256 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
17262 Opc,
First, Second);
17277 if (Op == OO_Subscript) {
17278 if (!
First->getType()->isOverloadableType() &&
17280 return getSema().CreateBuiltinArraySubscriptExpr(
First, CalleeLoc, Second,
17282 }
else if (Op == OO_Arrow) {
17285 if (
First->getType()->isDependentType())
17289 }
else if (Second ==
nullptr || isPostIncDec) {
17290 if (!
First->getType()->isOverloadableType() ||
17291 (Op == OO_Amp && getSema().isQualifiedMemberAccess(
First))) {
17298 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc,
First);
17302 !
First->getType()->isOverloadableType() &&
17317 if (!Second || isPostIncDec) {
17327 First, Second, RequiresADL);
17334template<
typename Derived>
17349 ->template getAs<RecordType>())){
17352 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
17353 CCLoc, TildeLoc, Destroyed);
17365 if (!ScopeType->getType()->getAs<
TagType>()) {
17366 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
17367 diag::err_expected_class_or_namespace)
17368 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
17376 return getSema().BuildMemberReferenceExpr(
Base, BaseType,
17377 OperatorLoc, isArrow,
17385template<
typename Derived>
17393 for (
unsigned I = 0; I < NumParams; ++I) {
17394 if (I != ContextParamPos) {
17400 Params.push_back(std::make_pair(StringRef(), QualType()));
17403 getSema().ActOnCapturedRegionStart(
Loc,
nullptr,
17404 S->getCapturedRegionKind(), Params);
17407 Sema::CompoundScopeRAII CompoundScope(getSema());
17408 Body = getDerived().TransformStmt(S->getCapturedStmt());
17411 if (Body.isInvalid()) {
17412 getSema().ActOnCapturedRegionError();
17416 return getSema().ActOnCapturedRegionEnd(Body.get());
17419template <
typename Derived>
17421TreeTransform<Derived>::TransformSYCLKernelCallStmt(SYCLKernelCallStmt *S) {
17425 llvm_unreachable(
"SYCL kernel call statement cannot appear in dependent "
17429template <
typename Derived>
17430ExprResult TreeTransform<Derived>::TransformHLSLOutArgExpr(HLSLOutArgExpr *
E) {
17433 return getDerived().TransformExpr(
E->getArgLValue());
static Decl::Kind getKind(const Decl *D)
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines Expressions and AST nodes for C++2a concepts.
llvm::MachO::Target Target
llvm::MachO::Record Record
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenACC constructs and clauses.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis for expressions involving.
This file declares semantic analysis for SYCL constructs.
Defines the Objective-C statement AST node classes.
This file defines OpenACC AST classes for statement-level contructs.
This file defines OpenMP AST classes for executable directives and clauses.
This file defines SYCL AST classes used to represent calls to SYCL kernels.
static QualType getPointeeType(const MemRegion *R)
QualType getUsingType(const UsingShadowDecl *Found, QualType Underlying) const
TranslationUnitDecl * getTranslationUnitDecl() const
unsigned getIntWidth(QualType T) const
QualType getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent, bool IsPack=false, ConceptDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
QualType getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, ArrayRef< TemplateArgumentLoc > Args) const
DeclarationNameTable DeclarationNames
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
QualType getArrayParameterType(QualType Ty) const
Return the uniqued reference to a specified array parameter type from the original array type.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
TemplateName getQualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const
Return the unique reference to a vector type of the specified element type and size.
QualType getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl, unsigned Index, std::optional< unsigned > PackIndex, SubstTemplateTypeParmTypeFlag Flag=SubstTemplateTypeParmTypeFlag::None) const
Retrieve a substitution-result type.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
QualType getMacroQualifiedType(QualType UnderlyingTy, const IdentifierInfo *MacroII) const
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getDeducedTemplateSpecializationType(TemplateName Template, QualType DeducedType, bool IsDependent) const
C++17 deduced class template specialization type.
CanQualType UnsignedLongTy
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
CanQualType PseudoObjectTy
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, QualType NamedType, TagDecl *OwnedTagDecl=nullptr) const
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
QualType getPackExpansionType(QualType Pattern, std::optional< unsigned > NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
CanQualType UnsignedInt128Ty
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
CanQualType UnsignedLongLongTy
CanQualType UnsignedShortTy
QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, QualType Canon=QualType()) const
TemplateName getSubstTemplateTemplateParmPack(const TemplateArgument &ArgPack, Decl *AssociatedDecl, unsigned Index, bool Final) const
QualType getHLSLAttributedResourceType(QualType Wrapped, QualType Contained, const HLSLAttributedResourceType::Attributes &Attrs)
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
QualType getTypeOfType(QualType QT, TypeOfKind Kind) const
getTypeOfType - Unlike many "get<Type>" functions, we don't unique TypeOfType nodes.
QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, unsigned NumColumns) const
Return the unique reference to the matrix type of the specified element type and size.
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
SourceLocation getRParenLoc() const
TypeLoc getValueLoc() const
SourceLocation getKWLoc() const
SourceLocation getLParenLoc() const
Attr - This represents one attribute.
attr::Kind getKind() const
Represents an attribute applied to a statement.
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
ArrayRef< TemplateArgument > getTypeConstraintArguments() const
ConceptDecl * getTypeConstraintConcept() const
AutoTypeKeyword getKeyword() const
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
bool isAssignmentOp() const
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
void setIsVariadic(bool value)
Represents a C++2a __builtin_bit_cast(T, v) expression.
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
Represents binding an expression to a temporary.
CXXCatchStmt - This represents a C++ catch block.
Represents a call to a C++ constructor.
SourceRange getParenOrBraceRange() const
Expr * getArg(unsigned Arg)
Return the specified argument.
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
Represents a C++ constructor within a class.
static CXXDefaultArgExpr * Create(const ASTContext &C, SourceLocation Loc, ParmVarDecl *Param, Expr *RewrittenExpr, DeclContext *UsedContext)
Represents a call to an inherited base class constructor from an inheriting constructor.
Abstract class common to all of the C++ "named"/"keyword" casts.
Represents a C++ struct/union/class.
unsigned getLambdaDependencyKind() const
An expression "T()" which creates an rvalue of a non-class type T.
Represents a C++ nested-name-specifier or a global scope specifier.
char * location_data() const
Retrieve the data associated with the source-location information.
SourceRange getRange() const
void MakeGlobal(ASTContext &Context, SourceLocation ColonColonLoc)
Turn this (empty) nested-name-specifier into the global nested-name-specifier '::'.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
NestedNameSpecifier * getScopeRep() const
Retrieve the representation of the nested-name-specifier.
unsigned location_size() const
Retrieve the size of the data associated with source-location information.
void MakeSuper(ASTContext &Context, CXXRecordDecl *RD, SourceLocation SuperLoc, SourceLocation ColonColonLoc)
Turns this (empty) nested-name-specifier into '__super' nested-name-specifier.
void Extend(ASTContext &Context, SourceLocation TemplateKWLoc, TypeLoc TL, SourceLocation ColonColonLoc)
Extend the current nested-name-specifier by another nested-name-specifier component of the form 'type...
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
static CallExpr * Create(const ASTContext &Ctx, Expr *Fn, ArrayRef< Expr * > Args, QualType Ty, ExprValueKind VK, SourceLocation RParenLoc, FPOptionsOverride FPFeatures, unsigned MinNumArgs=0, ADLCallKind UsesADL=NotADL)
Create a call expression.
Represents the body of a CapturedStmt, and serves as its DeclContext.
unsigned getNumParams() const
unsigned getContextParamPosition() const
ImplicitParamDecl * getParam(unsigned i) const
This captures a statement into a function.
SourceLocation getBegin() const
CompoundStmt - This represents a group of statements like { stmt stmt }.
Declaration of a C++20 concept.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, ConceptDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
void addDecl(Decl *D)
Add the declaration D into this context.
A reference to a declared variable, function, enum, etc.
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Decl - This represents one declaration (or definition), e.g.
SourceLocation getEndLoc() const LLVM_READONLY
bool isInvalidDecl() const
SourceLocation getLocation() const
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
The name of a declaration.
@ CXXConversionFunctionName
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
QualType getDeducedType() const
Get the type deduced for this placeholder type, or null if it has not been deduced.
A qualified reference to a name whose declaration cannot yet be resolved.
Represents a dependent template name that cannot be resolved prior to template instantiation.
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
unsigned getNumArgs() const
SourceLocation getTemplateNameLoc() const
SourceLocation getLAngleLoc() const
void setTemplateKeywordLoc(SourceLocation Loc)
SourceLocation getTemplateKeywordLoc() const
void setElaboratedKeywordLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
SourceLocation getRAngleLoc() const
SourceLocation getElaboratedKeywordLoc() const
void setLAngleLoc(SourceLocation Loc)
void setArgLocInfo(unsigned i, TemplateArgumentLocInfo AI)
void setTemplateNameLoc(SourceLocation Loc)
Represents a template specialization type whose template cannot be resolved, e.g.
Designation - Represent a full designation, which is a sequence of designators.
static Designator CreateArrayRangeDesignator(Expr *Start, Expr *End, SourceLocation LBracketLoc, SourceLocation EllipsisLoc)
Creates a GNU array-range designator.
static Designator CreateArrayDesignator(Expr *Index, SourceLocation LBracketLoc)
Creates an array designator.
static Designator CreateFieldDesignator(const IdentifierInfo *FieldName, SourceLocation DotLoc, SourceLocation FieldLoc)
Creates a field designator.
bool hasErrorOccurred() const
Wrap a function effect's condition expression in another struct so that FunctionProtoType's TrailingO...
Expr * getCondition() const
SourceLocation getElaboratedKeywordLoc() const
NestedNameSpecifierLoc getQualifierLoc() const
void setElaboratedKeywordLoc(SourceLocation Loc)
TypeLoc getNamedTypeLoc() const
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Represents a type that was referred to using an elaborated type keyword, e.g., struct S,...
RAII object that enters a new expression evaluation context.
TypeSourceInfo * getTypeInfoAsWritten() const
getTypeInfoAsWritten - Returns the type source info for the type that this expression is casting to.
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Represents a function declaration or definition.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
QualType getCallResultType() const
Determine the type of an expression that calls this function.
Represents an abstract function effect, using just an enumeration describing its kind.
StringRef name() const
The description printed in diagnostics, e.g. 'nonblocking'.
Kind oppositeKind() const
Return the opposite kind, for effects which have opposites.
ArrayRef< EffectConditionExpr > conditions() const
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
param_type_iterator param_type_begin() const
const ExtParameterInfo * getExtParameterInfosOrNull() const
Return a pointer to the beginning of the array of extra parameter information, if present,...
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
unsigned getNumParams() const
SourceLocation getLocalRangeEnd() const
void setLocalRangeBegin(SourceLocation L)
void setLParenLoc(SourceLocation Loc)
SourceRange getExceptionSpecRange() const
void setParam(unsigned i, ParmVarDecl *VD)
ArrayRef< ParmVarDecl * > getParams() const
void setRParenLoc(SourceLocation Loc)
void setLocalRangeEnd(SourceLocation L)
void setExceptionSpecRange(SourceRange R)
TypeLoc getReturnLoc() const
SourceLocation getLocalRangeBegin() const
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
QualType getReturnType() const
AssociationTy< false > Association
One of these records is kept for each identifier that is lexed.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Represents an implicitly-generated value initialization of an object of a given type.
const TypeClass * getTypePtr() const
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the declaration of a label.
Describes the capture of a variable or of this, or of a C++1y init-capture.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
const LambdaCapture * capture_iterator
An iterator that walks over the captures of the lambda, both implicit and explicit.
Represents the results of name lookup.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
@ Found
Name lookup found a single declaration that met the criteria.
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
bool empty() const
Return true if no decls were found.
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
SourceLocation getNameLoc() const
Gets the location of the identifier.
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
DeclarationName getLookupName() const
Gets the name to look up.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Represents a C++ namespace alias.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
SourceLocation getLocalEndLoc() const
Retrieve the location of the end of this component of the nested-name-specifier.
SourceLocation getEndLoc() const
Retrieve the location of the end of this nested-name-specifier.
TypeLoc getTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
void * getOpaqueData() const
Retrieve the opaque pointer that refers to source-location data.
NestedNameSpecifier * getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
SourceLocation getLocalBeginLoc() const
Retrieve the location of the beginning of this component of the nested-name-specifier.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier.
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
NamespaceAliasDecl * getAsNamespaceAlias() const
Retrieve the namespace alias stored in this nested name specifier.
IdentifierInfo * getAsIdentifier() const
Retrieve the identifier stored in this nested name specifier.
@ NamespaceAlias
A namespace alias, stored as a NamespaceAliasDecl*.
@ TypeSpec
A type, stored as a Type*.
@ TypeSpecWithTemplate
A type that was preceded by the 'template' keyword, stored as a Type*.
@ Super
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Identifier
An identifier, stored as an IdentifierInfo*.
@ Global
The global specifier '::'. There is no stored value.
@ Namespace
A namespace, stored as a NamespaceDecl*.
NamespaceDecl * getAsNamespace() const
Retrieve the namespace stored in this nested name specifier.
This is a basic class for representing single OpenMP clause.
This is a basic class for representing single OpenMP executable directive.
This represents clauses with a list of expressions that are mappable.
ObjCIvarDecl - Represents an ObjC instance variable.
@ SuperInstance
The receiver is the instance of the superclass object.
@ Instance
The receiver is an object instance.
@ SuperClass
The receiver is a superclass.
@ Class
The receiver is a class.
ObjCMethodDecl - Represents an instance or class method declaration.
bool isInstanceMethod() const
Represents one property declaration in an Objective-C interface.
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
Represents the declaration of an Objective-C type parameter.
@ Array
An index into an array.
@ Identifier
A field in a dependent type, known only by its name.
@ Base
An implicit indirection through a C++ base class, when the field found is in a base class.
Wrapper for void* pointer.
static OpaquePtr make(QualType P)
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
static OpenACCAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCAttachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCAutoClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
This is the base type for all OpenACC Clauses.
static OpenACCCollapseClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, bool HasForce, Expr *LoopCount, SourceLocation EndLoc)
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, bool IsReadOnly, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, bool IsZero, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, bool IsZero, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDefaultAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDefaultClause * Create(const ASTContext &C, OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static OpenACCDeleteClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDetachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceNumClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCFinalizeClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCFirstPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCHostClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCIfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCIfPresentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCIndependentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCNoCreateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNumGangsClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCNumWorkersClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCSelfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCTileClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > SizeExprs, SourceLocation EndLoc)
static OpenACCUseDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCVectorLengthClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWaitClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef< Expr * > QueueIdExprs, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
SourceLocation getLAngleLoc() const
Retrieve the location of the left angle bracket starting the explicit template argument list followin...
SourceLocation getNameLoc() const
Gets the location of the name.
SourceLocation getTemplateKeywordLoc() const
Retrieve the location of the template keyword preceding this name, if any.
NestedNameSpecifierLoc getQualifierLoc() const
Fetches the nested-name qualifier with source-location information, if one was given.
TemplateArgumentLoc const * getTemplateArgs() const
llvm::iterator_range< decls_iterator > decls() const
unsigned getNumTemplateArgs() const
DeclarationName getName() const
Gets the name looked up.
SourceLocation getRAngleLoc() const
Retrieve the location of the right angle bracket ending the explicit template argument list following...
bool hasTemplateKeyword() const
Determines whether the name was preceded by the template keyword.
Represents a C++11 pack expansion that produces a sequence of expressions.
void setEllipsisLoc(SourceLocation Loc)
SourceLocation getEllipsisLoc() const
TypeLoc getPatternLoc() const
Represents a pack expansion of types.
std::optional< unsigned > getNumExpansions() const
Retrieve the number of expansions that this pack expansion will generate, if known.
ParenExpr - This represents a parenthesized expression, e.g.
SourceLocation getLParen() const
Get the location of the left parentheses '('.
SourceLocation getRParen() const
Get the location of the right parentheses ')'.
Represents a parameter to a function.
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
unsigned getFunctionScopeDepth() const
void setSigilLoc(SourceLocation Loc)
TypeLoc getPointeeLoc() const
SourceLocation getSigilLoc() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
Stores the type being destroyed by a pseudo-destructor expression.
const IdentifierInfo * getIdentifier() const
SourceLocation getLocation() const
TypeSourceInfo * getTypeSourceInfo() const
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
Represents a template name as written in source code.
Wrapper of type source information for a type with non-trivial direct qualifiers.
The collection of all-type qualifiers we support.
void removeObjCLifetime()
static Qualifiers fromCVRMask(unsigned CVR)
bool hasObjCLifetime() const
LangAS getAddressSpace() const
Represents a struct/union/class.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeTypeAsWritten() const
Represents the body of a requires-expression.
static RequiresExprBodyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc)
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
static RequiresExpr * Create(ASTContext &C, SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body, SourceLocation LParenLoc, ArrayRef< ParmVarDecl * > LocalParameters, SourceLocation RParenLoc, ArrayRef< concepts::Requirement * > Requirements, SourceLocation RBraceLoc)
static SEHFinallyStmt * Create(const ASTContext &C, SourceLocation FinallyLoc, Stmt *Block)
Represents a __leave statement.
Smart pointer class that efficiently represents Objective-C method names.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
VarDecl * BuildObjCExceptionDecl(TypeSourceInfo *TInfo, QualType ExceptionType, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, bool Invalid=false)
Build a type-check a new Objective-C exception variable declaration.
StmtResult ActOnObjCForCollectionStmt(SourceLocation ForColLoc, Stmt *First, Expr *collection, SourceLocation RParenLoc)
StmtResult FinishObjCForCollectionStmt(Stmt *ForCollection, Stmt *Body)
FinishObjCForCollectionStmt - Attach the body to a objective-C foreach statement.
ExprResult BuildObjCDictionaryLiteral(SourceRange SR, MutableArrayRef< ObjCDictionaryElement > Elements)
ExprResult BuildInstanceMessage(Expr *Receiver, QualType ReceiverType, SourceLocation SuperLoc, Selector Sel, ObjCMethodDecl *Method, SourceLocation LBracLoc, ArrayRef< SourceLocation > SelectorLocs, SourceLocation RBracLoc, MultiExprArg Args, bool isImplicit=false)
Build an Objective-C instance message expression.
QualType BuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, SourceLocation ProtocolLAngleLoc, ArrayRef< ObjCProtocolDecl * > Protocols, ArrayRef< SourceLocation > ProtocolLocs, SourceLocation ProtocolRAngleLoc, bool FailOnError=false)
Build an Objective-C type parameter type.
ExprResult BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, QualType ReceiverType, SourceLocation SuperLoc, Selector Sel, ObjCMethodDecl *Method, SourceLocation LBracLoc, ArrayRef< SourceLocation > SelectorLocs, SourceLocation RBracLoc, MultiExprArg Args, bool isImplicit=false)
Build an Objective-C class message expression.
StmtResult ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc, Expr *SynchExpr, Stmt *SynchBody)
ExprResult BuildObjCEncodeExpression(SourceLocation AtLoc, TypeSourceInfo *EncodedTypeInfo, SourceLocation RParenLoc)
ExprResult BuildObjCArrayLiteral(SourceRange SR, MultiExprArg Elements)
ExprResult BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr)
BuildObjCBoxedExpr - builds an ObjCBoxedExpr AST node for the '@' prefixed parenthesized expression.
StmtResult ActOnObjCAtTryStmt(SourceLocation AtLoc, Stmt *Try, MultiStmtArg Catch, Stmt *Finally)
StmtResult ActOnObjCAtFinallyStmt(SourceLocation AtLoc, Stmt *Body)
StmtResult BuildObjCAtThrowStmt(SourceLocation AtLoc, Expr *Throw)
QualType BuildObjCObjectType(QualType BaseType, SourceLocation Loc, SourceLocation TypeArgsLAngleLoc, ArrayRef< TypeSourceInfo * > TypeArgs, SourceLocation TypeArgsRAngleLoc, SourceLocation ProtocolLAngleLoc, ArrayRef< ObjCProtocolDecl * > Protocols, ArrayRef< SourceLocation > ProtocolLocs, SourceLocation ProtocolRAngleLoc, bool FailOnError, bool Rebuilding)
Build an Objective-C object pointer type.
ExprResult ActOnObjCAtSynchronizedOperand(SourceLocation atLoc, Expr *operand)
ExprResult BuildObjCBridgedCast(SourceLocation LParenLoc, ObjCBridgeCastKind Kind, SourceLocation BridgeKeywordLoc, TypeSourceInfo *TSInfo, Expr *SubExpr)
StmtResult ActOnObjCAtCatchStmt(SourceLocation AtLoc, SourceLocation RParen, Decl *Parm, Stmt *Body)
StmtResult ActOnObjCAutoreleasePoolStmt(SourceLocation AtLoc, Stmt *Body)
ExprResult BuildObjCSubscriptExpression(SourceLocation RB, Expr *BaseExpr, Expr *IndexExpr, ObjCMethodDecl *getterMethod, ObjCMethodDecl *setterMethod)
Build an ObjC subscript pseudo-object expression, given that that's supported by the runtime.
ArrayRef< Expr * > getIntExprs()
ArrayRef< Expr * > getQueueIdExprs() const
OpenACCDirectiveKind getDirectiveKind() const
SourceLocation getEndLoc() const
void setLParenLoc(SourceLocation EndLoc)
void setConditionDetails(Expr *ConditionExpr)
void setCollapseDetails(bool IsForce, Expr *LoopCount)
OpenACCClauseKind getClauseKind() const
const Expr * getConditionExpr() const
SourceLocation getLParenLoc() const
SourceLocation getBeginLoc() const
void setDefaultDetails(OpenACCDefaultClauseKind DefKind)
SourceLocation getQueuesLoc() const
void setVarListDetails(ArrayRef< Expr * > VarList, bool IsReadOnly, bool IsZero)
Expr * getDevNumExpr() const
ArrayRef< Expr * > getVarList()
unsigned getNumIntExprs() const
void setWaitDetails(Expr *DevNum, SourceLocation QueuesLoc, llvm::SmallVector< Expr * > &&IntExprs)
void setEndLoc(SourceLocation EndLoc)
Expr * getLoopCount() const
void setIntExprDetails(ArrayRef< Expr * > IntExprs)
OpenACCDefaultClauseKind getDefaultClauseKind() const
void ActOnWhileStmt(SourceLocation WhileLoc)
StmtResult ActOnEndStmtDirective(OpenACCDirectiveKind K, SourceLocation StartLoc, SourceLocation DirLoc, SourceLocation LParenLoc, SourceLocation MiscLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc, SourceLocation EndLoc, ArrayRef< OpenACCClause * > Clauses, StmtResult AssocStmt)
Called after the directive has been completely parsed, including the declaration group or associated ...
ExprResult ActOnOpenACCAsteriskSizeExpr(SourceLocation AsteriskLoc)
void ActOnDoStmt(SourceLocation DoLoc)
void ActOnRangeForStmtBegin(SourceLocation ForLoc, const Stmt *OldRangeFor, const Stmt *RangeFor)
void ActOnForStmtEnd(SourceLocation ForLoc, StmtResult Body)
void ActOnForStmtBegin(SourceLocation ForLoc, const Stmt *First, const Stmt *Second, const Stmt *Third)
ExprResult ActOnArraySectionExpr(Expr *Base, SourceLocation LBLoc, Expr *LowerBound, SourceLocation ColonLocFirst, Expr *Length, SourceLocation RBLoc)
Checks and creates an Array Section used in an OpenACC construct/clause.
OMPClause * ActOnOpenMPNocontextClause(Expr *Condition, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'nocontext' clause.
OMPClause * ActOnOpenMPXDynCGroupMemClause(Expr *Size, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on a well-formed 'ompx_dyn_cgroup_mem' clause.
OMPClause * ActOnOpenMPSafelenClause(Expr *Length, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'safelen' clause.
OMPClause * ActOnOpenMPHoldsClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'holds' clause.
OMPClause * ActOnOpenMPDefaultClause(llvm::omp::DefaultKind Kind, SourceLocation KindLoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'default' clause.
OMPClause * ActOnOpenMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'filter' clause.
OMPClause * ActOnOpenMPFullClause(SourceLocation StartLoc, SourceLocation EndLoc)
Called on well-form 'full' clauses.
OMPClause * ActOnOpenMPDetachClause(Expr *Evt, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'detach' clause.
OMPClause * ActOnOpenMPUseClause(Expr *InteropVar, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation VarLoc, SourceLocation EndLoc)
Called on well-formed 'use' clause.
OMPClause * ActOnOpenMPToClause(ArrayRef< OpenMPMotionModifierKind > MotionModifiers, ArrayRef< SourceLocation > MotionModifiersLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperId, SourceLocation ColonLoc, ArrayRef< Expr * > VarList, const OMPVarListLocTy &Locs, ArrayRef< Expr * > UnresolvedMappers={})
Called on well-formed 'to' clause.
OMPClause * ActOnOpenMPPrivateClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'private' clause.
OMPClause * ActOnOpenMPOrderedClause(SourceLocation StartLoc, SourceLocation EndLoc, SourceLocation LParenLoc=SourceLocation(), Expr *NumForLoops=nullptr)
Called on well-formed 'ordered' clause.
OMPClause * ActOnOpenMPIsDevicePtrClause(ArrayRef< Expr * > VarList, const OMPVarListLocTy &Locs)
Called on well-formed 'is_device_ptr' clause.
OMPClause * ActOnOpenMPHasDeviceAddrClause(ArrayRef< Expr * > VarList, const OMPVarListLocTy &Locs)
Called on well-formed 'has_device_addr' clause.
OMPClause * ActOnOpenMPPartialClause(Expr *FactorExpr, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-form 'partial' clauses.
OMPClause * ActOnOpenMPLastprivateClause(ArrayRef< Expr * > VarList, OpenMPLastprivateModifier LPKind, SourceLocation LPKindLoc, SourceLocation ColonLoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'lastprivate' clause.
OMPClause * ActOnOpenMPFirstprivateClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'firstprivate' clause.
OMPClause * ActOnOpenMPPriorityClause(Expr *Priority, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'priority' clause.
OMPClause * ActOnOpenMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc)
Called on well-formed 'dist_schedule' clause.
OMPClause * ActOnOpenMPPermutationClause(ArrayRef< Expr * > PermExprs, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-form 'permutation' clause after parsing its arguments.
OMPClause * ActOnOpenMPNontemporalClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'nontemporal' clause.
OMPClause * ActOnOpenMPFromClause(ArrayRef< OpenMPMotionModifierKind > MotionModifiers, ArrayRef< SourceLocation > MotionModifiersLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperId, SourceLocation ColonLoc, ArrayRef< Expr * > VarList, const OMPVarListLocTy &Locs, ArrayRef< Expr * > UnresolvedMappers={})
Called on well-formed 'from' clause.
OMPClause * ActOnOpenMPBindClause(OpenMPBindClauseKind Kind, SourceLocation KindLoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on a well-formed 'bind' clause.
OMPClause * ActOnOpenMPThreadLimitClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'thread_limit' clause.
OMPClause * ActOnOpenMPSharedClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'shared' clause.
OMPClause * ActOnOpenMPCopyinClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'copyin' clause.
OMPClause * ActOnOpenMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation VarLoc, SourceLocation EndLoc)
Called on well-formed 'destroy' clause.
OMPClause * ActOnOpenMPAffinityClause(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, Expr *Modifier, ArrayRef< Expr * > Locators)
Called on well-formed 'affinity' clause.
OMPClause * ActOnOpenMPNumTeamsClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'num_teams' clause.
OMPClause * ActOnOpenMPDependClause(const OMPDependClause::DependDataTy &Data, Expr *DepModifier, ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'depend' clause.
OMPClause * ActOnOpenMPDoacrossClause(OpenMPDoacrossClauseModifier DepType, SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'doacross' clause.
OMPClause * ActOnOpenMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier, Expr *Size, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ModifierLoc, SourceLocation EndLoc)
Called on well-formed 'grainsize' clause.
ExprResult ActOnOMPArraySectionExpr(Expr *Base, SourceLocation LBLoc, Expr *LowerBound, SourceLocation ColonLocFirst, SourceLocation ColonLocSecond, Expr *Length, Expr *Stride, SourceLocation RBLoc)
ExprResult ActOnOMPIteratorExpr(Scope *S, SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, ArrayRef< OMPIteratorData > Data)
OMPClause * ActOnOpenMPUsesAllocatorClause(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef< UsesAllocatorsData > Data)
Called on well-formed 'uses_allocators' clause.
OMPClause * ActOnOpenMPAllocatorClause(Expr *Allocator, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'allocator' clause.
OMPClause * ActOnOpenMPInclusiveClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'inclusive' clause.
OMPClause * ActOnOpenMPTaskReductionClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId, ArrayRef< Expr * > UnresolvedReductions={})
Called on well-formed 'task_reduction' clause.
OMPClause * ActOnOpenMPOrderClause(OpenMPOrderClauseModifier Modifier, OpenMPOrderClauseKind Kind, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation MLoc, SourceLocation KindLoc, SourceLocation EndLoc)
Called on well-formed 'order' clause.
OMPClause * ActOnOpenMPReductionClause(ArrayRef< Expr * > VarList, OpenMPReductionClauseModifier Modifier, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ModifierLoc, SourceLocation ColonLoc, SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId, ArrayRef< Expr * > UnresolvedReductions={})
Called on well-formed 'reduction' clause.
OMPClause * ActOnOpenMPSizesClause(ArrayRef< Expr * > SizeExprs, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-form 'sizes' clause.
OMPClause * ActOnOpenMPDeviceClause(OpenMPDeviceClauseModifier Modifier, Expr *Device, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ModifierLoc, SourceLocation EndLoc)
Called on well-formed 'device' clause.
OMPClause * ActOnOpenMPNumThreadsClause(Expr *NumThreads, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'num_threads' clause.
OMPClause * ActOnOpenMPInReductionClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId, ArrayRef< Expr * > UnresolvedReductions={})
Called on well-formed 'in_reduction' clause.
OMPClause * ActOnOpenMPFlushClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'flush' pseudo clause.
StmtResult ActOnOpenMPExecutableDirective(OpenMPDirectiveKind Kind, const DeclarationNameInfo &DirName, OpenMPDirectiveKind CancelRegion, ArrayRef< OMPClause * > Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc)
OMPClause * ActOnOpenMPMessageClause(Expr *MS, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'message' clause.
OMPClause * ActOnOpenMPScheduleClause(OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc)
Called on well-formed 'schedule' clause.
OMPClause * ActOnOpenMPSimdlenClause(Expr *Length, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'simdlen' clause.
OMPClause * ActOnOpenMPUseDevicePtrClause(ArrayRef< Expr * > VarList, const OMPVarListLocTy &Locs)
Called on well-formed 'use_device_ptr' clause.
OMPClause * ActOnOpenMPProcBindClause(llvm::omp::ProcBindKind Kind, SourceLocation KindLoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'proc_bind' clause.
OMPClause * ActOnOpenMPXBareClause(SourceLocation StartLoc, SourceLocation EndLoc)
Called on a well-formed 'ompx_bare' clause.
StmtResult ActOnOpenMPInformationalDirective(OpenMPDirectiveKind Kind, const DeclarationNameInfo &DirName, ArrayRef< OMPClause * > Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc)
Process an OpenMP informational directive.
StmtResult ActOnOpenMPCanonicalLoop(Stmt *AStmt)
Called for syntactical loops (ForStmt or CXXForRangeStmt) associated to an OpenMP loop directive.
OMPClause * ActOnOpenMPHintClause(Expr *Hint, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'hint' clause.
ExprResult ActOnOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, SourceLocation RParenLoc, ArrayRef< Expr * > Dims, ArrayRef< SourceRange > Brackets)
OMPClause * ActOnOpenMPAtClause(OpenMPAtClauseKind Kind, SourceLocation KindLoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'at' clause.
OMPClause * ActOnOpenMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation VarLoc, SourceLocation EndLoc)
Called on well-formed 'init' clause.
OMPClause * ActOnOpenMPUseDeviceAddrClause(ArrayRef< Expr * > VarList, const OMPVarListLocTy &Locs)
Called on well-formed 'use_device_addr' clause.
OMPClause * ActOnOpenMPAllocateClause(Expr *Allocator, Expr *Alignment, OpenMPAllocateClauseModifier FirstModifier, SourceLocation FirstModifierLoc, OpenMPAllocateClauseModifier SecondModifier, SourceLocation SecondModifierLoc, ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation ColonLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'allocate' clause.
OMPClause * ActOnOpenMPFinalClause(Expr *Condition, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'final' clause.
OMPClause * ActOnOpenMPMapClause(Expr *IteratorModifier, ArrayRef< OpenMPMapModifierKind > MapTypeModifiers, ArrayRef< SourceLocation > MapTypeModifiersLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperId, OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef< Expr * > VarList, const OMPVarListLocTy &Locs, bool NoDiagnose=false, ArrayRef< Expr * > UnresolvedMappers={})
Called on well-formed 'map' clause.
OMPClause * ActOnOpenMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier, Expr *NumTasks, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ModifierLoc, SourceLocation EndLoc)
Called on well-formed 'num_tasks' clause.
OMPClause * ActOnOpenMPSeverityClause(OpenMPSeverityClauseKind Kind, SourceLocation KindLoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'severity' clause.
OMPClause * ActOnOpenMPLinearClause(ArrayRef< Expr * > VarList, Expr *Step, SourceLocation StartLoc, SourceLocation LParenLoc, OpenMPLinearClauseKind LinKind, SourceLocation LinLoc, SourceLocation ColonLoc, SourceLocation StepModifierLoc, SourceLocation EndLoc)
Called on well-formed 'linear' clause.
OMPClause * ActOnOpenMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, OpenMPDefaultmapClauseKind Kind, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation MLoc, SourceLocation KindLoc, SourceLocation EndLoc)
Called on well-formed 'defaultmap' clause.
OMPClause * ActOnOpenMPAlignedClause(ArrayRef< Expr * > VarList, Expr *Alignment, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc)
Called on well-formed 'aligned' clause.
OMPClause * ActOnOpenMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'depobj' pseudo clause.
OMPClause * ActOnOpenMPNovariantsClause(Expr *Condition, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'novariants' clause.
OMPClause * ActOnOpenMPCopyprivateClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'copyprivate' clause.
OMPClause * ActOnOpenMPCollapseClause(Expr *NumForLoops, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'collapse' clause.
OMPClause * ActOnOpenMPAlignClause(Expr *Alignment, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'align' clause.
OMPClause * ActOnOpenMPXAttributeClause(ArrayRef< const Attr * > Attrs, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on a well-formed 'ompx_attribute' clause.
OMPClause * ActOnOpenMPExclusiveClause(ArrayRef< Expr * > VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'exclusive' clause.
OMPClause * ActOnOpenMPIfClause(OpenMPDirectiveKind NameModifier, Expr *Condition, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation NameModifierLoc, SourceLocation ColonLoc, SourceLocation EndLoc)
Called on well-formed 'if' clause.
ExprResult checkAssignment(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opcode, Expr *LHS, Expr *RHS)
Expr * recreateSyntacticForm(PseudoObjectExpr *E)
Given a pseudo-object expression, recreate what it looks like syntactically without the attendant Opa...
ExprResult checkRValue(Expr *E)
ExprResult BuildUniqueStableNameExpr(SourceLocation OpLoc, SourceLocation LParen, SourceLocation RParen, TypeSourceInfo *TSI)
RAII object used to change the argument pack substitution index within a Sema object.
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
A RAII object to enter scope of a compound statement.
A helper class for building up ExtParameterInfos.
const FunctionProtoType::ExtParameterInfo * getPointerOrNull(unsigned numParams)
Return a pointer (suitable for setting in an ExtProtoInfo) to the ExtParameterInfo array we've built ...
void set(unsigned index, FunctionProtoType::ExtParameterInfo info)
Set the ExtParameterInfo for the parameter at the given index,.
Records and restores the CurFPFeatures state on entry/exit of compound statements.
Sema - This implements semantic analysis and AST building for C.
QualType BuildParenType(QualType T)
Build a paren type including T.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
bool CheckSpecifiedExceptionType(QualType &T, SourceRange Range)
CheckSpecifiedExceptionType - Check if the given type is valid in an exception specification.
ExprResult BuildOperatorCoawaitCall(SourceLocation Loc, Expr *E, UnresolvedLookupExpr *Lookup)
Build a call to 'operator co_await' if there is a suitable operator for the given expression.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
StmtResult BuildMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, NestedNameSpecifierLoc QualifierLoc, DeclarationNameInfo NameInfo, Stmt *Nested)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend)
Check that the expression co_await promise.final_suspend() shall not be potentially-throwing.
QualType BuildAddressSpaceAttr(QualType &T, LangAS ASIdx, Expr *AddrSpace, SourceLocation AttrLoc)
BuildAddressSpaceAttr - Builds a DependentAddressSpaceType if an expression is uninstantiated.
ExprResult ActOnConstantExpression(ExprResult Res)
StmtResult ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, ArrayRef< Token > AsmToks, StringRef AsmString, unsigned NumOutputs, unsigned NumInputs, ArrayRef< StringRef > Constraints, ArrayRef< StringRef > Clobbers, ArrayRef< Expr * > Exprs, SourceLocation EndLoc)
StmtResult BuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs)
ExprResult BuildCoyieldExpr(SourceLocation KwLoc, Expr *E)
static std::enable_if_t< std::is_base_of_v< Attr, AttrInfo >, SourceLocation > getAttrLoc(const AttrInfo &AL)
A helper function to provide Attribute Location for the Attr types AND the ParsedAttr.
QualType BuildVectorType(QualType T, Expr *VecSize, SourceLocation AttrLoc)
StmtResult BuildAttributedStmt(SourceLocation AttrsLoc, ArrayRef< const Attr * > Attrs, Stmt *SubStmt)
@ IER_DoesNotExist
The symbol does not exist.
@ IER_Dependent
The name is a dependent name, so the results will differ from one instantiation to the next.
@ IER_Error
An error occurred.
@ IER_Exists
The symbol exists.
void ActOnStartStmtExpr()
ExprResult BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc, sema::LambdaScopeInfo *LSI)
Complete a lambda-expression having processed and attached the lambda body.
void ActOnStmtExprError()
void MarkDeclarationsReferencedInExpr(Expr *E, bool SkipLocalVariables=false, ArrayRef< const Expr * > StopAt={})
Mark any declarations that appear within this expression or any potentially-evaluated subexpressions ...
std::optional< FunctionEffectMode > ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName)
Try to parse the conditional expression attached to an effect attribute (e.g.
VarDecl * buildCoroutinePromise(SourceLocation Loc)
ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E, bool IsConstexpr=false)
CheckBooleanCondition - Diagnose problems involving the use of the given expression as a boolean cond...
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
@ Switch
An integral condition for a 'switch' statement.
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
ExprResult BuildBuiltinBitCastExpr(SourceLocation KWLoc, TypeSourceInfo *TSI, Expr *Operand, SourceLocation RParenLoc)
StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl)
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
StmtResult BuildCoreturnStmt(SourceLocation KwLoc, Expr *E, bool IsImplicit=false)
ExprResult ActOnStartCXXMemberReference(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, ParsedType &ObjectType, bool &MayBePseudoDestructor)
ExprResult ActOnCaseExpr(SourceLocation CaseLoc, ExprResult Val)
QualType BuildExtVectorType(QualType T, Expr *ArraySize, SourceLocation AttrLoc)
Build an ext-vector type.
ExprResult ActOnDesignatedInitializer(Designation &Desig, SourceLocation EqualOrColonLoc, bool GNUSyntax, ExprResult Init)
ExprResult BuildStmtExpr(SourceLocation LPLoc, Stmt *SubStmt, SourceLocation RPLoc, unsigned TemplateDepth)
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
ExprResult BuildResolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, Expr *Awaiter, bool IsImplicit=false)
ExprResult BuildVAArgExpr(SourceLocation BuiltinLoc, Expr *E, TypeSourceInfo *TInfo, SourceLocation RPLoc)
ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *Operand)
ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc)
Build a C++ typeid expression with a type operand.
QualType BuildFunctionType(QualType T, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc, DeclarationName Entity, const FunctionProtoType::ExtProtoInfo &EPI)
Build a function type.
ExprResult PerformMemberExprBaseConversion(Expr *Base, bool IsArrow)
Perform conversions on the LHS of a member access expression.
DiagnosticsEngine & getDiagnostics() const
concepts::TypeRequirement * BuildTypeRequirement(TypeSourceInfo *Type)
TypeSourceInfo * CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc, std::optional< unsigned > NumExpansions)
Construct a pack expansion type from the pattern of the pack expansion.
ExprResult BuildPackIndexingExpr(Expr *PackExpression, SourceLocation EllipsisLoc, Expr *IndexExpr, SourceLocation RSquareLoc, ArrayRef< Expr * > ExpandedExprs={}, bool FullySubstituted=false)
ParsedType getDestructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectType, bool EnteringContext)
ASTContext & getASTContext() const
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *Input, bool IsAfterAmp=false)
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
StmtResult ActOnSEHTryBlock(bool IsCXXTry, SourceLocation TryLoc, Stmt *TryBlock, Stmt *Handler)
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
ExprResult BuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK)
ExprResult BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo, SourceLocation RParenLoc, Expr *LiteralExpr)
ExprResult ActOnAddrLabel(SourceLocation OpLoc, SourceLocation LabLoc, LabelDecl *TheDecl)
ActOnAddrLabel - Parse the GNU address of label extension: "&&foo".
ExprResult ActOnParenListExpr(SourceLocation L, SourceLocation R, MultiExprArg Val)
QualType BuildCountAttributedArrayOrPointerType(QualType WrappedTy, Expr *CountExpr, bool CountInBytes, bool OrNull)
ExprResult BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, QualType AllocType, TypeSourceInfo *AllocTypeInfo, std::optional< Expr * > ArraySize, SourceRange DirectInitRange, Expr *Initializer)
bool isAcceptableTagRedeclaration(const TagDecl *Previous, TagTypeKind NewTag, bool isDefinition, SourceLocation NewTagLoc, const IdentifierInfo *Name)
Determine whether a tag with a given kind is acceptable as a redeclaration of the given tag declarati...
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
QualType BuildBitIntType(bool IsUnsigned, Expr *BitWidth, SourceLocation Loc)
Build a bit-precise integer type.
ExprResult ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr, SourceLocation RPLoc)
ExprResult CreateGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef< TypeSourceInfo * > Types, ArrayRef< Expr * > Exprs)
ControllingExprOrType is either a TypeSourceInfo * or an Expr *.
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
StmtResult ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, Stmt *Body)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
const LangOptions & getLangOpts() const
StmtResult ActOnWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, ConditionResult Cond, SourceLocation RParenLoc, Stmt *Body)
ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee, SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, std::optional< unsigned > NumExpansions)
bool isPotentialImplicitMemberAccess(const CXXScopeSpec &SS, LookupResult &R, bool IsAddressOfOperand)
Check whether an expression might be an implicit class member access.
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
ExprResult BuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy, SourceLocation BuiltinLoc, SourceLocation RPLoc, DeclContext *ParentContext)
ExprResult BuildCXXTypeConstructExpr(TypeSourceInfo *Type, SourceLocation LParenLoc, MultiExprArg Exprs, SourceLocation RParenLoc, bool ListInitialization)
ExprResult BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef< OffsetOfComponent > Components, SourceLocation RParenLoc)
__builtin_offsetof(type, a.b[123][456].c)
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
ExprResult ConvertVectorExpr(Expr *E, TypeSourceInfo *TInfo, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
ConvertVectorExpr - Handle __builtin_convertvector.
QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)
ExprResult BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc, ArrayRef< TypeSourceInfo * > Args, SourceLocation RParenLoc)
DeclContext * getCurLexicalContext() const
ExprResult BuildUnresolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, UnresolvedLookupExpr *Lookup)
NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK)
Given a non-tag type declaration, returns an enum useful for indicating what kind of non-tag type thi...
ExprResult BuildExpressionTrait(ExpressionTrait OET, SourceLocation KWLoc, Expr *Queried, SourceLocation RParen)
bool buildCoroutineParameterMoves(SourceLocation Loc)
ExprResult BuildCStyleCastExpr(SourceLocation LParenLoc, TypeSourceInfo *Ty, SourceLocation RParenLoc, Expr *Op)
ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc)
Build a Microsoft __uuidof expression with a type operand.
sema::FunctionScopeInfo * getCurFunction() const
DeclGroupPtrTy BuildDeclaratorGroup(MutableArrayRef< Decl * > Group)
BuildDeclaratorGroup - convert a list of declarations into a declaration group, performing any necess...
Expr * BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit)
Build a CXXThisExpr and mark it referenced in the current context.
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
int ArgumentPackSubstitutionIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
VarDecl * BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id)
Perform semantic analysis for the variable declaration that occurs within a C++ catch clause,...
bool BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo, bool EnteringContext, CXXScopeSpec &SS, NamedDecl *ScopeLookupResult, bool ErrorRecoveryLookup, bool *IsCorrectedToColon=nullptr, bool OnlyNamespace=false)
Build a new nested-name-specifier for "identifier::", as described by ActOnCXXNestedNameSpecifier.
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
ExprResult BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand, SourceLocation RParen)
ExprResult BuildQualifiedDeclarationNameExpr(CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, bool IsAddressOfOperand, TypeSourceInfo **RecoveryTSI=nullptr)
BuildQualifiedDeclarationNameExpr - Build a C++ qualified declaration name, generally during template...
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc, SourceLocation StarLoc, Expr *DestExp)
ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E)
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
ExprResult BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl, CXXConstructorDecl *Constructor, MultiExprArg Exprs, bool HadMultipleCandidates, bool IsListInitialization, bool IsStdInitListInitialization, bool RequiresZeroInit, CXXConstructionKind ConstructKind, SourceRange ParenRange)
BuildCXXConstructExpr - Creates a complete call to a constructor, including handling of its default a...
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
@ TryCapture_ExplicitByVal
@ TryCapture_ExplicitByRef
ExprResult BuildAsTypeExpr(Expr *E, QualType DestTy, SourceLocation BuiltinLoc, SourceLocation RParenLoc)
Create a new AsTypeExpr node (bitcast) from the arguments.
ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, FieldDecl *Field, DeclAccessPair FoundDecl, const DeclarationNameInfo &MemberNameInfo)
bool CheckRebuiltStmtAttributes(ArrayRef< const Attr * > Attrs)
ExprResult ActOnConditionalOp(SourceLocation QuestionLoc, SourceLocation ColonLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr)
ActOnConditionalOp - Parse a ?: operation.
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
concepts::ExprRequirement * BuildExprRequirement(Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc, concepts::ExprRequirement::ReturnTypeRequirement ReturnTypeRequirement)
QualType BuildAtomicType(QualType T, SourceLocation Loc)
QualType CheckTemplateIdType(TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs)
void ActOnInitializerError(Decl *Dcl)
ActOnInitializerError - Given that there was an error parsing an initializer for the given declaratio...
bool diagnoseConflictingFunctionEffect(const FunctionEffectsRef &FX, const FunctionEffectWithCondition &EC, SourceLocation NewAttrLoc)
Warn and return true if adding a function effect to a set would create a conflict.
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, bool AllowRecovery=false)
ExprResult BuildPseudoDestructorExpr(Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc, SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
QualType BuildPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a pointer type.
StmtResult BuildCXXForRangeStmt(SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End, Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc, BuildForRangeKind Kind, ArrayRef< MaterializeTemporaryExpr * > LifetimeExtendTemps={})
BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
StmtResult ActOnDoStmt(SourceLocation DoLoc, Stmt *Body, SourceLocation WhileLoc, SourceLocation CondLParen, Expr *Cond, SourceLocation CondRParen)
StmtResult ActOnStartOfSwitchStmt(SourceLocation SwitchLoc, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc)
ExprResult BuildQualifiedTemplateIdExpr(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, bool IsAddressOfOperand)
ExprResult BuiltinShuffleVector(CallExpr *TheCall)
BuiltinShuffleVector - Handle __builtin_shufflevector.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
QualType BuildDecltypeType(Expr *E, bool AsUnevaluated=true)
If AsUnevaluated is false, E is treated as though it were an evaluated context, such as when building...
QualType BuildUnaryTransformType(QualType BaseType, UTTKind UKind, SourceLocation Loc)
StmtResult ActOnSEHExceptBlock(SourceLocation Loc, Expr *FilterExpr, Stmt *Block)
ExprResult CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo, SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, SourceRange R)
Build a sizeof or alignof expression given a type operand.
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, BinaryOperatorKind Operator)
ExprResult BuildCXXThrow(SourceLocation OpLoc, Expr *Ex, bool IsThrownVarInScope)
QualType BuildArrayType(QualType T, ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity)
Build an array type.
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
QualType BuildReadPipeType(QualType T, SourceLocation Loc)
Build a Read-only Pipe type.
concepts::NestedRequirement * BuildNestedRequirement(Expr *E)
QualType BuildWritePipeType(QualType T, SourceLocation Loc)
Build a Write-only Pipe type.
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
ExprResult CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &ConceptNameInfo, NamedDecl *FoundDecl, ConceptDecl *NamedConcept, const TemplateArgumentListInfo *TemplateArgs)
void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt)
ActOnCaseStmtBody - This installs a statement as the body of a case.
ExprResult ActOnBlockStmtExpr(SourceLocation CaretLoc, Stmt *Body, Scope *CurScope)
ActOnBlockStmtExpr - This is called when the body of a block statement literal was successfully compl...
QualType BuildTypeofExprType(Expr *E, TypeOfKind Kind)
ExprResult BuildArrayTypeTrait(ArrayTypeTrait ATT, SourceLocation KWLoc, TypeSourceInfo *TSInfo, Expr *DimExpr, SourceLocation RParen)
void MarkMemberReferenced(MemberExpr *E)
Perform reference-marking and odr-use handling for a MemberExpr.
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
QualType BuildMatrixType(QualType T, Expr *NumRows, Expr *NumColumns, SourceLocation AttrLoc)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
ExprResult BuildBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr)
ExprResult PerformObjectMemberConversion(Expr *From, NestedNameSpecifier *Qualifier, NamedDecl *FoundDecl, NamedDecl *Member)
Cast a base object to a member's actual type.
StmtResult ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
ExprResult BuildInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc)
void ActOnBlockStart(SourceLocation CaretLoc, Scope *CurScope)
ActOnBlockStart - This callback is invoked when a block literal is started.
ExprResult ActOnArraySubscriptExpr(Scope *S, Expr *Base, SourceLocation LLoc, MultiExprArg ArgExprs, SourceLocation RLoc)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
ExprResult BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange, SourceLocation RParenLoc, MultiExprArg Args, AtomicExpr::AtomicOp Op, AtomicArgumentOrder ArgOrder=AtomicArgumentOrder::API)
ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr)
ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
static ConditionResult ConditionError()
StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, ArrayRef< Stmt * > Elts, bool isStmtExpr)
SemaPseudoObject & PseudoObject()
StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt)
StmtResult ActOnCXXTryBlock(SourceLocation TryLoc, Stmt *TryBlock, ArrayRef< Stmt * > Handlers)
ActOnCXXTryBlock - Takes a try compound-statement and a number of handlers and creates a try statemen...
StmtResult ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc, Stmt *SubStmt, Scope *CurScope)
ExprResult HandleExprEvaluationContextForTypeof(Expr *E)
StmtResult ActOnCaseStmt(SourceLocation CaseLoc, ExprResult LHS, SourceLocation DotDotDotLoc, ExprResult RHS, SourceLocation ColonLoc)
QualType BuildMemberPointerType(QualType T, QualType Class, SourceLocation Loc, DeclarationName Entity)
Build a member pointer type T Class::*.
QualType BuildBlockPointerType(QualType T, SourceLocation Loc, DeclarationName Entity)
Build a block pointer type.
StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body)
FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
ExprResult CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, Expr *ColumnIdx, SourceLocation RBLoc)
StmtResult ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, IdentifierInfo **Names, MultiExprArg Constraints, MultiExprArg Exprs, Expr *AsmString, MultiExprArg Clobbers, unsigned NumLabels, SourceLocation RParenLoc)
static SizeOfPackExpr * Create(ASTContext &Context, SourceLocation OperatorLoc, NamedDecl *Pack, SourceLocation PackLoc, SourceLocation RParenLoc, std::optional< unsigned > Length=std::nullopt, ArrayRef< TemplateArgument > PartialArgs={})
static bool MayBeDependent(SourceLocIdentKind Kind)
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
SourceLocation getBegin() const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
A structure for storing an already-substituted template template parameter pack.
Wrapper for substituted template type parameters.
Represents the declaration of a struct/union/class/enum.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void addArgument(const TemplateArgumentLoc &Loc)
llvm::ArrayRef< TemplateArgumentLoc > arguments() const
const TemplateArgumentLoc * operator->() const
pointer(TemplateArgumentLoc Arg)
Simple iterator that traverses the template arguments in a container that provides a getArgLoc() memb...
TemplateArgumentLoc operator*() const
TemplateArgumentLocContainerIterator operator++(int)
friend bool operator!=(const TemplateArgumentLocContainerIterator &X, const TemplateArgumentLocContainerIterator &Y)
TemplateArgumentLocContainerIterator()
TemplateArgumentLoc value_type
TemplateArgumentLocContainerIterator(ArgLocContainer &Container, unsigned Index)
friend bool operator==(const TemplateArgumentLocContainerIterator &X, const TemplateArgumentLocContainerIterator &Y)
TemplateArgumentLocContainerIterator & operator++()
std::input_iterator_tag iterator_category
TemplateArgumentLoc reference
pointer operator->() const
const TemplateArgumentLoc * operator->() const
pointer(TemplateArgumentLoc Arg)
Iterator adaptor that invents template argument location information for each of the template argumen...
TemplateArgumentLocInventIterator & operator++()
pointer operator->() const
std::iterator_traits< InputIterator >::difference_type difference_type
reference operator*() const
TemplateArgumentLocInventIterator operator++(int)
friend bool operator==(const TemplateArgumentLocInventIterator &X, const TemplateArgumentLocInventIterator &Y)
TemplateArgumentLocInventIterator(TreeTransform< Derived > &Self, InputIterator Iter)
friend bool operator!=(const TemplateArgumentLocInventIterator &X, const TemplateArgumentLocInventIterator &Y)
std::input_iterator_tag iterator_category
TemplateArgumentLoc reference
TemplateArgumentLoc value_type
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
SourceLocation getTemplateNameLoc() const
TypeSourceInfo * getTypeSourceInfo() const
SourceRange getSourceRange() const LLVM_READONLY
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Expr * getSourceExpression() const
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
bool isNull() const
Determine whether this template name is NULL.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
Stores a list of template parameters for a TemplateDecl and its derived classes.
void setArgLocInfo(unsigned i, TemplateArgumentLocInfo AI)
void setTemplateKeywordLoc(SourceLocation Loc)
void setTemplateNameLoc(SourceLocation Loc)
void setLAngleLoc(SourceLocation Loc)
SourceLocation getTemplateNameLoc() const
void setRAngleLoc(SourceLocation Loc)
Represents a type template specialization; the template must be a class template, a type alias templa...
Wrapper for template type parameters.
The top declaration context.
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
void reserve(size_t Requested)
Ensures that this buffer has at least as much capacity as described.
void TypeWasModifiedSafely(QualType T)
Tell the TypeLocBuilder that the type it is storing has been modified in some safe way that doesn't a...
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
QualType getType() const
Get the type for which this source info wrapper provides information.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
unsigned getFullDataSize() const
Returns the size of the type source info data block.
SourceLocation getTemplateKeywordLoc() const
Get the SourceLocation of the template keyword (if any).
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
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.
QualType getType() const
Return the type wrapped by this type source info.
static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword)
Converts an elaborated type keyword into a TagTypeKind.
ElaboratedTypeKeyword getKeyword() const
The base class of the type hierarchy.
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
bool isFunctionType() const
bool isObjCObjectPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
Base class for declarations which introduce a typedef-name.
Wrapper for source info for typedefs.
TypedefNameDecl * getTypedefNameDecl() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix)
Retrieve the unary opcode that corresponds to the given overloaded operator.
Represents a C++ unqualified-id that has been parsed.
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
CXXRecordDecl * getNamingClass()
Gets the 'naming class' (in the sense of C++0x [class.access.base]p5) of the lookup.
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
A set of unresolved declarations.
void addDecl(NamedDecl *D)
A set of unresolved declarations.
Represents the dependent type named by a dependently-scoped typename using declaration,...
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
@ CInit
C-style initialization with assignment.
@ CallInit
Call-style initialization (C++98)
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isParameterPack() const
Determine whether this variable is actually a function parameter pack or init-capture pack.
A requires-expression requirement which queries the validity and properties of an expression ('simple...
SubstitutionDiagnostic * getExprSubstitutionDiagnostic() const
bool isExprSubstitutionFailure() const
const ReturnTypeRequirement & getReturnTypeRequirement() const
SourceLocation getNoexceptLoc() const
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
const ASTConstraintSatisfaction & getConstraintSatisfaction() const
bool hasInvalidConstraint() const
Expr * getConstraintExpr() const
StringRef getInvalidConstraintEntity()
A static requirement that can be used in a requires-expression to check properties of types and expre...
A requires-expression requirement which queries the existence of a type name or type template special...
bool isSubstitutionFailure() const
SubstitutionDiagnostic * getSubstitutionDiagnostic() const
TypeSourceInfo * getType() const
bool ContainsUnexpandedParameterPack
Whether this contains an unexpanded parameter pack.
CXXRecordDecl * Lambda
The class that describes the lambda.
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
@ AttributedType
The l-value was considered opaque, so the alignment was determined from a type, but that type was an ...
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
const AstTypeMatcher< FunctionType > functionType
Matches FunctionType nodes.
bool Inc(InterpState &S, CodePtr OpPC)
1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value increased by ...
bool Comp(InterpState &S, CodePtr OpPC)
1) Pops the value from the stack.
llvm::PointerUnion< const Decl *, const Expr * > DeclTy
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
ArrayTypeTrait
Names for the array type traits.
AutoTypeKeyword
Which keyword(s) were used to create an AutoType.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
OpenMPDefaultmapClauseModifier
OpenMP modifiers for 'defaultmap' clause.
OpenMPOrderClauseModifier
OpenMP modifiers for 'order' clause.
IfStatementKind
In an if statement, this denotes whether the statement is a constexpr or consteval if statement.
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
OpenMPAtClauseKind
OpenMP attributes for 'at' clause.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_StarThis
Capturing the *this object by copy.
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
@ Invalid
Represents an invalid clause, for the purposes of parsing.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
TypeOfKind
The kind of 'typeof' expression we're after.
OpenMPScheduleClauseModifier
OpenMP modifiers for 'schedule' clause.
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
UnaryExprOrTypeTrait
Names for the "expression or type" traits.
@ Property
The type of a property.
@ Result
The result type of a method or function.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
ArraySizeModifier
Capture whether this is a normal array (e.g.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
ActionResult< Expr * > ExprResult
TagTypeKind
The kind of a tag type.
bool transformOMPMappableExprListClause(TreeTransform< Derived > &TT, OMPMappableExprListClause< T > *C, llvm::SmallVectorImpl< Expr * > &Vars, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperIdInfo, llvm::SmallVectorImpl< Expr * > &UnresolvedMappers)
bool isOpenMPLoopDirective(OpenMPDirectiveKind DKind)
Checks if the specified directive is a directive with an associated loop construct.
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
ActionResult< Stmt * > StmtResult
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
const FunctionProtoType * T
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl * >, SourceLocation > UnexpandedParameterPack
OpenMPDeviceClauseModifier
OpenMP modifiers for 'device' clause.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
OpenMPOrderClauseKind
OpenMP attributes for 'order' clause.
TypeTrait
Names for traits that operate specifically on types.
@ Parens
New-expression has a C++98 paren-delimited initializer.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_Uninstantiated
not instantiated yet
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_Dynamic
throw(T1, T2)
OpenMPScheduleClauseKind
OpenMP attributes for 'schedule' clause.
static QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T)
MutableArrayRef< Expr * > MultiExprArg
OpenMPMapClauseKind
OpenMP mapping kind for 'map' clause.
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
TypeSourceInfo * getNamedTypeInfo() const
getNamedTypeInfo - Returns the source type info associated to the name.
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
Holds information about the various types of exception specification.
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
ExceptionSpecificationType Type
The kind of exception specification this is.
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionEffectsRef FunctionEffects
const ExtParameterInfo * ExtParameterInfos
This structure contains most locations needed for by an OMPVarListClause.
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
Keeps information about an identifier in a nested-name-spec.
Location information for a TemplateArgument.