@@ -13629,59 +13629,42 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
1362913629 // The transformation MUST be done in the CurrentInstantiationScope since
1363013630 // it introduces a mapping of the original to the newly created
1363113631 // transformed parameters.
13632- TypeSourceInfo *NewCallOpTSI = nullptr;
13633- {
13634- auto OldCallOpTypeLoc =
13635- E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
13636-
13637- auto TransformFunctionProtoTypeLoc =
13638- [this](TypeLocBuilder &TLB, FunctionProtoTypeLoc FPTL) -> QualType {
13639- SmallVector<QualType, 4> ExceptionStorage;
13640- TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
13641- return this->TransformFunctionProtoType(
13642- TLB, FPTL, nullptr, Qualifiers(),
13643- [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
13644- return This->TransformExceptionSpec(FPTL.getBeginLoc(), ESI,
13645- ExceptionStorage, Changed);
13646- });
13647- };
13632+ auto OldCallOpTypeLoc =
13633+ E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
1364813634
13649- QualType NewCallOpType;
13650- TypeLocBuilder NewCallOpTLBuilder;
13635+ TypeLocBuilder NewCallOpTLBuilder;
13636+ QualType NewCallOpType =
13637+ getDerived().TransformType(NewCallOpTLBuilder, OldCallOpTypeLoc);
1365113638
13652- if (auto ATL = OldCallOpTypeLoc.getAs<AttributedTypeLoc>()) {
13653- NewCallOpType = this->TransformAttributedType(
13654- NewCallOpTLBuilder, ATL,
13655- [&](TypeLocBuilder &TLB, TypeLoc TL) -> QualType {
13656- return TransformFunctionProtoTypeLoc(
13657- TLB, TL.castAs<FunctionProtoTypeLoc>());
13658- });
13659- } else {
13660- auto FPTL = OldCallOpTypeLoc.castAs<FunctionProtoTypeLoc>();
13661- NewCallOpType = TransformFunctionProtoTypeLoc(NewCallOpTLBuilder, FPTL);
13662- }
13663-
13664- if (NewCallOpType.isNull())
13665- return ExprError();
13666- NewCallOpTSI =
13667- NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType);
13668- }
13639+ if (NewCallOpType.isNull())
13640+ return ExprError();
1366913641
13670- ArrayRef<ParmVarDecl *> Params;
13671- if (auto ATL = NewCallOpTSI->getTypeLoc().getAs<AttributedTypeLoc>()) {
13672- Params = ATL.getModifiedLoc().castAs<FunctionProtoTypeLoc>().getParams();
13673- } else {
13674- auto FPTL = NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>();
13675- Params = FPTL.getParams();
13676- }
13642+ TypeSourceInfo *NewCallOpTSI =
13643+ NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType);
13644+
13645+ auto ExtractParams = [](TypeLoc TL) {
13646+ auto ExtractParamsImpl = [](auto Self,
13647+ TypeLoc TL) -> ArrayRef<ParmVarDecl *> {
13648+ if (auto FPTL = TL.getAs<FunctionProtoTypeLoc>()) {
13649+ return FPTL.getParams();
13650+ } else if (auto ATL = TL.getAs<AttributedTypeLoc>()) {
13651+ return Self(Self, ATL.getModifiedLoc());
13652+ } else if (auto MQTL = TL.getAs<MacroQualifiedTypeLoc>()) {
13653+ return Self(Self, MQTL.getInnerLoc());
13654+ } else {
13655+ llvm_unreachable("Unhandled TypeLoc");
13656+ }
13657+ };
13658+ return ExtractParamsImpl(ExtractParamsImpl, TL);
13659+ };
1367713660
1367813661 getSema().CompleteLambdaCallOperator(
1367913662 NewCallOperator, E->getCallOperator()->getLocation(),
1368013663 E->getCallOperator()->getInnerLocStart(),
1368113664 E->getCallOperator()->getTrailingRequiresClause(), NewCallOpTSI,
1368213665 E->getCallOperator()->getConstexprKind(),
13683- E->getCallOperator()->getStorageClass(), Params,
13684- E->hasExplicitResultType());
13666+ E->getCallOperator()->getStorageClass(),
13667+ ExtractParams(NewCallOpTSI->getTypeLoc()), E->hasExplicitResultType());
1368513668
1368613669 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
1368713670 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
0 commit comments