@@ -368,6 +368,8 @@ SubstitutionInTemplateArguments(
368368
369369 TemplateArgumentListInfo SubstArgs;
370370 if (Constraint.hasParameterMapping ()) {
371+ Sema::ArgPackSubstIndexRAII SubstIndex (
372+ S, Constraint.getPackSubstitutionIndex ());
371373 if (S.SubstTemplateArgumentsInParameterMapping (
372374 Constraint.getParameterMapping (), MLTAL, SubstArgs) ||
373375 Trap.hasErrorOccurred ())
@@ -590,6 +592,8 @@ static bool calculateConstraintSatisfaction(
590592 return Ok;
591593
592594 Sema::SFINAETrap Trap (S);
595+ Sema::ArgPackSubstIndexRAII SubstIndex (
596+ S, Constraint.getPackSubstitutionIndex ());
593597
594598 const ASTTemplateArgumentListInfo *Ori =
595599 Constraint.getConceptId ()->getTemplateArgsAsWritten ();
@@ -604,7 +608,8 @@ static bool calculateConstraintSatisfaction(
604608 Ori->NumTemplateArgs , TransArgs))
605609 return Ok;
606610
607- if (S.SubstTemplateArguments (TransArgs.arguments (), MLTAL, OutArgs) ||
611+ if (S.SubstTemplateArguments (TransArgs.arguments (), *SubstitutedArgs,
612+ OutArgs) ||
608613 Trap.hasErrorOccurred ())
609614 return Ok;
610615
@@ -1659,19 +1664,23 @@ static bool substituteParameterMappings(Sema &S, NormalizedConstraint &N,
16591664 /* RelativeToPrimary=*/ true ,
16601665 /* Pattern=*/ nullptr ,
16611666 /* ForConstraintInstantiation=*/ true );
1662-
1667+ // Don't build Subst* nodes to model lambda expressions.
1668+ // The transform of Subst* is oblivious to the lambda type.
1669+ MLTAL.setKind (TemplateSubstitutionKind::Rewrite);
16631670 return substituteParameterMappings (S, N, MLTAL,
16641671 CSE->getTemplateArgsAsWritten ());
16651672}
16661673
16671674NormalizedConstraint *NormalizedConstraint::fromAssociatedConstraints (
16681675 Sema &S, const NamedDecl *D, ArrayRef<AssociatedConstraint> ACs) {
16691676 assert (ACs.size () != 0 );
1670- auto Conjunction = fromConstraintExpr (S, D, ACs[0 ].ConstraintExpr );
1677+ auto *Conjunction =
1678+ fromConstraintExpr (S, D, ACs[0 ].ConstraintExpr , ACs[0 ].ArgPackSubstIndex );
16711679 if (!Conjunction)
16721680 return nullptr ;
16731681 for (unsigned I = 1 ; I < ACs.size (); ++I) {
1674- auto Next = fromConstraintExpr (S, D, ACs[I].ConstraintExpr );
1682+ auto *Next = fromConstraintExpr (S, D, ACs[I].ConstraintExpr ,
1683+ ACs[I].ArgPackSubstIndex );
16751684 if (!Next)
16761685 return nullptr ;
16771686 Conjunction = CompoundConstraint::CreateConjunction (S.getASTContext (),
@@ -1680,9 +1689,8 @@ NormalizedConstraint *NormalizedConstraint::fromAssociatedConstraints(
16801689 return Conjunction;
16811690}
16821691
1683- NormalizedConstraint *
1684- NormalizedConstraint::fromConstraintExpr (Sema &S, const NamedDecl *D,
1685- const Expr *E) {
1692+ NormalizedConstraint *NormalizedConstraint::fromConstraintExpr (
1693+ Sema &S, const NamedDecl *D, const Expr *E, UnsignedOrNone SubstIndex) {
16861694 assert (E != nullptr );
16871695
16881696 // C++ [temp.constr.normal]p1.1
@@ -1703,10 +1711,10 @@ NormalizedConstraint::fromConstraintExpr(Sema &S, const NamedDecl *D,
17031711 // See http://cplusplus.github.io/concepts-ts/ts-active.html#28
17041712
17051713 if (LogicalBinOp BO = E) {
1706- auto LHS = fromConstraintExpr (S, D, BO.getLHS ());
1714+ auto * LHS = fromConstraintExpr (S, D, BO.getLHS (), SubstIndex );
17071715 if (!LHS)
17081716 return nullptr ;
1709- auto RHS = fromConstraintExpr (S, D, BO.getRHS ());
1717+ auto * RHS = fromConstraintExpr (S, D, BO.getRHS (), SubstIndex );
17101718 if (!RHS)
17111719 return nullptr ;
17121720
@@ -1734,7 +1742,7 @@ NormalizedConstraint::fromConstraintExpr(Sema &S, const NamedDecl *D,
17341742 ConceptDecl *CD = CSE->getNamedConcept ();
17351743 SubNF = NormalizedConstraint::fromAssociatedConstraints (
17361744 S, CSE->getNamedConcept (),
1737- AssociatedConstraint (CD->getConstraintExpr ()));
1745+ AssociatedConstraint (CD->getConstraintExpr (), SubstIndex ));
17381746
17391747 if (!SubNF)
17401748 return nullptr ;
@@ -1744,7 +1752,7 @@ NormalizedConstraint::fromConstraintExpr(Sema &S, const NamedDecl *D,
17441752
17451753 return ConceptIdConstraint::Create (S.getASTContext (),
17461754 CSE->getConceptReference (), SubNF, D,
1747- S. ArgPackSubstIndex );
1755+ SubstIndex );
17481756
17491757 } else if (auto *FE = dyn_cast<const CXXFoldExpr>(E);
17501758 FE && S.getLangOpts ().CPlusPlus26 &&
@@ -1759,8 +1767,8 @@ NormalizedConstraint::fromConstraintExpr(Sema &S, const NamedDecl *D,
17591767 : FoldExpandedConstraint::FoldOperatorKind::Or;
17601768
17611769 if (FE->getInit ()) {
1762- auto LHS = fromConstraintExpr (S, D, FE->getLHS ());
1763- auto RHS = fromConstraintExpr (S, D, FE->getRHS ());
1770+ auto * LHS = fromConstraintExpr (S, D, FE->getLHS (), SubstIndex );
1771+ auto * RHS = fromConstraintExpr (S, D, FE->getRHS (), SubstIndex );
17641772 if (!LHS || !RHS)
17651773 return nullptr ;
17661774
@@ -1777,13 +1785,13 @@ NormalizedConstraint::fromConstraintExpr(Sema &S, const NamedDecl *D,
17771785 : CCK_Disjunction),
17781786 RHS);
17791787 }
1780- auto Sub = fromConstraintExpr (S, D, FE->getPattern ());
1788+ auto * Sub = fromConstraintExpr (S, D, FE->getPattern (), SubstIndex );
17811789 if (!Sub)
17821790 return nullptr ;
17831791 return FoldExpandedConstraint::Create (S.getASTContext (), FE->getPattern (),
17841792 Kind, Sub);
17851793 }
1786- return AtomicConstraint::Create (S.getASTContext (), E, D, S. ArgPackSubstIndex );
1794+ return AtomicConstraint::Create (S.getASTContext (), E, D, SubstIndex );
17871795}
17881796
17891797bool FoldExpandedConstraint::AreCompatibleForSubsumption (
0 commit comments