@@ -353,8 +353,6 @@ SubstitutionInTemplateArguments(
353
353
const NamedDecl *Template, MultiLevelTemplateArgumentList MLTAL,
354
354
llvm::SmallVector<TemplateArgument> &SubstitutedOuterMost) {
355
355
356
- Sema::SFINAETrap Trap (S);
357
-
358
356
Sema::InstantiatingTemplate Inst (
359
357
S, Constraint.getBeginLoc (),
360
358
Sema::InstantiatingTemplate::ParameterMappingSubstitution{},
@@ -363,6 +361,8 @@ SubstitutionInTemplateArguments(
363
361
if (Inst.isInvalid ())
364
362
return std::nullopt ;
365
363
364
+ Sema::SFINAETrap Trap (S);
365
+
366
366
// TODO substitute at the appropriate depth
367
367
// Template->getTemplateDepth();
368
368
@@ -539,7 +539,6 @@ static bool calculateConstraintSatisfaction(
539
539
return true ;
540
540
}
541
541
542
- // bool HasAnyFailed = false;
543
542
for (unsigned I = 0 ; I < *NumExpansions; I++) {
544
543
Sema::ArgPackSubstIndexRAII SubstIndex (S, I);
545
544
Satisfaction.IsSatisfied = false ;
@@ -591,18 +590,19 @@ static bool calculateConstraintSatisfaction(
591
590
const ASTTemplateArgumentListInfo *Ori =
592
591
Constraint.getConceptId ()->getTemplateArgsAsWritten ();
593
592
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;
606
606
607
607
CXXScopeSpec SS;
608
608
SS.Adopt (Constraint.getConceptId ()->getNestedNameSpecifierLoc ());
@@ -1563,22 +1563,14 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
1563
1563
}
1564
1564
TemplateArgumentLoc *TempArgs =
1565
1565
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 ();
1567
1570
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
+ }
1582
1574
N.updateParameterMapping (OccurringIndices,
1583
1575
MutableArrayRef<TemplateArgumentLoc>{
1584
1576
TempArgs, OccurringIndices.count ()});
0 commit comments