13#ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14#define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
47#include "llvm/ADT/ArrayRef.h"
48#include "llvm/Support/ErrorHandling.h"
52using namespace llvm::omp;
108template<
typename Derived>
113 class ForgetPartiallySubstitutedPackRAII {
121 ForgetPartiallySubstitutedPackRAII(Derived &Self)
122 : Self(Self), ResetPackSubstIndex(Self.getSema(), -1) {
123 Old = Self.ForgetPartiallySubstitutedPack();
126 ~ForgetPartiallySubstitutedPackRAII() {
127 Self.RememberPartiallySubstitutedPack(Old);
144 Derived &
getDerived() {
return static_cast<Derived&
>(*this); }
148 return static_cast<const Derived&
>(*this);
213 OldLocation = Self.getDerived().getBaseLocation();
214 OldEntity = Self.getDerived().getBaseEntity();
217 Self.getDerived().setBase(Location, Entity);
221 Self.getDerived().setBase(OldLocation, OldEntity);
251 return E->isDefaultArgument();
294 bool &ShouldExpand,
bool &RetainExpansion,
295 std::optional<unsigned> &NumExpansions) {
296 ShouldExpand =
false;
411 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
412#include "clang/Basic/AttrList.inc"
422 const X##Attr *TransformStmt##X##Attr(const Stmt *, const Stmt *, \
423 const X##Attr *A) { \
424 return getDerived().Transform##X##Attr(A); \
426#include "clang/Basic/AttrList.inc"
472 bool *ArgChanged =
nullptr);
481 llvm::DenseMap<Decl *, Decl *>::iterator Known
484 return Known->second;
512 assert(New.size() == 1 &&
513 "must override transformedLocalDecl if performing pack expansion");
551 NamedDecl *FirstQualifierInScope =
nullptr);
596 NamedDecl *FirstQualifierInScope =
nullptr,
597 bool AllowInjectedClassName =
false);
609 bool Uneval =
false);
632 bool Uneval =
false) {
651 template<
typename InputIterator>
655 bool Uneval =
false);
667#define ABSTRACT_TYPELOC(CLASS, PARENT)
668#define TYPELOC(CLASS, PARENT) \
669 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
670#include "clang/AST/TypeLocNodes.def"
674 bool SuppressObjCLifetime);
678 bool SuppressObjCLifetime);
680 template<
typename Fn>
733 return getDerived().TransformFunctionTypeParams(
734 Loc, Params, ParamTypes, ParamInfos, PTypes, PVars, PInfos,
nullptr);
752 KWLoc, Params,
nullptr,
753 nullptr, PTypes, &TransParams, PInfos))
766 std::optional<unsigned> NumExpansions,
767 bool ExpectParameterPack);
794 bool IsAddressOfOperand,
802 bool IsAddressOfOperand);
810#define STMT(Node, Parent) \
811 LLVM_ATTRIBUTE_NOINLINE \
812 StmtResult Transform##Node(Node *S);
813#define VALUESTMT(Node, Parent) \
814 LLVM_ATTRIBUTE_NOINLINE \
815 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
816#define EXPR(Node, Parent) \
817 LLVM_ATTRIBUTE_NOINLINE \
818 ExprResult Transform##Node(Node *E);
819#define ABSTRACT_STMT(Stmt)
820#include "clang/AST/StmtNodes.inc"
822#define GEN_CLANG_CLAUSE_CLASS
823#define CLAUSE_CLASS(Enum, Str, Class) \
824 LLVM_ATTRIBUTE_NOINLINE \
825 OMPClause *Transform##Class(Class *S);
826#include "llvm/Frontend/OpenMP/OMP.inc"
903 const llvm::APInt *Size,
Expr *SizeExpr,
904 unsigned IndexTypeQuals,
SourceRange BracketsRange);
913 const llvm::APInt &Size,
Expr *SizeExpr,
914 unsigned IndexTypeQuals,
924 unsigned IndexTypeQuals,
934 unsigned IndexTypeQuals,
945 unsigned IndexTypeQuals,
983 unsigned NumColumns);
1000 Expr *AddrSpaceExpr,
1070 bool FullySubstituted,
1084 TypeConstraintConcept,
1085 TypeConstraintArgs);
1093 Template, Deduced,
false);
1139 bool AllowInjectedClassName) {
1143 SS.
Adopt(QualifierLoc);
1145 SS, TemplateKWLoc, *Name, NameLoc,
QualType(),
nullptr,
1146 AllowInjectedClassName);
1160 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1177 bool DeducedTSTContext) {
1179 SS.
Adopt(QualifierLoc);
1192 *
Id, IdLoc, DeducedTSTContext);
1210 switch (
Result.getResultKind()) {
1221 llvm_unreachable(
"Tag lookup cannot find non-tags");
1233 switch (
Result.getResultKind()) {
1239 SemaRef.
Diag(IdLoc, diag::err_tag_reference_non_tag)
1240 << SomeDecl << NTK << llvm::to_underlying(Kind);
1246 << llvm::to_underlying(Kind) <<
Id << DC
1255 SemaRef.
Diag(KeywordLoc, diag::err_use_with_wrong_tag) <<
Id;
1256 SemaRef.
Diag(Tag->getLocation(), diag::note_previous_use);
1273 std::optional<unsigned> NumExpansions) {
1318 bool AllowInjectedClassName);
1331 bool AllowInjectedClassName);
1341 Decl *AssociatedDecl,
unsigned Index,
1344 ArgPack, AssociatedDecl, Index, Final);
1422 Then, ElseLoc, Else);
1476 Inc, RParenLoc, Body);
1521 bool IsVolatile,
unsigned NumOutputs,
1528 NumInputs, Names, Constraints, Exprs,
1529 AsmString, Clobbers, NumLabels, RParenLoc);
1538 StringRef AsmString,
1539 unsigned NumOutputs,
unsigned NumInputs,
1545 NumOutputs, NumInputs,
1546 Constraints, Clobbers, Exprs, EndLoc);
1575 CoawaitLoc, Operand, OpCoawaitLookup);
1579 Suspend.
get(),
true);
1680 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1692 Kind, DirName, Clauses, AStmt, StartLoc, EndLoc);
1706 NameModifier,
Condition, StartLoc, LParenLoc, NameModifierLoc, ColonLoc,
1817 Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
1830 Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
1843 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1894 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1921 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1922 ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1936 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1937 ReductionId, UnresolvedReductions);
1952 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1953 ReductionId, UnresolvedReductions);
1966 VarList, Step, StartLoc, LParenLoc, Modifier, ModifierLoc, ColonLoc,
1967 StepModifierLoc, EndLoc);
1980 VarList, Alignment, StartLoc, LParenLoc, ColonLoc, EndLoc);
2040 Data, DepModifier, VarList, StartLoc, LParenLoc, EndLoc);
2053 Modifier,
Device, StartLoc, LParenLoc, ModifierLoc, EndLoc);
2068 IteratorModifier, MapTypeModifiers, MapTypeModifiersLoc,
2069 MapperIdScopeSpec, MapperId, MapType, IsMapTypeImplicit, MapLoc,
2070 ColonLoc, VarList, Locs,
2071 false, UnresolvedMappers);
2088 Allocate, Alignment, FirstModifier, FirstModifierLoc, SecondModifier,
2089 SecondModifierLoc, VarList, StartLoc, LParenLoc, ColonLoc, EndLoc);
2137 Modifier,
Device, StartLoc, LParenLoc, ModifierLoc, EndLoc);
2150 Modifier, NumTasks, StartLoc, LParenLoc, ModifierLoc, EndLoc);
2185 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2200 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2201 ColonLoc, VarList, Locs, UnresolvedMappers);
2216 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2217 ColonLoc, VarList, Locs, UnresolvedMappers);
2268 M, Kind, StartLoc, LParenLoc, MLoc, KindLoc, EndLoc);
2315 StartLoc, LParenLoc, EndLoc,
Data);
2328 StartLoc, LParenLoc, ColonLoc, EndLoc, Modifier, Locators);
2340 Modifier, Kind, StartLoc, LParenLoc, ModifierKwLoc, KindKwLoc, EndLoc);
2353 InteropVar, InteropInfo, StartLoc, LParenLoc, VarLoc, EndLoc);
2364 LParenLoc, VarLoc, EndLoc);
2376 InteropVar, StartLoc, LParenLoc, VarLoc, EndLoc);
2515 DepType, DepLoc, ColonLoc, VarList, StartLoc, LParenLoc, EndLoc);
2563 ForLoc, Element, Collection, RParenLoc);
2581 StartLoc, IdLoc,
Id);
2619 if (RangeStmt->isSingleDecl()) {
2620 if (
VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2621 if (RangeVar->isInvalidDecl())
2624 Expr *RangeExpr = RangeVar->getInit();
2631 diag::err_objc_for_range_init_stmt)
2632 <<
Init->getSourceRange();
2635 ForLoc, LoopVar, RangeExpr, RParenLoc);
2642 ForLoc, CoawaitLoc,
Init, ColonLoc,
Range,
Begin, End, Cond, Inc,
2656 QualifierLoc, NameInfo, Nested);
2718 SS.
Adopt(QualifierLoc);
2830 if (IsOMPArraySection)
2832 Base, LBracketLoc, LowerBound, ColonLocFirst, ColonLocSecond, Length,
2833 Stride, RBracketLoc);
2835 assert(Stride ==
nullptr && !ColonLocSecond.
isValid() &&
2836 "Stride/second colon not allowed for OpenACC");
2839 Base, LBracketLoc, LowerBound, ColonLocFirst, Length, RBracketLoc);
2851 Base, LParenLoc, RParenLoc, Dims, BracketsRanges);
2863 nullptr, IteratorKwLoc, LLoc, RLoc,
Data);
2873 Expr *ExecConfig =
nullptr) {
2875 nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2882 nullptr, Callee, LParenLoc, Args, RParenLoc);
2900 if (!
Member->getDeclName()) {
2904 assert(
Member->getType()->isRecordType() &&
2905 "unnamed member not of record type?");
2918 if (!isArrow &&
Base->isPRValue()) {
2927 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(
Member),
2933 SS.
Adopt(QualifierLoc);
2936 if (
Base->containsErrors())
2950 if (
getSema().isUnevaluatedContext() &&
Base->isImplicitCXXThis() &&
2951 isa<FieldDecl, IndirectFieldDecl, MSPropertyDecl>(
Member)) {
2952 if (
auto *ThisClass = cast<CXXThisExpr>(
Base)
2955 ->getAsCXXRecordDecl()) {
2956 auto *
Class = cast<CXXRecordDecl>(
Member->getDeclContext());
2959 if (!ThisClass->Equals(
Class) && !ThisClass->isDerivedFrom(
Class))
2967 FirstQualifierInScope,
2968 R, ExplicitTemplateArgs,
3146 Expr *ControllingExpr,
3151 ControllingExpr, Types, Exprs);
3166 ControllingType, Types, Exprs);
3199 case Stmt::CXXStaticCastExprClass:
3200 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
3201 RAngleLoc, LParenLoc,
3202 SubExpr, RParenLoc);
3204 case Stmt::CXXDynamicCastExprClass:
3205 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
3206 RAngleLoc, LParenLoc,
3207 SubExpr, RParenLoc);
3209 case Stmt::CXXReinterpretCastExprClass:
3210 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
3211 RAngleLoc, LParenLoc,
3215 case Stmt::CXXConstCastExprClass:
3216 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
3217 RAngleLoc, LParenLoc,
3218 SubExpr, RParenLoc);
3220 case Stmt::CXXAddrspaceCastExprClass:
3221 return getDerived().RebuildCXXAddrspaceCastExpr(
3222 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
3225 llvm_unreachable(
"Invalid C++ named cast");
3303 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3315 bool ListInitialization) {
3319 if (
auto *PLE = dyn_cast<ParenListExpr>(Sub))
3321 TInfo, LParenLoc,
MultiExprArg(PLE->getExprs(), PLE->getNumExprs()),
3322 RParenLoc, ListInitialization);
3325 ListInitialization);
3389 if (
getSema().CheckCXXThisType(ThisLoc, ThisType))
3399 bool IsThrownVariableInScope) {
3409 Expr *RewrittenExpr) {
3411 RewrittenExpr,
getSema().CurContext);
3445 std::optional<Expr *> ArraySize,
3464 bool IsGlobalDelete,
3515 bool IsAddressOfOperand,
3518 SS.
Adopt(QualifierLoc);
3520 if (TemplateArgs || TemplateKWLoc.
isValid())
3522 SS, TemplateKWLoc, NameInfo, TemplateArgs, IsAddressOfOperand);
3525 SS, NameInfo, IsAddressOfOperand, RecoveryTSI);
3547 bool IsElidable,
MultiExprArg Args,
bool HadMultipleCandidates,
3548 bool ListInitialization,
bool StdInitListInitialization,
3554 if (Constructor->isInheritingConstructor())
3555 FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3558 if (
getSema().CompleteConstructorCall(FoundCtor,
T, Args,
Loc,
3565 HadMultipleCandidates,
3567 StdInitListInitialization,
3568 RequiresZeroInit, ConstructKind,
3576 bool ConstructsVBase,
3577 bool InheritedFromVBase) {
3579 Loc,
T, Constructor, ConstructsVBase, InheritedFromVBase);
3590 bool ListInitialization) {
3592 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3603 bool ListInitialization) {
3605 RParenLoc, ListInitialization);
3622 SS.
Adopt(QualifierLoc);
3625 OperatorLoc, IsArrow,
3627 FirstQualifierInScope,
3629 TemplateArgs,
nullptr);
3645 SS.
Adopt(QualifierLoc);
3648 OperatorLoc, IsArrow,
3650 FirstQualifierInScope,
3651 R, TemplateArgs,
nullptr);
3666 std::optional<unsigned> Length,
3669 RParenLoc, Length, PartialArgs);
3674 Expr *PackIdExpression,
Expr *IndexExpr,
3676 bool FullySubstituted =
false) {
3678 IndexExpr, RSquareLoc, ExpandedExprs,
3708 NamedConcept, TALI);
3726 LocalParameters, RParenLoc, Requirements,
3780 Expr **Elements,
unsigned NumElements) {
3790 RB,
Base, Key, getterMethod, setterMethod);
3822 ReceiverTypeInfo, ReceiverTypeInfo->
getType(),
3837 Sel, Method, LBracLoc,
3838 SelectorLocs, RBracLoc, Args);
3852 nullptr, SuperType, SuperLoc, Sel, Method, LBracLoc,
3853 SelectorLocs, RBracLoc, Args)
3855 Sel, Method, LBracLoc,
3856 SelectorLocs, RBracLoc, Args);
3865 bool IsArrow,
bool IsFreeIvar) {
3874 if (IsFreeIvar &&
Result.isUsable())
3875 cast<ObjCIvarRefExpr>(
Result.get())->setIsFreeIvar(IsFreeIvar);
3911 PropertyLoc,
Base));
3943 assert(!Lookup.
empty() &&
"No __builtin_shufflevector?");
3952 CK_BuiltinFnToFnPtr).
get();
3978 std::optional<unsigned> NumExpansions) {
3983 EllipsisLoc, NumExpansions);
4005 llvm_unreachable(
"Pack expansion pattern has no parameter packs");
4026 std::optional<unsigned> NumExpansions) {
4039 std::optional<unsigned> NumExpansions) {
4041 EllipsisLoc, RHS, RParenLoc,
4050 Init->containsUnexpandedParameterPack();
4051 else if (PVD->hasUninstantiatedDefaultArg())
4053 PVD->getUninstantiatedDefaultArg()
4054 ->containsUnexpandedParameterPack();
4199 Exprs.push_back(DevNumExpr);
4200 Exprs.insert(Exprs.end(), QueueIdExprs.begin(), QueueIdExprs.end());
4203 Exprs, RParenLoc, EndLoc, Clauses, {});
4227 bool DeducibleTSTContext);
4239template <
typename Derived>
4244 switch (S->getStmtClass()) {
4249#define STMT(Node, Parent) \
4250 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
4251#define VALUESTMT(Node, Parent) \
4252 case Stmt::Node##Class: \
4253 return getDerived().Transform##Node(cast<Node>(S), SDK);
4254#define ABSTRACT_STMT(Node)
4255#define EXPR(Node, Parent)
4256#include "clang/AST/StmtNodes.inc"
4259#define STMT(Node, Parent)
4260#define ABSTRACT_STMT(Stmt)
4261#define EXPR(Node, Parent) case Stmt::Node##Class:
4262#include "clang/AST/StmtNodes.inc"
4264 ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
4266 if (SDK == SDK_StmtExprResult)
4267 E = getSema().ActOnStmtExprResult(
E);
4268 return getSema().ActOnExprStmt(
E, SDK == SDK_Discarded);
4275template<
typename Derived>
4280 switch (S->getClauseKind()) {
4283#define GEN_CLANG_CLAUSE_CLASS
4284#define CLAUSE_CLASS(Enum, Str, Class) \
4286 return getDerived().Transform##Class(cast<Class>(S));
4287#include "llvm/Frontend/OpenMP/OMP.inc"
4294template<
typename Derived>
4301#define STMT(Node, Parent) case Stmt::Node##Class: break;
4302#define ABSTRACT_STMT(Stmt)
4303#define EXPR(Node, Parent) \
4304 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
4305#include "clang/AST/StmtNodes.inc"
4311template<
typename Derived>
4319 if (
auto *FE = dyn_cast<FullExpr>(
Init))
4320 Init = FE->getSubExpr();
4322 if (
auto *AIL = dyn_cast<ArrayInitLoopExpr>(
Init)) {
4328 Init = MTE->getSubExpr();
4331 Init = Binder->getSubExpr();
4334 Init = ICE->getSubExprAsWritten();
4337 dyn_cast<CXXStdInitializerListExpr>(
Init))
4338 return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
4345 return getDerived().TransformExpr(
Init);
4350 return getDerived().RebuildParenListExpr(
Parens.getBegin(), {},
4355 if (isa<ImplicitValueInitExpr>(
Init))
4361 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
4362 return getDerived().TransformExpr(
Init);
4367 return TransformInitializer(Construct->
getArg(0), NotCopyInit);
4374 getSema().currentEvaluationContext().InLifetimeExtendingContext =
4375 getSema().parentEvaluationContext().InLifetimeExtendingContext;
4376 getSema().currentEvaluationContext().RebuildDefaultArgOrDefaultInit =
4377 getSema().parentEvaluationContext().RebuildDefaultArgOrDefaultInit;
4379 bool ArgChanged =
false;
4381 true, NewArgs, &ArgChanged))
4386 return getDerived().RebuildInitList(Construct->
getBeginLoc(), NewArgs,
4391 if (
Parens.isInvalid()) {
4394 assert(NewArgs.empty() &&
4395 "no parens or braces but have direct init with arguments?");
4398 return getDerived().RebuildParenListExpr(
Parens.getBegin(), NewArgs,
4402template<
typename Derived>
4408 for (
unsigned I = 0; I != NumInputs; ++I) {
4410 if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
4418 Expr *Pattern = Expansion->getPattern();
4421 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4422 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
4427 bool RetainExpansion =
false;
4428 std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
4429 std::optional<unsigned> NumExpansions = OrigNumExpansions;
4430 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
4433 Expand, RetainExpansion,
4442 ExprResult OutPattern = getDerived().TransformExpr(Pattern);
4446 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.
get(),
4447 Expansion->getEllipsisLoc(),
4449 if (Out.isInvalid())
4454 Outputs.push_back(Out.get());
4460 if (ArgChanged) *ArgChanged =
true;
4464 for (
unsigned I = 0; I != *NumExpansions; ++I) {
4466 ExprResult Out = getDerived().TransformExpr(Pattern);
4467 if (Out.isInvalid())
4470 if (Out.get()->containsUnexpandedParameterPack()) {
4471 Out = getDerived().RebuildPackExpansion(
4472 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4473 if (Out.isInvalid())
4477 Outputs.push_back(Out.get());
4482 if (RetainExpansion) {
4483 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4485 ExprResult Out = getDerived().TransformExpr(Pattern);
4486 if (Out.isInvalid())
4489 Out = getDerived().RebuildPackExpansion(
4490 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4491 if (Out.isInvalid())
4494 Outputs.push_back(Out.get());
4501 IsCall ? getDerived().TransformInitializer(Inputs[I],
false)
4502 : getDerived().TransformExpr(Inputs[I]);
4506 if (
Result.get() != Inputs[I] && ArgChanged)
4509 Outputs.push_back(
Result.get());
4515template <
typename Derived>
4519 VarDecl *ConditionVar = cast_or_null<VarDecl>(
4520 getDerived().TransformDefinition(Var->
getLocation(), Var));
4525 return getSema().ActOnConditionVariable(ConditionVar,
Loc, Kind);
4534 return getSema().ActOnCondition(
nullptr,
Loc, CondExpr.
get(), Kind,
4541template <
typename Derived>
4549 Qualifier = Qualifier.getPrefix())
4565 SS, FirstQualifierInScope,
false))
4572 cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4580 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4595 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4604 FirstQualifierInScope, SS);
4614 diag::warn_cxx98_compat_enum_nested_name_spec);
4617 SS.
Adopt(ETL.getQualifierLoc());
4618 TL = ETL.getNamedTypeLoc();
4637 FirstQualifierInScope =
nullptr;
4643 !getDerived().AlwaysRebuild())
4656template<
typename Derived>
4664 switch (Name.getNameKind()) {
4675 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4676 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4677 getDerived().TransformDecl(NameInfo.
getLoc(), OldTemplate));
4693 NewTInfo = getDerived().TransformType(OldTInfo);
4701 QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4717 llvm_unreachable(
"Unknown name kind.");
4720template<
typename Derived>
4727 bool AllowInjectedClassName) {
4729 TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl();
4730 assert(Template &&
"qualified template name must refer to a template");
4733 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4738 if (!getDerived().AlwaysRebuild() &&
4740 TransTemplate == Template)
4743 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4751 FirstQualifierInScope =
nullptr;
4754 if (!getDerived().AlwaysRebuild() &&
4762 if (DTN->isIdentifier()) {
4763 return getDerived().RebuildTemplateName(SS,
4765 *DTN->getIdentifier(),
4768 FirstQualifierInScope,
4769 AllowInjectedClassName);
4772 return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4773 DTN->getOperator(), NameLoc,
4774 ObjectType, AllowInjectedClassName);
4778 if (
TemplateDecl *Template = Name.getAsTemplateDecl()) {
4780 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4785 return getDerived().RebuildTemplateName(SS,
false,
4790 = Name.getAsSubstTemplateTemplateParmPack()) {
4791 return getDerived().RebuildTemplateName(
4792 SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(),
4793 SubstPack->getIndex(), SubstPack->getFinal());
4797 llvm_unreachable(
"overloaded function decl survived to here");
4800template<
typename Derived>
4804 Output = getSema().getTrivialTemplateArgumentLoc(
4805 Arg,
QualType(), getDerived().getBaseLocation());
4808template <
typename Derived>
4816 llvm_unreachable(
"Unexpected TemplateArgument");
4826 QualType NewT = getDerived().TransformType(
T);
4833 ValueDecl *NewD =
D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4834 getDerived().getBaseLocation(),
D))
4839 if (NewT ==
T &&
D == NewD)
4856 llvm_unreachable(
"unexpected template argument kind");
4866 DI = getDerived().TransformType(DI);
4877 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4883 SS.
Adopt(QualifierLoc);
4884 TemplateName Template = getDerived().TransformTemplateName(
4895 llvm_unreachable(
"Caller should expand pack expansions");
4910 ExprResult E = getDerived().TransformExpr(InputExpr);
4925template<
typename Derived,
typename InputIterator>
4933 typedef typename std::iterator_traits<InputIterator>::difference_type
4963 Self.InventTemplateArgumentLoc(*
Iter,
Result);
4971 return X.Iter == Y.Iter;
4976 return X.Iter != Y.Iter;
4980template<
typename Derived>
4981template<
typename InputIterator>
4998 if (TransformTemplateArguments(PackLocIterator(*
this,
4999 In.getArgument().pack_begin()),
5000 PackLocIterator(*
this,
5001 In.getArgument().pack_end()),
5008 if (In.getArgument().isPackExpansion()) {
5012 std::optional<unsigned> OrigNumExpansions;
5014 = getSema().getTemplateArgumentPackExpansionPattern(
5015 In, Ellipsis, OrigNumExpansions);
5018 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5019 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
5024 bool RetainExpansion =
false;
5025 std::optional<unsigned> NumExpansions = OrigNumExpansions;
5026 if (getDerived().TryExpandParameterPacks(Ellipsis,
5040 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
5043 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
5045 if (Out.getArgument().isNull())
5054 for (
unsigned I = 0; I != *NumExpansions; ++I) {
5057 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
5060 if (Out.getArgument().containsUnexpandedParameterPack()) {
5061 Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
5063 if (Out.getArgument().isNull())
5072 if (RetainExpansion) {
5073 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5075 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
5078 Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
5080 if (Out.getArgument().isNull())
5090 if (getDerived().TransformTemplateArgument(In, Out, Uneval))
5104template<
typename Derived>
5106 if (getDerived().AlreadyTransformed(
T))
5112 getDerived().getBaseLocation());
5122template<
typename Derived>
5126 getDerived().getBaseEntity());
5127 if (getDerived().AlreadyTransformed(DI->
getType()))
5142template<
typename Derived>
5145 switch (
T.getTypeLocClass()) {
5146#define ABSTRACT_TYPELOC(CLASS, PARENT)
5147#define TYPELOC(CLASS, PARENT) \
5148 case TypeLoc::CLASS: \
5149 return getDerived().Transform##CLASS##Type(TLB, \
5150 T.castAs<CLASS##TypeLoc>());
5151#include "clang/AST/TypeLocNodes.def"
5154 llvm_unreachable(
"unhandled type loc!");
5157template<
typename Derived>
5159 if (!isa<DependentNameType>(
T))
5160 return TransformType(
T);
5162 if (getDerived().AlreadyTransformed(
T))
5165 getDerived().getBaseLocation());
5166 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
5170template<
typename Derived>
5173 if (!isa<DependentNameType>(DI->
getType()))
5174 return TransformType(DI);
5178 getDerived().getBaseEntity());
5179 if (getDerived().AlreadyTransformed(DI->
getType()))
5199 Result = getDerived().RebuildQualifiedType(
Result, QTL);
5208template<
typename Derived>
5213 TypeLoc UnqualTL =
T.getUnqualifiedLoc();
5214 auto SuppressObjCLifetime =
5215 T.getType().getLocalQualifiers().hasObjCLifetime();
5217 Result = getDerived().TransformTemplateTypeParmType(TLB, TTP,
5218 SuppressObjCLifetime);
5219 }
else if (
auto STTP = UnqualTL.
getAs<SubstTemplateTypeParmPackTypeLoc>()) {
5220 Result = getDerived().TransformSubstTemplateTypeParmPackType(
5221 TLB, STTP, SuppressObjCLifetime);
5223 Result = getDerived().TransformType(TLB, UnqualTL);
5242template <
typename Derived>
5252 SemaRef.
Diag(
Loc, diag::err_address_space_mismatch_templ_inst)
5283 else if (
T.getObjCLifetime()) {
5288 if ((AutoTy = dyn_cast<AutoType>(
T)) && AutoTy->
isDeduced()) {
5304 SemaRef.
Diag(
Loc, diag::err_attr_objc_ownership_redundant) <<
T;
5313template<
typename Derived>
5319 if (getDerived().AlreadyTransformed(TL.
getType()))
5323 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
5329template<
typename Derived>
5331TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
5332 QualType ObjectType,
5333 NamedDecl *UnqualLookup,
5335 if (getDerived().AlreadyTransformed(TSInfo->getType()))
5338 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
5342template <
typename Derived>
5343TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
5344 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
5346 QualType
T = TL.getType();
5347 assert(!getDerived().AlreadyTransformed(
T));
5352 if (isa<TemplateSpecializationType>(
T)) {
5353 TemplateSpecializationTypeLoc SpecTL =
5354 TL.castAs<TemplateSpecializationTypeLoc>();
5356 TemplateName Template = getDerived().TransformTemplateName(
5357 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
5358 ObjectType, UnqualLookup,
true);
5359 if (Template.isNull())
5362 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
5364 }
else if (isa<DependentTemplateSpecializationType>(
T)) {
5365 DependentTemplateSpecializationTypeLoc SpecTL =
5366 TL.castAs<DependentTemplateSpecializationTypeLoc>();
5368 TemplateName Template
5369 = getDerived().RebuildTemplateName(SS,
5370 SpecTL.getTemplateKeywordLoc(),
5371 *SpecTL.getTypePtr()->getIdentifier(),
5372 SpecTL.getTemplateNameLoc(),
5373 ObjectType, UnqualLookup,
5375 if (Template.isNull())
5378 Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
5384 Result = getDerived().TransformType(TLB, TL);
5393template <
class TyLoc>
static inline
5395 TyLoc NewT = TLB.
push<TyLoc>(
T.getType());
5396 NewT.setNameLoc(
T.getNameLoc());
5400template<
typename Derived>
5401QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
5403 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(
T.getType());
5404 NewT.setBuiltinLoc(
T.getBuiltinLoc());
5405 if (
T.needsExtraLocalData())
5406 NewT.getWrittenBuiltinSpecs() =
T.getWrittenBuiltinSpecs();
5410template<
typename Derived>
5411QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
5417template <
typename Derived>
5418QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
5419 AdjustedTypeLoc TL) {
5421 return getDerived().TransformType(TLB, TL.getOriginalLoc());
5424template<
typename Derived>
5425QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
5426 DecayedTypeLoc TL) {
5427 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
5428 if (OriginalType.isNull())
5431 QualType
Result = TL.getType();
5432 if (getDerived().AlwaysRebuild() ||
5433 OriginalType != TL.getOriginalLoc().getType())
5435 TLB.push<DecayedTypeLoc>(
Result);
5440template <
typename Derived>
5442TreeTransform<Derived>::TransformArrayParameterType(TypeLocBuilder &TLB,
5443 ArrayParameterTypeLoc TL) {
5444 QualType OriginalType = getDerived().TransformType(TLB, TL.getElementLoc());
5445 if (OriginalType.isNull())
5448 QualType
Result = TL.getType();
5449 if (getDerived().AlwaysRebuild() ||
5450 OriginalType != TL.getElementLoc().getType())
5452 TLB.push<ArrayParameterTypeLoc>(
Result);
5457template<
typename Derived>
5458QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
5459 PointerTypeLoc TL) {
5460 QualType PointeeType
5461 = getDerived().TransformType(TLB, TL.getPointeeLoc());
5462 if (PointeeType.isNull())
5465 QualType
Result = TL.getType();
5466 if (PointeeType->getAs<ObjCObjectType>()) {
5473 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(
Result);
5474 NewT.setStarLoc(TL.getStarLoc());
5478 if (getDerived().AlwaysRebuild() ||
5479 PointeeType != TL.getPointeeLoc().getType()) {
5480 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5487 TLB.TypeWasModifiedSafely(
Result->getPointeeType());
5489 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(
Result);
5490 NewT.setSigilLoc(TL.getSigilLoc());
5494template<
typename Derived>
5496TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5497 BlockPointerTypeLoc TL) {
5498 QualType PointeeType
5499 = getDerived().TransformType(TLB, TL.getPointeeLoc());
5500 if (PointeeType.isNull())
5503 QualType
Result = TL.getType();
5504 if (getDerived().AlwaysRebuild() ||
5505 PointeeType != TL.getPointeeLoc().getType()) {
5506 Result = getDerived().RebuildBlockPointerType(PointeeType,
5512 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(
Result);
5513 NewT.setSigilLoc(TL.getSigilLoc());
5521template<
typename Derived>
5529 if (PointeeType.
isNull())
5533 if (getDerived().AlwaysRebuild() ||
5534 PointeeType !=
T->getPointeeTypeAsWritten()) {
5535 Result = getDerived().RebuildReferenceType(PointeeType,
5536 T->isSpelledAsLValue(),
5549 if (isa<LValueReferenceType>(
Result))
5558template<
typename Derived>
5562 return TransformReferenceType(TLB, TL);
5565template<
typename Derived>
5567TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5568 RValueReferenceTypeLoc TL) {
5569 return TransformReferenceType(TLB, TL);
5572template<
typename Derived>
5574TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5575 MemberPointerTypeLoc TL) {
5576 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5577 if (PointeeType.isNull())
5580 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5581 TypeSourceInfo *NewClsTInfo =
nullptr;
5583 NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5588 const MemberPointerType *
T = TL.getTypePtr();
5589 QualType OldClsType = QualType(
T->getClass(), 0);
5590 QualType NewClsType;
5592 NewClsType = NewClsTInfo->getType();
5594 NewClsType = getDerived().TransformType(OldClsType);
5595 if (NewClsType.isNull())
5599 QualType
Result = TL.getType();
5600 if (getDerived().AlwaysRebuild() ||
5602 NewClsType != OldClsType) {
5603 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5611 const MemberPointerType *MPT =
Result->getAs<MemberPointerType>();
5612 if (MPT && PointeeType != MPT->getPointeeType()) {
5613 assert(isa<AdjustedType>(MPT->getPointeeType()));
5614 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5617 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(
Result);
5618 NewTL.setSigilLoc(TL.getSigilLoc());
5619 NewTL.setClassTInfo(NewClsTInfo);
5624template<
typename Derived>
5626TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5627 ConstantArrayTypeLoc TL) {
5628 const ConstantArrayType *
T = TL.getTypePtr();
5629 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5630 if (ElementType.isNull())
5634 Expr *
OldSize = TL.getSizeExpr();
5636 OldSize =
const_cast<Expr*
>(
T->getSizeExpr());
5637 Expr *NewSize =
nullptr;
5641 NewSize = getDerived().TransformExpr(
OldSize).template getAs<Expr>();
5645 QualType
Result = TL.getType();
5646 if (getDerived().AlwaysRebuild() ||
5647 ElementType !=
T->getElementType() ||
5648 (
T->getSizeExpr() && NewSize !=
OldSize)) {
5649 Result = getDerived().RebuildConstantArrayType(ElementType,
5650 T->getSizeModifier(),
5651 T->getSize(), NewSize,
5652 T->getIndexTypeCVRQualifiers(),
5653 TL.getBracketsRange());
5662 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(
Result);
5663 NewTL.setLBracketLoc(TL.getLBracketLoc());
5664 NewTL.setRBracketLoc(TL.getRBracketLoc());
5665 NewTL.setSizeExpr(NewSize);
5670template<
typename Derived>
5671QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5672 TypeLocBuilder &TLB,
5673 IncompleteArrayTypeLoc TL) {
5674 const IncompleteArrayType *
T = TL.getTypePtr();
5675 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5676 if (ElementType.isNull())
5679 QualType
Result = TL.getType();
5680 if (getDerived().AlwaysRebuild() ||
5681 ElementType !=
T->getElementType()) {
5682 Result = getDerived().RebuildIncompleteArrayType(ElementType,
5683 T->getSizeModifier(),
5684 T->getIndexTypeCVRQualifiers(),
5685 TL.getBracketsRange());
5690 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(
Result);
5691 NewTL.setLBracketLoc(TL.getLBracketLoc());
5692 NewTL.setRBracketLoc(TL.getRBracketLoc());
5693 NewTL.setSizeExpr(
nullptr);
5698template<
typename Derived>
5700TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5701 VariableArrayTypeLoc TL) {
5702 const VariableArrayType *
T = TL.getTypePtr();
5703 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5704 if (ElementType.isNull())
5709 EnterExpressionEvaluationContext Context(
5711 SizeResult = getDerived().TransformExpr(
T->getSizeExpr());
5713 if (SizeResult.isInvalid())
5717 if (SizeResult.isInvalid())
5720 Expr *
Size = SizeResult.get();
5722 QualType
Result = TL.getType();
5723 if (getDerived().AlwaysRebuild() ||
5724 ElementType !=
T->getElementType() ||
5725 Size !=
T->getSizeExpr()) {
5726 Result = getDerived().RebuildVariableArrayType(ElementType,
5727 T->getSizeModifier(),
5729 T->getIndexTypeCVRQualifiers(),
5730 TL.getBracketsRange());
5737 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(
Result);
5738 NewTL.setLBracketLoc(TL.getLBracketLoc());
5739 NewTL.setRBracketLoc(TL.getRBracketLoc());
5740 NewTL.setSizeExpr(Size);
5745template<
typename Derived>
5747TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5748 DependentSizedArrayTypeLoc TL) {
5749 const DependentSizedArrayType *
T = TL.getTypePtr();
5750 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5751 if (ElementType.isNull())
5759 SemaRef.
ExprEvalContexts.back().InConditionallyConstantEvaluateContext =
true;
5762 Expr *origSize = TL.getSizeExpr();
5763 if (!origSize) origSize =
T->getSizeExpr();
5766 = getDerived().TransformExpr(origSize);
5768 if (sizeResult.isInvalid())
5771 Expr *size = sizeResult.get();
5773 QualType
Result = TL.getType();
5774 if (getDerived().AlwaysRebuild() ||
5775 ElementType !=
T->getElementType() ||
5777 Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5778 T->getSizeModifier(),
5780 T->getIndexTypeCVRQualifiers(),
5781 TL.getBracketsRange());
5788 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(
Result);
5789 NewTL.setLBracketLoc(TL.getLBracketLoc());
5790 NewTL.setRBracketLoc(TL.getRBracketLoc());
5791 NewTL.setSizeExpr(size);
5796template <
typename Derived>
5797QualType TreeTransform<Derived>::TransformDependentVectorType(
5798 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5799 const DependentVectorType *
T = TL.getTypePtr();
5800 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5801 if (ElementType.isNull())
5809 if (
Size.isInvalid())
5812 QualType
Result = TL.getType();
5813 if (getDerived().AlwaysRebuild() || ElementType !=
T->getElementType() ||
5814 Size.get() !=
T->getSizeExpr()) {
5815 Result = getDerived().RebuildDependentVectorType(
5816 ElementType,
Size.get(),
T->getAttributeLoc(),
T->getVectorKind());
5822 if (isa<DependentVectorType>(
Result)) {
5823 DependentVectorTypeLoc NewTL =
5824 TLB.push<DependentVectorTypeLoc>(
Result);
5825 NewTL.setNameLoc(TL.getNameLoc());
5827 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(
Result);
5828 NewTL.setNameLoc(TL.getNameLoc());
5834template<
typename Derived>
5835QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5836 TypeLocBuilder &TLB,
5837 DependentSizedExtVectorTypeLoc TL) {
5838 const DependentSizedExtVectorType *
T = TL.getTypePtr();
5841 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5842 if (ElementType.isNull())
5851 if (
Size.isInvalid())
5854 QualType
Result = TL.getType();
5855 if (getDerived().AlwaysRebuild() ||
5856 ElementType !=
T->getElementType() ||
5857 Size.get() !=
T->getSizeExpr()) {
5858 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5860 T->getAttributeLoc());
5866 if (isa<DependentSizedExtVectorType>(
Result)) {
5867 DependentSizedExtVectorTypeLoc NewTL
5868 = TLB.push<DependentSizedExtVectorTypeLoc>(
Result);
5869 NewTL.setNameLoc(TL.getNameLoc());
5871 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(
Result);
5872 NewTL.setNameLoc(TL.getNameLoc());
5878template <
typename Derived>
5880TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5881 ConstantMatrixTypeLoc TL) {
5882 const ConstantMatrixType *
T = TL.getTypePtr();
5883 QualType ElementType = getDerived().TransformType(
T->getElementType());
5884 if (ElementType.isNull())
5887 QualType
Result = TL.getType();
5888 if (getDerived().AlwaysRebuild() || ElementType !=
T->getElementType()) {
5889 Result = getDerived().RebuildConstantMatrixType(
5890 ElementType,
T->getNumRows(),
T->getNumColumns());
5895 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(
Result);
5896 NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5897 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5898 NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5899 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5904template <
typename Derived>
5905QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5906 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5907 const DependentSizedMatrixType *
T = TL.getTypePtr();
5909 QualType ElementType = getDerived().TransformType(
T->getElementType());
5910 if (ElementType.isNull()) {
5918 Expr *origRows = TL.getAttrRowOperand();
5920 origRows =
T->getRowExpr();
5921 Expr *origColumns = TL.getAttrColumnOperand();
5923 origColumns =
T->getColumnExpr();
5925 ExprResult rowResult = getDerived().TransformExpr(origRows);
5927 if (rowResult.isInvalid())
5930 ExprResult columnResult = getDerived().TransformExpr(origColumns);
5932 if (columnResult.isInvalid())
5935 Expr *rows = rowResult.get();
5936 Expr *columns = columnResult.get();
5938 QualType
Result = TL.getType();
5939 if (getDerived().AlwaysRebuild() || ElementType !=
T->getElementType() ||
5940 rows != origRows || columns != origColumns) {
5941 Result = getDerived().RebuildDependentSizedMatrixType(
5942 ElementType, rows, columns,
T->getAttributeLoc());
5950 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(
Result);
5951 NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5952 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5953 NewTL.setAttrRowOperand(rows);
5954 NewTL.setAttrColumnOperand(columns);
5958template <
typename Derived>
5959QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5960 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5961 const DependentAddressSpaceType *
T = TL.getTypePtr();
5963 QualType pointeeType =
5964 getDerived().TransformType(TLB, TL.getPointeeTypeLoc());
5966 if (pointeeType.isNull())
5973 ExprResult AddrSpace = getDerived().TransformExpr(
T->getAddrSpaceExpr());
5975 if (AddrSpace.isInvalid())
5978 QualType
Result = TL.getType();
5979 if (getDerived().AlwaysRebuild() || pointeeType !=
T->
getPointeeType() ||
5980 AddrSpace.get() !=
T->getAddrSpaceExpr()) {
5981 Result = getDerived().RebuildDependentAddressSpaceType(
5982 pointeeType, AddrSpace.get(),
T->getAttributeLoc());
5988 if (isa<DependentAddressSpaceType>(
Result)) {
5989 DependentAddressSpaceTypeLoc NewTL =
5990 TLB.push<DependentAddressSpaceTypeLoc>(
Result);
5992 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5993 NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5994 NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5997 TLB.TypeWasModifiedSafely(
Result);
6003template <
typename Derived>
6004QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
6006 const VectorType *
T = TL.getTypePtr();
6007 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
6008 if (ElementType.isNull())
6011 QualType
Result = TL.getType();
6012 if (getDerived().AlwaysRebuild() ||
6013 ElementType !=
T->getElementType()) {
6014 Result = getDerived().RebuildVectorType(ElementType,
T->getNumElements(),
6015 T->getVectorKind());
6020 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(
Result);
6021 NewTL.setNameLoc(TL.getNameLoc());
6026template<
typename Derived>
6027QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
6028 ExtVectorTypeLoc TL) {
6029 const VectorType *
T = TL.getTypePtr();
6030 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
6031 if (ElementType.isNull())
6034 QualType
Result = TL.getType();
6035 if (getDerived().AlwaysRebuild() ||
6036 ElementType !=
T->getElementType()) {
6037 Result = getDerived().RebuildExtVectorType(ElementType,
6038 T->getNumElements(),
6044 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(
Result);
6045 NewTL.setNameLoc(TL.getNameLoc());
6050template <
typename Derived>
6053 std::optional<unsigned> NumExpansions,
bool ExpectParameterPack) {
6057 if (NumExpansions && isa<PackExpansionType>(OldDI->
getType())) {
6084 NewDI = getDerived().TransformType(OldDI);
6088 if (NewDI == OldDI && indexAdjustment == 0)
6102 transformedLocalDecl(OldParm, {newParm});
6106template <
typename Derived>
6114 unsigned *LastParamTransformed) {
6115 int indexAdjustment = 0;
6117 unsigned NumParams = Params.size();
6118 for (
unsigned i = 0; i != NumParams; ++i) {
6119 if (LastParamTransformed)
6120 *LastParamTransformed = i;
6122 assert(OldParm->getFunctionScopeIndex() == i);
6124 std::optional<unsigned> NumExpansions;
6126 if (OldParm->isParameterPack()) {
6131 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
6137 bool ShouldExpand =
false;
6138 bool RetainExpansion =
false;
6139 std::optional<unsigned> OrigNumExpansions;
6140 if (Unexpanded.size() > 0) {
6142 NumExpansions = OrigNumExpansions;
6143 if (getDerived().TryExpandParameterPacks(ExpansionTL.
getEllipsisLoc(),
6144 Pattern.getSourceRange(),
6156 "Could not find parameter packs or undeduced auto type!");
6163 getDerived().ExpandingFunctionParameterPack(OldParm);
6164 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6167 = getDerived().TransformFunctionTypeParam(OldParm,
6175 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6176 OutParamTypes.push_back(NewParm->
getType());
6178 PVars->push_back(NewParm);
6183 if (RetainExpansion) {
6184 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6186 = getDerived().TransformFunctionTypeParam(OldParm,
6194 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6195 OutParamTypes.push_back(NewParm->
getType());
6197 PVars->push_back(NewParm);
6213 NewParm = getDerived().TransformFunctionTypeParam(OldParm,
6218 "Parameter pack no longer a parameter pack after "
6221 NewParm = getDerived().TransformFunctionTypeParam(
6222 OldParm, indexAdjustment, std::nullopt,
6230 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6231 OutParamTypes.push_back(NewParm->
getType());
6233 PVars->push_back(NewParm);
6241 bool IsPackExpansion =
false;
6242 std::optional<unsigned> NumExpansions;
6245 = dyn_cast<PackExpansionType>(OldType)) {
6247 QualType Pattern = Expansion->getPattern();
6249 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
6252 bool ShouldExpand =
false;
6253 bool RetainExpansion =
false;
6265 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6267 QualType NewType = getDerived().TransformType(Pattern);
6272 NewType = getSema().getASTContext().getPackExpansionType(
6273 NewType, std::nullopt);
6280 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6281 OutParamTypes.push_back(NewType);
6283 PVars->push_back(
nullptr);
6292 if (RetainExpansion) {
6293 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6294 QualType NewType = getDerived().TransformType(Pattern);
6299 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6300 OutParamTypes.push_back(NewType);
6302 PVars->push_back(
nullptr);
6307 OldType = Expansion->getPattern();
6308 IsPackExpansion =
true;
6310 NewType = getDerived().TransformType(OldType);
6312 NewType = getDerived().TransformType(OldType);
6318 if (IsPackExpansion)
6319 NewType = getSema().Context.getPackExpansionType(NewType,
6323 PInfos.
set(OutParamTypes.size(), ParamInfos[i]);
6324 OutParamTypes.push_back(NewType);
6326 PVars->push_back(
nullptr);
6331 for (
unsigned i = 0, e = PVars->size(); i != e; ++i)
6333 assert(parm->getFunctionScopeIndex() == i);
6340template<
typename Derived>
6345 return getDerived().TransformFunctionProtoType(
6348 return getDerived().TransformExceptionSpec(TL.
getBeginLoc(), ESI,
6349 ExceptionStorage, Changed);
6353template<
typename Derived>
template<
typename Fn>
6356 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
6373 if (getDerived().TransformFunctionTypeParams(
6377 ParamTypes, &ParamDecls, ExtParamInfos))
6389 SemaRef, !ThisContext && RD ? RD : ThisContext, ThisTypeQuals);
6391 ResultType = getDerived().TransformType(TLB, TL.
getReturnLoc());
6397 ResultType = getDerived().TransformType(TLB, TL.
getReturnLoc());
6401 if (getDerived().TransformFunctionTypeParams(
6405 ParamTypes, &ParamDecls, ExtParamInfos))
6411 bool EPIChanged =
false;
6416 if (
auto NewExtParamInfos =
6432 std::optional<FunctionEffectSet> NewFX;
6441 ExprResult NewExpr = getDerived().TransformExpr(CondExpr);
6444 std::optional<FunctionEffectMode> Mode =
6464 "FunctionEffectMode::None shouldn't be possible here");
6470 NewFX->insert(NewEC, Errs);
6471 assert(Errs.empty());
6479 if (getDerived().AlwaysRebuild() || ResultType !=
T->
getReturnType() ||
6481 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
6492 for (
unsigned i = 0, e = NewTL.
getNumParams(); i != e; ++i)
6498template<
typename Derived>
6508 auto *Method = dyn_cast_if_present<CXXMethodDecl>(ESI.
SourceTemplate);
6510 SemaRef, Method ? Method->getParent() :
nullptr,
6511 Method ? Method->getMethodQualifiers() :
Qualifiers{},
6521 getSema().ActOnNoexceptSpec(NoexceptExpr.
get(), EST);
6544 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
6549 bool Expand =
false;
6550 bool RetainExpansion =
false;
6551 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6554 if (getDerived().TryExpandParameterPacks(
6556 RetainExpansion, NumExpansions))
6564 QualType U = getDerived().TransformType(PackExpansion->getPattern());
6569 Exceptions.push_back(
U);
6575 for (
unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6578 QualType U = getDerived().TransformType(PackExpansion->getPattern());
6582 Exceptions.push_back(
U);
6591 Exceptions.push_back(
U);
6601template<
typename Derived>
6611 if (getDerived().AlwaysRebuild() || ResultType !=
T->
getReturnType())
6612 Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6623template <
typename Derived>
6624QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6625 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6626 const UnresolvedUsingType *
T = TL.getTypePtr();
6627 Decl *
D = getDerived().TransformDecl(TL.getNameLoc(),
T->getDecl());
6631 QualType
Result = TL.getType();
6632 if (getDerived().AlwaysRebuild() ||
D !=
T->getDecl()) {
6633 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(),
D);
6640 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(
Result);
6641 NewTL.setNameLoc(TL.getNameLoc());
6646template <
typename Derived>
6647QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6649 const UsingType *
T = TL.getTypePtr();
6651 auto *
Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6652 TL.getLocalSourceRange().getBegin(),
T->getFoundDecl()));
6656 QualType Underlying = getDerived().TransformType(
T->
desugar());
6657 if (Underlying.isNull())
6660 QualType
Result = TL.getType();
6661 if (getDerived().AlwaysRebuild() ||
Found !=
T->getFoundDecl() ||
6662 Underlying !=
T->getUnderlyingType()) {
6663 Result = getDerived().RebuildUsingType(
Found, Underlying);
6668 TLB.pushTypeSpec(
Result).setNameLoc(TL.getNameLoc());
6672template<
typename Derived>
6673QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6674 TypedefTypeLoc TL) {
6675 const TypedefType *
T = TL.getTypePtr();
6676 TypedefNameDecl *Typedef
6677 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6682 QualType
Result = TL.getType();
6683 if (getDerived().AlwaysRebuild() ||
6684 Typedef !=
T->getDecl()) {
6685 Result = getDerived().RebuildTypedefType(Typedef);
6690 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(
Result);
6691 NewTL.setNameLoc(TL.getNameLoc());
6696template<
typename Derived>
6697QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6698 TypeOfExprTypeLoc TL) {
6704 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6712 QualType
Result = TL.getType();
6714 if (getDerived().AlwaysRebuild() ||
E.get() != TL.getUnderlyingExpr()) {
6716 getDerived().RebuildTypeOfExprType(
E.get(), TL.getTypeofLoc(), Kind);
6721 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(
Result);
6722 NewTL.setTypeofLoc(TL.getTypeofLoc());
6723 NewTL.setLParenLoc(TL.getLParenLoc());
6724 NewTL.setRParenLoc(TL.getRParenLoc());
6729template<
typename Derived>
6730QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6732 TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo();
6733 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6737 QualType
Result = TL.getType();
6739 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6740 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind);
6745 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(
Result);
6746 NewTL.setTypeofLoc(TL.getTypeofLoc());
6747 NewTL.setLParenLoc(TL.getLParenLoc());
6748 NewTL.setRParenLoc(TL.getRParenLoc());
6749 NewTL.setUnmodifiedTInfo(New_Under_TI);
6754template<
typename Derived>
6755QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6756 DecltypeTypeLoc TL) {
6757 const DecltypeType *
T = TL.getTypePtr();
6764 ExprResult E = getDerived().TransformExpr(
T->getUnderlyingExpr());
6768 E = getSema().ActOnDecltypeExpression(
E.get());
6772 QualType
Result = TL.getType();
6773 if (getDerived().AlwaysRebuild() ||
6774 E.get() !=
T->getUnderlyingExpr()) {
6775 Result = getDerived().RebuildDecltypeType(
E.get(), TL.getDecltypeLoc());
6781 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(
Result);
6782 NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6783 NewTL.setRParenLoc(TL.getRParenLoc());
6787template <
typename Derived>
6789TreeTransform<Derived>::TransformPackIndexingType(TypeLocBuilder &TLB,
6790 PackIndexingTypeLoc TL) {
6794 EnterExpressionEvaluationContext ConstantContext(
6797 IndexExpr = getDerived().TransformExpr(TL.getIndexExpr());
6798 if (IndexExpr.isInvalid())
6801 QualType Pattern = TL.getPattern();
6803 const PackIndexingType *PIT = TL.getTypePtr();
6807 bool NotYetExpanded = Types.empty();
6808 bool FullySubstituted =
true;
6810 if (Types.empty() && !PIT->expandsToEmptyPack())
6813 for (QualType
T : Types) {
6815 QualType Transformed = getDerived().TransformType(
T);
6816 if (Transformed.isNull())
6818 SubtitutedTypes.push_back(Transformed);
6823 getSema().collectUnexpandedParameterPacks(
T, Unexpanded);
6824 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
6827 bool ShouldExpand =
true;
6828 bool RetainExpansion =
false;
6829 std::optional<unsigned> OrigNumExpansions;
6830 std::optional<unsigned> NumExpansions = OrigNumExpansions;
6831 if (getDerived().TryExpandParameterPacks(TL.getEllipsisLoc(), SourceRange(),
6832 Unexpanded, ShouldExpand,
6833 RetainExpansion, NumExpansions))
6835 if (!ShouldExpand) {
6836 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6839 TypeSourceInfo *TI =
6841 QualType Pack = getDerived().TransformType(TLB, TI->getTypeLoc());
6844 if (NotYetExpanded) {
6845 FullySubstituted =
false;
6846 QualType Out = getDerived().RebuildPackIndexingType(
6847 Pack, IndexExpr.get(), SourceLocation(), TL.getEllipsisLoc(),
6852 PackIndexingTypeLoc
Loc = TLB.push<PackIndexingTypeLoc>(Out);
6853 Loc.setEllipsisLoc(TL.getEllipsisLoc());
6856 SubtitutedTypes.push_back(Pack);
6859 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6860 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
6861 QualType Out = getDerived().TransformType(
T);
6864 SubtitutedTypes.push_back(Out);
6865 FullySubstituted &= !Out->containsUnexpandedParameterPack();
6869 if (RetainExpansion) {
6870 FullySubstituted =
false;
6871 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6872 QualType Out = getDerived().TransformType(
T);
6875 SubtitutedTypes.push_back(Out);
6882 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6883 QualType
Result = getDerived().TransformType(TLB, TL.getPatternLoc());
6885 QualType Out = getDerived().RebuildPackIndexingType(
6886 Result, IndexExpr.get(), SourceLocation(), TL.getEllipsisLoc(),
6887 FullySubstituted, SubtitutedTypes);
6891 PackIndexingTypeLoc
Loc = TLB.push<PackIndexingTypeLoc>(Out);
6892 Loc.setEllipsisLoc(TL.getEllipsisLoc());
6896template<
typename Derived>
6897QualType TreeTransform<Derived>::TransformUnaryTransformType(
6898 TypeLocBuilder &TLB,
6899 UnaryTransformTypeLoc TL) {
6900 QualType
Result = TL.getType();
6901 if (
Result->isDependentType()) {
6902 const UnaryTransformType *
T = TL.getTypePtr();
6904 TypeSourceInfo *NewBaseTSI =
6905 getDerived().TransformType(TL.getUnderlyingTInfo());
6908 QualType NewBase = NewBaseTSI->getType();
6910 Result = getDerived().RebuildUnaryTransformType(NewBase,
6917 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(
Result);
6918 NewTL.setKWLoc(TL.getKWLoc());
6919 NewTL.setParensRange(TL.getParensRange());
6920 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6924template<
typename Derived>
6925QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6926 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6927 const DeducedTemplateSpecializationType *
T = TL.getTypePtr();
6930 TemplateName TemplateName = getDerived().TransformTemplateName(
6931 SS,
T->getTemplateName(), TL.getTemplateNameLoc());
6932 if (TemplateName.isNull())
6935 QualType OldDeduced =
T->getDeducedType();
6936 QualType NewDeduced;
6937 if (!OldDeduced.isNull()) {
6938 NewDeduced = getDerived().TransformType(OldDeduced);
6939 if (NewDeduced.isNull())
6943 QualType
Result = getDerived().RebuildDeducedTemplateSpecializationType(
6944 TemplateName, NewDeduced);
6948 DeducedTemplateSpecializationTypeLoc NewTL =
6949 TLB.push<DeducedTemplateSpecializationTypeLoc>(
Result);
6950 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6955template<
typename Derived>
6956QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6958 const RecordType *
T = TL.getTypePtr();
6960 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6965 QualType
Result = TL.getType();
6966 if (getDerived().AlwaysRebuild() ||
6973 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(
Result);
6974 NewTL.setNameLoc(TL.getNameLoc());
6979template<
typename Derived>
6980QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6982 const EnumType *
T = TL.getTypePtr();
6984 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6989 QualType
Result = TL.getType();
6990 if (getDerived().AlwaysRebuild() ||
6991 Enum !=
T->getDecl()) {
6997 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(
Result);
6998 NewTL.setNameLoc(TL.getNameLoc());
7003template<
typename Derived>
7004QualType TreeTransform<Derived>::TransformInjectedClassNameType(
7005 TypeLocBuilder &TLB,
7006 InjectedClassNameTypeLoc TL) {
7007 Decl *
D = getDerived().TransformDecl(TL.getNameLoc(),
7008 TL.getTypePtr()->getDecl());
7009 if (!
D)
return QualType();
7012 TLB.pushTypeSpec(
T).setNameLoc(TL.getNameLoc());
7016template<
typename Derived>
7020 return getDerived().TransformTemplateTypeParmType(
7025template <
typename Derived>
7031template<
typename Derived>
7032QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
7033 TypeLocBuilder &TLB,
7034 SubstTemplateTypeParmTypeLoc TL) {
7035 const SubstTemplateTypeParmType *
T = TL.getTypePtr();
7038 getDerived().TransformDecl(TL.getNameLoc(),
T->getAssociatedDecl());
7043 TemporaryBase Rebase(*
this, TL.getNameLoc(), DeclarationName());
7044 QualType Replacement = getDerived().TransformType(
T->getReplacementType());
7045 if (Replacement.isNull())
7049 Replacement, NewReplaced,
T->getIndex(),
T->getPackIndex());
7052 SubstTemplateTypeParmTypeLoc NewTL
7053 = TLB.push<SubstTemplateTypeParmTypeLoc>(
Result);
7054 NewTL.setNameLoc(TL.getNameLoc());
7059template<
typename Derived>
7063 return getDerived().TransformSubstTemplateTypeParmPackType(
7067template <
typename Derived>
7073template<
typename Derived>
7083 = getDerived().TransformTemplateName(SS,
T->getTemplateName(),
7088 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
7091template<
typename Derived>
7099 if (getDerived().AlwaysRebuild() ||
7101 Result = getDerived().RebuildAtomicType(ValueType, TL.
getKWLoc());
7106 AtomicTypeLoc NewTL = TLB.
push<AtomicTypeLoc>(
Result);
7114template <
typename Derived>
7115QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
7117 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
7118 if (ValueType.isNull())
7121 QualType
Result = TL.getType();
7122 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
7123 const PipeType *PT =
Result->castAs<PipeType>();
7124 bool isReadPipe = PT->isReadOnly();
7125 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
7130 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(
Result);
7131 NewTL.setKWLoc(TL.getKWLoc());
7136template <
typename Derived>
7137QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
7139 const BitIntType *EIT = TL.getTypePtr();
7140 QualType
Result = TL.getType();
7142 if (getDerived().AlwaysRebuild()) {
7143 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
7144 EIT->getNumBits(), TL.getNameLoc());
7149 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(
Result);
7150 NewTL.setNameLoc(TL.getNameLoc());
7154template <
typename Derived>
7155QualType TreeTransform<Derived>::TransformDependentBitIntType(
7156 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
7157 const DependentBitIntType *EIT = TL.getTypePtr();
7161 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
7164 if (BitsExpr.isInvalid())
7167 QualType
Result = TL.getType();
7169 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
7170 Result = getDerived().RebuildDependentBitIntType(
7171 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
7177 if (isa<DependentBitIntType>(
Result)) {
7178 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(
Result);
7179 NewTL.setNameLoc(TL.getNameLoc());
7181 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(
Result);
7182 NewTL.setNameLoc(TL.getNameLoc());
7192 template<
typename ArgLocContainer>
7194 ArgLocContainer *Container;
7219 : Container(&Container), Index(Index) { }
7233 return Container->getArgLoc(Index);
7237 return pointer(Container->getArgLoc(Index));
7242 return X.Container == Y.Container &&
X.Index == Y.Index;
7251template<
typename Derived>
7252QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
7254 const AutoType *
T = TL.getTypePtr();
7255 QualType OldDeduced =
T->getDeducedType();
7256 QualType NewDeduced;
7257 if (!OldDeduced.isNull()) {
7258 NewDeduced = getDerived().TransformType(OldDeduced);
7259 if (NewDeduced.isNull())
7263 ConceptDecl *NewCD =
nullptr;
7264 TemplateArgumentListInfo NewTemplateArgs;
7265 NestedNameSpecifierLoc NewNestedNameSpec;
7266 if (
T->isConstrained()) {
7267 assert(TL.getConceptReference());
7268 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
7269 TL.getConceptNameLoc(),
T->getTypeConstraintConcept()));
7271 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7272 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7273 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
7274 if (getDerived().TransformTemplateArguments(
7275 ArgIterator(TL, 0), ArgIterator(TL, TL.getNumArgs()),
7279 if (TL.getNestedNameSpecifierLoc()) {
7281 = getDerived().TransformNestedNameSpecifierLoc(
7282 TL.getNestedNameSpecifierLoc());
7283 if (!NewNestedNameSpec)
7288 QualType
Result = TL.getType();
7289 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
7293 NewArgList.reserve(NewTemplateArgs.size());
7294 for (
const auto &ArgLoc : NewTemplateArgs.arguments())
7295 NewArgList.push_back(ArgLoc.getArgument());
7296 Result = getDerived().RebuildAutoType(NewDeduced,
T->getKeyword(), NewCD,
7302 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(
Result);
7303 NewTL.setNameLoc(TL.getNameLoc());
7304 NewTL.setRParenLoc(TL.getRParenLoc());
7305 NewTL.setConceptReference(
nullptr);
7307 if (
T->isConstrained()) {
7308 DeclarationNameInfo DNI = DeclarationNameInfo(
7309 TL.getTypePtr()->getTypeConstraintConcept()->getDeclName(),
7310 TL.getConceptNameLoc(),
7311 TL.getTypePtr()->getTypeConstraintConcept()->getDeclName());
7313 SemaRef.
Context, NewNestedNameSpec, TL.getTemplateKWLoc(), DNI,
7314 TL.getFoundDecl(), TL.getTypePtr()->getTypeConstraintConcept(),
7316 NewTL.setConceptReference(CR);
7322template <
typename Derived>
7324 TypeLocBuilder &TLB,
7325 TemplateSpecializationTypeLoc TL,
7326 TemplateName Template) {
7327 TemplateArgumentListInfo NewTemplateArgs;
7328 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7329 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7330 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
7332 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7333 ArgIterator(TL, TL.getNumArgs()),
7340 getDerived().RebuildTemplateSpecializationType(Template,
7341 TL.getTemplateNameLoc(),
7349 if (isa<DependentTemplateSpecializationType>(
Result)) {
7350 DependentTemplateSpecializationTypeLoc NewTL
7351 = TLB.push<DependentTemplateSpecializationTypeLoc>(
Result);
7352 NewTL.setElaboratedKeywordLoc(SourceLocation());
7353 NewTL.setQualifierLoc(NestedNameSpecifierLoc());
7354 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7355 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7356 NewTL.setLAngleLoc(TL.getLAngleLoc());
7357 NewTL.setRAngleLoc(TL.getRAngleLoc());
7358 for (
unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
7359 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
7363 TemplateSpecializationTypeLoc NewTL
7364 = TLB.push<TemplateSpecializationTypeLoc>(
Result);
7365 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7366 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7367 NewTL.setLAngleLoc(TL.getLAngleLoc());
7368 NewTL.setRAngleLoc(TL.getRAngleLoc());
7369 for (
unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
7370 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
7376template <
typename Derived>
7387 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7395 QualType Result = getSema().Context.getDependentTemplateSpecializationType(
7397 DTN->getIdentifier(), NewTemplateArgs.
arguments());
7407 for (
unsigned i = 0, e = NewTemplateArgs.
size(); i != e; ++i)
7413 = getDerived().RebuildTemplateSpecializationType(Template,
7425 for (
unsigned i = 0, e = NewTemplateArgs.
size(); i != e; ++i)
7432template<
typename Derived>
7447 QualType NamedT = getDerived().TransformType(TLB, TL.
getNamedTypeLoc());
7448 if (NamedT.isNull())
7457 if (
const TemplateSpecializationType *TST =
7458 NamedT->getAs<TemplateSpecializationType>()) {
7459 TemplateName Template = TST->getTemplateName();
7460 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
7461 Template.getAsTemplateDecl())) {
7463 diag::err_tag_reference_non_tag)
7465 << llvm::to_underlying(
7467 SemaRef.
Diag(TAT->getLocation(), diag::note_declared_at);
7473 if (getDerived().AlwaysRebuild() ||
7475 NamedT !=
T->getNamedType()) {
7478 QualifierLoc, NamedT);
7483 ElaboratedTypeLoc NewTL = TLB.
push<ElaboratedTypeLoc>(
Result);
7485 NewTL.setQualifierLoc(QualifierLoc);
7489template <
typename Derived>
7490QualType TreeTransform<Derived>::TransformAttributedType(TypeLocBuilder &TLB,
7491 AttributedTypeLoc TL) {
7493 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
7494 if (modifiedType.isNull())
7498 const Attr *oldAttr = TL.getAttr();
7499 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) :
nullptr;
7500 if (oldAttr && !newAttr)
7503 QualType result = TL.getType();
7506 if (getDerived().AlwaysRebuild() ||
7507 modifiedType != oldType->getModifiedType()) {
7520 QualType equivalentType = modifiedType;
7521 if (TL.getModifiedLoc().getType() != TL.getEquivalentTypeLoc().getType()) {
7522 TypeLocBuilder AuxiliaryTLB;
7523 AuxiliaryTLB.reserve(TL.getFullDataSize());
7525 getDerived().TransformType(AuxiliaryTLB, TL.getEquivalentTypeLoc());
7526 if (equivalentType.isNull())
7532 if (
auto nullability = oldType->getImmediateNullability()) {
7533 if (!modifiedType->canHaveNullability()) {
7534 SemaRef.
Diag((TL.getAttr() ? TL.getAttr()->getLocation()
7535 : TL.getModifiedLoc().getBeginLoc()),
7536 diag::err_nullability_nonpointer)
7548 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
7549 newTL.setAttr(newAttr);
7553template <
typename Derived>
7554QualType TreeTransform<Derived>::TransformCountAttributedType(
7555 TypeLocBuilder &TLB, CountAttributedTypeLoc TL) {
7556 const CountAttributedType *OldTy = TL.
getTypePtr();
7557 QualType InnerTy = getDerived().TransformType(TLB, TL.getInnerLoc());
7558 if (InnerTy.isNull())
7561 Expr *OldCount = TL.getCountExpr();
7562 Expr *NewCount =
nullptr;
7564 ExprResult CountResult = getDerived().TransformExpr(OldCount);
7565 if (CountResult.isInvalid())
7567 NewCount = CountResult.get();
7570 QualType
Result = TL.getType();
7571 if (getDerived().AlwaysRebuild() || InnerTy != OldTy->desugar() ||
7572 OldCount != NewCount) {
7575 InnerTy, NewCount, OldTy->isCountInBytes(), OldTy->isOrNull());
7578 TLB.push<CountAttributedTypeLoc>(
Result);
7582template <
typename Derived>
7583QualType TreeTransform<Derived>::TransformBTFTagAttributedType(
7584 TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) {
7586 llvm_unreachable(
"Unexpected TreeTransform for BTFTagAttributedType");
7589template <
typename Derived>
7590QualType TreeTransform<Derived>::TransformHLSLAttributedResourceType(
7591 TypeLocBuilder &TLB, HLSLAttributedResourceTypeLoc TL) {
7593 const HLSLAttributedResourceType *oldType = TL.getTypePtr();
7595 QualType WrappedTy = getDerived().TransformType(TLB, TL.getWrappedLoc());
7596 if (WrappedTy.isNull())
7599 QualType ContainedTy = QualType();
7600 QualType OldContainedTy = oldType->getContainedType();
7601 if (!OldContainedTy.isNull()) {
7602 TypeSourceInfo *oldContainedTSI = TL.getContainedTypeSourceInfo();
7603 if (!oldContainedTSI)
7604 oldContainedTSI = getSema().getASTContext().getTrivialTypeSourceInfo(
7605 OldContainedTy, SourceLocation());
7606 TypeSourceInfo *ContainedTSI = getDerived().TransformType(oldContainedTSI);
7609 ContainedTy = ContainedTSI->getType();
7612 QualType
Result = TL.getType();
7613 if (getDerived().AlwaysRebuild() || WrappedTy != oldType->getWrappedType() ||
7614 ContainedTy != oldType->getContainedType()) {
7616 WrappedTy, ContainedTy, oldType->getAttrs());
7619 TLB.push<HLSLAttributedResourceTypeLoc>(
Result);
7623template<
typename Derived>
7625TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
7627 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7631 QualType
Result = TL.getType();
7632 if (getDerived().AlwaysRebuild() ||
7633 Inner != TL.getInnerLoc().getType()) {
7634 Result = getDerived().RebuildParenType(Inner);
7639 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(
Result);
7640 NewTL.setLParenLoc(TL.getLParenLoc());
7641 NewTL.setRParenLoc(TL.getRParenLoc());
7645template <
typename Derived>
7647TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
7648 MacroQualifiedTypeLoc TL) {
7649 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7653 QualType
Result = TL.getType();
7654 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
7656 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
7661 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(
Result);
7662 NewTL.setExpansionLoc(TL.getExpansionLoc());
7666template<
typename Derived>
7667QualType TreeTransform<Derived>::TransformDependentNameType(
7668 TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
7669 return TransformDependentNameType(TLB, TL,
false);
7672template<
typename Derived>
7673QualType TreeTransform<Derived>::TransformDependentNameType(
7674 TypeLocBuilder &TLB, DependentNameTypeLoc TL,
bool DeducedTSTContext) {
7675 const DependentNameType *
T = TL.getTypePtr();
7677 NestedNameSpecifierLoc QualifierLoc
7678 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7683 = getDerived().RebuildDependentNameType(
T->getKeyword(),
7684 TL.getElaboratedKeywordLoc(),
7692 if (
const ElaboratedType* ElabT =
Result->getAs<ElaboratedType>()) {
7693 QualType NamedT = ElabT->getNamedType();
7694 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
7696 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(
Result);
7697 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7698 NewTL.setQualifierLoc(QualifierLoc);
7700 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(
Result);
7701 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7702 NewTL.setQualifierLoc(QualifierLoc);
7703 NewTL.setNameLoc(TL.getNameLoc());
7708template<
typename Derived>
7711 DependentTemplateSpecializationTypeLoc TL) {
7712 NestedNameSpecifierLoc QualifierLoc;
7713 if (TL.getQualifierLoc()) {
7715 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7721 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
7724template<
typename Derived>
7737 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7742 QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
7750 QualType NamedT = ElabT->getNamedType();
7759 for (
unsigned I = 0,
E = NewTemplateArgs.
size(); I !=
E; ++I)
7766 }
else if (isa<DependentTemplateSpecializationType>(
Result)) {
7775 for (
unsigned I = 0,
E = NewTemplateArgs.
size(); I !=
E; ++I)
7784 for (
unsigned I = 0,
E = NewTemplateArgs.
size(); I !=
E; ++I)
7790template<
typename Derived>
7799 if (getDerived().AlwaysRebuild() ||
7801 Result = getDerived().RebuildPackExpansionType(Pattern,
7809 PackExpansionTypeLoc NewT = TLB.
push<PackExpansionTypeLoc>(
Result);
7814template<
typename Derived>
7816TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7817 ObjCInterfaceTypeLoc TL) {
7819 TLB.pushFullCopy(TL);
7820 return TL.getType();
7823template<
typename Derived>
7825TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7826 ObjCTypeParamTypeLoc TL) {
7827 const ObjCTypeParamType *
T = TL.getTypePtr();
7828 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7829 getDerived().TransformDecl(
T->getDecl()->getLocation(),
T->getDecl()));
7833 QualType
Result = TL.getType();
7834 if (getDerived().AlwaysRebuild() ||
7835 OTP !=
T->getDecl()) {
7836 Result = getDerived().RebuildObjCTypeParamType(
7837 OTP, TL.getProtocolLAngleLoc(),
7838 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7839 TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7844 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(
Result);
7845 if (TL.getNumProtocols()) {
7846 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7847 for (
unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7848 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7849 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7854template<
typename Derived>
7856TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7857 ObjCObjectTypeLoc TL) {
7859 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7860 if (BaseType.isNull())
7863 bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7867 for (
unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7868 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7869 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7870 QualType TypeArg = TypeArgInfo->getType();
7871 if (
auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7875 const auto *PackExpansion = PackExpansionLoc.getType()
7876 ->castAs<PackExpansionType>();
7880 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
7884 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7885 bool Expand =
false;
7886 bool RetainExpansion =
false;
7887 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7888 if (getDerived().TryExpandParameterPacks(
7889 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7890 Unexpanded, Expand, RetainExpansion, NumExpansions))
7897 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7899 TypeLocBuilder TypeArgBuilder;
7900 TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7901 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7903 if (NewPatternType.isNull())
7907 NewPatternType, NumExpansions);
7908 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7909 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7910 NewTypeArgInfos.push_back(
7911 TypeArgBuilder.getTypeSourceInfo(SemaRef.
Context, NewExpansionType));
7917 for (
unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7918 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7920 TypeLocBuilder TypeArgBuilder;
7921 TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7923 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7925 if (NewTypeArg.isNull())
7928 NewTypeArgInfos.push_back(
7929 TypeArgBuilder.getTypeSourceInfo(SemaRef.
Context, NewTypeArg));
7935 TypeLocBuilder TypeArgBuilder;
7936 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7937 QualType NewTypeArg =
7938 getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7939 if (NewTypeArg.isNull())
7943 if (NewTypeArg == TypeArg) {
7944 NewTypeArgInfos.push_back(TypeArgInfo);
7948 NewTypeArgInfos.push_back(
7949 TypeArgBuilder.getTypeSourceInfo(SemaRef.
Context, NewTypeArg));
7953 QualType
Result = TL.getType();
7954 if (getDerived().AlwaysRebuild() || AnyChanged) {
7956 Result = getDerived().RebuildObjCObjectType(
7957 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7958 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7959 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7960 TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7966 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(
Result);
7967 NewT.setHasBaseTypeAsWritten(
true);
7968 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7969 for (
unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7970 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7971 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7972 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7973 for (
unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7974 NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7975 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7979template<
typename Derived>
7981TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7982 ObjCObjectPointerTypeLoc TL) {
7983 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7984 if (PointeeType.isNull())
7987 QualType
Result = TL.getType();
7988 if (getDerived().AlwaysRebuild() ||
7989 PointeeType != TL.getPointeeLoc().getType()) {
7990 Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7996 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(
Result);
7997 NewT.setStarLoc(TL.getStarLoc());
8004template<
typename Derived>
8006TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
8010template<
typename Derived>
8013 return getDerived().TransformCompoundStmt(S,
false);
8016template<
typename Derived>
8022 if (S->hasStoredFPFeatures())
8023 getSema().resetFPOptions(
8024 S->getStoredFPFeatures().applyOverrides(getSema().getLangOpts()));
8027 bool SubStmtInvalid =
false;
8028 bool SubStmtChanged =
false;
8030 for (
auto *B : S->body()) {
8032 B, IsStmtExpr && B ==
ExprResult ? SDK_StmtExprResult : SDK_Discarded);
8034 if (
Result.isInvalid()) {
8037 if (isa<DeclStmt>(B))
8041 SubStmtInvalid =
true;
8045 SubStmtChanged = SubStmtChanged ||
Result.get() != B;
8046 Statements.push_back(
Result.getAs<Stmt>());
8052 if (!getDerived().AlwaysRebuild() &&
8056 return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
8062template<
typename Derived>
8064TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
8071 LHS = getDerived().TransformExpr(S->getLHS());
8073 if (LHS.isInvalid())
8077 RHS = getDerived().TransformExpr(S->getRHS());
8079 if (RHS.isInvalid())
8086 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
8088 S->getEllipsisLoc(),
8091 if (Case.isInvalid())
8096 getDerived().TransformStmt(S->getSubStmt());
8097 if (SubStmt.isInvalid())
8101 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
8104template <
typename Derived>
8105StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
8108 getDerived().TransformStmt(S->getSubStmt());
8109 if (SubStmt.isInvalid())
8113 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
8117template<
typename Derived>
8119TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
8120 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
8121 if (SubStmt.isInvalid())
8124 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
8132 if (LD == S->getDecl())
8133 S->getDecl()->setStmt(
nullptr);
8136 return getDerived().RebuildLabelStmt(S->getIdentLoc(),
8137 cast<LabelDecl>(LD), SourceLocation(),
8141template <
typename Derived>
8150 return getDerived().Transform##X##Attr(cast<X##Attr>(R));
8151#include "clang/Basic/AttrList.inc"
8156template <
typename Derived>
8167 return getDerived().TransformStmt##X##Attr(OrigS, InstS, cast<X##Attr>(R));
8168#include "clang/Basic/AttrList.inc"
8170 return TransformAttr(R);
8173template <
typename Derived>
8176 StmtDiscardKind SDK) {
8177 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
8181 bool AttrsChanged =
false;
8185 for (
const auto *I : S->getAttrs()) {
8187 getDerived().TransformStmtAttr(S->getSubStmt(), SubStmt.
get(), I);
8188 AttrsChanged |= (I != R);
8193 if (SubStmt.
get() == S->getSubStmt() && !AttrsChanged)
8201 return getDerived().RebuildAttributedStmt(S->
getAttrLoc(), Attrs,
8205template<
typename Derived>
8207TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
8210 if (
Init.isInvalid())
8213 Sema::ConditionResult Cond;
8214 if (!S->isConsteval()) {
8216 Cond = getDerived().TransformCondition(
8217 S->getIfLoc(), S->getConditionVariable(), S->getCond(),
8220 if (Cond.isInvalid())
8225 std::optional<bool> ConstexprConditionValue;
8226 if (S->isConstexpr())
8227 ConstexprConditionValue = Cond.getKnownValue();
8231 if (!ConstexprConditionValue || *ConstexprConditionValue) {
8232 EnterExpressionEvaluationContext Ctx(
8235 S->isNonNegatedConsteval());
8237 Then = getDerived().TransformStmt(S->getThen());
8238 if (Then.isInvalid())
8244 Then =
new (getSema().Context)
8245 CompoundStmt(S->getThen()->getBeginLoc(), S->getThen()->getEndLoc());
8250 if (!ConstexprConditionValue || !*ConstexprConditionValue) {
8251 EnterExpressionEvaluationContext Ctx(
8254 S->isNegatedConsteval());
8256 Else = getDerived().TransformStmt(S->getElse());
8257 if (Else.isInvalid())
8259 }
else if (S->getElse() && ConstexprConditionValue &&
8260 *ConstexprConditionValue) {
8264 Else =
new (getSema().Context)
8265 CompoundStmt(S->getElse()->getBeginLoc(), S->getElse()->getEndLoc());
8268 if (!getDerived().AlwaysRebuild() &&
8269 Init.get() == S->getInit() &&
8270 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
8271 Then.get() == S->getThen() &&
8272 Else.get() == S->getElse())
8275 return getDerived().RebuildIfStmt(
8276 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
8277 S->getRParenLoc(),
Init.get(), Then.get(), S->getElseLoc(), Else.get());
8280template<
typename Derived>
8282TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
8285 if (
Init.isInvalid())
8289 Sema::ConditionResult Cond = getDerived().TransformCondition(
8290 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
8292 if (Cond.isInvalid())
8297 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
8298 Init.get(), Cond, S->getRParenLoc());
8303 StmtResult Body = getDerived().TransformStmt(S->getBody());
8304 if (Body.isInvalid())
8308 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(),
Switch.get(),
8312template<
typename Derived>
8314TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
8316 Sema::ConditionResult Cond = getDerived().TransformCondition(
8317 S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
8319 if (Cond.isInvalid())
8324 SemaOpenACC::LoopInConstructRAII LCR{SemaRef.
OpenACC()};
8328 StmtResult Body = getDerived().TransformStmt(S->getBody());
8329 if (Body.isInvalid())
8332 if (!getDerived().AlwaysRebuild() &&
8333 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
8334 Body.get() == S->getBody())
8337 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
8338 Cond, S->getRParenLoc(), Body.get());
8341template<
typename Derived>
8343TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
8346 SemaOpenACC::LoopInConstructRAII LCR{SemaRef.
OpenACC()};
8350 StmtResult Body = getDerived().TransformStmt(S->getBody());
8351 if (Body.isInvalid())
8355 ExprResult Cond = getDerived().TransformExpr(S->getCond());
8356 if (Cond.isInvalid())
8359 if (!getDerived().AlwaysRebuild() &&
8360 Cond.get() == S->getCond() &&
8361 Body.get() == S->getBody())
8364 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
8365 S->getWhileLoc(), Cond.get(),
8369template<
typename Derived>
8371TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
8372 if (getSema().getLangOpts().OpenMP)
8373 getSema().OpenMP().startOpenMPLoop();
8377 if (
Init.isInvalid())
8382 if (getSema().getLangOpts().OpenMP &&
Init.isUsable())
8383 getSema().OpenMP().ActOnOpenMPLoopInitialization(S->getForLoc(),
8387 Sema::ConditionResult Cond = getDerived().TransformCondition(
8388 S->getForLoc(), S->getConditionVariable(), S->getCond(),
8390 if (Cond.isInvalid())
8395 if (
Inc.isInvalid())
8398 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(
Inc.get()));
8399 if (S->getInc() && !FullInc.get())
8404 SemaOpenACC::LoopInConstructRAII LCR{SemaRef.
OpenACC()};
8406 S->getBeginLoc(), S->getInit(),
Init.get(), S->getCond(),
8407 Cond.get().second, S->getInc(),
Inc.get());
8410 StmtResult Body = getDerived().TransformStmt(S->getBody());
8411 if (Body.isInvalid())
8416 if (!getDerived().AlwaysRebuild() &&
8417 Init.get() == S->getInit() &&
8418 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
8419 Inc.get() == S->getInc() &&
8420 Body.get() == S->getBody())
8423 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
8424 Init.get(), Cond, FullInc,
8425 S->getRParenLoc(), Body.get());
8428template<
typename Derived>
8430TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
8431 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
8437 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
8438 cast<LabelDecl>(LD));
8441template<
typename Derived>
8443TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
8449 if (!getDerived().AlwaysRebuild() &&
8450 Target.get() == S->getTarget())
8453 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
8457template<
typename Derived>
8459TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
8463template<
typename Derived>
8465TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
8469template<
typename Derived>
8471TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
8479 return getDerived().RebuildReturnStmt(S->getReturnLoc(),
Result.get());
8482template<
typename Derived>
8484TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
8485 bool DeclChanged =
false;
8487 LambdaScopeInfo *LSI = getSema().getCurLambda();
8488 for (
auto *
D : S->decls()) {
8493 if (Transformed !=
D)
8497 if (
auto *TD = dyn_cast<TypeDecl>(Transformed))
8498 LSI->ContainsUnexpandedParameterPack |=
8501 .getTypeDeclType(TD)
8503 ->containsUnexpandedParameterPack();
8505 if (
auto *VD = dyn_cast<VarDecl>(Transformed))
8506 LSI->ContainsUnexpandedParameterPack |=
8507 VD->getType()->containsUnexpandedParameterPack();
8510 Decls.push_back(Transformed);
8513 if (!getDerived().AlwaysRebuild() && !DeclChanged)
8516 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
8519template<
typename Derived>
8521TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
8530 bool ExprsChanged =
false;
8533 for (
unsigned I = 0,
E = S->getNumOutputs(); I !=
E; ++I) {
8534 Names.push_back(S->getOutputIdentifier(I));
8537 Constraints.push_back(S->getOutputConstraintLiteral(I));
8540 Expr *OutputExpr = S->getOutputExpr(I);
8545 ExprsChanged |=
Result.get() != OutputExpr;
8547 Exprs.push_back(
Result.get());
8551 for (
unsigned I = 0,
E = S->getNumInputs(); I !=
E; ++I) {
8552 Names.push_back(S->getInputIdentifier(I));
8555 Constraints.push_back(S->getInputConstraintLiteral(I));
8558 Expr *InputExpr = S->getInputExpr(I);
8563 ExprsChanged |=
Result.get() != InputExpr;
8565 Exprs.push_back(
Result.get());
8569 for (
unsigned I = 0,
E = S->getNumLabels(); I !=
E; ++I) {
8570 Names.push_back(S->getLabelIdentifier(I));
8575 ExprsChanged |=
Result.get() != S->getLabelExpr(I);
8576 Exprs.push_back(
Result.get());
8578 if (!getDerived().AlwaysRebuild() && !ExprsChanged)
8582 for (
unsigned I = 0,
E = S->getNumClobbers(); I !=
E; ++I)
8583 Clobbers.push_back(S->getClobberStringLiteral(I));
8586 AsmString = S->getAsmString();
8587 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
8588 S->isVolatile(), S->getNumOutputs(),
8589 S->getNumInputs(), Names.data(),
8590 Constraints, Exprs, AsmString.get(),
8591 Clobbers, S->getNumLabels(),
8595template<
typename Derived>
8597TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
8600 bool HadError =
false, HadChange =
false;
8604 TransformedExprs.reserve(SrcExprs.size());
8605 for (
unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
8607 if (!
Result.isUsable()) {
8610 HadChange |= (
Result.get() != SrcExprs[i]);
8611 TransformedExprs.push_back(
Result.get());
8616 if (!HadChange && !getDerived().AlwaysRebuild())
8619 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
8620 AsmToks, S->getAsmString(),
8621 S->getNumOutputs(), S->getNumInputs(),
8622 S->getAllConstraints(), S->getClobbers(),
8623 TransformedExprs, S->getEndLoc());
8627template<
typename Derived>
8629TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
8631 auto *FD = cast<FunctionDecl>(SemaRef.
CurContext);
8632 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
8633 ScopeInfo->NeedsCoroutineSuspends &&
8634 ScopeInfo->CoroutineSuspends.first ==
nullptr &&
8635 ScopeInfo->CoroutineSuspends.second ==
nullptr &&
8636 "expected clean scope info");
8640 ScopeInfo->setNeedsCoroutineSuspends(
false);
8653 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
8654 ScopeInfo->CoroutinePromise = Promise;
8659 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
8660 if (InitSuspend.isInvalid())
8663 getDerived().TransformStmt(S->getFinalSuspendStmt());
8664 if (FinalSuspend.isInvalid() ||
8667 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
8668 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
8670 StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
8671 if (BodyRes.isInvalid())
8674 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
8675 if (Builder.isInvalid())
8678 Expr *ReturnObject = S->getReturnValueInit();
8679 assert(ReturnObject &&
"the return object is expected to be valid");
8680 ExprResult Res = getDerived().TransformInitializer(ReturnObject,
8682 if (Res.isInvalid())
8684 Builder.ReturnValue = Res.get();
8689 if (S->hasDependentPromiseType()) {
8692 if (!Promise->getType()->isDependentType()) {
8693 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
8694 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
8695 "these nodes should not have been built yet");
8696 if (!Builder.buildDependentStatements())
8700 if (
auto *OnFallthrough = S->getFallthroughHandler()) {
8701 StmtResult Res = getDerived().TransformStmt(OnFallthrough);
8702 if (Res.isInvalid())
8704 Builder.OnFallthrough = Res.get();
8707 if (
auto *OnException = S->getExceptionHandler()) {
8708 StmtResult Res = getDerived().TransformStmt(OnException);
8709 if (Res.isInvalid())
8711 Builder.OnException = Res.get();
8714 if (
auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
8715 StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
8716 if (Res.isInvalid())
8718 Builder.ReturnStmtOnAllocFailure = Res.get();
8722 assert(S->getAllocate() && S->getDeallocate() &&
8723 "allocation and deallocation calls must already be built");
8724 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
8725 if (AllocRes.isInvalid())
8727 Builder.Allocate = AllocRes.get();
8729 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
8730 if (DeallocRes.isInvalid())
8732 Builder.Deallocate = DeallocRes.get();
8734 if (
auto *ResultDecl = S->getResultDecl()) {
8735 StmtResult Res = getDerived().TransformStmt(ResultDecl);
8736 if (Res.isInvalid())
8738 Builder.ResultDecl = Res.get();
8741 if (
auto *ReturnStmt = S->getReturnStmt()) {
8742 StmtResult Res = getDerived().TransformStmt(ReturnStmt);
8743 if (Res.isInvalid())
8745 Builder.ReturnStmt = Res.get();
8749 return getDerived().RebuildCoroutineBodyStmt(Builder);
8752template<
typename Derived>
8754TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
8762 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(),
Result.get(),
8766template <
typename Derived>
8767ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *
E) {
8779 ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr(
8780 getSema().getCurScope(),
E->getKeywordLoc());
8784 return getDerived().RebuildCoawaitExpr(
8786 cast<UnresolvedLookupExpr>(Lookup.get()),
E->isImplicit());
8789template <
typename Derived>
8791TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *
E) {
8792 ExprResult OperandResult = getDerived().TransformInitializer(
E->getOperand(),
8794 if (OperandResult.isInvalid())
8797 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
8798 E->getOperatorCoawaitLookup());
8800 if (LookupResult.isInvalid())
8805 return getDerived().RebuildDependentCoawaitExpr(
8806 E->getKeywordLoc(), OperandResult.get(),
8807 cast<UnresolvedLookupExpr>(LookupResult.get()));
8810template<
typename Derived>
8812TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *
E) {
8820 return getDerived().RebuildCoyieldExpr(
E->getKeywordLoc(),
Result.get());
8825template<
typename Derived>
8827TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
8829 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
8830 if (TryBody.isInvalid())
8834 bool AnyCatchChanged =
false;
8836 for (
unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
8837 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8838 if (Catch.isInvalid())
8840 if (Catch.get() != S->getCatchStmt(I))
8841 AnyCatchChanged =
true;
8842 CatchStmts.push_back(Catch.get());
8847 if (S->getFinallyStmt()) {
8848 Finally = getDerived().TransformStmt(S->getFinallyStmt());
8849 if (Finally.isInvalid())
8854 if (!getDerived().AlwaysRebuild() &&
8855 TryBody.get() == S->getTryBody() &&
8857 Finally.get() == S->getFinallyStmt())
8861 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8862 CatchStmts, Finally.get());
8865template<
typename Derived>
8867TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8869 VarDecl *Var =
nullptr;
8870 if (VarDecl *FromVar = S->getCatchParamDecl()) {
8871 TypeSourceInfo *TSInfo =
nullptr;
8872 if (FromVar->getTypeSourceInfo()) {
8873 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8880 T = TSInfo->getType();
8882 T = getDerived().TransformType(FromVar->getType());
8887 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo,
T);
8892 StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8893 if (Body.isInvalid())
8896 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8901template<
typename Derived>
8903TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8905 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8906 if (Body.isInvalid())
8910 if (!getDerived().AlwaysRebuild() &&
8911 Body.get() == S->getFinallyBody())
8915 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8919template<
typename Derived>
8921TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8923 if (S->getThrowExpr()) {
8924 Operand = getDerived().TransformExpr(S->getThrowExpr());
8929 if (!getDerived().AlwaysRebuild() &&
8930 Operand.get() == S->getThrowExpr())
8933 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(),
Operand.get());
8936template<
typename Derived>
8938TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8939 ObjCAtSynchronizedStmt *S) {
8945 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8951 StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8952 if (Body.isInvalid())
8956 if (!getDerived().AlwaysRebuild() &&
8957 Object.get() == S->getSynchExpr() &&
8958 Body.get() == S->getSynchBody())
8962 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8963 Object.get(), Body.get());
8966template<
typename Derived>
8968TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8969 ObjCAutoreleasePoolStmt *S) {
8971 StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8972 if (Body.isInvalid())
8976 if (!getDerived().AlwaysRebuild() &&
8977 Body.get() == S->getSubStmt())
8981 return getDerived().RebuildObjCAutoreleasePoolStmt(
8982 S->getAtLoc(), Body.get());
8985template<
typename Derived>
8987TreeTransform<Derived>::TransformObjCForCollectionStmt(
8988 ObjCForCollectionStmt *S) {
8991 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8992 if (Element.isInvalid())
8996 ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8997 if (Collection.isInvalid())
9001 StmtResult Body = getDerived().TransformStmt(S->getBody());
9002 if (Body.isInvalid())
9006 if (!getDerived().AlwaysRebuild() &&
9007 Element.get() == S->getElement() &&
9008 Collection.get() == S->getCollection() &&
9009 Body.get() == S->getBody())
9013 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
9020template <
typename Derived>
9021StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
9023 VarDecl *Var =
nullptr;
9024 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
9026 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
9030 Var = getDerived().RebuildExceptionDecl(
9031 ExceptionDecl,
T, ExceptionDecl->getInnerLocStart(),
9032 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
9033 if (!Var || Var->isInvalidDecl())
9038 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
9039 if (Handler.isInvalid())
9042 if (!getDerived().AlwaysRebuild() && !Var &&
9043 Handler.get() == S->getHandlerBlock())
9046 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
9049template <
typename Derived>
9050StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
9052 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
9053 if (TryBlock.isInvalid())
9057 bool HandlerChanged =
false;
9059 for (
unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
9060 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
9061 if (Handler.isInvalid())
9064 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
9065 Handlers.push_back(Handler.getAs<Stmt>());
9068 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
9072 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
9076template<
typename Derived>
9078TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
9079 EnterExpressionEvaluationContext ForRangeInitContext(
9087 auto &LastRecord = getSema().currentEvaluationContext();
9088 LastRecord.InLifetimeExtendingContext =
true;
9089 LastRecord.RebuildDefaultArgOrDefaultInit =
true;
9092 S->getInit() ? getDerived().TransformStmt(S->getInit()) :
StmtResult();
9093 if (
Init.isInvalid())
9102 getSema().ExprEvalContexts.back().ForRangeLifetimeExtendTemps.empty());
9103 auto ForRangeLifetimeExtendTemps =
9104 getSema().ExprEvalContexts.back().ForRangeLifetimeExtendTemps;
9109 StmtResult End = getDerived().TransformStmt(S->getEndStmt());
9110 if (End.isInvalid())
9113 ExprResult Cond = getDerived().TransformExpr(S->getCond());
9114 if (Cond.isInvalid())
9118 if (Cond.isInvalid())
9124 if (
Inc.isInvalid())
9129 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
9130 if (LoopVar.isInvalid())
9134 if (getDerived().AlwaysRebuild() ||
9135 Init.get() != S->getInit() ||
9136 Range.get() != S->getRangeStmt() ||
9137 Begin.get() != S->getBeginStmt() ||
9138 End.get() != S->getEndStmt() ||
9139 Cond.get() != S->getCond() ||
9140 Inc.get() != S->getInc() ||
9141 LoopVar.get() != S->getLoopVarStmt()) {
9142 NewStmt = getDerived().RebuildCXXForRangeStmt(
9143 S->getForLoc(), S->getCoawaitLoc(),
Init.get(), S->getColonLoc(),
9145 LoopVar.get(), S->getRParenLoc(), ForRangeLifetimeExtendTemps);
9146 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
9149 cast<DeclStmt>(LoopVar.get())->getSingleDecl());
9156 SemaOpenACC::LoopInConstructRAII LCR{SemaRef.
OpenACC()};
9159 StmtResult Body = getDerived().TransformStmt(S->getBody());
9160 if (Body.isInvalid())
9167 if (Body.get() != S->getBody() && NewStmt.get() == S) {
9168 NewStmt = getDerived().RebuildCXXForRangeStmt(
9169 S->getForLoc(), S->getCoawaitLoc(),
Init.get(), S->getColonLoc(),
9171 LoopVar.get(), S->getRParenLoc(), ForRangeLifetimeExtendTemps);
9172 if (NewStmt.isInvalid())
9176 if (NewStmt.get() == S)
9179 return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
9182template<
typename Derived>
9184TreeTransform<Derived>::TransformMSDependentExistsStmt(
9185 MSDependentExistsStmt *S) {
9187 NestedNameSpecifierLoc QualifierLoc;
9188 if (S->getQualifierLoc()) {
9190 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
9196 DeclarationNameInfo NameInfo = S->getNameInfo();
9197 if (NameInfo.getName()) {
9198 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9199 if (!NameInfo.getName())
9204 if (!getDerived().AlwaysRebuild() &&
9205 QualifierLoc == S->getQualifierLoc() &&
9206 NameInfo.getName() == S->getNameInfo().getName())
9211 SS.Adopt(QualifierLoc);
9213 switch (getSema().CheckMicrosoftIfExistsSymbol(
nullptr, SS, NameInfo)) {
9215 if (S->isIfExists())
9218 return new (getSema().Context) NullStmt(S->getKeywordLoc());
9221 if (S->isIfNotExists())
9224 return new (getSema().Context) NullStmt(S->getKeywordLoc());
9235 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
9236 if (SubStmt.isInvalid())
9244 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
9251template<
typename Derived>
9253TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *
E) {
9254 NestedNameSpecifierLoc QualifierLoc;
9255 if (
E->getQualifierLoc()) {
9257 = getDerived().TransformNestedNameSpecifierLoc(
E->getQualifierLoc());
9262 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
9263 getDerived().TransformDecl(
E->getMemberLoc(),
E->getPropertyDecl()));
9268 if (
Base.isInvalid())
9272 MSPropertyRefExpr(
Base.get(), PD,
E->isArrow(),
9274 QualifierLoc,
E->getMemberLoc());
9277template <
typename Derived>
9278ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
9279 MSPropertySubscriptExpr *
E) {
9280 auto BaseRes = getDerived().TransformExpr(
E->getBase());
9281 if (BaseRes.isInvalid())
9283 auto IdxRes = getDerived().TransformExpr(
E->getIdx());
9284 if (IdxRes.isInvalid())
9287 if (!getDerived().AlwaysRebuild() &&
9288 BaseRes.get() ==
E->getBase() &&
9289 IdxRes.get() ==
E->getIdx())
9292 return getDerived().RebuildArraySubscriptExpr(
9293 BaseRes.get(), SourceLocation(), IdxRes.get(),
E->getRBracketLoc());
9296template <
typename Derived>
9297StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
9298 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
9299 if (TryBlock.isInvalid())
9302 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
9303 if (Handler.isInvalid())
9306 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
9307 Handler.get() == S->getHandler())
9310 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
9311 TryBlock.get(), Handler.get());
9314template <
typename Derived>
9315StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
9317 if (
Block.isInvalid())
9320 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(),
Block.get());
9323template <
typename Derived>
9324StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
9325 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
9326 if (FilterExpr.isInvalid())
9330 if (
Block.isInvalid())
9333 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
9337template <
typename Derived>
9339 if (isa<SEHFinallyStmt>(Handler))
9340 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
9342 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
9345template<
typename Derived>
9355template <
typename Derived>
9357TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
9361 return getDerived().TransformStmt(L->getLoopStmt());
9364template <
typename Derived>
9371 TClauses.reserve(Clauses.size());
9375 getDerived().getSema().OpenMP().StartOpenMPClause((*I)->getClauseKind());
9376 OMPClause *Clause = getDerived().TransformOMPClause(*I);
9377 getDerived().getSema().OpenMP().EndOpenMPClause();
9379 TClauses.push_back(Clause);
9381 TClauses.push_back(
nullptr);
9385 if (
D->hasAssociatedStmt() &&
D->getAssociatedStmt()) {
9386 getDerived().getSema().OpenMP().ActOnOpenMPRegionStart(
9387 D->getDirectiveKind(),
9393 if (
D->getDirectiveKind() == OMPD_atomic ||
9394 D->getDirectiveKind() == OMPD_critical ||
9395 D->getDirectiveKind() == OMPD_section ||
9396 D->getDirectiveKind() == OMPD_master)
9397 CS =
D->getAssociatedStmt();
9399 CS =
D->getRawStmt();
9400 Body = getDerived().TransformStmt(CS);
9402 getSema().getLangOpts().OpenMPIRBuilder)
9403 Body = getDerived().RebuildOMPCanonicalLoop(Body.
get());
9406 getDerived().getSema().OpenMP().ActOnOpenMPRegionEnd(Body, TClauses);
9411 if (TClauses.size() != Clauses.size()) {
9417 if (
D->getDirectiveKind() == OMPD_critical) {
9418 DirName = cast<OMPCriticalDirective>(
D)->getDirectiveName();
9419 DirName = getDerived().TransformDeclarationNameInfo(DirName);
9422 if (
D->getDirectiveKind() == OMPD_cancellation_point) {
9423 CancelRegion = cast<OMPCancellationPointDirective>(
D)->getCancelRegion();
9424 }
else if (
D->getDirectiveKind() == OMPD_cancel) {
9425 CancelRegion = cast<OMPCancelDirective>(
D)->getCancelRegion();
9428 return getDerived().RebuildOMPExecutableDirective(
9429 D->getDirectiveKind(), DirName, CancelRegion, TClauses,
9438template <
typename Derived>
9445 TClauses.reserve(Clauses.size());
9448 getDerived().getSema().OpenMP().StartOpenMPClause(
C->getClauseKind());
9449 OMPClause *Clause = getDerived().TransformOMPClause(
C);
9450 getDerived().getSema().OpenMP().EndOpenMPClause();
9452 TClauses.push_back(Clause);
9454 TClauses.push_back(
nullptr);
9458 if (
D->hasAssociatedStmt() &&
D->getAssociatedStmt()) {
9459 getDerived().getSema().OpenMP().ActOnOpenMPRegionStart(
9460 D->getDirectiveKind(),
9465 assert(
D->getDirectiveKind() == OMPD_assume &&
9466 "Unexpected informational directive");
9467 Stmt *CS =
D->getAssociatedStmt();
9468 Body = getDerived().TransformStmt(CS);
9471 getDerived().getSema().OpenMP().ActOnOpenMPRegionEnd(Body, TClauses);
9475 if (TClauses.size() != Clauses.size())
9480 return getDerived().RebuildOMPInformationalDirective(
9481 D->getDirectiveKind(), DirName, TClauses, AssociatedStmt.
get(),
9485template <
typename Derived>
9490 << getOpenMPDirectiveName(
D->getDirectiveKind());
9494template <
typename Derived>
9496TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *
D) {
9497 DeclarationNameInfo DirName;
9498 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9500 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9501 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9505template <
typename Derived>
9507TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *
D) {
9508 DeclarationNameInfo DirName;
9509 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9511 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9512 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9516template <
typename Derived>
9518TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *
D) {
9519 DeclarationNameInfo DirName;
9520 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9522 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9523 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9527template <
typename Derived>
9529TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *
D) {
9530 DeclarationNameInfo DirName;
9531 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9533 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9534 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9538template <
typename Derived>
9540TreeTransform<Derived>::TransformOMPReverseDirective(OMPReverseDirective *
D) {
9541 DeclarationNameInfo DirName;
9542 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9544 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9545 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9549template <
typename Derived>
9550StmtResult TreeTransform<Derived>::TransformOMPInterchangeDirective(
9551 OMPInterchangeDirective *
D) {
9552 DeclarationNameInfo DirName;
9553 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9555 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9556 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9560template <
typename Derived>
9562TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *
D) {
9563 DeclarationNameInfo DirName;
9564 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9566 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9567 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9571template <
typename Derived>
9573TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *
D) {
9574 DeclarationNameInfo DirName;
9575 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9577 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9578 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9582template <
typename Derived>
9584TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *
D) {
9585 DeclarationNameInfo DirName;
9586 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9588 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9589 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9593template <
typename Derived>
9595TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *
D) {
9596 DeclarationNameInfo DirName;
9597 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9599 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9600 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9604template <
typename Derived>
9606TreeTransform<Derived>::TransformOMPScopeDirective(OMPScopeDirective *
D) {
9607 DeclarationNameInfo DirName;
9608 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9610 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9611 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9615template <
typename Derived>
9617TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *
D) {
9618 DeclarationNameInfo DirName;
9619 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9621 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9622 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9626template <
typename Derived>
9628TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *
D) {
9629 DeclarationNameInfo DirName;
9630 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9632 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9633 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9637template <
typename Derived>
9639TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *
D) {
9640 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9641 OMPD_critical,
D->getDirectiveName(),
nullptr,
D->
getBeginLoc());
9642 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9643 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9647template <
typename Derived>
9648StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
9649 OMPParallelForDirective *
D) {
9650 DeclarationNameInfo DirName;
9651 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9652 OMPD_parallel_for, DirName,
nullptr,
D->
getBeginLoc());
9653 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9654 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9658template <
typename Derived>
9659StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
9660 OMPParallelForSimdDirective *
D) {
9661 DeclarationNameInfo DirName;
9662 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9663 OMPD_parallel_for_simd, DirName,
nullptr,
D->
getBeginLoc());
9664 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9665 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9669template <
typename Derived>
9670StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
9671 OMPParallelMasterDirective *
D) {
9672 DeclarationNameInfo DirName;
9673 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9674 OMPD_parallel_master, DirName,
nullptr,
D->
getBeginLoc());
9675 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9676 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9680template <
typename Derived>
9681StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective(
9682 OMPParallelMaskedDirective *
D) {
9683 DeclarationNameInfo DirName;
9684 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9685 OMPD_parallel_masked, DirName,
nullptr,
D->
getBeginLoc());
9686 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9687 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9691template <
typename Derived>
9692StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
9693 OMPParallelSectionsDirective *
D) {
9694 DeclarationNameInfo DirName;
9695 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9696 OMPD_parallel_sections, DirName,
nullptr,
D->
getBeginLoc());
9697 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9698 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9702template <
typename Derived>
9704TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *
D) {
9705 DeclarationNameInfo DirName;
9706 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9708 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9709 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9713template <
typename Derived>
9714StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
9715 OMPTaskyieldDirective *
D) {
9716 DeclarationNameInfo DirName;
9717 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9719 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9720 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9724template <
typename Derived>
9726TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *
D) {
9727 DeclarationNameInfo DirName;
9728 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9730 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9731 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9735template <
typename Derived>
9737TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *
D) {
9738 DeclarationNameInfo DirName;
9739 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9741 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9742 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9746template <
typename Derived>
9748TreeTransform<Derived>::TransformOMPAssumeDirective(OMPAssumeDirective *
D) {
9749 DeclarationNameInfo DirName;
9750 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9752 StmtResult Res = getDerived().TransformOMPInformationalDirective(
D);
9753 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9757template <
typename Derived>
9759TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *
D) {
9760 DeclarationNameInfo DirName;
9761 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9763 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9764 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9768template <
typename Derived>
9769StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
9770 OMPTaskgroupDirective *
D) {
9771 DeclarationNameInfo DirName;
9772 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9774 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9775 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9779template <
typename Derived>
9781TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *
D) {
9782 DeclarationNameInfo DirName;
9783 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9785 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9786 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9790template <
typename Derived>
9792TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *
D) {
9793 DeclarationNameInfo DirName;
9794 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9796 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9797 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9801template <
typename Derived>
9803TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *
D) {
9804 DeclarationNameInfo DirName;
9805 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9807 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9808 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9812template <
typename Derived>
9814TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *
D) {
9815 DeclarationNameInfo DirName;
9816 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9818 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9819 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9823template <
typename Derived>
9825TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *
D) {
9826 DeclarationNameInfo DirName;
9827 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9829 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9830 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9834template <
typename Derived>
9836TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *
D) {
9837 DeclarationNameInfo DirName;
9838 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9840 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9841 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9845template <
typename Derived>
9846StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
9847 OMPTargetDataDirective *
D) {
9848 DeclarationNameInfo DirName;
9849 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9851 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9852 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9856template <
typename Derived>
9857StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
9858 OMPTargetEnterDataDirective *
D) {
9859 DeclarationNameInfo DirName;
9860 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9861 OMPD_target_enter_data, DirName,
nullptr,
D->
getBeginLoc());
9862 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9863 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9867template <
typename Derived>
9868StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
9869 OMPTargetExitDataDirective *
D) {
9870 DeclarationNameInfo DirName;
9871 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9872 OMPD_target_exit_data, DirName,
nullptr,
D->
getBeginLoc());
9873 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9874 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9878template <
typename Derived>
9879StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
9880 OMPTargetParallelDirective *
D) {
9881 DeclarationNameInfo DirName;
9882 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9883 OMPD_target_parallel, DirName,
nullptr,
D->
getBeginLoc());
9884 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9885 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9889template <
typename Derived>
9890StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
9891 OMPTargetParallelForDirective *
D) {
9892 DeclarationNameInfo DirName;
9893 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9894 OMPD_target_parallel_for, DirName,
nullptr,
D->
getBeginLoc());
9895 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9896 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9900template <
typename Derived>
9901StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
9902 OMPTargetUpdateDirective *
D) {
9903 DeclarationNameInfo DirName;
9904 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9905 OMPD_target_update, DirName,
nullptr,
D->
getBeginLoc());
9906 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9907 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9911template <
typename Derived>
9913TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *
D) {
9914 DeclarationNameInfo DirName;
9915 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9917 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9918 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9922template <
typename Derived>
9923StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
9924 OMPCancellationPointDirective *
D) {
9925 DeclarationNameInfo DirName;
9926 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9927 OMPD_cancellation_point, DirName,
nullptr,
D->
getBeginLoc());
9928 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9929 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9933template <
typename Derived>
9935TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *
D) {
9936 DeclarationNameInfo DirName;
9937 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9939 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9940 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9944template <
typename Derived>
9946TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *
D) {
9947 DeclarationNameInfo DirName;
9948 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9950 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9951 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9955template <
typename Derived>
9956StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
9957 OMPTaskLoopSimdDirective *
D) {
9958 DeclarationNameInfo DirName;
9959 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9960 OMPD_taskloop_simd, DirName,
nullptr,
D->
getBeginLoc());
9961 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9962 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9966template <
typename Derived>
9967StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
9968 OMPMasterTaskLoopDirective *
D) {
9969 DeclarationNameInfo DirName;
9970 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9971 OMPD_master_taskloop, DirName,
nullptr,
D->
getBeginLoc());
9972 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9973 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9977template <
typename Derived>
9978StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective(
9979 OMPMaskedTaskLoopDirective *
D) {
9980 DeclarationNameInfo DirName;
9981 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9982 OMPD_masked_taskloop, DirName,
nullptr,
D->
getBeginLoc());
9983 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9984 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9988template <
typename Derived>
9989StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
9990 OMPMasterTaskLoopSimdDirective *
D) {
9991 DeclarationNameInfo DirName;
9992 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9993 OMPD_master_taskloop_simd, DirName,
nullptr,
D->
getBeginLoc());
9994 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
9995 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9999template <
typename Derived>
10000StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective(
10001 OMPMaskedTaskLoopSimdDirective *
D) {
10002 DeclarationNameInfo DirName;
10003 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10004 OMPD_masked_taskloop_simd, DirName,
nullptr,
D->
getBeginLoc());
10005 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10006 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10010template <
typename Derived>
10011StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
10012 OMPParallelMasterTaskLoopDirective *
D) {
10013 DeclarationNameInfo DirName;
10014 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10015 OMPD_parallel_master_taskloop, DirName,
nullptr,
D->
getBeginLoc());
10016 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10017 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10021template <
typename Derived>
10022StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective(
10023 OMPParallelMaskedTaskLoopDirective *
D) {
10024 DeclarationNameInfo DirName;
10025 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10026 OMPD_parallel_masked_taskloop, DirName,
nullptr,
D->
getBeginLoc());
10027 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10028 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10032template <
typename Derived>
10034TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
10035 OMPParallelMasterTaskLoopSimdDirective *
D) {
10036 DeclarationNameInfo DirName;
10037 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10038 OMPD_parallel_master_taskloop_simd, DirName,
nullptr,
D->
getBeginLoc());
10039 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10040 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10044template <
typename Derived>
10046TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective(
10047 OMPParallelMaskedTaskLoopSimdDirective *
D) {
10048 DeclarationNameInfo DirName;
10049 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10050 OMPD_parallel_masked_taskloop_simd, DirName,
nullptr,
D->
getBeginLoc());
10051 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10052 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10056template <
typename Derived>
10057StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
10058 OMPDistributeDirective *
D) {
10059 DeclarationNameInfo DirName;
10060 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10062 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10063 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10067template <
typename Derived>
10068StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
10069 OMPDistributeParallelForDirective *
D) {
10070 DeclarationNameInfo DirName;
10071 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10072 OMPD_distribute_parallel_for, DirName,
nullptr,
D->
getBeginLoc());
10073 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10074 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10078template <
typename Derived>
10080TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
10081 OMPDistributeParallelForSimdDirective *
D) {
10082 DeclarationNameInfo DirName;
10083 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10084 OMPD_distribute_parallel_for_simd, DirName,
nullptr,
D->
getBeginLoc());
10085 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10086 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10090template <
typename Derived>
10091StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
10092 OMPDistributeSimdDirective *
D) {
10093 DeclarationNameInfo DirName;
10094 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10095 OMPD_distribute_simd, DirName,
nullptr,
D->
getBeginLoc());
10096 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10097 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10101template <
typename Derived>
10102StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
10103 OMPTargetParallelForSimdDirective *
D) {
10104 DeclarationNameInfo DirName;
10105 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10106 OMPD_target_parallel_for_simd, DirName,
nullptr,
D->
getBeginLoc());
10107 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10108 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10112template <
typename Derived>
10113StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
10114 OMPTargetSimdDirective *
D) {
10115 DeclarationNameInfo DirName;
10116 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10117 OMPD_target_simd, DirName,
nullptr,
D->
getBeginLoc());
10118 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10119 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10123template <
typename Derived>
10124StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
10125 OMPTeamsDistributeDirective *
D) {
10126 DeclarationNameInfo DirName;
10127 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10128 OMPD_teams_distribute, DirName,
nullptr,
D->
getBeginLoc());
10129 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10130 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10134template <
typename Derived>
10135StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
10136 OMPTeamsDistributeSimdDirective *
D) {
10137 DeclarationNameInfo DirName;
10138 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10139 OMPD_teams_distribute_simd, DirName,
nullptr,
D->
getBeginLoc());
10140 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10141 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10145template <
typename Derived>
10146StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
10147 OMPTeamsDistributeParallelForSimdDirective *
D) {
10148 DeclarationNameInfo DirName;
10149 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10150 OMPD_teams_distribute_parallel_for_simd, DirName,
nullptr,
10152 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10153 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10157template <
typename Derived>
10158StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
10159 OMPTeamsDistributeParallelForDirective *
D) {
10160 DeclarationNameInfo DirName;
10161 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10162 OMPD_teams_distribute_parallel_for, DirName,
nullptr,
D->
getBeginLoc());
10163 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10164 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10168template <
typename Derived>
10169StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
10170 OMPTargetTeamsDirective *
D) {
10171 DeclarationNameInfo DirName;
10172 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10173 OMPD_target_teams, DirName,
nullptr,
D->
getBeginLoc());
10174 auto Res = getDerived().TransformOMPExecutableDirective(
D);
10175 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10179template <
typename Derived>
10180StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
10181 OMPTargetTeamsDistributeDirective *
D) {
10182 DeclarationNameInfo DirName;
10183 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10184 OMPD_target_teams_distribute, DirName,
nullptr,
D->
getBeginLoc());
10185 auto Res = getDerived().TransformOMPExecutableDirective(
D);
10186 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10190template <
typename Derived>
10192TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
10193 OMPTargetTeamsDistributeParallelForDirective *
D) {
10194 DeclarationNameInfo DirName;
10195 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10196 OMPD_target_teams_distribute_parallel_for, DirName,
nullptr,
10198 auto Res = getDerived().TransformOMPExecutableDirective(
D);
10199 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10203template <
typename Derived>
10205 TransformOMPTargetTeamsDistributeParallelForSimdDirective(
10206 OMPTargetTeamsDistributeParallelForSimdDirective *
D) {
10207 DeclarationNameInfo DirName;
10208 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10209 OMPD_target_teams_distribute_parallel_for_simd, DirName,
nullptr,
10211 auto Res = getDerived().TransformOMPExecutableDirective(
D);
10212 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10216template <
typename Derived>
10218TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
10219 OMPTargetTeamsDistributeSimdDirective *
D) {
10220 DeclarationNameInfo DirName;
10221 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10222 OMPD_target_teams_distribute_simd, DirName,
nullptr,
D->
getBeginLoc());
10223 auto Res = getDerived().TransformOMPExecutableDirective(
D);
10224 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10228template <
typename Derived>
10230TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *
D) {
10231 DeclarationNameInfo DirName;
10232 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10234 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10235 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10239template <
typename Derived>
10241TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *
D) {
10242 DeclarationNameInfo DirName;
10243 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10245 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10246 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10250template <
typename Derived>
10252TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *
D) {
10253 DeclarationNameInfo DirName;
10254 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10256 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10257 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10261template <
typename Derived>
10262StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
10263 OMPGenericLoopDirective *
D) {
10264 DeclarationNameInfo DirName;
10265 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10267 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10268 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10272template <
typename Derived>
10273StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective(
10274 OMPTeamsGenericLoopDirective *
D) {
10275 DeclarationNameInfo DirName;
10276 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10278 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10279 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10283template <
typename Derived>
10284StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective(
10285 OMPTargetTeamsGenericLoopDirective *
D) {
10286 DeclarationNameInfo DirName;
10287 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10288 OMPD_target_teams_loop, DirName,
nullptr,
D->
getBeginLoc());
10289 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10290 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10294template <
typename Derived>
10295StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective(
10296 OMPParallelGenericLoopDirective *
D) {
10297 DeclarationNameInfo DirName;
10298 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10299 OMPD_parallel_loop, DirName,
nullptr,
D->
getBeginLoc());
10300 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10301 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10305template <
typename Derived>
10307TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective(
10308 OMPTargetParallelGenericLoopDirective *
D) {
10309 DeclarationNameInfo DirName;
10310 getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10311 OMPD_target_parallel_loop, DirName,
nullptr,
D->
getBeginLoc());
10312 StmtResult Res = getDerived().TransformOMPExecutableDirective(
D);
10313 getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10320template <
typename Derived>
10321OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *
C) {
10322 ExprResult Cond = getDerived().TransformExpr(
C->getCondition());
10323 if (Cond.isInvalid())
10325 return getDerived().RebuildOMPIfClause(
10326 C->getNameModifier(), Cond.get(),
C->getBeginLoc(),
C->getLParenLoc(),
10327 C->getNameModifierLoc(),
C->getColonLoc(),
C->getEndLoc());
10330template <
typename Derived>
10331OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *
C) {
10332 ExprResult Cond = getDerived().TransformExpr(
C->getCondition());
10333 if (Cond.isInvalid())
10335 return getDerived().RebuildOMPFinalClause(Cond.get(),
C->getBeginLoc(),
10336 C->getLParenLoc(),
C->getEndLoc());
10339template <
typename Derived>
10341TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *
C) {
10342 ExprResult NumThreads = getDerived().TransformExpr(
C->getNumThreads());
10343 if (NumThreads.isInvalid())
10345 return getDerived().RebuildOMPNumThreadsClause(
10346 NumThreads.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10349template <
typename Derived>
10351TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *
C) {
10352 ExprResult E = getDerived().TransformExpr(
C->getSafelen());
10355 return getDerived().RebuildOMPSafelenClause(
10356 E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10359template <
typename Derived>
10361TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *
C) {
10362 ExprResult E = getDerived().TransformExpr(
C->getAllocator());
10365 return getDerived().RebuildOMPAllocatorClause(
10366 E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10369template <
typename Derived>
10371TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *
C) {
10372 ExprResult E = getDerived().TransformExpr(
C->getSimdlen());
10375 return getDerived().RebuildOMPSimdlenClause(
10376 E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10379template <
typename Derived>
10380OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *
C) {
10382 TransformedSizes.reserve(
C->getNumSizes());
10384 for (Expr *
E :
C->getSizesRefs()) {
10386 TransformedSizes.push_back(
nullptr);
10395 TransformedSizes.push_back(
T.get());
10398 if (!Changed && !getDerived().AlwaysRebuild())
10400 return RebuildOMPSizesClause(TransformedSizes,
C->getBeginLoc(),
10401 C->getLParenLoc(),
C->getEndLoc());
10404template <
typename Derived>
10406TreeTransform<Derived>::TransformOMPPermutationClause(OMPPermutationClause *
C) {
10408 TransformedArgs.reserve(
C->getNumLoops());
10410 for (Expr *
E :
C->getArgsRefs()) {
10412 TransformedArgs.push_back(
nullptr);
10421 TransformedArgs.push_back(
T.get());
10424 if (!Changed && !getDerived().AlwaysRebuild())
10426 return RebuildOMPPermutationClause(TransformedArgs,
C->getBeginLoc(),
10427 C->getLParenLoc(),
C->getEndLoc());
10430template <
typename Derived>
10431OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *
C) {
10432 if (!getDerived().AlwaysRebuild())
10434 return RebuildOMPFullClause(
C->getBeginLoc(),
C->getEndLoc());
10437template <
typename Derived>
10439TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *
C) {
10440 ExprResult T = getDerived().TransformExpr(
C->getFactor());
10443 Expr *Factor =
T.get();
10444 bool Changed = Factor !=
C->getFactor();
10446 if (!Changed && !getDerived().AlwaysRebuild())
10448 return RebuildOMPPartialClause(Factor,
C->getBeginLoc(),
C->getLParenLoc(),
10452template <
typename Derived>
10454TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *
C) {
10455 ExprResult E = getDerived().TransformExpr(
C->getNumForLoops());
10458 return getDerived().RebuildOMPCollapseClause(
10459 E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10462template <
typename Derived>
10464TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *
C) {
10465 return getDerived().RebuildOMPDefaultClause(
10466 C->getDefaultKind(),
C->getDefaultKindKwLoc(),
C->getBeginLoc(),
10467 C->getLParenLoc(),
C->getEndLoc());
10470template <
typename Derived>
10472TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *
C) {
10473 return getDerived().RebuildOMPProcBindClause(
10474 C->getProcBindKind(),
C->getProcBindKindKwLoc(),
C->getBeginLoc(),
10475 C->getLParenLoc(),
C->getEndLoc());
10478template <
typename Derived>
10480TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *
C) {
10481 ExprResult E = getDerived().TransformExpr(
C->getChunkSize());
10484 return getDerived().RebuildOMPScheduleClause(
10485 C->getFirstScheduleModifier(),
C->getSecondScheduleModifier(),
10486 C->getScheduleKind(),
E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
10487 C->getFirstScheduleModifierLoc(),
C->getSecondScheduleModifierLoc(),
10488 C->getScheduleKindLoc(),
C->getCommaLoc(),
C->getEndLoc());
10491template <
typename Derived>
10493TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *
C) {
10495 if (
auto *
Num =
C->getNumForLoops()) {
10496 E = getDerived().TransformExpr(
Num);
10500 return getDerived().RebuildOMPOrderedClause(
C->getBeginLoc(),
C->getEndLoc(),
10501 C->getLParenLoc(),
E.get());
10504template <
typename Derived>
10506TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *
C) {
10508 if (Expr *Evt =
C->getEventHandler()) {
10509 E = getDerived().TransformExpr(Evt);
10513 return getDerived().RebuildOMPDetachClause(
E.get(),
C->getBeginLoc(),
10514 C->getLParenLoc(),
C->getEndLoc());
10517template <
typename Derived>
10519TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *
C) {
10524template <
typename Derived>
10526TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *
C) {
10531template <
typename Derived>
10533TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *
C) {
10538template <
typename Derived>
10539OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *
C) {
10544template <
typename Derived>
10545OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *
C) {
10550template <
typename Derived>
10552TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *
C) {
10557template <
typename Derived>
10559TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *
C) {
10564template <
typename Derived>
10566TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *
C) {
10571template <
typename Derived>
10572OMPClause *TreeTransform<Derived>::TransformOMPFailClause(OMPFailClause *
C) {
10577template <
typename Derived>
10579TreeTransform<Derived>::TransformOMPAbsentClause(OMPAbsentClause *
C) {
10583template <
typename Derived>
10584OMPClause *TreeTransform<Derived>::TransformOMPHoldsClause(OMPHoldsClause *
C) {
10585 ExprResult E = getDerived().TransformExpr(
C->getExpr());
10588 return getDerived().RebuildOMPHoldsClause(
E.get(),
C->getBeginLoc(),
10589 C->getLParenLoc(),
C->getEndLoc());
10592template <
typename Derived>
10594TreeTransform<Derived>::TransformOMPContainsClause(OMPContainsClause *
C) {
10598template <
typename Derived>
10600TreeTransform<Derived>::TransformOMPNoOpenMPClause(OMPNoOpenMPClause *
C) {
10603template <
typename Derived>
10604OMPClause *TreeTransform<Derived>::TransformOMPNoOpenMPRoutinesClause(
10605 OMPNoOpenMPRoutinesClause *
C) {
10608template <
typename Derived>
10609OMPClause *TreeTransform<Derived>::TransformOMPNoParallelismClause(
10610 OMPNoParallelismClause *
C) {
10614template <
typename Derived>
10616TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *
C) {
10621template <
typename Derived>
10623TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *
C) {
10628template <
typename Derived>
10630TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *
C) {
10635template <
typename Derived>
10637TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *
C) {
10642template <
typename Derived>
10644TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *
C) {
10649template <
typename Derived>
10650OMPClause *TreeTransform<Derived>::TransformOMPWeakClause(OMPWeakClause *
C) {
10655template <
typename Derived>
10657TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *
C) {
10662template <
typename Derived>
10663OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *
C) {
10668template <
typename Derived>
10670TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *
C) {
10675template <
typename Derived>
10676OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *
C) {
10677 ExprResult IVR = getDerived().TransformExpr(
C->getInteropVar());
10678 if (IVR.isInvalid())
10681 OMPInteropInfo InteropInfo(
C->getIsTarget(),
C->getIsTargetSync());
10682 InteropInfo.PreferTypes.reserve(
C->varlist_size() - 1);
10683 for (Expr *
E : llvm::drop_begin(
C->varlist())) {
10684 ExprResult ER = getDerived().TransformExpr(cast<Expr>(
E));
10685 if (ER.isInvalid())
10687 InteropInfo.PreferTypes.push_back(ER.get());
10689 return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo,
10690 C->getBeginLoc(),
C->getLParenLoc(),
10691 C->getVarLoc(),
C->getEndLoc());
10694template <
typename Derived>
10695OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *
C) {
10696 ExprResult ER = getDerived().TransformExpr(
C->getInteropVar());
10697 if (ER.isInvalid())
10699 return getDerived().RebuildOMPUseClause(ER.get(),
C->getBeginLoc(),
10700 C->getLParenLoc(),
C->getVarLoc(),
10704template <
typename Derived>
10706TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *
C) {
10708 if (Expr *IV =
C->getInteropVar()) {
10709 ER = getDerived().TransformExpr(IV);
10710 if (ER.isInvalid())
10713 return getDerived().RebuildOMPDestroyClause(ER.get(),
C->getBeginLoc(),
10714 C->getLParenLoc(),
C->getVarLoc(),
10718template <
typename Derived>
10720TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *
C) {
10721 ExprResult Cond = getDerived().TransformExpr(
C->getCondition());
10722 if (Cond.isInvalid())
10724 return getDerived().RebuildOMPNovariantsClause(
10725 Cond.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10728template <
typename Derived>
10730TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *
C) {
10731 ExprResult Cond = getDerived().TransformExpr(
C->getCondition());
10732 if (Cond.isInvalid())
10734 return getDerived().RebuildOMPNocontextClause(
10735 Cond.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10738template <
typename Derived>
10740TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *
C) {
10741 ExprResult ThreadID = getDerived().TransformExpr(
C->getThreadID());
10742 if (ThreadID.isInvalid())
10744 return getDerived().RebuildOMPFilterClause(ThreadID.get(),
C->getBeginLoc(),
10745 C->getLParenLoc(),
C->getEndLoc());
10748template <
typename Derived>
10749OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *
C) {
10750 ExprResult E = getDerived().TransformExpr(
C->getAlignment());
10753 return getDerived().RebuildOMPAlignClause(
E.get(),
C->getBeginLoc(),
10754 C->getLParenLoc(),
C->getEndLoc());
10757template <
typename Derived>
10758OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
10759 OMPUnifiedAddressClause *
C) {
10760 llvm_unreachable(
"unified_address clause cannot appear in dependent context");
10763template <
typename Derived>
10764OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
10765 OMPUnifiedSharedMemoryClause *
C) {
10767 "unified_shared_memory clause cannot appear in dependent context");
10770template <
typename Derived>
10771OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
10772 OMPReverseOffloadClause *
C) {
10773 llvm_unreachable(
"reverse_offload clause cannot appear in dependent context");
10776template <
typename Derived>
10777OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
10778 OMPDynamicAllocatorsClause *
C) {
10780 "dynamic_allocators clause cannot appear in dependent context");
10783template <
typename Derived>
10784OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
10785 OMPAtomicDefaultMemOrderClause *
C) {
10787 "atomic_default_mem_order clause cannot appear in dependent context");
10790template <
typename Derived>
10791OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *
C) {
10792 return getDerived().RebuildOMPAtClause(
C->getAtKind(),
C->getAtKindKwLoc(),
10793 C->getBeginLoc(),
C->getLParenLoc(),
10797template <
typename Derived>
10799TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *
C) {
10800 return getDerived().RebuildOMPSeverityClause(
10801 C->getSeverityKind(),
C->getSeverityKindKwLoc(),
C->getBeginLoc(),
10802 C->getLParenLoc(),
C->getEndLoc());
10805template <
typename Derived>
10807TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *
C) {
10808 ExprResult E = getDerived().TransformExpr(
C->getMessageString());
10811 return getDerived().RebuildOMPMessageClause(
10812 C->getMessageString(),
C->getBeginLoc(),
C->getLParenLoc(),
10816template <
typename Derived>
10818TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *
C) {
10820 Vars.reserve(
C->varlist_size());
10821 for (
auto *VE :
C->varlist()) {
10822 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10823 if (EVar.isInvalid())
10825 Vars.push_back(EVar.get());
10827 return getDerived().RebuildOMPPrivateClause(
10828 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10831template <
typename Derived>
10832OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
10833 OMPFirstprivateClause *
C) {
10835 Vars.reserve(
C->varlist_size());
10836 for (
auto *VE :
C->varlist()) {
10837 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10838 if (EVar.isInvalid())
10840 Vars.push_back(EVar.get());
10842 return getDerived().RebuildOMPFirstprivateClause(
10843 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
10846template <
typename Derived>
10848TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *
C) {
10850 Vars.reserve(
C->varlist_size());
10851 for (
auto *VE :
C->varlist()) {
10852 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10853 if (EVar.isInvalid())
10855 Vars.push_back(EVar.get());
10857 return getDerived().RebuildOMPLastprivateClause(
10858 Vars,
C->getKind(),
C->getKindLoc(),
C->getColonLoc(),
C->getBeginLoc(),
10859 C->getLParenLoc(),
C->getEndLoc());
10862template <
typename Derived>
10864TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *
C) {
10866 Vars.reserve(
C->varlist_size());
10867 for (
auto *VE :
C->varlist()) {
10868 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10869 if (EVar.isInvalid())
10871 Vars.push_back(EVar.get());
10873 return getDerived().RebuildOMPSharedClause(Vars,
C->getBeginLoc(),
10874 C->getLParenLoc(),
C->getEndLoc());
10877template <
typename Derived>
10879TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *
C) {
10881 Vars.reserve(
C->varlist_size());
10882 for (
auto *VE :
C->varlist()) {
10883 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10884 if (EVar.isInvalid())
10886 Vars.push_back(EVar.get());
10888 CXXScopeSpec ReductionIdScopeSpec;
10889 ReductionIdScopeSpec.Adopt(
C->getQualifierLoc());
10891 DeclarationNameInfo NameInfo =
C->getNameInfo();
10892 if (NameInfo.getName()) {
10893 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10894 if (!NameInfo.getName())
10900 for (
auto *
E :
C->reduction_ops()) {
10903 auto *ULE = cast<UnresolvedLookupExpr>(
E);
10904 UnresolvedSet<8> Decls;
10905 for (
auto *
D : ULE->decls()) {
10907 cast<NamedDecl>(getDerived().TransformDecl(
E->
getExprLoc(),
D));
10908 Decls.addDecl(InstD, InstD->getAccess());
10912 ReductionIdScopeSpec.getWithLocInContext(SemaRef.
Context), NameInfo,
10913 true, Decls.begin(), Decls.end(),
10916 UnresolvedReductions.push_back(
nullptr);
10918 return getDerived().RebuildOMPReductionClause(
10919 Vars,
C->getModifier(),
C->getBeginLoc(),
C->getLParenLoc(),
10920 C->getModifierLoc(),
C->getColonLoc(),
C->getEndLoc(),
10921 ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10924template <
typename Derived>
10925OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
10926 OMPTaskReductionClause *
C) {
10928 Vars.reserve(
C->varlist_size());
10929 for (
auto *VE :
C->varlist()) {
10930 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10931 if (EVar.isInvalid())
10933 Vars.push_back(EVar.get());
10935 CXXScopeSpec ReductionIdScopeSpec;
10936 ReductionIdScopeSpec.Adopt(
C->getQualifierLoc());
10938 DeclarationNameInfo NameInfo =
C->getNameInfo();
10939 if (NameInfo.getName()) {
10940 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10941 if (!NameInfo.getName())
10947 for (
auto *
E :
C->reduction_ops()) {
10950 auto *ULE = cast<UnresolvedLookupExpr>(
E);
10951 UnresolvedSet<8> Decls;
10952 for (
auto *
D : ULE->decls()) {
10954 cast<NamedDecl>(getDerived().TransformDecl(
E->
getExprLoc(),
D));
10955 Decls.addDecl(InstD, InstD->getAccess());
10959 ReductionIdScopeSpec.getWithLocInContext(SemaRef.
Context), NameInfo,
10960 true, Decls.begin(), Decls.end(),
10963 UnresolvedReductions.push_back(
nullptr);
10965 return getDerived().RebuildOMPTaskReductionClause(
10966 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getColonLoc(),
10967 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10970template <
typename Derived>
10972TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *
C) {
10974 Vars.reserve(
C->varlist_size());
10975 for (
auto *VE :
C->varlist()) {
10976 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10977 if (EVar.isInvalid())
10979 Vars.push_back(EVar.get());
10981 CXXScopeSpec ReductionIdScopeSpec;
10982 ReductionIdScopeSpec.Adopt(
C->getQualifierLoc());
10984 DeclarationNameInfo NameInfo =
C->getNameInfo();
10985 if (NameInfo.getName()) {
10986 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10987 if (!NameInfo.getName())
10993 for (
auto *
E :
C->reduction_ops()) {
10996 auto *ULE = cast<UnresolvedLookupExpr>(
E);
10997 UnresolvedSet<8> Decls;
10998 for (
auto *
D : ULE->decls()) {
11000 cast<NamedDecl>(getDerived().TransformDecl(
E->
getExprLoc(),
D));
11001 Decls.addDecl(InstD, InstD->getAccess());
11005 ReductionIdScopeSpec.getWithLocInContext(SemaRef.
Context), NameInfo,
11006 true, Decls.begin(), Decls.end(),
11009 UnresolvedReductions.push_back(
nullptr);
11011 return getDerived().RebuildOMPInReductionClause(
11012 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getColonLoc(),
11013 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
11016template <
typename Derived>
11018TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *
C) {
11020 Vars.reserve(
C->varlist_size());
11021 for (
auto *VE :
C->varlist()) {
11022 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11023 if (EVar.isInvalid())
11025 Vars.push_back(EVar.get());
11027 ExprResult Step = getDerived().TransformExpr(
C->getStep());
11028 if (Step.isInvalid())
11030 return getDerived().RebuildOMPLinearClause(
11031 Vars, Step.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getModifier(),
11032 C->getModifierLoc(),
C->getColonLoc(),
C->getStepModifierLoc(),
11036template <
typename Derived>
11038TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *
C) {
11040 Vars.reserve(
C->varlist_size());
11041 for (
auto *VE :
C->varlist()) {
11042 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11043 if (EVar.isInvalid())
11045 Vars.push_back(EVar.get());
11047 ExprResult Alignment = getDerived().TransformExpr(
C->getAlignment());
11048 if (Alignment.isInvalid())
11050 return getDerived().RebuildOMPAlignedClause(
11051 Vars, Alignment.get(),
C->getBeginLoc(),
C->getLParenLoc(),
11052 C->getColonLoc(),
C->getEndLoc());
11055template <
typename Derived>
11057TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *
C) {
11059 Vars.reserve(
C->varlist_size());
11060 for (
auto *VE :
C->varlist()) {
11061 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11062 if (EVar.isInvalid())
11064 Vars.push_back(EVar.get());
11066 return getDerived().RebuildOMPCopyinClause(Vars,
C->getBeginLoc(),
11067 C->getLParenLoc(),
C->getEndLoc());
11070template <
typename Derived>
11072TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *
C) {
11074 Vars.reserve(
C->varlist_size());
11075 for (
auto *VE :
C->varlist()) {
11076 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11077 if (EVar.isInvalid())
11079 Vars.push_back(EVar.get());
11081 return getDerived().RebuildOMPCopyprivateClause(
11082 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11085template <
typename Derived>
11086OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *
C) {
11088 Vars.reserve(
C->varlist_size());
11089 for (
auto *VE :
C->varlist()) {
11090 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11091 if (EVar.isInvalid())
11093 Vars.push_back(EVar.get());
11095 return getDerived().RebuildOMPFlushClause(Vars,
C->getBeginLoc(),
11096 C->getLParenLoc(),
C->getEndLoc());
11099template <
typename Derived>
11101TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *
C) {
11102 ExprResult E = getDerived().TransformExpr(
C->getDepobj());
11105 return getDerived().RebuildOMPDepobjClause(
E.get(),
C->getBeginLoc(),
11106 C->getLParenLoc(),
C->getEndLoc());
11109template <
typename Derived>
11111TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *
C) {
11113 Expr *DepModifier =
C->getModifier();
11115 ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
11116 if (DepModRes.isInvalid())
11118 DepModifier = DepModRes.
get();
11120 Vars.reserve(
C->varlist_size());
11121 for (
auto *VE :
C->varlist()) {
11122 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11123 if (EVar.isInvalid())
11125 Vars.push_back(EVar.get());
11127 return getDerived().RebuildOMPDependClause(
11128 {
C->getDependencyKind(),
C->getDependencyLoc(),
C->getColonLoc(),
11129 C->getOmpAllMemoryLoc()},
11130 DepModifier, Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11133template <
typename Derived>
11135TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *
C) {
11136 ExprResult E = getDerived().TransformExpr(
C->getDevice());
11139 return getDerived().RebuildOMPDeviceClause(
11140 C->getModifier(),
E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
11141 C->getModifierLoc(),
C->getEndLoc());
11144template <
typename Derived,
class T>
11151 Vars.reserve(
C->varlist_size());
11152 for (
auto *VE :
C->varlist()) {
11156 Vars.push_back(EVar.
get());
11160 if (
C->getMapperQualifierLoc()) {
11161 QualifierLoc = TT.
getDerived().TransformNestedNameSpecifierLoc(
11162 C->getMapperQualifierLoc());
11166 MapperIdScopeSpec.
Adopt(QualifierLoc);
11167 MapperIdInfo =
C->getMapperIdInfo();
11168 if (MapperIdInfo.
getName()) {
11169 MapperIdInfo = TT.
getDerived().TransformDeclarationNameInfo(MapperIdInfo);
11175 for (
auto *
E :
C->mapperlists()) {
11178 auto *ULE = cast<UnresolvedLookupExpr>(
E);
11180 for (
auto *
D : ULE->decls()) {
11188 MapperIdInfo,
true, Decls.
begin(), Decls.
end(),
11191 UnresolvedMappers.push_back(
nullptr);
11197template <
typename Derived>
11198OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *
C) {
11199 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11201 Expr *IteratorModifier =
C->getIteratorModifier();
11202 if (IteratorModifier) {
11203 ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier);
11204 if (MapModRes.isInvalid())
11206 IteratorModifier = MapModRes.
get();
11208 CXXScopeSpec MapperIdScopeSpec;
11209 DeclarationNameInfo MapperIdInfo;
11211 if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
11212 *
this,
C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
11214 return getDerived().RebuildOMPMapClause(
11215 IteratorModifier,
C->getMapTypeModifiers(),
C->getMapTypeModifiersLoc(),
11216 MapperIdScopeSpec, MapperIdInfo,
C->getMapType(),
C->isImplicitMapType(),
11217 C->getMapLoc(),
C->getColonLoc(), Vars, Locs, UnresolvedMappers);
11220template <
typename Derived>
11222TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *
C) {
11223 Expr *Allocator =
C->getAllocator();
11225 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
11226 if (AllocatorRes.isInvalid())
11228 Allocator = AllocatorRes.get();
11230 Expr *Alignment =
C->getAlignment();
11232 ExprResult AlignmentRes = getDerived().TransformExpr(Alignment);
11233 if (AlignmentRes.isInvalid())
11235 Alignment = AlignmentRes.
get();
11238 Vars.reserve(
C->varlist_size());
11239 for (
auto *VE :
C->varlist()) {
11240 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11241 if (EVar.isInvalid())
11243 Vars.push_back(EVar.get());
11245 return getDerived().RebuildOMPAllocateClause(
11246 Allocator, Alignment,
C->getFirstAllocateModifier(),
11247 C->getFirstAllocateModifierLoc(),
C->getSecondAllocateModifier(),
11248 C->getSecondAllocateModifierLoc(), Vars,
C->getBeginLoc(),
11249 C->getLParenLoc(),
C->getColonLoc(),
C->getEndLoc());
11252template <
typename Derived>
11254TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *
C) {
11256 Vars.reserve(
C->varlist_size());
11257 for (
auto *VE :
C->varlist()) {
11258 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11259 if (EVar.isInvalid())
11261 Vars.push_back(EVar.get());
11263 return getDerived().RebuildOMPNumTeamsClause(
11264 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11267template <
typename Derived>
11269TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *
C) {
11271 Vars.reserve(
C->varlist_size());
11272 for (
auto *VE :
C->varlist()) {
11273 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11274 if (EVar.isInvalid())
11276 Vars.push_back(EVar.get());
11278 return getDerived().RebuildOMPThreadLimitClause(
11279 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11282template <
typename Derived>
11284TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *
C) {
11285 ExprResult E = getDerived().TransformExpr(
C->getPriority());
11288 return getDerived().RebuildOMPPriorityClause(
11289 E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11292template <
typename Derived>
11294TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *
C) {
11295 ExprResult E = getDerived().TransformExpr(
C->getGrainsize());
11298 return getDerived().RebuildOMPGrainsizeClause(
11299 C->getModifier(),
E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
11300 C->getModifierLoc(),
C->getEndLoc());
11303template <
typename Derived>
11305TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *
C) {
11306 ExprResult E = getDerived().TransformExpr(
C->getNumTasks());
11309 return getDerived().RebuildOMPNumTasksClause(
11310 C->getModifier(),
E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
11311 C->getModifierLoc(),
C->getEndLoc());
11314template <
typename Derived>
11315OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *
C) {
11316 ExprResult E = getDerived().TransformExpr(
C->getHint());
11319 return getDerived().RebuildOMPHintClause(
E.get(),
C->getBeginLoc(),
11320 C->getLParenLoc(),
C->getEndLoc());
11323template <
typename Derived>
11324OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
11325 OMPDistScheduleClause *
C) {
11326 ExprResult E = getDerived().TransformExpr(
C->getChunkSize());
11329 return getDerived().RebuildOMPDistScheduleClause(
11330 C->getDistScheduleKind(),
E.get(),
C->getBeginLoc(),
C->getLParenLoc(),
11331 C->getDistScheduleKindLoc(),
C->getCommaLoc(),
C->getEndLoc());
11334template <
typename Derived>
11336TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *
C) {
11339 return getDerived().RebuildOMPDefaultmapClause(
C->getDefaultmapModifier(),
11340 C->getDefaultmapKind(),
11343 C->getDefaultmapModifierLoc(),
11344 C->getDefaultmapKindLoc(),
11348template <
typename Derived>
11349OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *
C) {
11350 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11352 CXXScopeSpec MapperIdScopeSpec;
11353 DeclarationNameInfo MapperIdInfo;
11355 if (transformOMPMappableExprListClause<Derived, OMPToClause>(
11356 *
this,
C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
11358 return getDerived().RebuildOMPToClause(
11359 C->getMotionModifiers(),
C->getMotionModifiersLoc(), MapperIdScopeSpec,
11360 MapperIdInfo,
C->getColonLoc(), Vars, Locs, UnresolvedMappers);
11363template <
typename Derived>
11364OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *
C) {
11365 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11367 CXXScopeSpec MapperIdScopeSpec;
11368 DeclarationNameInfo MapperIdInfo;
11370 if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
11371 *
this,
C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
11373 return getDerived().RebuildOMPFromClause(
11374 C->getMotionModifiers(),
C->getMotionModifiersLoc(), MapperIdScopeSpec,
11375 MapperIdInfo,
C->getColonLoc(), Vars, Locs, UnresolvedMappers);
11378template <
typename Derived>
11379OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
11380 OMPUseDevicePtrClause *
C) {
11382 Vars.reserve(
C->varlist_size());
11383 for (
auto *VE :
C->varlist()) {
11384 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11385 if (EVar.isInvalid())
11387 Vars.push_back(EVar.get());
11389 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11390 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
11393template <
typename Derived>
11394OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
11395 OMPUseDeviceAddrClause *
C) {
11397 Vars.reserve(
C->varlist_size());
11398 for (
auto *VE :
C->varlist()) {
11399 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11400 if (EVar.isInvalid())
11402 Vars.push_back(EVar.get());
11404 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11405 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
11408template <
typename Derived>
11410TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
11412 Vars.reserve(
C->varlist_size());
11413 for (
auto *VE :
C->varlist()) {
11414 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11415 if (EVar.isInvalid())
11417 Vars.push_back(EVar.get());
11419 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11420 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
11423template <
typename Derived>
11424OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause(
11425 OMPHasDeviceAddrClause *
C) {
11427 Vars.reserve(
C->varlist_size());
11428 for (
auto *VE :
C->varlist()) {
11429 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11430 if (EVar.isInvalid())
11432 Vars.push_back(EVar.get());
11434 OMPVarListLocTy Locs(
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11435 return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs);
11438template <
typename Derived>
11440TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *
C) {
11442 Vars.reserve(
C->varlist_size());
11443 for (
auto *VE :
C->varlist()) {
11444 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11445 if (EVar.isInvalid())
11447 Vars.push_back(EVar.get());
11449 return getDerived().RebuildOMPNontemporalClause(
11450 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11453template <
typename Derived>
11455TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *
C) {
11457 Vars.reserve(
C->varlist_size());
11458 for (
auto *VE :
C->varlist()) {
11459 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11460 if (EVar.isInvalid())
11462 Vars.push_back(EVar.get());
11464 return getDerived().RebuildOMPInclusiveClause(
11465 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11468template <
typename Derived>
11470TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *
C) {
11472 Vars.reserve(
C->varlist_size());
11473 for (
auto *VE :
C->varlist()) {
11474 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11475 if (EVar.isInvalid())
11477 Vars.push_back(EVar.get());
11479 return getDerived().RebuildOMPExclusiveClause(
11480 Vars,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11483template <
typename Derived>
11484OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
11485 OMPUsesAllocatorsClause *
C) {
11487 Data.reserve(
C->getNumberOfAllocators());
11488 for (
unsigned I = 0,
E =
C->getNumberOfAllocators(); I <
E; ++I) {
11489 OMPUsesAllocatorsClause::Data
D =
C->getAllocatorData(I);
11490 ExprResult Allocator = getDerived().TransformExpr(
D.Allocator);
11491 if (Allocator.isInvalid())
11494 if (Expr *AT =
D.AllocatorTraits) {
11495 AllocatorTraits = getDerived().TransformExpr(AT);
11496 if (AllocatorTraits.isInvalid())
11499 SemaOpenMP::UsesAllocatorsData &NewD =
Data.emplace_back();
11500 NewD.Allocator = Allocator.get();
11501 NewD.AllocatorTraits = AllocatorTraits.get();
11502 NewD.LParenLoc =
D.LParenLoc;
11503 NewD.RParenLoc =
D.RParenLoc;
11505 return getDerived().RebuildOMPUsesAllocatorsClause(
11506 Data,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11509template <
typename Derived>
11511TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *
C) {
11513 Locators.reserve(
C->varlist_size());
11515 if (Expr *Modifier =
C->getModifier()) {
11516 ModifierRes = getDerived().TransformExpr(Modifier);
11517 if (ModifierRes.isInvalid())
11520 for (Expr *
E :
C->varlist()) {
11521 ExprResult Locator = getDerived().TransformExpr(
E);
11522 if (Locator.isInvalid())
11524 Locators.push_back(Locator.get());
11526 return getDerived().RebuildOMPAffinityClause(
11527 C->getBeginLoc(),
C->getLParenLoc(),
C->getColonLoc(),
C->getEndLoc(),
11528 ModifierRes.get(), Locators);
11531template <
typename Derived>
11532OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *
C) {
11533 return getDerived().RebuildOMPOrderClause(
11534 C->getKind(),
C->getKindKwLoc(),
C->getBeginLoc(),
C->getLParenLoc(),
11535 C->getEndLoc(),
C->getModifier(),
C->getModifierKwLoc());
11538template <
typename Derived>
11539OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *
C) {
11540 return getDerived().RebuildOMPBindClause(
11541 C->getBindKind(),
C->getBindKindLoc(),
C->getBeginLoc(),
11542 C->getLParenLoc(),
C->getEndLoc());
11545template <
typename Derived>
11546OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause(
11547 OMPXDynCGroupMemClause *
C) {
11549 if (
Size.isInvalid())
11551 return getDerived().RebuildOMPXDynCGroupMemClause(
11552 Size.get(),
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11555template <
typename Derived>
11557TreeTransform<Derived>::TransformOMPDoacrossClause(OMPDoacrossClause *
C) {
11559 Vars.reserve(
C->varlist_size());
11560 for (
auto *VE :
C->varlist()) {
11561 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11562 if (EVar.isInvalid())
11564 Vars.push_back(EVar.get());
11566 return getDerived().RebuildOMPDoacrossClause(
11567 C->getDependenceType(),
C->getDependenceLoc(),
C->getColonLoc(), Vars,
11568 C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11571template <
typename Derived>
11573TreeTransform<Derived>::TransformOMPXAttributeClause(OMPXAttributeClause *
C) {
11575 for (
auto *A :
C->getAttrs())
11576 NewAttrs.push_back(getDerived().TransformAttr(A));
11577 return getDerived().RebuildOMPXAttributeClause(
11578 NewAttrs,
C->getBeginLoc(),
C->getLParenLoc(),
C->getEndLoc());
11581template <
typename Derived>
11582OMPClause *TreeTransform<Derived>::TransformOMPXBareClause(OMPXBareClause *
C) {
11583 return getDerived().RebuildOMPXBareClause(
C->getBeginLoc(),
C->getEndLoc());
11590template <
typename Derived>
11591class OpenACCClauseTransform final
11592 :
public OpenACCClauseVisitor<OpenACCClauseTransform<Derived>> {
11593 TreeTransform<Derived> &Self;
11595 SemaOpenACC::OpenACCParsedClause &ParsedClause;
11596 OpenACCClause *NewClause =
nullptr;
11600 for (Expr *CurVar : VarList) {
11601 ExprResult Res = Self.TransformExpr(CurVar);
11603 if (!Res.isUsable())
11606 Res = Self.getSema().OpenACC().ActOnVar(ParsedClause.getClauseKind(),
11609 if (Res.isUsable())
11610 InstantiatedVarList.push_back(Res.get());
11613 return InstantiatedVarList;
11617 OpenACCClauseTransform(TreeTransform<Derived> &Self,
11619 SemaOpenACC::OpenACCParsedClause &PC)
11620 : Self(Self), ExistingClauses(ExistingClauses), ParsedClause(PC) {}
11622 OpenACCClause *CreatedClause()
const {
return NewClause; }
11624#define VISIT_CLAUSE(CLAUSE_NAME) \
11625 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
11626#include "clang/Basic/OpenACCClauses.def"
11629template <
typename Derived>
11630void OpenACCClauseTransform<Derived>::VisitDefaultClause(
11631 const OpenACCDefaultClause &
C) {
11640template <
typename Derived>
11641void OpenACCClauseTransform<Derived>::VisitIfClause(
const OpenACCIfClause &
C) {
11642 Expr *Cond =
const_cast<Expr *
>(
C.getConditionExpr());
11643 assert(Cond &&
"If constructed with invalid Condition");
11644 Sema::ConditionResult Res =
Self.TransformCondition(
11647 if (Res.isInvalid() || !Res.get().second)
11658template <
typename Derived>
11659void OpenACCClauseTransform<Derived>::VisitSelfClause(
11660 const OpenACCSelfClause &
C) {
11665 for (Expr *CurVar :
C.getVarList()) {
11668 if (!Res.isUsable())
11674 if (Res.isUsable())
11675 InstantiatedVarList.push_back(Res.get());
11687 if (
C.hasConditionExpr()) {
11688 Expr *Cond =
const_cast<Expr *
>(
C.getConditionExpr());
11689 Sema::ConditionResult Res =
11690 Self.TransformCondition(Cond->getExprLoc(),
nullptr, Cond,
11693 if (Res.isInvalid() || !Res.get().second)
11706template <
typename Derived>
11707void OpenACCClauseTransform<Derived>::VisitNumGangsClause(
11708 const OpenACCNumGangsClause &
C) {
11711 for (Expr *CurIntExpr :
C.getIntExprs()) {
11714 if (!Res.isUsable())
11719 C.getBeginLoc(), Res.get());
11720 if (!Res.isUsable())
11723 InstantiatedIntExprs.push_back(Res.get());
11733template <
typename Derived>
11734void OpenACCClauseTransform<Derived>::VisitPrivateClause(
11735 const OpenACCPrivateClause &
C) {
11745template <
typename Derived>
11746void OpenACCClauseTransform<Derived>::VisitHostClause(
11747 const OpenACCHostClause &
C) {
11757template <
typename Derived>
11758void OpenACCClauseTransform<Derived>::VisitDeviceClause(
11759 const OpenACCDeviceClause &
C) {
11769template <
typename Derived>
11770void OpenACCClauseTransform<Derived>::VisitFirstPrivateClause(
11771 const OpenACCFirstPrivateClause &
C) {
11781template <
typename Derived>
11782void OpenACCClauseTransform<Derived>::VisitNoCreateClause(
11783 const OpenACCNoCreateClause &
C) {
11793template <
typename Derived>
11794void OpenACCClauseTransform<Derived>::VisitPresentClause(
11795 const OpenACCPresentClause &
C) {
11805template <
typename Derived>
11806void OpenACCClauseTransform<Derived>::VisitCopyClause(
11807 const OpenACCCopyClause &
C) {
11817template <
typename Derived>
11818void OpenACCClauseTransform<Derived>::VisitCopyInClause(
11819 const OpenACCCopyInClause &
C) {
11830template <
typename Derived>
11831void OpenACCClauseTransform<Derived>::VisitCopyOutClause(
11832 const OpenACCCopyOutClause &
C) {
11834 false,
C.isZero());
11843template <
typename Derived>
11844void OpenACCClauseTransform<Derived>::VisitCreateClause(
11845 const OpenACCCreateClause &
C) {
11847 false,
C.isZero());
11855template <
typename Derived>
11856void OpenACCClauseTransform<Derived>::VisitAttachClause(
11857 const OpenACCAttachClause &
C) {
11861 VarList.erase(std::remove_if(VarList.begin(), VarList.end(), [&](Expr *
E) {
11862 return Self.getSema().OpenACC().CheckVarIsPointerType(
11863 OpenACCClauseKind::Attach, E);
11864 }), VarList.end());
11874template <
typename Derived>
11875void OpenACCClauseTransform<Derived>::VisitDetachClause(
11876 const OpenACCDetachClause &
C) {
11881 std::remove_if(VarList.begin(), VarList.end(),
11883 return Self.getSema().OpenACC().CheckVarIsPointerType(
11884 OpenACCClauseKind::Detach, E);
11896template <
typename Derived>
11897void OpenACCClauseTransform<Derived>::VisitDeleteClause(
11898 const OpenACCDeleteClause &
C) {
11907template <
typename Derived>
11908void OpenACCClauseTransform<Derived>::VisitUseDeviceClause(
11909 const OpenACCUseDeviceClause &
C) {
11918template <
typename Derived>
11919void OpenACCClauseTransform<Derived>::VisitDevicePtrClause(
11920 const OpenACCDevicePtrClause &
C) {
11924 VarList.erase(std::remove_if(VarList.begin(), VarList.end(), [&](Expr *
E) {
11925 return Self.getSema().OpenACC().CheckVarIsPointerType(
11926 OpenACCClauseKind::DevicePtr, E);
11927 }), VarList.end());
11937template <
typename Derived>
11938void OpenACCClauseTransform<Derived>::VisitNumWorkersClause(
11939 const OpenACCNumWorkersClause &
C) {
11940 Expr *IntExpr =
const_cast<Expr *
>(
C.getIntExpr());
11941 assert(IntExpr &&
"num_workers clause constructed with invalid int expr");
11944 if (!Res.isUsable())
11949 C.getBeginLoc(), Res.get());
11950 if (!Res.isUsable())
11960template <
typename Derived>
11961void OpenACCClauseTransform<Derived>::VisitDeviceNumClause (
11962 const OpenACCDeviceNumClause &
C) {
11963 Expr *IntExpr =
const_cast<Expr *
>(
C.getIntExpr());
11964 assert(IntExpr &&
"device_num clause constructed with invalid int expr");
11967 if (!Res.isUsable())
11972 C.getBeginLoc(), Res.get());
11973 if (!Res.isUsable())
11983template <
typename Derived>
11984void OpenACCClauseTransform<Derived>::VisitDefaultAsyncClause(
11985 const OpenACCDefaultAsyncClause &
C) {
11986 Expr *IntExpr =
const_cast<Expr *
>(
C.getIntExpr());
11987 assert(IntExpr &&
"default_async clause constructed with invalid int expr");
11990 if (!Res.isUsable())
11995 C.getBeginLoc(), Res.get());
11996 if (!Res.isUsable())
12006template <
typename Derived>
12007void OpenACCClauseTransform<Derived>::VisitVectorLengthClause(
12008 const OpenACCVectorLengthClause &
C) {
12009 Expr *IntExpr =
const_cast<Expr *
>(
C.getIntExpr());
12010 assert(IntExpr &&
"vector_length clause constructed with invalid int expr");
12013 if (!Res.isUsable())
12018 C.getBeginLoc(), Res.get());
12019 if (!Res.isUsable())
12029template <
typename Derived>
12030void OpenACCClauseTransform<Derived>::VisitAsyncClause(
12031 const OpenACCAsyncClause &
C) {
12032 if (
C.hasIntExpr()) {
12033 ExprResult Res =
Self.TransformExpr(
const_cast<Expr *
>(
C.getIntExpr()));
12034 if (!Res.isUsable())
12039 C.getBeginLoc(), Res.get());
12040 if (!Res.isUsable())
12053template <
typename Derived>
12054void OpenACCClauseTransform<Derived>::VisitWorkerClause(
12055 const OpenACCWorkerClause &
C) {
12056 if (
C.hasIntExpr()) {
12060 ExprResult Res =
Self.TransformExpr(
const_cast<Expr *
>(
C.getIntExpr()));
12061 if (!Res.isUsable())
12066 C.getBeginLoc(), Res.get());
12067 if (!Res.isUsable())
12080template <
typename Derived>
12081void OpenACCClauseTransform<Derived>::VisitVectorClause(
12082 const OpenACCVectorClause &
C) {
12083 if (
C.hasIntExpr()) {
12087 ExprResult Res =
Self.TransformExpr(
const_cast<Expr *
>(
C.getIntExpr()));
12088 if (!Res.isUsable())
12093 C.getBeginLoc(), Res.get());
12094 if (!Res.isUsable())
12107template <
typename Derived>
12108void OpenACCClauseTransform<Derived>::VisitWaitClause(
12109 const OpenACCWaitClause &
C) {
12110 if (!
C.getLParenLoc().isInvalid()) {
12111 Expr *DevNumExpr =
nullptr;
12115 if (
C.getDevNumExpr()) {
12117 if (!Res.isUsable())
12121 C.getBeginLoc(), Res.get());
12122 if (!Res.isUsable())
12125 DevNumExpr = Res.get();
12129 for (Expr *CurQueueIdExpr :
C.getQueueIdExprs()) {
12131 if (!Res.isUsable())
12135 C.getBeginLoc(), Res.get());
12136 if (!Res.isUsable())
12139 InstantiatedQueueIdExprs.push_back(Res.get());
12143 std::move(InstantiatedQueueIdExprs));
12153template <
typename Derived>
12154void OpenACCClauseTransform<Derived>::VisitDeviceTypeClause(
12155 const OpenACCDeviceTypeClause &
C) {
12158 Self.getSema().getASTContext(),
C.getClauseKind(),
12160 C.getArchitectures(), ParsedClause.
getEndLoc());
12163template <
typename Derived>
12164void OpenACCClauseTransform<Derived>::VisitAutoClause(
12165 const OpenACCAutoClause &
C) {
12172template <
typename Derived>
12173void OpenACCClauseTransform<Derived>::VisitIndependentClause(
12174 const OpenACCIndependentClause &
C) {
12180template <
typename Derived>
12181void OpenACCClauseTransform<Derived>::VisitSeqClause(
12182 const OpenACCSeqClause &
C) {
12187template <
typename Derived>
12188void OpenACCClauseTransform<Derived>::VisitFinalizeClause(
12189 const OpenACCFinalizeClause &
C) {
12195template <
typename Derived>
12196void OpenACCClauseTransform<Derived>::VisitIfPresentClause(
12197 const OpenACCIfPresentClause &
C) {
12203template <
typename Derived>
12204void OpenACCClauseTransform<Derived>::VisitReductionClause(
12205 const OpenACCReductionClause &
C) {
12209 for (Expr *Var : TransformedVars) {
12212 if (Res.isUsable())
12213 ValidVars.push_back(Res.get());
12216 NewClause =
Self.getSema().OpenACC().CheckReductionClause(
12219 C.getReductionOp(), ValidVars, ParsedClause.
getEndLoc());
12222template <
typename Derived>
12223void OpenACCClauseTransform<Derived>::VisitCollapseClause(
12224 const OpenACCCollapseClause &
C) {
12225 Expr *LoopCount =
const_cast<Expr *
>(
C.getLoopCount());
12226 assert(LoopCount &&
"collapse clause constructed with invalid loop count");
12230 NewLoopCount =
Self.getSema().OpenACC().ActOnIntExpr(
12232 NewLoopCount.get()->getBeginLoc(), NewLoopCount.get());
12235 Self.getSema().OpenACC().CheckCollapseLoopCount(NewLoopCount.get());
12237 if (!NewLoopCount.isUsable())
12247template <
typename Derived>
12248void OpenACCClauseTransform<Derived>::VisitTileClause(
12249 const OpenACCTileClause &
C) {
12253 for (Expr *
E :
C.getSizeExprs()) {
12256 if (!NewSizeExpr.isUsable())
12259 NewSizeExpr =
Self.getSema().OpenACC().ActOnIntExpr(
12261 NewSizeExpr.get()->getBeginLoc(), NewSizeExpr.get());
12263 NewSizeExpr =
Self.getSema().OpenACC().CheckTileSizeExpr(NewSizeExpr.get());
12265 if (!NewSizeExpr.isUsable())
12267 TransformedExprs.push_back(NewSizeExpr.get());
12276template <
typename Derived>
12277void OpenACCClauseTransform<Derived>::VisitGangClause(
12278 const OpenACCGangClause &
C) {
12282 for (
unsigned I = 0; I <
C.getNumExprs(); ++I) {
12283 ExprResult ER =
Self.TransformExpr(
const_cast<Expr *
>(
C.getExpr(I).second));
12284 if (!ER.isUsable())
12287 ER =
Self.getSema().OpenACC().CheckGangExpr(ExistingClauses,
12289 C.getExpr(I).first, ER.get());
12290 if (!ER.isUsable())
12292 TransformedGangKinds.push_back(
C.getExpr(I).first);
12293 TransformedIntExprs.push_back(ER.get());
12296 NewClause =
Self.getSema().OpenACC().CheckGangClause(
12299 TransformedGangKinds, TransformedIntExprs, ParsedClause.
getEndLoc());
12302template <
typename Derived>
12303OpenACCClause *TreeTransform<Derived>::TransformOpenACCClause(
12307 SemaOpenACC::OpenACCParsedClause ParsedClause(
12308 DirKind, OldClause->getClauseKind(), OldClause->getBeginLoc());
12309 ParsedClause.
setEndLoc(OldClause->getEndLoc());
12311 if (
const auto *WithParms = dyn_cast<OpenACCClauseWithParams>(OldClause))
12314 OpenACCClauseTransform<Derived> Transform{*
this, ExistingClauses,
12316 Transform.Visit(OldClause);
12318 return Transform.CreatedClause();
12321template <
typename Derived>
12323TreeTransform<Derived>::TransformOpenACCClauseList(
12326 for (
const auto *Clause : OldClauses) {
12327 if (OpenACCClause *TransformedClause = getDerived().TransformOpenACCClause(
12328 TransformedClauses, DirKind, Clause))
12329 TransformedClauses.push_back(TransformedClause);
12331 return TransformedClauses;
12334template <
typename Derived>
12335StmtResult TreeTransform<Derived>::TransformOpenACCComputeConstruct(
12336 OpenACCComputeConstruct *
C) {
12337 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12340 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12343 if (getSema().OpenACC().ActOnStartStmtDirective(
12344 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12348 SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12349 getSema().OpenACC(),
C->getDirectiveKind(),
C->getDirectiveLoc(),
12350 C->clauses(), TransformedClauses);
12351 StmtResult StrBlock = getDerived().TransformStmt(
C->getStructuredBlock());
12352 StrBlock = getSema().OpenACC().ActOnAssociatedStmt(
12353 C->getBeginLoc(),
C->getDirectiveKind(), TransformedClauses, StrBlock);
12355 return getDerived().RebuildOpenACCComputeConstruct(
12356 C->getDirectiveKind(),
C->getBeginLoc(),
C->getDirectiveLoc(),
12357 C->getEndLoc(), TransformedClauses, StrBlock);
12360template <
typename Derived>
12362TreeTransform<Derived>::TransformOpenACCLoopConstruct(OpenACCLoopConstruct *
C) {
12364 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12367 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12370 if (getSema().OpenACC().ActOnStartStmtDirective(
12371 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12375 SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12376 getSema().OpenACC(),
C->getDirectiveKind(),
C->getDirectiveLoc(),
12377 C->clauses(), TransformedClauses);
12379 Loop = getSema().OpenACC().ActOnAssociatedStmt(
12380 C->getBeginLoc(),
C->getDirectiveKind(), TransformedClauses,
Loop);
12382 return getDerived().RebuildOpenACCLoopConstruct(
12383 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12384 TransformedClauses,
Loop);
12387template <
typename Derived>
12388StmtResult TreeTransform<Derived>::TransformOpenACCCombinedConstruct(
12389 OpenACCCombinedConstruct *
C) {
12390 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12393 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12396 if (getSema().OpenACC().ActOnStartStmtDirective(
12397 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12401 SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12402 getSema().OpenACC(),
C->getDirectiveKind(),
C->getDirectiveLoc(),
12403 C->clauses(), TransformedClauses);
12405 Loop = getSema().OpenACC().ActOnAssociatedStmt(
12406 C->getBeginLoc(),
C->getDirectiveKind(), TransformedClauses,
Loop);
12408 return getDerived().RebuildOpenACCCombinedConstruct(
12409 C->getDirectiveKind(),
C->getBeginLoc(),
C->getDirectiveLoc(),
12410 C->getEndLoc(), TransformedClauses,
Loop);
12413template <
typename Derived>
12415TreeTransform<Derived>::TransformOpenACCDataConstruct(OpenACCDataConstruct *
C) {
12416 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12419 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12421 if (getSema().OpenACC().ActOnStartStmtDirective(
12422 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12425 SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12426 getSema().OpenACC(),
C->getDirectiveKind(),
C->getDirectiveLoc(),
12427 C->clauses(), TransformedClauses);
12428 StmtResult StrBlock = getDerived().TransformStmt(
C->getStructuredBlock());
12429 StrBlock = getSema().OpenACC().ActOnAssociatedStmt(
12430 C->getBeginLoc(),
C->getDirectiveKind(), TransformedClauses, StrBlock);
12432 return getDerived().RebuildOpenACCDataConstruct(
12433 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12434 TransformedClauses, StrBlock);
12437template <
typename Derived>
12438StmtResult TreeTransform<Derived>::TransformOpenACCEnterDataConstruct(
12439 OpenACCEnterDataConstruct *
C) {
12440 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12443 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12445 if (getSema().OpenACC().ActOnStartStmtDirective(
12446 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12449 return getDerived().RebuildOpenACCEnterDataConstruct(
12450 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12451 TransformedClauses);
12454template <
typename Derived>
12455StmtResult TreeTransform<Derived>::TransformOpenACCExitDataConstruct(
12456 OpenACCExitDataConstruct *
C) {
12457 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12460 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12462 if (getSema().OpenACC().ActOnStartStmtDirective(
12463 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12466 return getDerived().RebuildOpenACCExitDataConstruct(
12467 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12468 TransformedClauses);
12471template <
typename Derived>
12472StmtResult TreeTransform<Derived>::TransformOpenACCHostDataConstruct(
12473 OpenACCHostDataConstruct *
C) {
12474 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12477 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12479 if (getSema().OpenACC().ActOnStartStmtDirective(
12480 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12483 SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12484 getSema().OpenACC(),
C->getDirectiveKind(),
C->getDirectiveLoc(),
12485 C->clauses(), TransformedClauses);
12486 StmtResult StrBlock = getDerived().TransformStmt(
C->getStructuredBlock());
12487 StrBlock = getSema().OpenACC().ActOnAssociatedStmt(
12488 C->getBeginLoc(),
C->getDirectiveKind(), TransformedClauses, StrBlock);
12490 return getDerived().RebuildOpenACCHostDataConstruct(
12491 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12492 TransformedClauses, StrBlock);
12495template <
typename Derived>
12497TreeTransform<Derived>::TransformOpenACCInitConstruct(OpenACCInitConstruct *
C) {
12498 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12501 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12503 if (getSema().OpenACC().ActOnStartStmtDirective(
12504 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12507 return getDerived().RebuildOpenACCInitConstruct(
12508 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12509 TransformedClauses);
12512template <
typename Derived>
12513StmtResult TreeTransform<Derived>::TransformOpenACCShutdownConstruct(
12514 OpenACCShutdownConstruct *
C) {
12515 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12518 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12520 if (getSema().OpenACC().ActOnStartStmtDirective(
12521 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12524 return getDerived().RebuildOpenACCShutdownConstruct(
12525 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12526 TransformedClauses);
12528template <
typename Derived>
12530TreeTransform<Derived>::TransformOpenACCSetConstruct(OpenACCSetConstruct *
C) {
12531 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12534 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12536 if (getSema().OpenACC().ActOnStartStmtDirective(
12537 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12540 return getDerived().RebuildOpenACCSetConstruct(
12541 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12542 TransformedClauses);
12545template <
typename Derived>
12546StmtResult TreeTransform<Derived>::TransformOpenACCUpdateConstruct(
12547 OpenACCUpdateConstruct *
C) {
12548 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12551 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12553 if (getSema().OpenACC().ActOnStartStmtDirective(
12554 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12557 return getDerived().RebuildOpenACCUpdateConstruct(
12558 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getEndLoc(),
12559 TransformedClauses);
12562template <
typename Derived>
12564TreeTransform<Derived>::TransformOpenACCWaitConstruct(OpenACCWaitConstruct *
C) {
12565 getSema().OpenACC().ActOnConstruct(
C->getDirectiveKind(),
C->getBeginLoc());
12568 if (
C->hasDevNumExpr()) {
12569 DevNumExpr = getDerived().TransformExpr(
C->getDevNumExpr());
12571 if (DevNumExpr.isUsable())
12572 DevNumExpr = getSema().OpenACC().ActOnIntExpr(
12574 C->getBeginLoc(), DevNumExpr.get());
12579 for (Expr *QE :
C->getQueueIdExprs()) {
12580 assert(QE &&
"Null queue id expr?");
12581 ExprResult NewEQ = getDerived().TransformExpr(QE);
12583 if (!NewEQ.isUsable())
12587 C->getBeginLoc(), NewEQ.get());
12588 if (NewEQ.isUsable())
12589 QueueIdExprs.push_back(NewEQ.get());
12593 getDerived().TransformOpenACCClauseList(
C->getDirectiveKind(),
12596 if (getSema().OpenACC().ActOnStartStmtDirective(
12597 C->getDirectiveKind(),
C->getBeginLoc(), TransformedClauses))
12600 return getDerived().RebuildOpenACCWaitConstruct(
12601 C->getBeginLoc(),
C->getDirectiveLoc(),
C->getLParenLoc(),
12602 DevNumExpr.isUsable() ? DevNumExpr.get() :
nullptr,
C->getQueuesLoc(),
12603 QueueIdExprs,
C->getRParenLoc(),
C->getEndLoc(), TransformedClauses);
12606template <
typename Derived>
12607ExprResult TreeTransform<Derived>::TransformOpenACCAsteriskSizeExpr(
12608 OpenACCAsteriskSizeExpr *
E) {
12609 if (getDerived().AlwaysRebuild())
12610 return getDerived().RebuildOpenACCAsteriskSizeExpr(
E->getLocation());
12618template<
typename Derived>
12620TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *
E) {
12621 return TransformExpr(
E->getSubExpr());
12624template <
typename Derived>
12625ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
12626 SYCLUniqueStableNameExpr *
E) {
12630 TypeSourceInfo *NewT = getDerived().TransformType(
E->getTypeSourceInfo());
12635 if (!getDerived().AlwaysRebuild() &&
E->getTypeSourceInfo() == NewT)
12638 return getDerived().RebuildSYCLUniqueStableNameExpr(
12639 E->getLocation(),
E->getLParenLocation(),
E->getRParenLocation(), NewT);
12642template<
typename Derived>
12644TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *
E) {
12648 return getDerived().RebuildPredefinedExpr(
E->getLocation(),
12649 E->getIdentKind());
12652template<
typename Derived>
12654TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *
E) {
12655 NestedNameSpecifierLoc QualifierLoc;
12656 if (
E->getQualifierLoc()) {
12658 = getDerived().TransformNestedNameSpecifierLoc(
E->getQualifierLoc());
12664 = cast_or_null<ValueDecl>(getDerived().TransformDecl(
E->getLocation(),
12669 NamedDecl *
Found = ND;
12670 if (
E->getFoundDecl() !=
E->getDecl()) {
12671 Found = cast_or_null<NamedDecl>(
12672 getDerived().TransformDecl(
E->getLocation(),
E->getFoundDecl()));
12677 DeclarationNameInfo NameInfo =
E->getNameInfo();
12678 if (NameInfo.getName()) {
12679 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
12680 if (!NameInfo.getName())
12684 if (!getDerived().AlwaysRebuild() &&
12685 !
E->isCapturedByCopyInLambdaWithExplicitObjectParameter() &&
12686 QualifierLoc ==
E->getQualifierLoc() && ND ==
E->getDecl() &&
12687 Found ==
E->getFoundDecl() &&
12688 NameInfo.getName() ==
E->getDecl()->getDeclName() &&
12689 !
E->hasExplicitTemplateArgs()) {
12698 TemplateArgumentListInfo TransArgs, *TemplateArgs =
nullptr;
12699 if (
E->hasExplicitTemplateArgs()) {
12700 TemplateArgs = &TransArgs;
12701 TransArgs.setLAngleLoc(
E->getLAngleLoc());
12702 TransArgs.setRAngleLoc(
E->getRAngleLoc());
12703 if (getDerived().TransformTemplateArguments(
E->getTemplateArgs(),
12704 E->getNumTemplateArgs(),
12709 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
12710 Found, TemplateArgs);
12713template<
typename Derived>
12715TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *
E) {
12719template <
typename Derived>
12720ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
12721 FixedPointLiteral *
E) {
12725template<
typename Derived>
12727TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *
E) {
12731template<
typename Derived>
12733TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *
E) {
12737template<
typename Derived>
12739TreeTransform<Derived>::TransformStringLiteral(StringLiteral *
E) {
12743template<
typename Derived>
12745TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *
E) {
12749template<
typename Derived>
12751TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *
E) {
12752 return getDerived().TransformCallExpr(
E);
12755template<
typename Derived>
12757TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *
E) {
12759 TypeSourceInfo *ControllingType =
nullptr;
12760 if (
E->isExprPredicate())
12761 ControllingExpr = getDerived().TransformExpr(
E->getControllingExpr());
12763 ControllingType = getDerived().TransformType(
E->getControllingType());
12765 if (ControllingExpr.isInvalid() && !ControllingType)
12771 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
12773 TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
12776 AssocTypes.push_back(AssocType);
12778 AssocTypes.push_back(
nullptr);
12782 getDerived().TransformExpr(Assoc.getAssociationExpr());
12783 if (AssocExpr.isInvalid())
12785 AssocExprs.push_back(AssocExpr.get());
12788 if (!ControllingType)
12789 return getDerived().RebuildGenericSelectionExpr(
E->getGenericLoc(),
12790 E->getDefaultLoc(),
12792 ControllingExpr.get(),
12795 return getDerived().RebuildGenericSelectionExpr(
12796 E->getGenericLoc(),
E->getDefaultLoc(),
E->getRParenLoc(),
12797 ControllingType, AssocTypes, AssocExprs);
12800template<
typename Derived>
12802TreeTransform<Derived>::TransformParenExpr(ParenExpr *
E) {
12803 ExprResult SubExpr = getDerived().TransformExpr(
E->getSubExpr());
12804 if (SubExpr.isInvalid())
12807 if (!getDerived().AlwaysRebuild() && SubExpr.get() ==
E->getSubExpr())
12810 return getDerived().RebuildParenExpr(SubExpr.get(),
E->getLParen(),
12817template<
typename Derived>
12821 return getDerived().TransformDependentScopeDeclRefExpr(
12822 DRE,
true,
nullptr);
12824 return getDerived().TransformUnresolvedLookupExpr(
12827 return getDerived().TransformExpr(
E);
12830template<
typename Derived>
12834 if (
E->getOpcode() == UO_AddrOf)
12835 SubExpr = TransformAddressOfOperand(
E->getSubExpr());
12837 SubExpr = TransformExpr(
E->getSubExpr());
12841 if (!getDerived().AlwaysRebuild() && SubExpr.
get() ==
E->getSubExpr())
12844 return getDerived().RebuildUnaryOperator(
E->getOperatorLoc(),
12849template<
typename Derived>
12851TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *
E) {
12853 TypeSourceInfo *
Type = getDerived().TransformType(
E->getTypeSourceInfo());
12863 bool ExprChanged =
false;
12864 typedef Sema::OffsetOfComponent Component;
12866 for (
unsigned I = 0, N =
E->getNumComponents(); I != N; ++I) {
12867 const OffsetOfNode &ON =
E->getComponent(I);
12869 Comp.isBrackets =
true;
12870 Comp.LocStart = ON.getSourceRange().getBegin();
12871 Comp.LocEnd = ON.getSourceRange().getEnd();
12872 switch (ON.getKind()) {
12874 Expr *FromIndex =
E->getIndexExpr(ON.getArrayExprIndex());
12875 ExprResult Index = getDerived().TransformExpr(FromIndex);
12876 if (Index.isInvalid())
12879 ExprChanged = ExprChanged || Index.get() != FromIndex;
12880 Comp.isBrackets =
true;
12881 Comp.U.E = Index.get();
12887 Comp.isBrackets =
false;
12888 Comp.U.IdentInfo = ON.getFieldName();
12889 if (!
Comp.U.IdentInfo)
12899 Components.push_back(Comp);
12903 if (!getDerived().AlwaysRebuild() &&
12904 Type ==
E->getTypeSourceInfo() &&
12909 return getDerived().RebuildOffsetOfExpr(
E->getOperatorLoc(), Type,
12910 Components,
E->getRParenLoc());
12913template<
typename Derived>
12915TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *
E) {
12916 assert((!
E->getSourceExpr() || getDerived().AlreadyTransformed(
E->
getType())) &&
12917 "opaque value expression requires transformation");
12921template<
typename Derived>
12923TreeTransform<Derived>::TransformTypoExpr(TypoExpr *
E) {
12927template <
typename Derived>
12928ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *
E) {
12931 for (Expr *
C :
E->subExpressions()) {
12933 if (NewC.isInvalid())
12935 Children.push_back(NewC.get());
12939 if (!getDerived().AlwaysRebuild() && !Changed)
12945template<
typename Derived>
12947TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *
E) {
12955 ExprResult result = getDerived().TransformExpr(newSyntacticForm);
12956 if (result.isInvalid())
return ExprError();
12961 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
12967template<
typename Derived>
12969TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
12970 UnaryExprOrTypeTraitExpr *
E) {
12971 if (
E->isArgumentType()) {
12972 TypeSourceInfo *OldT =
E->getArgumentTypeInfo();
12974 TypeSourceInfo *NewT = getDerived().TransformType(OldT);
12978 if (!getDerived().AlwaysRebuild() && OldT == NewT)
12981 return getDerived().RebuildUnaryExprOrTypeTrait(NewT,
E->getOperatorLoc(),
12995 TypeSourceInfo *RecoveryTSI =
nullptr;
12997 auto *PE = dyn_cast<ParenExpr>(
E->getArgumentExpr());
12999 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) :
nullptr)
13000 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
13001 PE, DRE,
false, &RecoveryTSI);
13003 SubExpr = getDerived().TransformExpr(
E->getArgumentExpr());
13006 return getDerived().RebuildUnaryExprOrTypeTrait(
13008 }
else if (SubExpr.isInvalid())
13011 if (!getDerived().AlwaysRebuild() && SubExpr.get() ==
E->getArgumentExpr())
13014 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
13015 E->getOperatorLoc(),
13020template<
typename Derived>
13022TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *
E) {
13023 ExprResult LHS = getDerived().TransformExpr(
E->getLHS());
13024 if (LHS.isInvalid())
13027 ExprResult RHS = getDerived().TransformExpr(
E->getRHS());
13028 if (RHS.isInvalid())
13032 if (!getDerived().AlwaysRebuild() &&
13033 LHS.get() ==
E->getLHS() &&
13034 RHS.get() ==
E->getRHS())
13037 return getDerived().RebuildArraySubscriptExpr(
13039 E->getLHS()->
getBeginLoc(), RHS.get(),
E->getRBracketLoc());
13042template <
typename Derived>
13044TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *
E) {
13046 if (
Base.isInvalid())
13049 ExprResult RowIdx = getDerived().TransformExpr(
E->getRowIdx());
13050 if (RowIdx.isInvalid())
13053 ExprResult ColumnIdx = getDerived().TransformExpr(
E->getColumnIdx());
13054 if (ColumnIdx.isInvalid())
13057 if (!getDerived().AlwaysRebuild() &&
Base.get() ==
E->getBase() &&
13058 RowIdx.get() ==
E->getRowIdx() && ColumnIdx.get() ==
E->getColumnIdx())
13061 return getDerived().RebuildMatrixSubscriptExpr(
13062 Base.get(), RowIdx.get(), ColumnIdx.get(),
E->getRBracketLoc());
13065template <
typename Derived>
13067TreeTransform<Derived>::TransformArraySectionExpr(ArraySectionExpr *
E) {
13069 if (
Base.isInvalid())
13073 if (
E->getLowerBound()) {
13074 LowerBound = getDerived().TransformExpr(
E->getLowerBound());
13075 if (LowerBound.isInvalid())
13080 if (
E->getLength()) {
13081 Length = getDerived().TransformExpr(
E->getLength());
13082 if (Length.isInvalid())
13087 if (
E->isOMPArraySection()) {
13088 if (Expr *Str =
E->getStride()) {
13089 Stride = getDerived().TransformExpr(Str);
13090 if (Stride.isInvalid())
13095 if (!getDerived().AlwaysRebuild() &&
Base.get() ==
E->getBase() &&
13096 LowerBound.get() ==
E->getLowerBound() &&
13097 Length.get() ==
E->getLength() &&
13098 (
E->isOpenACCArraySection() || Stride.get() ==
E->getStride()))
13101 return getDerived().RebuildArraySectionExpr(
13103 LowerBound.get(),
E->getColonLocFirst(),
13104 E->isOMPArraySection() ?
E->getColonLocSecond() : SourceLocation{},
13105 Length.get(), Stride.get(),
E->getRBracketLoc());
13108template <
typename Derived>
13110TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *
E) {
13112 if (
Base.isInvalid())
13116 bool ErrorFound =
false;
13117 for (Expr *
Dim :
E->getDimensions()) {
13119 if (DimRes.isInvalid()) {
13123 Dims.push_back(DimRes.get());
13128 return getDerived().RebuildOMPArrayShapingExpr(
Base.get(),
E->getLParenLoc(),
13129 E->getRParenLoc(), Dims,
13130 E->getBracketsRanges());
13133template <
typename Derived>
13135TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *
E) {
13136 unsigned NumIterators =
E->numOfIterators();
13139 bool ErrorFound =
false;
13140 bool NeedToRebuild = getDerived().AlwaysRebuild();
13141 for (
unsigned I = 0; I < NumIterators; ++I) {
13142 auto *
D = cast<VarDecl>(
E->getIteratorDecl(I));
13143 Data[I].DeclIdent =
D->getIdentifier();
13147 "Implicit type must be int.");
13149 TypeSourceInfo *TSI = getDerived().TransformType(
D->getTypeSourceInfo());
13150 QualType
DeclTy = getDerived().TransformType(
D->getType());
13153 OMPIteratorExpr::IteratorRange
Range =
E->getIteratorRange(I);
13157 ErrorFound = ErrorFound ||
13158 !(!
D->getTypeSourceInfo() || (
Data[I].Type.getAsOpaquePtr() &&
13159 !
Data[I].Type.get().isNull())) ||
13164 Data[I].Range.End = End.get();
13165 Data[I].Range.Step = Step.get();
13166 Data[I].AssignLoc =
E->getAssignLoc(I);
13167 Data[I].ColonLoc =
E->getColonLoc(I);
13168 Data[I].SecColonLoc =
E->getSecondColonLoc(I);
13171 (
D->getTypeSourceInfo() &&
Data[I].Type.get().getTypePtrOrNull() !=
13172 D->getType().getTypePtrOrNull()) ||
13178 if (!NeedToRebuild)
13181 ExprResult Res = getDerived().RebuildOMPIteratorExpr(
13182 E->getIteratorKwLoc(),
E->getLParenLoc(),
E->getRParenLoc(),
Data);
13183 if (!Res.isUsable())
13185 auto *IE = cast<OMPIteratorExpr>(Res.get());
13186 for (
unsigned I = 0; I < NumIterators; ++I)
13187 getDerived().transformedLocalDecl(
E->getIteratorDecl(I),
13188 IE->getIteratorDecl(I));
13192template<
typename Derived>
13194TreeTransform<Derived>::TransformCallExpr(CallExpr *
E) {
13201 bool ArgChanged =
false;
13203 if (getDerived().TransformExprs(
E->getArgs(),
E->getNumArgs(),
true, Args,
13207 if (!getDerived().AlwaysRebuild() &&
13208 Callee.get() ==
E->getCallee() &&
13213 SourceLocation FakeLParenLoc
13216 Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13217 if (
E->hasStoredFPFeatures()) {
13218 FPOptionsOverride NewOverrides =
E->getFPFeatures();
13219 getSema().CurFPFeatures =
13220 NewOverrides.applyOverrides(getSema().getLangOpts());
13221 getSema().FpPragmaStack.CurrentValue = NewOverrides;
13224 return getDerived().RebuildCallExpr(
Callee.get(), FakeLParenLoc,
13226 E->getRParenLoc());
13229template<
typename Derived>
13231TreeTransform<Derived>::TransformMemberExpr(MemberExpr *
E) {
13233 if (
Base.isInvalid())
13236 NestedNameSpecifierLoc QualifierLoc;
13237 if (
E->hasQualifier()) {
13239 = getDerived().TransformNestedNameSpecifierLoc(
E->getQualifierLoc());
13244 SourceLocation TemplateKWLoc =
E->getTemplateKeywordLoc();
13247 = cast_or_null<ValueDecl>(getDerived().TransformDecl(
E->getMemberLoc(),
13248 E->getMemberDecl()));
13252 NamedDecl *FoundDecl =
E->getFoundDecl();
13253 if (FoundDecl ==
E->getMemberDecl()) {
13256 FoundDecl = cast_or_null<NamedDecl>(
13257 getDerived().TransformDecl(
E->getMemberLoc(), FoundDecl));
13262 if (!getDerived().AlwaysRebuild() &&
13263 Base.get() ==
E->getBase() &&
13264 QualifierLoc ==
E->getQualifierLoc() &&
13265 Member ==
E->getMemberDecl() &&
13266 FoundDecl ==
E->getFoundDecl() &&
13267 !
E->hasExplicitTemplateArgs()) {
13271 if (!(isa<CXXThisExpr>(
E->getBase()) &&
13272 getSema().OpenMP().isOpenMPRebuildMemberExpr(
13273 cast<ValueDecl>(
Member)))) {
13281 TemplateArgumentListInfo TransArgs;
13282 if (
E->hasExplicitTemplateArgs()) {
13283 TransArgs.setLAngleLoc(
E->getLAngleLoc());
13284 TransArgs.setRAngleLoc(
E->getRAngleLoc());
13285 if (getDerived().TransformTemplateArguments(
E->getTemplateArgs(),
13286 E->getNumTemplateArgs(),
13292 SourceLocation FakeOperatorLoc =
13299 NamedDecl *FirstQualifierInScope =
nullptr;
13300 DeclarationNameInfo MemberNameInfo =
E->getMemberNameInfo();
13301 if (MemberNameInfo.getName()) {
13302 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
13303 if (!MemberNameInfo.getName())
13307 return getDerived().RebuildMemberExpr(
Base.get(), FakeOperatorLoc,
13314 (
E->hasExplicitTemplateArgs()
13315 ? &TransArgs :
nullptr),
13316 FirstQualifierInScope);
13319template<
typename Derived>
13321TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *
E) {
13322 ExprResult LHS = getDerived().TransformExpr(
E->getLHS());
13323 if (LHS.isInvalid())
13327 getDerived().TransformInitializer(
E->getRHS(),
false);
13328 if (RHS.isInvalid())
13331 if (!getDerived().AlwaysRebuild() &&
13332 LHS.get() ==
E->getLHS() &&
13333 RHS.get() ==
E->getRHS())
13336 if (
E->isCompoundAssignmentOp())
13338 return getDerived().RebuildBinaryOperator(
13339 E->getOperatorLoc(),
E->getOpcode(), LHS.get(), RHS.get());
13340 Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13341 FPOptionsOverride NewOverrides(
E->getFPFeatures());
13342 getSema().CurFPFeatures =
13343 NewOverrides.applyOverrides(getSema().getLangOpts());
13344 getSema().FpPragmaStack.CurrentValue = NewOverrides;
13345 return getDerived().RebuildBinaryOperator(
E->getOperatorLoc(),
E->getOpcode(),
13346 LHS.get(), RHS.get());
13349template <
typename Derived>
13350ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
13351 CXXRewrittenBinaryOperator *
E) {
13352 CXXRewrittenBinaryOperator::DecomposedForm Decomp =
E->getDecomposedForm();
13354 ExprResult LHS = getDerived().TransformExpr(
const_cast<Expr*
>(Decomp.LHS));
13355 if (LHS.isInvalid())
13358 ExprResult RHS = getDerived().TransformExpr(
const_cast<Expr*
>(Decomp.RHS));
13359 if (RHS.isInvalid())
13364 UnresolvedSet<2> UnqualLookups;
13365 bool ChangedAnyLookups =
false;
13366 Expr *PossibleBinOps[] = {
E->getSemanticForm(),
13367 const_cast<Expr *
>(Decomp.InnerBinOp)};
13368 for (Expr *PossibleBinOp : PossibleBinOps) {
13369 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
13372 auto *
Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
13373 if (!Callee || isa<CXXMethodDecl>(
Callee->getDecl()))
13378 NamedDecl *
Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
13379 E->getOperatorLoc(),
Callee->getFoundDecl()));
13383 ChangedAnyLookups =
true;
13384 UnqualLookups.addDecl(
Found);
13387 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
13388 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
13394 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
13399 return getDerived().RebuildCXXRewrittenBinaryOperator(
13400 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
13403template<
typename Derived>
13405TreeTransform<Derived>::TransformCompoundAssignOperator(
13406 CompoundAssignOperator *
E) {
13407 Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13408 FPOptionsOverride NewOverrides(
E->getFPFeatures());
13409 getSema().CurFPFeatures =
13410 NewOverrides.applyOverrides(getSema().getLangOpts());
13411 getSema().FpPragmaStack.CurrentValue = NewOverrides;
13412 return getDerived().TransformBinaryOperator(
E);
13415template<
typename Derived>
13417TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
13421 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
13422 if (commonExpr.isInvalid())
13425 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
13426 if (rhs.isInvalid())
13429 if (!getDerived().AlwaysRebuild() &&
13430 commonExpr.get() == e->getCommon() &&
13431 rhs.get() == e->getFalseExpr())
13434 return getDerived().RebuildConditionalOperator(commonExpr.get(),
13435 e->getQuestionLoc(),
13441template<
typename Derived>
13443TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *
E) {
13444 ExprResult Cond = getDerived().TransformExpr(
E->getCond());
13445 if (Cond.isInvalid())
13448 ExprResult LHS = getDerived().TransformExpr(
E->getLHS());
13449 if (LHS.isInvalid())
13452 ExprResult RHS = getDerived().TransformExpr(
E->getRHS());
13453 if (RHS.isInvalid())
13456 if (!getDerived().AlwaysRebuild() &&
13457 Cond.get() ==
E->getCond() &&
13458 LHS.get() ==
E->getLHS() &&
13459 RHS.get() ==
E->getRHS())
13462 return getDerived().RebuildConditionalOperator(Cond.get(),
13463 E->getQuestionLoc(),
13469template<
typename Derived>
13471TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *
E) {
13474 return getDerived().TransformExpr(
E->getSubExprAsWritten());
13477template<
typename Derived>
13479TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *
E) {
13480 TypeSourceInfo *
Type = getDerived().TransformType(
E->getTypeInfoAsWritten());
13485 = getDerived().TransformExpr(
E->getSubExprAsWritten());
13486 if (SubExpr.isInvalid())
13489 if (!getDerived().AlwaysRebuild() &&
13490 Type ==
E->getTypeInfoAsWritten() &&
13491 SubExpr.get() ==
E->getSubExpr())
13494 return getDerived().RebuildCStyleCastExpr(
E->getLParenLoc(),
13500template<
typename Derived>
13502TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *
E) {
13503 TypeSourceInfo *OldT =
E->getTypeSourceInfo();
13504 TypeSourceInfo *NewT = getDerived().TransformType(OldT);
13509 if (
Init.isInvalid())
13512 if (!getDerived().AlwaysRebuild() &&
13514 Init.get() ==
E->getInitializer())
13521 return getDerived().RebuildCompoundLiteralExpr(
13522 E->getLParenLoc(), NewT,
13526template<
typename Derived>
13528TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *
E) {
13530 if (
Base.isInvalid())
13533 if (!getDerived().AlwaysRebuild() &&
13534 Base.get() ==
E->getBase())
13538 SourceLocation FakeOperatorLoc =
13540 return getDerived().RebuildExtVectorElementExpr(
13541 Base.get(), FakeOperatorLoc,
E->isArrow(),
E->getAccessorLoc(),
13545template<
typename Derived>
13547TreeTransform<Derived>::TransformInitListExpr(InitListExpr *
E) {
13548 if (InitListExpr *Syntactic =
E->getSyntacticForm())
13551 bool InitChanged =
false;
13553 EnterExpressionEvaluationContext Context(
13557 if (getDerived().TransformExprs(
E->getInits(),
E->getNumInits(),
false,
13558 Inits, &InitChanged))
13561 if (!getDerived().AlwaysRebuild() && !InitChanged) {
13568 return getDerived().RebuildInitList(
E->getLBraceLoc(), Inits,
13569 E->getRBraceLoc());
13572template<
typename Derived>
13574TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *
E) {
13579 if (
Init.isInvalid())
13584 bool ExprChanged =
false;
13585 for (
const DesignatedInitExpr::Designator &
D :
E->designators()) {
13586 if (
D.isFieldDesignator()) {
13587 if (
D.getFieldDecl()) {
13588 FieldDecl *
Field = cast_or_null<FieldDecl>(
13589 getDerived().TransformDecl(
D.getFieldLoc(),
D.getFieldDecl()));
13590 if (Field !=
D.getFieldDecl())
13593 ExprChanged =
true;
13594 if (
Field->isAnonymousStructOrUnion())
13600 ExprChanged =
true;
13603 D.getFieldName(),
D.getDotLoc(),
D.getFieldLoc()));
13607 if (
D.isArrayDesignator()) {
13608 ExprResult Index = getDerived().TransformExpr(
E->getArrayIndex(
D));
13609 if (Index.isInvalid())
13612 Desig.AddDesignator(
13615 ExprChanged = ExprChanged ||
Init.get() !=
E->getArrayIndex(
D);
13616 ArrayExprs.push_back(Index.get());
13620 assert(
D.isArrayRangeDesignator() &&
"New kind of designator?");
13622 = getDerived().TransformExpr(
E->getArrayRangeStart(
D));
13623 if (Start.isInvalid())
13626 ExprResult End = getDerived().TransformExpr(
E->getArrayRangeEnd(
D));
13627 if (End.isInvalid())
13631 Start.get(), End.get(),
D.getLBracketLoc(),
D.getEllipsisLoc()));
13633 ExprChanged = ExprChanged || Start.get() !=
E->getArrayRangeStart(
D) ||
13634 End.get() !=
E->getArrayRangeEnd(
D);
13636 ArrayExprs.push_back(Start.get());
13637 ArrayExprs.push_back(End.get());
13640 if (!getDerived().AlwaysRebuild() &&
13641 Init.get() ==
E->getInit() &&
13645 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
13646 E->getEqualOrColonLoc(),
13647 E->usesGNUSyntax(),
Init.get());
13652template<
typename Derived>
13654TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
13655 DesignatedInitUpdateExpr *
E) {
13656 llvm_unreachable(
"Unexpected DesignatedInitUpdateExpr in syntactic form of "
13661template<
typename Derived>
13663TreeTransform<Derived>::TransformNoInitExpr(
13665 llvm_unreachable(
"Unexpected NoInitExpr in syntactic form of initializer");
13669template<
typename Derived>
13671TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *
E) {
13672 llvm_unreachable(
"Unexpected ArrayInitLoopExpr outside of initializer");
13676template<
typename Derived>
13678TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *
E) {
13679 llvm_unreachable(
"Unexpected ArrayInitIndexExpr outside of initializer");
13683template<
typename Derived>
13685TreeTransform<Derived>::TransformImplicitValueInitExpr(
13686 ImplicitValueInitExpr *
E) {
13687 TemporaryBase Rebase(*
this,
E->
getBeginLoc(), DeclarationName());
13691 QualType
T = getDerived().TransformType(
E->
getType());
13695 if (!getDerived().AlwaysRebuild() &&
13699 return getDerived().RebuildImplicitValueInitExpr(
T);
13702template<
typename Derived>
13704TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *
E) {
13705 TypeSourceInfo *TInfo = getDerived().TransformType(
E->getWrittenTypeInfo());
13709 ExprResult SubExpr = getDerived().TransformExpr(
E->getSubExpr());
13710 if (SubExpr.isInvalid())
13713 if (!getDerived().AlwaysRebuild() &&
13714 TInfo ==
E->getWrittenTypeInfo() &&
13715 SubExpr.get() ==
E->getSubExpr())
13718 return getDerived().RebuildVAArgExpr(
E->getBuiltinLoc(), SubExpr.get(),
13719 TInfo,
E->getRParenLoc());
13722template<
typename Derived>
13724TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *
E) {
13725 bool ArgumentChanged =
false;
13727 if (TransformExprs(
E->getExprs(),
E->getNumExprs(),
true, Inits,
13731 return getDerived().RebuildParenListExpr(
E->getLParenLoc(),
13733 E->getRParenLoc());
13741template<
typename Derived>
13743TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *
E) {
13744 Decl *LD = getDerived().TransformDecl(
E->getLabel()->getLocation(),
13749 return getDerived().RebuildAddrLabelExpr(
E->getAmpAmpLoc(),
E->getLabelLoc(),
13750 cast<LabelDecl>(LD));
13753template<
typename Derived>
13755TreeTransform<Derived>::TransformStmtExpr(StmtExpr *
E) {
13758 = getDerived().TransformCompoundStmt(
E->getSubStmt(),
true);
13759 if (SubStmt.isInvalid()) {
13764 unsigned OldDepth =
E->getTemplateDepth();
13765 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
13767 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
13768 SubStmt.get() ==
E->getSubStmt()) {
13774 return getDerived().RebuildStmtExpr(
E->getLParenLoc(), SubStmt.get(),
13775 E->getRParenLoc(), NewDepth);
13778template<
typename Derived>
13780TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *
E) {
13781 ExprResult Cond = getDerived().TransformExpr(
E->getCond());
13782 if (Cond.isInvalid())
13785 ExprResult LHS = getDerived().TransformExpr(
E->getLHS());
13786 if (LHS.isInvalid())
13789 ExprResult RHS = getDerived().TransformExpr(
E->getRHS());
13790 if (RHS.isInvalid())
13793 if (!getDerived().AlwaysRebuild() &&
13794 Cond.get() ==
E->getCond() &&
13795 LHS.get() ==
E->getLHS() &&
13796 RHS.get() ==
E->getRHS())
13799 return getDerived().RebuildChooseExpr(
E->getBuiltinLoc(),
13800 Cond.get(), LHS.get(), RHS.get(),
13801 E->getRParenLoc());
13804template<
typename Derived>
13806TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *
E) {
13810template<
typename Derived>
13812TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *
E) {
13813 switch (
E->getOperator()) {
13817 case OO_Array_Delete:
13818 llvm_unreachable(
"new and delete operators cannot use CXXOperatorCallExpr");
13823 assert(
E->getNumArgs() >= 1 &&
"Object call is missing arguments");
13832 static_cast<Expr *
>(
Object.get())->getEndLoc());
13836 if (getDerived().TransformExprs(
E->getArgs() + 1,
E->getNumArgs() - 1,
true,
13840 if (
E->getOperator() == OO_Subscript)
13841 return getDerived().RebuildCxxSubscriptExpr(
Object.get(), FakeLParenLoc,
13844 return getDerived().RebuildCallExpr(
Object.get(), FakeLParenLoc, Args,
13848#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
13852#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
13853#include "clang/Basic/OperatorKinds.def"
13855 case OO_Conditional:
13856 llvm_unreachable(
"conditional operator is not actually overloadable");
13860 llvm_unreachable(
"not an overloaded operator?");
13864 if (
E->getNumArgs() == 1 &&
E->getOperator() == OO_Amp)
13865 First = getDerived().TransformAddressOfOperand(
E->getArg(0));
13867 First = getDerived().TransformExpr(
E->getArg(0));
13868 if (
First.isInvalid())
13872 if (
E->getNumArgs() == 2) {
13874 getDerived().TransformInitializer(
E->getArg(1),
false);
13875 if (Second.isInvalid())
13879 Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13880 FPOptionsOverride NewOverrides(
E->getFPFeatures());
13881 getSema().CurFPFeatures =
13882 NewOverrides.applyOverrides(getSema().getLangOpts());
13883 getSema().FpPragmaStack.CurrentValue = NewOverrides;
13885 Expr *
Callee =
E->getCallee();
13886 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
13887 LookupResult R(SemaRef, ULE->getName(), ULE->getNameLoc(),
13889 if (getDerived().TransformOverloadExprDecls(ULE, ULE->requiresADL(), R))
13892 return getDerived().RebuildCXXOperatorCallExpr(
13893 E->getOperator(),
E->getOperatorLoc(),
Callee->getBeginLoc(),
13894 ULE->requiresADL(), R.asUnresolvedSet(),
First.get(), Second.get());
13897 UnresolvedSet<1> Functions;
13898 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
13899 Callee = ICE->getSubExprAsWritten();
13900 NamedDecl *DR = cast<DeclRefExpr>(Callee)->getDecl();
13901 ValueDecl *VD = cast_or_null<ValueDecl>(
13902 getDerived().TransformDecl(DR->getLocation(), DR));
13906 if (!isa<CXXMethodDecl>(VD))
13907 Functions.addDecl(VD);
13909 return getDerived().RebuildCXXOperatorCallExpr(
13910 E->getOperator(),
E->getOperatorLoc(),
Callee->getBeginLoc(),
13911 false, Functions,
First.get(), Second.get());
13914template<
typename Derived>
13916TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *
E) {
13917 return getDerived().TransformCallExpr(
E);
13920template <
typename Derived>
13921ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *
E) {
13923 getSema().CurContext !=
E->getParentContext();
13925 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
13928 return getDerived().RebuildSourceLocExpr(
E->getIdentKind(),
E->
getType(),
13930 getSema().CurContext);
13933template <
typename Derived>
13934ExprResult TreeTransform<Derived>::TransformEmbedExpr(EmbedExpr *
E) {
13938template<
typename Derived>
13940TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *
E) {
13947 ExprResult EC = getDerived().TransformCallExpr(
E->getConfig());
13948 if (EC.isInvalid())
13952 bool ArgChanged =
false;
13954 if (getDerived().TransformExprs(
E->getArgs(),
E->getNumArgs(),
true, Args,
13958 if (!getDerived().AlwaysRebuild() &&
13959 Callee.get() ==
E->getCallee() &&
13964 SourceLocation FakeLParenLoc
13966 return getDerived().RebuildCallExpr(
Callee.get(), FakeLParenLoc,
13968 E->getRParenLoc(), EC.get());
13971template<
typename Derived>
13979 = getDerived().TransformExpr(
E->getSubExprAsWritten());
13983 if (!getDerived().AlwaysRebuild() &&
13984 Type ==
E->getTypeInfoAsWritten() &&
13985 SubExpr.
get() ==
E->getSubExpr())
13987 return getDerived().RebuildCXXNamedCastExpr(
13988 E->getOperatorLoc(),
E->
getStmtClass(),
E->getAngleBrackets().getBegin(),
13989 Type,
E->getAngleBrackets().getEnd(),
13991 E->getAngleBrackets().getEnd(), SubExpr.
get(),
E->getRParenLoc());
13994template<
typename Derived>
14003 if (Sub.isInvalid())
14006 return getDerived().RebuildBuiltinBitCastExpr(BCE->
getBeginLoc(), TSI,
14010template<
typename Derived>
14012TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *
E) {
14013 return getDerived().TransformCXXNamedCastExpr(
E);
14016template<
typename Derived>
14018TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *
E) {
14019 return getDerived().TransformCXXNamedCastExpr(
E);
14022template<
typename Derived>
14024TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
14025 CXXReinterpretCastExpr *
E) {
14026 return getDerived().TransformCXXNamedCastExpr(
E);
14029template<
typename Derived>
14031TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *
E) {
14032 return getDerived().TransformCXXNamedCastExpr(
E);
14035template<
typename Derived>
14037TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *
E) {
14038 return getDerived().TransformCXXNamedCastExpr(
E);
14041template<
typename Derived>
14043TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
14044 CXXFunctionalCastExpr *
E) {
14045 TypeSourceInfo *
Type =
14046 getDerived().TransformTypeWithDeducedTST(
E->getTypeInfoAsWritten());
14051 = getDerived().TransformExpr(
E->getSubExprAsWritten());
14052 if (SubExpr.isInvalid())
14055 if (!getDerived().AlwaysRebuild() &&
14056 Type ==
E->getTypeInfoAsWritten() &&
14057 SubExpr.get() ==
E->getSubExpr())
14060 return getDerived().RebuildCXXFunctionalCastExpr(Type,
14064 E->isListInitialization());
14067template<
typename Derived>
14069TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *
E) {
14070 if (
E->isTypeOperand()) {
14071 TypeSourceInfo *TInfo
14072 = getDerived().TransformType(
E->getTypeOperandSourceInfo());
14076 if (!getDerived().AlwaysRebuild() &&
14077 TInfo ==
E->getTypeOperandSourceInfo())
14087 Expr *Op =
E->getExprOperand();
14090 if (
auto *RecordT = Op->getType()->getAs<RecordType>())
14091 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
14094 EnterExpressionEvaluationContext
Unevaluated(SemaRef, EvalCtx,
14097 ExprResult SubExpr = getDerived().TransformExpr(Op);
14098 if (SubExpr.isInvalid())
14101 if (!getDerived().AlwaysRebuild() &&
14102 SubExpr.get() ==
E->getExprOperand())
14109template<
typename Derived>
14111TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *
E) {
14112 if (
E->isTypeOperand()) {
14113 TypeSourceInfo *TInfo
14114 = getDerived().TransformType(
E->getTypeOperandSourceInfo());
14118 if (!getDerived().AlwaysRebuild() &&
14119 TInfo ==
E->getTypeOperandSourceInfo())
14129 ExprResult SubExpr = getDerived().TransformExpr(
E->getExprOperand());
14130 if (SubExpr.isInvalid())
14133 if (!getDerived().AlwaysRebuild() &&
14134 SubExpr.get() ==
E->getExprOperand())
14141template<
typename Derived>
14143TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *
E) {
14147template<
typename Derived>
14149TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
14150 CXXNullPtrLiteralExpr *
E) {
14154template<
typename Derived>
14156TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *
E) {
14167 QualType
T = [&]() {
14168 auto &S = getSema();
14169 if (
E->isCapturedByCopyInLambdaWithExplicitObjectParameter())
14172 return getDerived().TransformType(
E->
getType());
14176 if (!getDerived().AlwaysRebuild() &&
T ==
E->
getType()) {
14179 getSema().MarkThisReferenced(
E);
14183 return getDerived().RebuildCXXThisExpr(
E->
getBeginLoc(),
T,
E->isImplicit());
14186template<
typename Derived>
14188TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *
E) {
14189 ExprResult SubExpr = getDerived().TransformExpr(
E->getSubExpr());
14190 if (SubExpr.isInvalid())
14193 if (!getDerived().AlwaysRebuild() &&
14194 SubExpr.get() ==
E->getSubExpr())
14197 return getDerived().RebuildCXXThrowExpr(
E->getThrowLoc(), SubExpr.get(),
14198 E->isThrownVariableInScope());
14201template<
typename Derived>
14203TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *
E) {
14204 ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
14205 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getParam()));
14210 if (
E->hasRewrittenInit()) {
14211 InitRes = getDerived().TransformExpr(
E->getRewrittenExpr());
14212 if (InitRes.isInvalid())
14216 if (!getDerived().AlwaysRebuild() && Param ==
E->getParam() &&
14218 InitRes.get() ==
E->getRewrittenExpr())
14221 return getDerived().RebuildCXXDefaultArgExpr(
E->getUsedLocation(), Param,
14225template<
typename Derived>
14227TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *
E) {
14228 FieldDecl *
Field = cast_or_null<FieldDecl>(
14229 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getField()));
14233 if (!getDerived().AlwaysRebuild() && Field ==
E->getField() &&
14237 return getDerived().RebuildCXXDefaultInitExpr(
E->
getExprLoc(), Field);
14240template<
typename Derived>
14242TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
14243 CXXScalarValueInitExpr *
E) {
14244 TypeSourceInfo *
T = getDerived().TransformType(
E->getTypeSourceInfo());
14248 if (!getDerived().AlwaysRebuild() &&
14249 T ==
E->getTypeSourceInfo())
14252 return getDerived().RebuildCXXScalarValueInitExpr(
T,
14253 T->getTypeLoc().getEndLoc(),
14254 E->getRParenLoc());
14257template<
typename Derived>
14259TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *
E) {
14261 TypeSourceInfo *AllocTypeInfo =
14262 getDerived().TransformTypeWithDeducedTST(
E->getAllocatedTypeSourceInfo());
14263 if (!AllocTypeInfo)
14267 std::optional<Expr *> ArraySize;
14268 if (
E->isArray()) {
14270 if (std::optional<Expr *> OldArraySize =
E->getArraySize()) {
14271 NewArraySize = getDerived().TransformExpr(*OldArraySize);
14272 if (NewArraySize.isInvalid())
14275 ArraySize = NewArraySize.get();
14279 bool ArgumentChanged =
false;
14281 if (getDerived().TransformExprs(
E->getPlacementArgs(),
14282 E->getNumPlacementArgs(),
true,
14283 PlacementArgs, &ArgumentChanged))
14287 Expr *OldInit =
E->getInitializer();
14290 NewInit = getDerived().TransformInitializer(OldInit,
true);
14291 if (NewInit.isInvalid())
14295 FunctionDecl *OperatorNew =
nullptr;
14296 if (
E->getOperatorNew()) {
14297 OperatorNew = cast_or_null<FunctionDecl>(
14298 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getOperatorNew()));
14303 FunctionDecl *OperatorDelete =
nullptr;
14304 if (
E->getOperatorDelete()) {
14305 OperatorDelete = cast_or_null<FunctionDecl>(
14306 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getOperatorDelete()));
14307 if (!OperatorDelete)
14311 if (!getDerived().AlwaysRebuild() &&
14312 AllocTypeInfo ==
E->getAllocatedTypeSourceInfo() &&
14313 ArraySize ==
E->getArraySize() &&
14314 NewInit.get() == OldInit &&
14315 OperatorNew ==
E->getOperatorNew() &&
14316 OperatorDelete ==
E->getOperatorDelete() &&
14317 !ArgumentChanged) {
14322 if (OperatorDelete)
14325 if (
E->isArray() && !
E->getAllocatedType()->isDependentType()) {
14326 QualType ElementType
14328 if (
const RecordType *RecordT = ElementType->getAs<RecordType>()) {
14329 CXXRecordDecl *
Record = cast<CXXRecordDecl>(RecordT->getDecl());
14339 QualType AllocType = AllocTypeInfo->
getType();
14349 }
else if (
const ConstantArrayType *ConsArrayT
14350 = dyn_cast<ConstantArrayType>(ArrayT)) {
14354 AllocType = ConsArrayT->getElementType();
14355 }
else if (
const DependentSizedArrayType *DepArrayT
14356 = dyn_cast<DependentSizedArrayType>(ArrayT)) {
14357 if (DepArrayT->getSizeExpr()) {
14358 ArraySize = DepArrayT->getSizeExpr();
14359 AllocType = DepArrayT->getElementType();
14364 return getDerived().RebuildCXXNewExpr(
14368 AllocTypeInfo, ArraySize,
E->getDirectInitRange(), NewInit.get());
14371template<
typename Derived>
14373TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *
E) {
14379 FunctionDecl *OperatorDelete =
nullptr;
14380 if (
E->getOperatorDelete()) {
14381 OperatorDelete = cast_or_null<FunctionDecl>(
14382 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getOperatorDelete()));
14383 if (!OperatorDelete)
14387 if (!getDerived().AlwaysRebuild() &&
14388 Operand.get() ==
E->getArgument() &&
14389 OperatorDelete ==
E->getOperatorDelete()) {
14392 if (OperatorDelete)
14397 E->getDestroyedType());
14398 if (
const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
14399 CXXRecordDecl *
Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
14408 return getDerived().RebuildCXXDeleteExpr(
14412template<
typename Derived>
14414TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
14415 CXXPseudoDestructorExpr *
E) {
14417 if (
Base.isInvalid())
14421 bool MayBePseudoDestructor =
false;
14423 E->getOperatorLoc(),
14424 E->isArrow()? tok::arrow : tok::period,
14426 MayBePseudoDestructor);
14427 if (
Base.isInvalid())
14430 QualType ObjectType = ObjectTypePtr.get();
14431 NestedNameSpecifierLoc QualifierLoc =
E->getQualifierLoc();
14432 if (QualifierLoc) {
14434 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
14439 SS.Adopt(QualifierLoc);
14441 PseudoDestructorTypeStorage Destroyed;
14442 if (
E->getDestroyedTypeInfo()) {
14443 TypeSourceInfo *DestroyedTypeInfo
14444 = getDerived().TransformTypeInObjectScope(
E->getDestroyedTypeInfo(),
14445 ObjectType,
nullptr, SS);
14446 if (!DestroyedTypeInfo)
14448 Destroyed = DestroyedTypeInfo;
14449 }
else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
14452 Destroyed = PseudoDestructorTypeStorage(
E->getDestroyedTypeIdentifier(),
14453 E->getDestroyedTypeLoc());
14457 *
E->getDestroyedTypeIdentifier(),
E->getDestroyedTypeLoc(),
14458 nullptr, SS, ObjectTypePtr,
false);
14464 E->getDestroyedTypeLoc());
14467 TypeSourceInfo *ScopeTypeInfo =
nullptr;
14468 if (
E->getScopeTypeInfo()) {
14469 CXXScopeSpec EmptySS;
14470 ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
14471 E->getScopeTypeInfo(), ObjectType,
nullptr, EmptySS);
14472 if (!ScopeTypeInfo)
14476 return getDerived().RebuildCXXPseudoDestructorExpr(
Base.get(),
14477 E->getOperatorLoc(),
14481 E->getColonColonLoc(),
14486template <
typename Derived>
14491 bool AllEmptyPacks =
true;
14492 for (
auto *OldD : Old->
decls()) {
14493 Decl *InstD = getDerived().TransformDecl(Old->
getNameLoc(), OldD);
14497 if (isa<UsingShadowDecl>(OldD))
14506 NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
14508 if (
auto *UPD = dyn_cast<UsingPackDecl>(InstD))
14509 Decls = UPD->expansions();
14512 for (
auto *
D : Decls) {
14513 if (
auto *UD = dyn_cast<UsingDecl>(
D)) {
14514 for (
auto *SD : UD->shadows())
14521 AllEmptyPacks &= Decls.empty();
14530 if (AllEmptyPacks && !RequiresADL) {
14531 getSema().Diag(Old->
getNameLoc(), diag::err_using_pack_expansion_empty)
14532 << isa<UnresolvedMemberExpr>(Old) << Old->
getName();
14542 getSema().FilterAcceptableTemplateNames(R,
14549 diag::err_template_kw_refers_to_non_template)
14553 diag::note_template_kw_refers_to_non_template)
14562template <
typename Derived>
14565 return TransformUnresolvedLookupExpr(Old,
false);
14568template <
typename Derived>
14571 bool IsAddressOfOperand) {
14576 if (TransformOverloadExprDecls(Old, Old->
requiresADL(), R))
14583 = getDerived().TransformNestedNameSpecifierLoc(Old->
getQualifierLoc());
14587 SS.
Adopt(QualifierLoc);
14591 CXXRecordDecl *NamingClass
14592 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
14595 if (!NamingClass) {
14600 R.setNamingClass(NamingClass);
14621 SS, TemplateKWLoc, R,
14628 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->
requiresADL());
14631 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
14635template<
typename Derived>
14637TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *
E) {
14638 bool ArgChanged =
false;
14640 for (
unsigned I = 0, N =
E->getNumArgs(); I != N; ++I) {
14641 TypeSourceInfo *From =
E->getArg(I);
14642 TypeLoc FromTL = From->getTypeLoc();
14643 if (!FromTL.getAs<PackExpansionTypeLoc>()) {
14644 TypeLocBuilder TLB;
14645 TLB.reserve(FromTL.getFullDataSize());
14646 QualType To = getDerived().TransformType(TLB, FromTL);
14650 if (To == From->getType())
14651 Args.push_back(From);
14653 Args.push_back(TLB.getTypeSourceInfo(SemaRef.
Context, To));
14662 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
14663 TypeLoc PatternTL = ExpansionTL.getPatternLoc();
14669 bool Expand =
true;
14670 bool RetainExpansion =
false;
14671 std::optional<unsigned> OrigNumExpansions =
14672 ExpansionTL.getTypePtr()->getNumExpansions();
14673 std::optional<unsigned> NumExpansions = OrigNumExpansions;
14674 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
14675 PatternTL.getSourceRange(),
14677 Expand, RetainExpansion,
14685 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
14687 TypeLocBuilder TLB;
14688 TLB.reserve(From->getTypeLoc().getFullDataSize());
14690 QualType To = getDerived().TransformType(TLB, PatternTL);
14694 To = getDerived().RebuildPackExpansionType(To,
14695 PatternTL.getSourceRange(),
14696 ExpansionTL.getEllipsisLoc(),
14701 PackExpansionTypeLoc ToExpansionTL
14702 = TLB.push<PackExpansionTypeLoc>(To);
14703 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
14704 Args.push_back(TLB.getTypeSourceInfo(SemaRef.
Context, To));
14710 for (
unsigned I = 0; I != *NumExpansions; ++I) {
14711 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
14712 TypeLocBuilder TLB;
14713 TLB.reserve(PatternTL.getFullDataSize());
14714 QualType To = getDerived().TransformType(TLB, PatternTL);
14718 if (To->containsUnexpandedParameterPack()) {
14719 To = getDerived().RebuildPackExpansionType(To,
14720 PatternTL.getSourceRange(),
14721 ExpansionTL.getEllipsisLoc(),
14726 PackExpansionTypeLoc ToExpansionTL
14727 = TLB.push<PackExpansionTypeLoc>(To);
14728 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
14731 Args.push_back(TLB.getTypeSourceInfo(SemaRef.
Context, To));
14734 if (!RetainExpansion)
14739 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
14741 TypeLocBuilder TLB;
14742 TLB.reserve(From->getTypeLoc().getFullDataSize());
14744 QualType To = getDerived().TransformType(TLB, PatternTL);
14748 To = getDerived().RebuildPackExpansionType(To,
14749 PatternTL.getSourceRange(),
14750 ExpansionTL.getEllipsisLoc(),
14755 PackExpansionTypeLoc ToExpansionTL
14756 = TLB.push<PackExpansionTypeLoc>(To);
14757 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
14758 Args.push_back(TLB.getTypeSourceInfo(SemaRef.
Context, To));
14761 if (!getDerived().AlwaysRebuild() && !ArgChanged)
14764 return getDerived().RebuildTypeTrait(
E->getTrait(),
E->
getBeginLoc(), Args,
14768template<
typename Derived>
14770TreeTransform<Derived>::TransformConceptSpecializationExpr(
14771 ConceptSpecializationExpr *
E) {
14772 const ASTTemplateArgumentListInfo *Old =
E->getTemplateArgsAsWritten();
14773 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
14774 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
14775 Old->NumTemplateArgs, TransArgs))
14778 return getDerived().RebuildConceptSpecializationExpr(
14779 E->getNestedNameSpecifierLoc(),
E->getTemplateKWLoc(),
14780 E->getConceptNameInfo(),
E->getFoundDecl(),
E->getNamedConcept(),
14784template<
typename Derived>
14786TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *
E) {
14789 Sema::ExtParameterInfoBuilder ExtParamInfos;
14793 EnterExpressionEvaluationContext Ctx(
14798 getSema().Context, getSema().CurContext,
14801 Sema::ContextRAII SavedContext(getSema(), Body,
false);
14803 ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams(
14804 E->getRequiresKWLoc(),
E->getRBraceLoc(),
E, Body,
14805 E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos);
14807 for (ParmVarDecl *Param : TransParams)
14809 Param->setDeclContext(Body);
14815 if (!TypeParamResult.isUnset())
14816 return TypeParamResult;
14819 if (getDerived().TransformRequiresExprRequirements(
E->getRequirements(),
14823 for (concepts::Requirement *Req : TransReqs) {
14824 if (
auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
14825 if (ER->getReturnTypeRequirement().isTypeConstraint()) {
14826 ER->getReturnTypeRequirement()
14827 .getTypeConstraintTemplateParameterList()->getParam(0)
14828 ->setDeclContext(Body);
14833 return getDerived().RebuildRequiresExpr(
14834 E->getRequiresKWLoc(), Body,
E->getLParenLoc(), TransParams,
14835 E->getRParenLoc(), TransReqs,
E->getRBraceLoc());
14838template<
typename Derived>
14844 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
14845 TransReq = getDerived().TransformTypeRequirement(TypeReq);
14846 else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
14847 TransReq = getDerived().TransformExprRequirement(ExprReq);
14849 TransReq = getDerived().TransformNestedRequirement(
14850 cast<concepts::NestedRequirement>(Req));
14853 Transformed.push_back(TransReq);
14858template<
typename Derived>
14863 if (getDerived().AlwaysRebuild())
14864 return getDerived().RebuildTypeRequirement(
14871 return getDerived().RebuildTypeRequirement(TransType);
14874template<
typename Derived>
14877 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
14886 TransExpr = TransExprRes.
get();
14889 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
14891 if (RetReq.isEmpty())
14892 TransRetReq.emplace();
14893 else if (RetReq.isSubstitutionFailure())
14894 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
14895 else if (RetReq.isTypeConstraint()) {
14897 RetReq.getTypeConstraintTemplateParameterList();
14899 getDerived().TransformTemplateParameterList(OrigTPL);
14902 TransRetReq.emplace(TPL);
14904 assert(TransRetReq &&
"All code paths leading here must set TransRetReq");
14905 if (
Expr *
E = TransExpr.dyn_cast<
Expr *>())
14906 return getDerived().RebuildExprRequirement(
E, Req->
isSimple(),
14908 std::move(*TransRetReq));
14909 return getDerived().RebuildExprRequirement(
14910 cast<concepts::Requirement::SubstitutionDiagnostic *>(TransExpr),
14914template<
typename Derived>
14919 if (getDerived().AlwaysRebuild())
14920 return getDerived().RebuildNestedRequirement(
14928 return getDerived().RebuildNestedRequirement(TransConstraint.
get());
14931template<
typename Derived>
14934 TypeSourceInfo *
T = getDerived().TransformType(
E->getQueriedTypeSourceInfo());
14938 if (!getDerived().AlwaysRebuild() &&
14939 T ==
E->getQueriedTypeSourceInfo())
14946 SubExpr = getDerived().TransformExpr(
E->getDimensionExpression());
14950 if (!getDerived().AlwaysRebuild() && SubExpr.
get() ==
E->getDimensionExpression())
14954 return getDerived().RebuildArrayTypeTrait(
E->getTrait(),
E->
getBeginLoc(),
T,
14958template<
typename Derived>
14960TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *
E) {
14965 SubExpr = getDerived().TransformExpr(
E->getQueriedExpression());
14966 if (SubExpr.isInvalid())
14969 if (!getDerived().AlwaysRebuild() && SubExpr.get() ==
E->getQueriedExpression())
14973 return getDerived().RebuildExpressionTrait(
E->getTrait(),
E->
getBeginLoc(),
14977template <
typename Derived>
14981 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
14982 DRE, AddrTaken, RecoveryTSI);
14989 if (!getDerived().AlwaysRebuild() && NewDRE.
get() == DRE)
14991 return getDerived().RebuildParenExpr(NewDRE.
get(), PE->
getLParen(),
14995template <
typename Derived>
14998 return TransformDependentScopeDeclRefExpr(
E,
false,
15002template <
typename Derived>
15006 assert(
E->getQualifierLoc());
15008 getDerived().TransformNestedNameSpecifierLoc(
E->getQualifierLoc());
15018 getDerived().TransformDeclarationNameInfo(
E->getNameInfo());
15022 if (!
E->hasExplicitTemplateArgs()) {
15023 if (!getDerived().AlwaysRebuild() && QualifierLoc ==
E->getQualifierLoc() &&
15026 NameInfo.
getName() ==
E->getDeclName())
15029 return getDerived().RebuildDependentScopeDeclRefExpr(
15030 QualifierLoc, TemplateKWLoc, NameInfo,
nullptr,
15031 IsAddressOfOperand, RecoveryTSI);
15034 TemplateArgumentListInfo TransArgs(
E->getLAngleLoc(),
E->getRAngleLoc());
15035 if (getDerived().TransformTemplateArguments(
15036 E->getTemplateArgs(),
E->getNumTemplateArgs(), TransArgs))
15039 return getDerived().RebuildDependentScopeDeclRefExpr(
15040 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
15044template<
typename Derived>
15046TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *
E) {
15050 if (getDerived().AllowSkippingCXXConstructExpr() &&
15051 ((
E->getNumArgs() == 1 ||
15052 (
E->getNumArgs() > 1 && getDerived().DropCallArgument(
E->getArg(1)))) &&
15053 (!getDerived().DropCallArgument(
E->getArg(0))) &&
15054 !
E->isListInitialization()))
15055 return getDerived().TransformInitializer(
E->getArg(0),
15058 TemporaryBase Rebase(*
this,
E->
getBeginLoc(), DeclarationName());
15060 QualType
T = getDerived().TransformType(
E->
getType());
15064 CXXConstructorDecl *
Constructor = cast_or_null<CXXConstructorDecl>(
15065 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getConstructor()));
15069 bool ArgumentChanged =
false;
15072 EnterExpressionEvaluationContext Context(
15074 E->isListInitialization());
15075 if (getDerived().TransformExprs(
E->getArgs(),
E->getNumArgs(),
true, Args,
15080 if (!getDerived().AlwaysRebuild() &&
15082 Constructor ==
E->getConstructor() &&
15083 !ArgumentChanged) {
15090 return getDerived().RebuildCXXConstructExpr(
15092 E->hadMultipleCandidates(),
E->isListInitialization(),
15093 E->isStdInitListInitialization(),
E->requiresZeroInitialization(),
15094 E->getConstructionKind(),
E->getParenOrBraceRange());
15097template<
typename Derived>
15098ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
15099 CXXInheritedCtorInitExpr *
E) {
15100 QualType
T = getDerived().TransformType(
E->
getType());
15104 CXXConstructorDecl *
Constructor = cast_or_null<CXXConstructorDecl>(
15105 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getConstructor()));
15109 if (!getDerived().AlwaysRebuild() &&
15111 Constructor ==
E->getConstructor()) {
15118 return getDerived().RebuildCXXInheritedCtorInitExpr(
15119 T,
E->getLocation(), Constructor,
15120 E->constructsVBase(),
E->inheritedFromVBase());
15127template<
typename Derived>
15129TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *
E) {
15130 if (
auto *Dtor =
E->getTemporary()->getDestructor())
15132 const_cast<CXXDestructorDecl *
>(Dtor));
15133 return getDerived().TransformExpr(
E->getSubExpr());
15141template<
typename Derived>
15143TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *
E) {
15144 return getDerived().TransformExpr(
E->getSubExpr());
15147template<
typename Derived>
15149TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
15150 CXXTemporaryObjectExpr *
E) {
15151 TypeSourceInfo *
T =
15152 getDerived().TransformTypeWithDeducedTST(
E->getTypeSourceInfo());
15156 CXXConstructorDecl *
Constructor = cast_or_null<CXXConstructorDecl>(
15157 getDerived().TransformDecl(
E->
getBeginLoc(),
E->getConstructor()));
15161 bool ArgumentChanged =
false;
15163 Args.reserve(
E->getNumArgs());
15165 EnterExpressionEvaluationContext Context(
15167 E->isListInitialization());
15168 if (TransformExprs(
E->getArgs(),
E->getNumArgs(),
true, Args,
15172 if (
E->isListInitialization() && !
E->isStdInitListInitialization()) {
15174 if (Res.isInvalid())
15176 Args = {Res.get()};
15180 if (!getDerived().AlwaysRebuild() &&
15181 T ==
E->getTypeSourceInfo() &&
15182 Constructor ==
E->getConstructor() &&
15183 !ArgumentChanged) {
15189 SourceLocation LParenLoc =
T->getTypeLoc().getEndLoc();
15190 return getDerived().RebuildCXXTemporaryObjectExpr(
15191 T, LParenLoc, Args,
E->
getEndLoc(),
E->isListInitialization());
15194template<
typename Derived>
15196TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *
E) {
15199 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
15200 struct TransformedInitCapture {
15202 SourceLocation EllipsisLoc;
15207 InitCaptures.resize(
E->explicit_capture_end() -
E->explicit_capture_begin());
15209 CEnd =
E->capture_end();
15211 if (!
E->isInitCapture(
C))
15214 TransformedInitCapture &
Result = InitCaptures[
C -
E->capture_begin()];
15215 auto *OldVD = cast<VarDecl>(
C->getCapturedVar());
15217 auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
15218 std::optional<unsigned> NumExpansions) {
15219 ExprResult NewExprInitResult = getDerived().TransformInitializer(
15222 if (NewExprInitResult.isInvalid()) {
15223 Result.Expansions.push_back(InitCaptureInfoTy(
ExprError(), QualType()));
15226 Expr *NewExprInit = NewExprInitResult.get();
15228 QualType NewInitCaptureType =
15229 getSema().buildLambdaInitCaptureInitialization(
15230 C->getLocation(),
C->getCaptureKind() ==
LCK_ByRef,
15231 EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
15232 cast<VarDecl>(
C->getCapturedVar())->getInitStyle() !=
15235 Result.Expansions.push_back(
15236 InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
15240 if (OldVD->isParameterPack()) {
15241 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
15243 .castAs<PackExpansionTypeLoc>();
15249 bool Expand =
true;
15250 bool RetainExpansion =
false;
15251 std::optional<unsigned> OrigNumExpansions =
15252 ExpansionTL.getTypePtr()->getNumExpansions();
15253 std::optional<unsigned> NumExpansions = OrigNumExpansions;
15254 if (getDerived().TryExpandParameterPacks(
15255 ExpansionTL.getEllipsisLoc(),
15256 OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
15257 RetainExpansion, NumExpansions))
15259 assert(!RetainExpansion &&
"Should not need to retain expansion after a "
15260 "capture since it cannot be extended");
15262 for (
unsigned I = 0; I != *NumExpansions; ++I) {
15263 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
15264 SubstInitCapture(SourceLocation(), std::nullopt);
15267 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
15268 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
15271 SubstInitCapture(SourceLocation(), std::nullopt);
15275 LambdaScopeInfo *LSI = getSema().PushLambdaScope();
15276 Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
15287 DeclContext *DC = getSema().CurContext;
15305 while (DC->isRequiresExprBody())
15306 DC = DC->getParent();
15307 if ((getSema().isUnevaluatedContext() ||
15308 getSema().isConstantEvaluatedContext()) &&
15309 (DC->isFileContext() || !DC->getParent()->isDependentContext()))
15312 CXXRecordDecl *OldClass =
E->getLambdaClass();
15313 CXXRecordDecl *
Class = getSema().createLambdaClosureType(
15314 E->getIntroducerRange(),
nullptr, DependencyKind,
15315 E->getCaptureDefault());
15316 getDerived().transformedLocalDecl(OldClass, {
Class});
15318 CXXMethodDecl *NewCallOperator =
15319 getSema().CreateLambdaCallOperator(
E->getIntroducerRange(),
Class);
15322 getSema().buildLambdaScope(LSI, NewCallOperator,
E->getIntroducerRange(),
15323 E->getCaptureDefault(),
E->getCaptureDefaultLoc(),
15324 E->hasExplicitParameters(),
E->isMutable());
15327 Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
15334 CEnd =
E->capture_end();
15338 if (
C->isImplicit())
15342 if (
C->capturesThis()) {
15348 Sema::CXXThisScopeRAII ThisScope(
15350 dyn_cast_if_present<CXXRecordDecl>(
15351 getSema().getFunctionLevelDeclContext()),
15353 getSema().CheckCXXThisCapture(
C->getLocation(),
C->isExplicit(),
15360 if (
C->capturesVLAType())
15364 if (
E->isInitCapture(
C)) {
15365 TransformedInitCapture &NewC = InitCaptures[
C -
E->capture_begin()];
15367 auto *OldVD = cast<VarDecl>(
C->getCapturedVar());
15370 for (InitCaptureInfoTy &Info : NewC.Expansions) {
15372 QualType InitQualType = Info.second;
15373 if (
Init.isInvalid() || InitQualType.isNull()) {
15377 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
15378 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
15379 OldVD->getIdentifier(), OldVD->getInitStyle(),
Init.get(),
15380 getSema().CurContext);
15385 NewVDs.push_back(NewVD);
15386 getSema().addInitCapture(LSI, NewVD,
C->getCaptureKind() ==
LCK_ByRef);
15391 if (NewC.EllipsisLoc.isInvalid())
15392 LSI->ContainsUnexpandedParameterPack |=
15393 Init.get()->containsUnexpandedParameterPack();
15399 getDerived().transformedLocalDecl(OldVD, NewVDs);
15403 assert(
C->capturesVariable() &&
"unexpected kind of lambda capture");
15411 SourceLocation EllipsisLoc;
15412 if (
C->isPackExpansion()) {
15414 bool ShouldExpand =
false;
15415 bool RetainExpansion =
false;
15416 std::optional<unsigned> NumExpansions;
15417 if (getDerived().TryExpandParameterPacks(
C->getEllipsisLoc(),
15420 ShouldExpand, RetainExpansion,
15426 if (ShouldExpand) {
15430 auto *Pack = cast<VarDecl>(
C->getCapturedVar());
15431 for (
unsigned I = 0; I != *NumExpansions; ++I) {
15432 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
15433 VarDecl *CapturedVar
15434 = cast_or_null<VarDecl>(getDerived().TransformDecl(
C->getLocation(),
15436 if (!CapturedVar) {
15442 getSema().tryCaptureVariable(CapturedVar,
C->getLocation(), Kind);
15450 EllipsisLoc =
C->getEllipsisLoc();
15454 auto *CapturedVar = cast_or_null<ValueDecl>(
15455 getDerived().TransformDecl(
C->getLocation(),
C->getCapturedVar()));
15456 if (!CapturedVar || CapturedVar->isInvalidDecl()) {
15463 if (
auto *VD = dyn_cast<VarDecl>(CapturedVar); VD && !
C->isPackExpansion())
15464 LSI->ContainsUnexpandedParameterPack |= VD->isParameterPack();
15467 getSema().tryCaptureVariable(CapturedVar,
C->getLocation(), Kind,
15470 getSema().finishLambdaExplicitCaptures(LSI);
15474 auto TPL = getDerived().TransformTemplateParameterList(
15475 E->getTemplateParameterList());
15476 LSI->GLTemplateParameterList = TPL;
15478 getSema().AddTemplateParametersToLambdaCallOperator(NewCallOperator,
Class,
15480 LSI->ContainsUnexpandedParameterPack |=
15481 TPL->containsUnexpandedParameterPack();
15484 TypeLocBuilder NewCallOpTLBuilder;
15485 TypeLoc OldCallOpTypeLoc =
15486 E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
15487 QualType NewCallOpType =
15488 getDerived().TransformType(NewCallOpTLBuilder, OldCallOpTypeLoc);
15489 if (NewCallOpType.isNull())
15491 LSI->ContainsUnexpandedParameterPack |=
15492 NewCallOpType->containsUnexpandedParameterPack();
15493 TypeSourceInfo *NewCallOpTSI =
15494 NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType);
15498 auto FPTL = NewCallOpTSI->getTypeLoc().getAsAdjusted<FunctionProtoTypeLoc>();
15499 assert(FPTL &&
"Not a FunctionProtoType?");
15501 getSema().CompleteLambdaCallOperator(
15502 NewCallOperator,
E->getCallOperator()->getLocation(),
15503 E->getCallOperator()->getInnerLocStart(),
15504 E->getCallOperator()->getTrailingRequiresClause(), NewCallOpTSI,
15505 E->getCallOperator()->getConstexprKind(),
15506 E->getCallOperator()->getStorageClass(), FPTL.getParams(),
15507 E->hasExplicitResultType());
15509 getDerived().transformAttrs(
E->getCallOperator(), NewCallOperator);
15510 getDerived().transformedLocalDecl(
E->getCallOperator(), {NewCallOperator});
15514 Sema::ContextRAII ManglingContext(getSema(),
Class->getDeclContext());
15516 std::optional<CXXRecordDecl::LambdaNumbering> Numbering;
15517 if (getDerived().ReplacingOriginal()) {
15518 Numbering = OldClass->getLambdaNumbering();
15521 getSema().handleLambdaNumbering(
Class, NewCallOperator, Numbering);
15526 getSema().PushExpressionEvaluationContext(
15527 E->getCallOperator()->isConsteval() ?
15530 getSema().currentEvaluationContext().InImmediateEscalatingFunctionContext =
15531 getSema().getLangOpts().CPlusPlus20 &&
15532 E->getCallOperator()->isImmediateEscalating();
15534 Sema::CodeSynthesisContext
C;
15537 getSema().pushCodeSynthesisContext(
C);
15543 getSema().popCodeSynthesisContext();
15546 FuncScopeCleanup.disable();
15548 if (Body.isInvalid()) {
15549 SavedContext.pop();
15558 auto LSICopy = *LSI;
15559 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
15561 SavedContext.pop();
15596 DependencyKind = getDerived().ComputeLambdaDependency(&LSICopy);
15597 Class->setLambdaDependencyKind(DependencyKind);
15600 Class->setTypeForDecl(
nullptr);
15601 getSema().Context.getTypeDeclType(
Class);
15603 return getDerived().RebuildLambdaExpr(
E->
getBeginLoc(),
15604 Body.get()->getEndLoc(), &LSICopy);
15607template<
typename Derived>
15610 return TransformStmt(S);
15613template<
typename Derived>
15618 CEnd =
E->capture_end();
15622 if (!
C->isImplicit())
15626 if (
C->capturesThis()) {
15627 getSema().CheckCXXThisCapture(
C->getLocation(),
C->isExplicit(),
15634 if (
C->capturesVLAType())
15637 assert(
C->capturesVariable() &&
"unexpected kind of lambda capture");
15638 assert(!
E->isInitCapture(
C) &&
"implicit init-capture?");
15641 VarDecl *CapturedVar = cast_or_null<VarDecl>(
15642 getDerived().TransformDecl(
C->getLocation(),
C->getCapturedVar()));
15647 getSema().tryCaptureVariable(CapturedVar,
C->getLocation());
15653template<
typename Derived>
15658 getDerived().TransformTypeWithDeducedTST(
E->getTypeSourceInfo());
15662 bool ArgumentChanged =
false;
15664 Args.reserve(
E->getNumArgs());
15668 E->isListInitialization());
15669 if (getDerived().TransformExprs(
E->arg_begin(),
E->getNumArgs(),
true, Args,
15674 if (!getDerived().AlwaysRebuild() &&
15675 T ==
E->getTypeSourceInfo() &&
15680 return getDerived().RebuildCXXUnresolvedConstructExpr(
15681 T,
E->getLParenLoc(), Args,
E->getRParenLoc(),
E->isListInitialization());
15684template<
typename Derived>
15686TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
15687 CXXDependentScopeMemberExpr *
E) {
15692 QualType ObjectType;
15693 if (!
E->isImplicitAccess()) {
15694 OldBase =
E->getBase();
15695 Base = getDerived().TransformExpr(OldBase);
15696 if (
Base.isInvalid())
15701 bool MayBePseudoDestructor =
false;
15703 E->getOperatorLoc(),
15704 E->isArrow()? tok::arrow : tok::period,
15706 MayBePseudoDestructor);
15707 if (
Base.isInvalid())
15710 ObjectType = ObjectTy.get();
15711 BaseType = ((Expr*)
Base.get())->getType();
15714 BaseType = getDerived().TransformType(
E->getBaseType());
15720 NamedDecl *FirstQualifierInScope
15721 = getDerived().TransformFirstQualifierInScope(
15722 E->getFirstQualifierFoundInScope(),
15725 NestedNameSpecifierLoc QualifierLoc;
15726 if (
E->getQualifier()) {
15728 = getDerived().TransformNestedNameSpecifierLoc(
E->getQualifierLoc(),
15730 FirstQualifierInScope);
15735 SourceLocation TemplateKWLoc =
E->getTemplateKeywordLoc();
15741 DeclarationNameInfo NameInfo
15742 = getDerived().TransformDeclarationNameInfo(
E->getMemberNameInfo());
15743 if (!NameInfo.getName())
15746 if (!
E->hasExplicitTemplateArgs()) {
15749 if (!getDerived().AlwaysRebuild() &&
15750 Base.get() == OldBase &&
15751 BaseType ==
E->getBaseType() &&
15752 QualifierLoc ==
E->getQualifierLoc() &&
15753 NameInfo.getName() ==
E->getMember() &&
15754 FirstQualifierInScope ==
E->getFirstQualifierFoundInScope())
15757 return getDerived().RebuildCXXDependentScopeMemberExpr(
Base.get(),
15760 E->getOperatorLoc(),
15763 FirstQualifierInScope,
15768 TemplateArgumentListInfo TransArgs(
E->getLAngleLoc(),
E->getRAngleLoc());
15769 if (getDerived().TransformTemplateArguments(
E->getTemplateArgs(),
15770 E->getNumTemplateArgs(),
15774 return getDerived().RebuildCXXDependentScopeMemberExpr(
Base.get(),
15777 E->getOperatorLoc(),
15780 FirstQualifierInScope,
15785template <
typename Derived>
15786ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
15787 UnresolvedMemberExpr *Old) {
15791 if (!Old->isImplicitAccess()) {
15792 Base = getDerived().TransformExpr(Old->getBase());
15793 if (
Base.isInvalid())
15796 getSema().PerformMemberExprBaseConversion(
Base.get(), Old->isArrow());
15797 if (
Base.isInvalid())
15799 BaseType =
Base.get()->getType();
15801 BaseType = getDerived().TransformType(Old->getBaseType());
15804 NestedNameSpecifierLoc QualifierLoc;
15805 if (Old->getQualifierLoc()) {
15807 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
15812 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
15817 if (TransformOverloadExprDecls(Old,
false, R))
15821 if (Old->getNamingClass()) {
15822 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
15823 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
15827 R.setNamingClass(NamingClass);
15830 TemplateArgumentListInfo TransArgs;
15831 if (Old->hasExplicitTemplateArgs()) {
15832 TransArgs.setLAngleLoc(Old->getLAngleLoc());
15833 TransArgs.setRAngleLoc(Old->getRAngleLoc());
15834 if (getDerived().TransformTemplateArguments(
15835 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
15843 NamedDecl *FirstQualifierInScope =
nullptr;
15845 return getDerived().RebuildUnresolvedMemberExpr(
15846 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
15847 TemplateKWLoc, FirstQualifierInScope, R,
15848 (Old->hasExplicitTemplateArgs() ? &TransArgs :
nullptr));
15851template<
typename Derived>
15853TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *
E) {
15856 ExprResult SubExpr = getDerived().TransformExpr(
E->getOperand());
15857 if (SubExpr.isInvalid())
15860 if (!getDerived().AlwaysRebuild() && SubExpr.get() ==
E->getOperand())
15863 return getDerived().RebuildCXXNoexceptExpr(
E->
getSourceRange(),SubExpr.get());
15866template<
typename Derived>
15868TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *
E) {
15869 ExprResult Pattern = getDerived().TransformExpr(
E->getPattern());
15870 if (Pattern.isInvalid())
15873 if (!getDerived().AlwaysRebuild() && Pattern.get() ==
E->getPattern())
15876 return getDerived().RebuildPackExpansion(Pattern.get(),
E->getEllipsisLoc(),
15877 E->getNumExpansions());
15880template<
typename Derived>
15882TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *
E) {
15892 TemplateArgument ArgStorage;
15895 if (
E->isPartiallySubstituted()) {
15896 PackArgs =
E->getPartialArguments();
15899 bool ShouldExpand =
false;
15900 bool RetainExpansion =
false;
15901 std::optional<unsigned> NumExpansions;
15902 if (getDerived().TryExpandParameterPacks(
E->getOperatorLoc(),
E->getPackLoc(),
15904 ShouldExpand, RetainExpansion,
15910 if (ShouldExpand) {
15911 auto *Pack =
E->getPack();
15912 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
15913 ArgStorage = getSema().Context.getPackExpansionType(
15915 }
else if (
auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
15916 ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt);
15918 auto *VD = cast<ValueDecl>(Pack);
15919 ExprResult DRE = getSema().BuildDeclRefExpr(
15920 VD, VD->getType().getNonLValueExprType(getSema().Context),
15923 if (DRE.isInvalid())
15925 ArgStorage =
new (getSema().Context)
15926 PackExpansionExpr(getSema().Context.DependentTy, DRE.get(),
15927 E->getPackLoc(), std::nullopt);
15929 PackArgs = ArgStorage;
15934 if (!PackArgs.size()) {
15935 auto *Pack = cast_or_null<NamedDecl>(
15936 getDerived().TransformDecl(
E->getPackLoc(),
E->getPack()));
15939 return getDerived().RebuildSizeOfPackExpr(
15940 E->getOperatorLoc(), Pack,
E->getPackLoc(),
E->getRParenLoc(),
15945 std::optional<unsigned>
Result = 0;
15946 for (
const TemplateArgument &Arg : PackArgs) {
15947 if (!Arg.isPackExpansion()) {
15952 TemplateArgumentLoc ArgLoc;
15953 InventTemplateArgumentLoc(Arg, ArgLoc);
15956 SourceLocation Ellipsis;
15957 std::optional<unsigned> OrigNumExpansions;
15958 TemplateArgumentLoc Pattern =
15959 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
15960 OrigNumExpansions);
15963 TemplateArgumentLoc OutPattern;
15964 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
15965 if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
15970 std::optional<unsigned> NumExpansions =
15971 getSema().getFullyPackExpandedSize(OutPattern.getArgument());
15972 if (!NumExpansions) {
15985 return getDerived().RebuildSizeOfPackExpr(
E->getOperatorLoc(),
E->getPack(),
15987 E->getRParenLoc(), *
Result, {});
15989 TemplateArgumentListInfo TransformedPackArgs(
E->getPackLoc(),
15992 TemporaryBase Rebase(*
this,
E->getPackLoc(), getBaseEntity());
15993 typedef TemplateArgumentLocInventIterator<
15994 Derived,
const TemplateArgument*> PackLocIterator;
15995 if (TransformTemplateArguments(PackLocIterator(*
this, PackArgs.begin()),
15996 PackLocIterator(*
this, PackArgs.end()),
15997 TransformedPackArgs,
true))
16004 bool PartialSubstitution =
false;
16005 for (
auto &
Loc : TransformedPackArgs.arguments()) {
16006 Args.push_back(
Loc.getArgument());
16007 if (
Loc.getArgument().isPackExpansion())
16008 PartialSubstitution =
true;
16011 if (PartialSubstitution)
16012 return getDerived().RebuildSizeOfPackExpr(
16013 E->getOperatorLoc(),
E->getPack(),
E->getPackLoc(),
E->getRParenLoc(),
16014 std::nullopt, Args);
16016 return getDerived().RebuildSizeOfPackExpr(
E->getOperatorLoc(),
E->getPack(),
16017 E->getPackLoc(),
E->getRParenLoc(),
16021template <
typename Derived>
16023TreeTransform<Derived>::TransformPackIndexingExpr(PackIndexingExpr *
E) {
16030 EnterExpressionEvaluationContext ConstantContext(
16032 IndexExpr = getDerived().TransformExpr(
E->getIndexExpr());
16033 if (IndexExpr.isInvalid())
16038 bool FullySubstituted =
true;
16039 if (!
E->expandsToEmptyPack() &&
E->getExpressions().empty()) {
16040 Expr *Pattern =
E->getPackIdExpression();
16042 getSema().collectUnexpandedParameterPacks(
E->getPackIdExpression(),
16044 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
16048 bool ShouldExpand =
true;
16049 bool RetainExpansion =
false;
16050 std::optional<unsigned> OrigNumExpansions;
16051 std::optional<unsigned> NumExpansions = OrigNumExpansions;
16052 if (getDerived().TryExpandParameterPacks(
16054 ShouldExpand, RetainExpansion, NumExpansions))
16056 if (!ShouldExpand) {
16057 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
16058 ExprResult Pack = getDerived().TransformExpr(Pattern);
16059 if (Pack.isInvalid())
16061 return getDerived().RebuildPackIndexingExpr(
16062 E->getEllipsisLoc(),
E->getRSquareLoc(), Pack.get(), IndexExpr.get(),
16065 for (
unsigned I = 0; I != *NumExpansions; ++I) {
16066 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
16067 ExprResult Out = getDerived().TransformExpr(Pattern);
16068 if (Out.isInvalid())
16070 if (Out.get()->containsUnexpandedParameterPack()) {
16071 Out = getDerived().RebuildPackExpansion(Out.get(),
E->getEllipsisLoc(),
16072 OrigNumExpansions);
16073 if (Out.isInvalid())
16075 FullySubstituted =
false;
16077 ExpandedExprs.push_back(Out.get());
16081 if (RetainExpansion) {
16082 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
16084 ExprResult Out = getDerived().TransformExpr(Pattern);
16085 if (Out.isInvalid())
16088 Out = getDerived().RebuildPackExpansion(Out.get(),
E->getEllipsisLoc(),
16089 OrigNumExpansions);
16090 if (Out.isInvalid())
16092 FullySubstituted =
false;
16093 ExpandedExprs.push_back(Out.get());
16095 }
else if (!
E->expandsToEmptyPack()) {
16096 if (getDerived().TransformExprs(
E->getExpressions().data(),
16097 E->getExpressions().size(),
false,
16102 return getDerived().RebuildPackIndexingExpr(
16103 E->getEllipsisLoc(),
E->getRSquareLoc(),
E->getPackIdExpression(),
16104 IndexExpr.get(), ExpandedExprs, FullySubstituted);
16107template<
typename Derived>
16109TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
16110 SubstNonTypeTemplateParmPackExpr *
E) {
16115template<
typename Derived>
16117TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
16118 SubstNonTypeTemplateParmExpr *
E) {
16123template<
typename Derived>
16125TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *
E) {
16130template<
typename Derived>
16132TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
16133 MaterializeTemporaryExpr *
E) {
16134 return getDerived().TransformExpr(
E->getSubExpr());
16137template<
typename Derived>
16139TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *
E) {
16140 UnresolvedLookupExpr *
Callee =
nullptr;
16141 if (Expr *OldCallee =
E->getCallee()) {
16142 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
16143 if (CalleeResult.isInvalid())
16145 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
16148 Expr *Pattern =
E->getPattern();
16151 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
16152 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
16156 bool Expand =
true;
16157 bool RetainExpansion =
false;
16158 std::optional<unsigned> OrigNumExpansions =
E->getNumExpansions(),
16159 NumExpansions = OrigNumExpansions;
16160 if (getDerived().TryExpandParameterPacks(
E->getEllipsisLoc(),
16163 Expand, RetainExpansion,
16170 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
16173 E->getLHS() ? getDerived().TransformExpr(
E->getLHS()) :
ExprResult();
16174 if (LHS.isInvalid())
16178 E->getRHS() ? getDerived().TransformExpr(
E->getRHS()) :
ExprResult();
16179 if (RHS.isInvalid())
16182 if (!getDerived().AlwaysRebuild() &&
16183 LHS.get() ==
E->getLHS() && RHS.get() ==
E->getRHS())
16186 return getDerived().RebuildCXXFoldExpr(
16188 E->getEllipsisLoc(), RHS.get(),
E->
getEndLoc(), NumExpansions);
16194 if (NumExpansions && SemaRef.
getLangOpts().BracketDepth < NumExpansions) {
16195 SemaRef.
Diag(
E->getEllipsisLoc(),
16196 clang::diag::err_fold_expression_limit_exceeded)
16197 << *NumExpansions << SemaRef.
getLangOpts().BracketDepth
16199 SemaRef.
Diag(
E->getEllipsisLoc(), diag::note_bracket_depth);
16208 bool LeftFold =
E->isLeftFold();
16212 if (!LeftFold && RetainExpansion) {
16213 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
16215 ExprResult Out = getDerived().TransformExpr(Pattern);
16216 if (Out.isInvalid())
16219 Result = getDerived().RebuildCXXFoldExpr(
16226 for (
unsigned I = 0; I != *NumExpansions; ++I) {
16227 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
16228 getSema(), LeftFold ? I : *NumExpansions - I - 1);
16229 ExprResult Out = getDerived().TransformExpr(Pattern);
16230 if (Out.isInvalid())
16233 if (Out.get()->containsUnexpandedParameterPack()) {
16235 Result = getDerived().RebuildCXXFoldExpr(
16237 E->getOperator(),
E->getEllipsisLoc(),
16239 OrigNumExpansions);
16240 }
else if (
Result.isUsable()) {
16242 Expr *LHS = LeftFold ?
Result.get() : Out.get();
16243 Expr *RHS = LeftFold ? Out.get() :
Result.get();
16245 UnresolvedSet<16> Functions;
16246 Functions.append(
Callee->decls_begin(),
Callee->decls_end());
16247 Result = getDerived().RebuildCXXOperatorCallExpr(
16249 E->getEllipsisLoc(),
Callee->getBeginLoc(),
Callee->requiresADL(),
16250 Functions, LHS, RHS);
16252 Result = getDerived().RebuildBinaryOperator(
E->getEllipsisLoc(),
16253 E->getOperator(), LHS, RHS);
16264 if (LeftFold && RetainExpansion) {
16265 ForgetPartiallySubstitutedPackRAII Forget(getDerived());
16267 ExprResult Out = getDerived().TransformExpr(Pattern);
16268 if (Out.isInvalid())
16271 Result = getDerived().RebuildCXXFoldExpr(
16273 E->getEllipsisLoc(), Out.get(),
E->
getEndLoc(), OrigNumExpansions);
16278 if (ParenExpr *PE = dyn_cast_or_null<ParenExpr>(
Result.get()))
16279 PE->setIsProducedByFoldExpansion();
16284 return getDerived().RebuildEmptyCXXFoldExpr(
E->getEllipsisLoc(),
16289template <
typename Derived>
16291TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *
E) {
16294 if (TransformExprs(InitExprs.data(), InitExprs.size(),
true,
16298 return getDerived().RebuildParenListExpr(
E->
getBeginLoc(), TransformedInits,
16302template<
typename Derived>
16304TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
16305 CXXStdInitializerListExpr *
E) {
16306 return getDerived().TransformExpr(
E->getSubExpr());
16309template<
typename Derived>
16311TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *
E) {
16315template<
typename Derived>
16317TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *
E) {
16321template<
typename Derived>
16323TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *
E) {
16324 ExprResult SubExpr = getDerived().TransformExpr(
E->getSubExpr());
16325 if (SubExpr.isInvalid())
16328 if (!getDerived().AlwaysRebuild() &&
16329 SubExpr.get() ==
E->getSubExpr())
16332 return getDerived().RebuildObjCBoxedExpr(
E->
getSourceRange(), SubExpr.get());
16335template<
typename Derived>
16337TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *
E) {
16340 bool ArgChanged =
false;
16341 if (getDerived().TransformExprs(
E->getElements(),
E->getNumElements(),
16342 false, Elements, &ArgChanged))
16345 if (!getDerived().AlwaysRebuild() && !ArgChanged)
16353template<
typename Derived>
16355TreeTransform<Derived>::TransformObjCDictionaryLiteral(
16356 ObjCDictionaryLiteral *
E) {
16359 bool ArgChanged =
false;
16360 for (
unsigned I = 0, N =
E->getNumElements(); I != N; ++I) {
16361 ObjCDictionaryElement OrigElement =
E->getKeyValueElement(I);
16363 if (OrigElement.isPackExpansion()) {
16366 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
16367 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
16368 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
16372 bool Expand =
true;
16373 bool RetainExpansion =
false;
16374 std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
16375 std::optional<unsigned> NumExpansions = OrigNumExpansions;
16376 SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
16377 OrigElement.Value->getEndLoc());
16378 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
16379 PatternRange, Unexpanded, Expand,
16380 RetainExpansion, NumExpansions))
16387 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
16388 ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
16389 if (Key.isInvalid())
16392 if (Key.get() != OrigElement.Key)
16396 if (
Value.isInvalid())
16399 if (
Value.get() != OrigElement.Value)
16402 ObjCDictionaryElement Expansion = {
16403 Key.get(),
Value.get(), OrigElement.EllipsisLoc, NumExpansions
16405 Elements.push_back(Expansion);
16415 for (
unsigned I = 0; I != *NumExpansions; ++I) {
16416 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
16417 ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
16418 if (Key.isInvalid())
16422 if (
Value.isInvalid())
16425 ObjCDictionaryElement Element = {
16426 Key.get(),
Value.get(), SourceLocation(), NumExpansions
16432 if (Key.get()->containsUnexpandedParameterPack() ||
16433 Value.get()->containsUnexpandedParameterPack())
16434 Element.EllipsisLoc = OrigElement.EllipsisLoc;
16436 Elements.push_back(Element);
16446 ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
16447 if (Key.isInvalid())
16450 if (Key.get() != OrigElement.Key)
16455 = getDerived().TransformExpr(OrigElement.Value);
16456 if (
Value.isInvalid())
16459 if (
Value.get() != OrigElement.Value)
16462 ObjCDictionaryElement Element = {Key.get(),
Value.get(), SourceLocation(),
16464 Elements.push_back(Element);
16467 if (!getDerived().AlwaysRebuild() && !ArgChanged)
16470 return getDerived().RebuildObjCDictionaryLiteral(
E->
getSourceRange(),
16474template<
typename Derived>
16476TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *
E) {
16477 TypeSourceInfo *EncodedTypeInfo
16478 = getDerived().TransformType(
E->getEncodedTypeSourceInfo());
16479 if (!EncodedTypeInfo)
16482 if (!getDerived().AlwaysRebuild() &&
16483 EncodedTypeInfo ==
E->getEncodedTypeSourceInfo())
16486 return getDerived().RebuildObjCEncodeExpr(
E->getAtLoc(),
16488 E->getRParenLoc());
16491template<
typename Derived>
16493TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *
E) {
16498 return getDerived().TransformExpr(
E->getSubExpr());
16501template<
typename Derived>
16503TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *
E) {
16504 TypeSourceInfo *TSInfo
16505 = getDerived().TransformType(
E->getTypeInfoAsWritten());
16513 if (!getDerived().AlwaysRebuild() &&
16514 TSInfo ==
E->getTypeInfoAsWritten() &&
16515 Result.get() ==
E->getSubExpr())
16519 E->getLParenLoc(),
E->getBridgeKind(),
E->getBridgeKeywordLoc(), TSInfo,
16523template <
typename Derived>
16524ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
16525 ObjCAvailabilityCheckExpr *
E) {
16529template<
typename Derived>
16531TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *
E) {
16533 bool ArgChanged =
false;
16535 Args.reserve(
E->getNumArgs());
16536 if (getDerived().TransformExprs(
E->getArgs(),
E->getNumArgs(),
false, Args,
16542 TypeSourceInfo *ReceiverTypeInfo
16543 = getDerived().TransformType(
E->getClassReceiverTypeInfo());
16544 if (!ReceiverTypeInfo)
16548 if (!getDerived().AlwaysRebuild() &&
16549 ReceiverTypeInfo ==
E->getClassReceiverTypeInfo() && !ArgChanged)
16554 E->getSelectorLocs(SelLocs);
16555 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
16558 E->getMethodDecl(),
16565 if (!
E->getMethodDecl())
16570 E->getSelectorLocs(SelLocs);
16571 return getDerived().RebuildObjCMessageExpr(
E->getSuperLoc(),
16574 E->getReceiverType(),
16575 E->getMethodDecl(),
16583 "Only class and instance messages may be instantiated");
16585 = getDerived().TransformExpr(
E->getInstanceReceiver());
16586 if (Receiver.isInvalid())
16590 if (!getDerived().AlwaysRebuild() &&
16591 Receiver.get() ==
E->getInstanceReceiver() && !ArgChanged)
16596 E->getSelectorLocs(SelLocs);
16597 return getDerived().RebuildObjCMessageExpr(Receiver.get(),
16600 E->getMethodDecl(),
16606template<
typename Derived>
16608TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *
E) {
16612template<
typename Derived>
16614TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *
E) {
16618template<
typename Derived>
16620TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *
E) {
16623 if (
Base.isInvalid())
16629 if (!getDerived().AlwaysRebuild() &&
16630 Base.get() ==
E->getBase())
16633 return getDerived().RebuildObjCIvarRefExpr(
Base.get(),
E->getDecl(),
16635 E->isArrow(),
E->isFreeIvar());
16638template<
typename Derived>
16640TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *
E) {
16643 if (!
E->isObjectReceiver())
16648 if (
Base.isInvalid())
16654 if (!getDerived().AlwaysRebuild() &&
16655 Base.get() ==
E->getBase())
16658 if (
E->isExplicitProperty())
16659 return getDerived().RebuildObjCPropertyRefExpr(
Base.get(),
16660 E->getExplicitProperty(),
16663 return getDerived().RebuildObjCPropertyRefExpr(
Base.get(),
16665 E->getImplicitPropertyGetter(),
16666 E->getImplicitPropertySetter(),
16670template<
typename Derived>
16672TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *
E) {
16675 if (
Base.isInvalid())
16679 ExprResult Key = getDerived().TransformExpr(
E->getKeyExpr());
16680 if (Key.isInvalid())
16684 if (!getDerived().AlwaysRebuild() &&
16685 Key.get() ==
E->getKeyExpr() &&
Base.get() ==
E->getBaseExpr())
16688 return getDerived().RebuildObjCSubscriptRefExpr(
E->getRBracket(),
16689 Base.get(), Key.get(),
16690 E->getAtIndexMethodDecl(),
16691 E->setAtIndexMethodDecl());
16694template<
typename Derived>
16696TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *
E) {
16699 if (
Base.isInvalid())
16703 if (!getDerived().AlwaysRebuild() &&
16704 Base.get() ==
E->getBase())
16707 return getDerived().RebuildObjCIsaExpr(
Base.get(),
E->getIsaMemberLoc(),
16712template<
typename Derived>
16714TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *
E) {
16715 bool ArgumentChanged =
false;
16717 SubExprs.reserve(
E->getNumSubExprs());
16718 if (getDerived().TransformExprs(
E->getSubExprs(),
E->getNumSubExprs(),
false,
16719 SubExprs, &ArgumentChanged))
16722 if (!getDerived().AlwaysRebuild() &&
16726 return getDerived().RebuildShuffleVectorExpr(
E->getBuiltinLoc(),
16728 E->getRParenLoc());
16731template<
typename Derived>
16733TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *
E) {
16734 ExprResult SrcExpr = getDerived().TransformExpr(
E->getSrcExpr());
16735 if (SrcExpr.isInvalid())
16738 TypeSourceInfo *
Type = getDerived().TransformType(
E->getTypeSourceInfo());
16742 if (!getDerived().AlwaysRebuild() &&
16743 Type ==
E->getTypeSourceInfo() &&
16744 SrcExpr.get() ==
E->getSrcExpr())
16747 return getDerived().RebuildConvertVectorExpr(
E->getBuiltinLoc(),
16748 SrcExpr.get(), Type,
16749 E->getRParenLoc());
16752template<
typename Derived>
16754TreeTransform<Derived>::TransformBlockExpr(BlockExpr *
E) {
16755 BlockDecl *oldBlock =
E->getBlockDecl();
16758 BlockScopeInfo *blockScope = SemaRef.
getCurBlock();
16761 blockScope->TheDecl->setBlockMissingReturnType(
16762 oldBlock->blockMissingReturnType());
16767 const FunctionProtoType *exprFunctionType =
E->getFunctionType();
16770 Sema::ExtParameterInfoBuilder extParamInfos;
16771 if (getDerived().TransformFunctionTypeParams(
16772 E->getCaretLocation(), oldBlock->parameters(),
nullptr,
16773 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms,
16775 getSema().ActOnBlockError(
E->getCaretLocation(),
nullptr);
16779 QualType exprResultType =
16780 getDerived().TransformType(exprFunctionType->getReturnType());
16782 auto epi = exprFunctionType->getExtProtoInfo();
16783 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
16786 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
16790 if (!params.empty())
16791 blockScope->TheDecl->setParams(params);
16793 if (!oldBlock->blockMissingReturnType()) {
16794 blockScope->HasImplicitReturnType =
false;
16795 blockScope->ReturnType = exprResultType;
16799 StmtResult body = getDerived().TransformStmt(
E->getBody());
16800 if (body.isInvalid()) {
16801 getSema().ActOnBlockError(
E->getCaretLocation(),
nullptr);
16809 for (
const auto &I : oldBlock->captures()) {
16810 VarDecl *oldCapture = I.getVariable();
16813 if (oldCapture->isParameterPack())
16816 VarDecl *newCapture =
16817 cast<VarDecl>(getDerived().TransformDecl(
E->getCaretLocation(),
16819 assert(blockScope->CaptureMap.count(newCapture));
16825 assert((!blockScope->isCXXThisCaptured() || oldBlock->capturesCXXThis()) &&
16826 "this pointer isn't captured in the old block");
16834template<
typename Derived>
16836TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *
E) {
16837 ExprResult SrcExpr = getDerived().TransformExpr(
E->getSrcExpr());
16838 if (SrcExpr.isInvalid())
16841 QualType
Type = getDerived().TransformType(
E->
getType());
16844 E->getRParenLoc());
16847template<
typename Derived>
16849TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *
E) {
16850 bool ArgumentChanged =
false;
16852 SubExprs.reserve(
E->getNumSubExprs());
16853 if (getDerived().TransformExprs(
E->getSubExprs(),
E->getNumSubExprs(),
false,
16854 SubExprs, &ArgumentChanged))
16857 if (!getDerived().AlwaysRebuild() &&
16861 return getDerived().RebuildAtomicExpr(
E->getBuiltinLoc(), SubExprs,
16862 E->getOp(),
E->getRParenLoc());
16869template<
typename Derived>
16873 getDerived().getBaseEntity());
16876template<
typename Derived>
16880 getDerived().getBaseEntity());
16883template<
typename Derived>
16886 bool WrittenAsLValue,
16889 Sigil, getDerived().getBaseEntity());
16892template<
typename Derived>
16898 getDerived().getBaseEntity());
16901template<
typename Derived>
16909 Decl, ProtocolLAngleLoc, Protocols, ProtocolLocs, ProtocolRAngleLoc,
16913template<
typename Derived>
16925 BaseType,
Loc, TypeArgsLAngleLoc, TypeArgs, TypeArgsRAngleLoc,
16926 ProtocolLAngleLoc, Protocols, ProtocolLocs, ProtocolRAngleLoc,
16931template<
typename Derived>
16938template <
typename Derived>
16941 Expr *SizeExpr,
unsigned IndexTypeQuals,
SourceRange BracketsRange) {
16942 if (SizeExpr || !Size)
16944 IndexTypeQuals, BracketsRange,
16945 getDerived().getBaseEntity());
16953 for (
const auto &
T : Types)
16965 IndexTypeQuals, BracketsRange,
16966 getDerived().getBaseEntity());
16969template <
typename Derived>
16972 Expr *SizeExpr,
unsigned IndexTypeQuals,
SourceRange BracketsRange) {
16973 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
16974 IndexTypeQuals, BracketsRange);
16977template <
typename Derived>
16981 return getDerived().RebuildArrayType(ElementType, SizeMod,
nullptr,
nullptr,
16982 IndexTypeQuals, BracketsRange);
16985template <
typename Derived>
16988 unsigned IndexTypeQuals,
SourceRange BracketsRange) {
16989 return getDerived().RebuildArrayType(ElementType, SizeMod,
nullptr,
16991 IndexTypeQuals, BracketsRange);
16994template <
typename Derived>
16997 unsigned IndexTypeQuals,
SourceRange BracketsRange) {
16998 return getDerived().RebuildArrayType(ElementType, SizeMod,
nullptr,
17000 IndexTypeQuals, BracketsRange);
17003template <
typename Derived>
17010template <
typename Derived>
17012 unsigned NumElements,
17018template <
typename Derived>
17025template<
typename Derived>
17027 unsigned NumElements,
17030 NumElements,
true);
17037template<
typename Derived>
17045template <
typename Derived>
17047 QualType ElementType,
unsigned NumRows,
unsigned NumColumns) {
17052template <
typename Derived>
17060template<
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>
17420ExprResult TreeTransform<Derived>::TransformHLSLOutArgExpr(HLSLOutArgExpr *
E) {
17423 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.
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.