@@ -353,8 +353,6 @@ SubstitutionInTemplateArguments(
353353 const NamedDecl *Template, MultiLevelTemplateArgumentList MLTAL,
354354 llvm::SmallVector<TemplateArgument> &SubstitutedOuterMost) {
355355
356- Sema::SFINAETrap Trap (S);
357-
358356 Sema::InstantiatingTemplate Inst (
359357 S, Constraint.getBeginLoc (),
360358 Sema::InstantiatingTemplate::ParameterMappingSubstitution{},
@@ -363,6 +361,8 @@ SubstitutionInTemplateArguments(
363361 if (Inst.isInvalid ())
364362 return std::nullopt ;
365363
364+ Sema::SFINAETrap Trap (S);
365+
366366 // TODO substitute at the appropriate depth
367367 // Template->getTemplateDepth();
368368
@@ -539,7 +539,6 @@ static bool calculateConstraintSatisfaction(
539539 return true ;
540540 }
541541
542- // bool HasAnyFailed = false;
543542 for (unsigned I = 0 ; I < *NumExpansions; I++) {
544543 Sema::ArgPackSubstIndexRAII SubstIndex (S, I);
545544 Satisfaction.IsSatisfied = false ;
@@ -591,18 +590,19 @@ static bool calculateConstraintSatisfaction(
591590 const ASTTemplateArgumentListInfo *Ori =
592591 Constraint.getConceptId ()->getTemplateArgsAsWritten ();
593592 TemplateArgumentListInfo OutArgs (Ori->LAngleLoc , Ori->RAngleLoc );
594- if (Template && Template->getTemplateDepth () > 0 ) {
595- TemplateArgumentListInfo TransArgs (Ori->LAngleLoc , Ori->RAngleLoc );
596- AdjustConstraintDepth Adjust (S, Template->getTemplateDepth () - 1 );
597- if (Adjust.TransformTemplateArguments (Ori->getTemplateArgs (),
598- Ori->NumTemplateArgs , TransArgs))
599- return Ok;
600- if (S.SubstTemplateArguments (TransArgs.arguments (), MLTAL, OutArgs))
601- return Ok;
602- } else {
603- if (S.SubstTemplateArguments (Ori->arguments (), MLTAL, OutArgs))
604- return Ok;
605- }
593+
594+ TemplateArgumentListInfo TransArgs (Ori->LAngleLoc , Ori->RAngleLoc );
595+ unsigned Depth = Template && Template->getTemplateDepth ()
596+ ? Template->getTemplateDepth () - 1
597+ : 0 ;
598+ AdjustConstraintDepth Adjust (S, Depth);
599+ if (Adjust.TransformTemplateArguments (Ori->getTemplateArgs (),
600+ Ori->NumTemplateArgs , TransArgs))
601+ return Ok;
602+
603+ if (S.SubstTemplateArguments (TransArgs.arguments (), MLTAL, OutArgs) ||
604+ Trap.hasErrorOccurred ())
605+ return Ok;
606606
607607 CXXScopeSpec SS;
608608 SS.Adopt (Constraint.getConceptId ()->getNestedNameSpecifierLoc ());
@@ -1563,22 +1563,14 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
15631563 }
15641564 TemplateArgumentLoc *TempArgs =
15651565 new (S.Context ) TemplateArgumentLoc[OccurringIndices.count ()];
1566- for (unsigned I = 0 , J = 0 , C = TemplateParams->size (); I != C; ++I)
1566+ for (unsigned I = 0 , J = 0 , C = TemplateParams->size (); I != C; ++I) {
1567+ SourceLocation Loc = ArgsAsWritten->NumTemplateArgs > I
1568+ ? ArgsAsWritten->arguments ()[I].getLocation ()
1569+ : SourceLocation ();
15671570 if (OccurringIndices[I])
1568- new (&(TempArgs)[J++])
1569- TemplateArgumentLoc (S.getIdentityTemplateArgumentLoc (
1570- TemplateParams->begin ()[I],
1571- // Here we assume we do not support things like
1572- // template<typename A, typename B>
1573- // concept C = ...;
1574- //
1575- // template<typename... Ts> requires C<Ts...>
1576- // struct S { };
1577- // The above currently yields a diagnostic.
1578- // We still might have default arguments for concept parameters.
1579- ArgsAsWritten->NumTemplateArgs > I
1580- ? ArgsAsWritten->arguments ()[I].getLocation ()
1581- : SourceLocation ()));
1571+ new (&(TempArgs)[J++]) TemplateArgumentLoc (
1572+ S.getIdentityTemplateArgumentLoc (TemplateParams->begin ()[I], Loc));
1573+ }
15821574 N.updateParameterMapping (OccurringIndices,
15831575 MutableArrayRef<TemplateArgumentLoc>{
15841576 TempArgs, OccurringIndices.count ()});
0 commit comments