@@ -377,24 +377,36 @@ SubstitutionInTemplateArguments(
377377 ? Constraint.getPackSubstitutionIndex ()
378378 : PackSubstitutionIndex);
379379 if (S.SubstTemplateArgumentsInParameterMapping (
380- Constraint.getParameterMapping (), MLTAL, SubstArgs) ||
380+ Constraint.getParameterMapping (), Constraint.getBeginLoc (), MLTAL,
381+ SubstArgs) ||
381382 Trap.hasErrorOccurred ())
382383 return std::nullopt ;
384+ Sema::CheckTemplateArgumentInfo CTAI;
385+ auto *TD = const_cast <TemplateDecl *>(
386+ cast<TemplateDecl>(Constraint.getConstraintDecl ()));
387+ if (S.CheckTemplateArgumentList (TD, Constraint.getUsedTemplateParamList (),
388+ TD->getLocation (), SubstArgs,
389+ /* DefaultArguments=*/ {},
390+ /* PartialTemplateArgs=*/ false , CTAI))
391+ return std::nullopt ;
383392 NormalizedConstraint::OccurenceList Used =
384393 Constraint.mappingOccurenceList ();
385394 SubstitutedOuterMost =
386395 llvm::to_vector_of<TemplateArgument>(MLTAL.getOutermost ());
387- for (unsigned I = 0 , MappedIndex = 0 ; I < SubstArgs.size (); I++)
388- if (I < Used.size () && Used[I]) {
396+ for (unsigned I = 0 , MappedIndex = 0 ; I < Used.size (); I++) {
397+ TemplateArgument Arg;
398+ if (Used[I])
389399 // SubstitutedOuterMost[I].dump();
390400 // SubstArgs[MappedIndex].getArgument().dump();
391- TemplateArgument Arg = S.Context .getCanonicalTemplateArgument (
392- SubstArgs[MappedIndex++].getArgument ());
393- if (I < SubstitutedOuterMost.size ())
394- SubstitutedOuterMost[I] = Arg;
395- else
396- SubstitutedOuterMost.push_back (Arg);
397- }
401+ // Arg = S.Context.getCanonicalTemplateArgument(
402+ // SubstArgs[MappedIndex++].getArgument());
403+ Arg = S.Context .getCanonicalTemplateArgument (
404+ CTAI.SugaredConverted [MappedIndex++]);
405+ if (I < SubstitutedOuterMost.size ())
406+ SubstitutedOuterMost[I] = Arg;
407+ else
408+ SubstitutedOuterMost.push_back (Arg);
409+ }
398410 MLTAL.replaceOutermostTemplateArguments (
399411 const_cast <NamedDecl *>(Constraint.getConstraintDecl ()),
400412 SubstitutedOuterMost);
@@ -681,7 +693,7 @@ static bool calculateConstraintSatisfaction(
681693 Ok = calculateConstraintSatisfaction (S, Constraint.getRHS (), Template,
682694 TemplateNameLoc, MLTAL, Satisfaction,
683695 PackSubstitutionIndex);
684- if (Ok && Satisfaction.IsSatisfied && !Satisfaction.ContainsErrors )
696+ if (Ok && Satisfaction.IsSatisfied && !Satisfaction.ContainsErrors )
685697 Satisfaction.Details .erase (Satisfaction.Details .begin () + EffectiveDetailEndIndex,
686698 Satisfaction.Details .end ());
687699 return Ok;
@@ -1574,26 +1586,37 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
15741586 /* OnlyDeduced=*/ false ,
15751587 /* Depth=*/ 0 , OccurringIndices);
15761588 } else if (N.getKind () == NormalizedConstraint::ConstraintKind::ConceptId) {
1577- auto Args = static_cast <ConceptIdConstraint &>(N)
1578- .getConceptId ()
1579- ->getTemplateArgsAsWritten ();
1589+ auto * Args = static_cast <ConceptIdConstraint &>(N)
1590+ .getConceptId ()
1591+ ->getTemplateArgsAsWritten ();
15801592 if (Args)
15811593 S.MarkUsedTemplateParameters (Args->arguments (),
15821594 /* Depth=*/ 0 , OccurringIndices);
15831595 }
15841596 TemplateArgumentLoc *TempArgs =
15851597 new (S.Context ) TemplateArgumentLoc[OccurringIndices.count ()];
1598+ llvm::SmallVector<NamedDecl *> UsedParams;
15861599 for (unsigned I = 0 , J = 0 , C = TemplateParams->size (); I != C; ++I) {
15871600 SourceLocation Loc = ArgsAsWritten->NumTemplateArgs > I
15881601 ? ArgsAsWritten->arguments ()[I].getLocation ()
15891602 : SourceLocation ();
1590- if (OccurringIndices[I])
1591- new (&(TempArgs)[J++]) TemplateArgumentLoc (
1592- S.getIdentityTemplateArgumentLoc (TemplateParams->begin ()[I], Loc));
1603+ if (OccurringIndices[I]) {
1604+ NamedDecl *Param = TemplateParams->begin ()[I];
1605+ new (&(TempArgs)[J])
1606+ TemplateArgumentLoc (S.getIdentityTemplateArgumentLoc (Param, Loc));
1607+ UsedParams.push_back (Param);
1608+ J++;
1609+ }
15931610 }
1611+ auto *UsedList = TemplateParameterList::Create (
1612+ S.Context , TemplateParams->getTemplateLoc (),
1613+ TemplateParams->getLAngleLoc (), UsedParams,
1614+ /* RAngleLoc=*/ SourceLocation (),
1615+ /* RequiresClause=*/ nullptr );
15941616 N.updateParameterMapping (OccurringIndices,
15951617 MutableArrayRef<TemplateArgumentLoc>{
1596- TempArgs, OccurringIndices.count ()});
1618+ TempArgs, OccurringIndices.count ()},
1619+ UsedList);
15971620 }
15981621 SourceLocation InstLocBegin =
15991622 ArgsAsWritten->arguments ().empty ()
@@ -1610,15 +1633,39 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
16101633 {InstLocBegin, InstLocEnd});
16111634 if (Inst.isInvalid ())
16121635 return true ;
1613- if (S.SubstTemplateArgumentsInParameterMapping (N.getParameterMapping (), MLTAL,
1614- SubstArgs))
1636+ // TransformTemplateArguments is unable to preserve the source location of a
1637+ // pack. The SourceLocation is necessary for the instantiation location.
1638+ // FIXME: The BaseLoc will be used as the location of the pack expansion,
1639+ // which is wrong.
1640+ if (S.SubstTemplateArgumentsInParameterMapping (
1641+ N.getParameterMapping (), N.getBeginLoc (), MLTAL, SubstArgs))
1642+ return true ;
1643+ Sema::CheckTemplateArgumentInfo CTAI;
1644+ auto *TD =
1645+ const_cast <TemplateDecl *>(cast<TemplateDecl>(N.getConstraintDecl ()));
1646+ if (S.CheckTemplateArgumentList (TD, N.getUsedTemplateParamList (),
1647+ TD->getLocation (), SubstArgs,
1648+ /* DefaultArguments=*/ {},
1649+ /* PartialTemplateArgs=*/ false , CTAI))
16151650 return true ;
16161651 TemplateArgumentLoc *TempArgs =
1617- new (S.Context ) TemplateArgumentLoc[SubstArgs.size ()];
1618- llvm::copy (SubstArgs.arguments (), TempArgs);
1619- N.updateParameterMapping (
1620- N.mappingOccurenceList (),
1621- MutableArrayRef<TemplateArgumentLoc>(TempArgs, SubstArgs.size ()));
1652+ new (S.Context ) TemplateArgumentLoc[CTAI.SugaredConverted .size ()];
1653+ for (unsigned I = 0 ; I < CTAI.SugaredConverted .size (); ++I) {
1654+ SourceLocation Loc;
1655+ // If this is an empty pack, we have no corresponding SubstArgs.
1656+ if (I < SubstArgs.size ())
1657+ Loc = SubstArgs.arguments ()[I].getLocation ();
1658+ TempArgs[I] = S.getTrivialTemplateArgumentLoc (CTAI.SugaredConverted [I],
1659+ QualType (), Loc);
1660+ }
1661+ // llvm::copy(SubstArgs.arguments(), TempArgs);
1662+ // N.updateParameterMapping(
1663+ // N.mappingOccurenceList(),
1664+ // MutableArrayRef<TemplateArgumentLoc>(TempArgs, SubstArgs.size()));
1665+ N.updateParameterMapping (N.mappingOccurenceList (),
1666+ MutableArrayRef<TemplateArgumentLoc>(
1667+ TempArgs, CTAI.SugaredConverted .size ()),
1668+ N.getUsedTemplateParamList ());
16221669 return false ;
16231670}
16241671
@@ -1627,12 +1674,10 @@ substituteParameterMappings(Sema &S, ConceptIdConstraint &N,
16271674 const MultiLevelTemplateArgumentList &MLTAL,
16281675 const ASTTemplateArgumentListInfo *ArgsAsWritten) {
16291676
1630- {
1631- if (N.getConstraintDecl ()) {
1632- substituteParameterMappings (
1633- S, static_cast <NormalizedConstraintWithParamMapping &>(N), MLTAL,
1634- ArgsAsWritten);
1635- }
1677+ if (N.getConstraintDecl ()) {
1678+ substituteParameterMappings (
1679+ S, static_cast <NormalizedConstraintWithParamMapping &>(N), MLTAL,
1680+ ArgsAsWritten);
16361681 }
16371682 return substituteParameterMappings (S, N.getNormalizedConstraint (), MLTAL,
16381683 ArgsAsWritten);
0 commit comments