================
@@ -2239,16 +2253,39 @@ bool
SubstituteParameterMappings::substitute(NormalizedConstraint &N) {
}
assert(!ArgsAsWritten);
const ConceptSpecializationExpr *CSE = CC.getConceptSpecializationExpr();
+ SmallVector<TemplateArgument> InnerArgs(CSE->getTemplateArguments());
ConceptDecl *Concept = CSE->getNamedConcept();
+ if (RemovePacksForFoldExpr) {
+ TemplateArgumentListInfo OutArgs;
+ ArrayRef<TemplateArgumentLoc> InputArgLoc =
+ CSE->getConceptReference()->getTemplateArgsAsWritten()->arguments();
+ if (AdjustConstraints(SemaRef, /*TemplateDepth=*/0,
+ /*RemoveNonPackExpansionPacks=*/true)
+ .TransformTemplateArguments(InputArgLoc.begin(),
+ InputArgLoc.end(), OutArgs))
+ return true;
+ Sema::CheckTemplateArgumentInfo CTAI;
+ // Repack the packs.
+ if (SemaRef.CheckTemplateArgumentList(
+ Concept, Concept->getTemplateParameters(),
Concept->getBeginLoc(),
+ OutArgs,
+ /*DefaultArguments=*/{},
+ /*PartialTemplateArgs=*/false, CTAI))
+ return true;
+ InnerArgs = std::move(CTAI.SugaredConverted);
+ RemovePacksForFoldExpr = false;
----------------
cor3ntin wrote:
Can you explain why we need to set it to false after the first substitution?
https://github.com/llvm/llvm-project/pull/177531
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits