@@ -13636,58 +13636,42 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
1363613636 // The transformation MUST be done in the CurrentInstantiationScope since
1363713637 // it introduces a mapping of the original to the newly created
1363813638 // transformed parameters.
13639- TypeSourceInfo *NewCallOpTSI = nullptr;
13640- {
13641- auto OldCallOpTypeLoc =
13642- E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
13643-
13644- auto TransformFunctionProtoTypeLoc =
13645- [this](TypeLocBuilder &TLB, FunctionProtoTypeLoc FPTL) -> QualType {
13646- SmallVector<QualType, 4> ExceptionStorage;
13647- return this->TransformFunctionProtoType(
13648- TLB, FPTL, nullptr, Qualifiers(),
13649- [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
13650- return TransformExceptionSpec(FPTL.getBeginLoc(), ESI,
13651- ExceptionStorage, Changed);
13652- });
13653- };
13639+ auto OldCallOpTypeLoc =
13640+ E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
1365413641
13655- QualType NewCallOpType;
13656- TypeLocBuilder NewCallOpTLBuilder;
13642+ TypeLocBuilder NewCallOpTLBuilder;
13643+ QualType NewCallOpType =
13644+ getDerived().TransformType(NewCallOpTLBuilder, OldCallOpTypeLoc);
1365713645
13658- if (auto ATL = OldCallOpTypeLoc.getAs<AttributedTypeLoc>()) {
13659- NewCallOpType = this->TransformAttributedType(
13660- NewCallOpTLBuilder, ATL,
13661- [&](TypeLocBuilder &TLB, TypeLoc TL) -> QualType {
13662- return TransformFunctionProtoTypeLoc(
13663- TLB, TL.castAs<FunctionProtoTypeLoc>());
13664- });
13665- } else {
13666- auto FPTL = OldCallOpTypeLoc.castAs<FunctionProtoTypeLoc>();
13667- NewCallOpType = TransformFunctionProtoTypeLoc(NewCallOpTLBuilder, FPTL);
13668- }
13669-
13670- if (NewCallOpType.isNull())
13671- return ExprError();
13672- NewCallOpTSI =
13673- NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType);
13674- }
13646+ if (NewCallOpType.isNull())
13647+ return ExprError();
1367513648
13676- ArrayRef<ParmVarDecl *> Params;
13677- if (auto ATL = NewCallOpTSI->getTypeLoc().getAs<AttributedTypeLoc>()) {
13678- Params = ATL.getModifiedLoc().castAs<FunctionProtoTypeLoc>().getParams();
13679- } else {
13680- auto FPTL = NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>();
13681- Params = FPTL.getParams();
13682- }
13649+ TypeSourceInfo *NewCallOpTSI =
13650+ NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType);
13651+
13652+ auto ExtractParams = [](TypeLoc TL) {
13653+ auto ExtractParamsImpl = [](auto Self,
13654+ TypeLoc TL) -> ArrayRef<ParmVarDecl *> {
13655+ if (auto FPTL = TL.getAs<FunctionProtoTypeLoc>()) {
13656+ return FPTL.getParams();
13657+ } else if (auto ATL = TL.getAs<AttributedTypeLoc>()) {
13658+ return Self(Self, ATL.getModifiedLoc());
13659+ } else if (auto MQTL = TL.getAs<MacroQualifiedTypeLoc>()) {
13660+ return Self(Self, MQTL.getInnerLoc());
13661+ } else {
13662+ llvm_unreachable("Unhandled TypeLoc");
13663+ }
13664+ };
13665+ return ExtractParamsImpl(ExtractParamsImpl, TL);
13666+ };
1368313667
1368413668 getSema().CompleteLambdaCallOperator(
1368513669 NewCallOperator, E->getCallOperator()->getLocation(),
1368613670 E->getCallOperator()->getInnerLocStart(),
1368713671 E->getCallOperator()->getTrailingRequiresClause(), NewCallOpTSI,
1368813672 E->getCallOperator()->getConstexprKind(),
13689- E->getCallOperator()->getStorageClass(), Params,
13690- E->hasExplicitResultType());
13673+ E->getCallOperator()->getStorageClass(),
13674+ ExtractParams(NewCallOpTSI->getTypeLoc()), E->hasExplicitResultType());
1369113675
1369213676 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
1369313677 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
0 commit comments