39
39
#include " clang/Sema/Overload.h"
40
40
#include " clang/Sema/Ownership.h"
41
41
#include " clang/Sema/Scope.h"
42
+ #include " clang/Sema/SemaInternal.h"
42
43
#include " clang/Sema/Template.h"
43
44
#include " clang/Sema/TemplateDeduction.h"
44
45
#include " llvm/ADT/ArrayRef.h"
@@ -241,11 +242,10 @@ NamedDecl *buildDeductionGuide(
241
242
}
242
243
243
244
// Transform a given template type parameter `TTP`.
244
- TemplateTypeParmDecl *
245
- transformTemplateTypeParam (Sema &SemaRef, DeclContext *DC,
246
- TemplateTypeParmDecl *TTP,
247
- MultiLevelTemplateArgumentList &Args,
248
- unsigned NewDepth, unsigned NewIndex) {
245
+ TemplateTypeParmDecl *transformTemplateTypeParam (
246
+ Sema &SemaRef, DeclContext *DC, TemplateTypeParmDecl *TTP,
247
+ MultiLevelTemplateArgumentList &Args, unsigned NewDepth, unsigned NewIndex,
248
+ bool EvaluateConstraint) {
249
249
// TemplateTypeParmDecl's index cannot be changed after creation, so
250
250
// substitute it directly.
251
251
auto *NewTTP = TemplateTypeParmDecl::Create (
@@ -257,7 +257,7 @@ transformTemplateTypeParam(Sema &SemaRef, DeclContext *DC,
257
257
: std::nullopt);
258
258
if (const auto *TC = TTP->getTypeConstraint ())
259
259
SemaRef.SubstTypeConstraint (NewTTP, TC, Args,
260
- /* EvaluateConstraint=*/ true );
260
+ /* EvaluateConstraint=*/ EvaluateConstraint );
261
261
if (TTP->hasDefaultArgument ()) {
262
262
TemplateArgumentLoc InstantiatedDefaultArg;
263
263
if (!SemaRef.SubstTemplateArgument (
@@ -284,6 +284,22 @@ transformTemplateParam(Sema &SemaRef, DeclContext *DC,
284
284
return NewParam;
285
285
}
286
286
287
+ NamedDecl *transformTemplateParameter (Sema &SemaRef, DeclContext *DC,
288
+ NamedDecl *TemplateParam,
289
+ MultiLevelTemplateArgumentList &Args,
290
+ unsigned NewIndex, unsigned NewDepth,
291
+ bool EvaluateConstraint = true ) {
292
+ if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(TemplateParam))
293
+ return transformTemplateTypeParam (
294
+ SemaRef, DC, TTP, Args, NewDepth, NewIndex,
295
+ /* EvaluateConstraint=*/ EvaluateConstraint);
296
+ if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TemplateParam))
297
+ return transformTemplateParam (SemaRef, DC, TTP, Args, NewIndex, NewDepth);
298
+ if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(TemplateParam))
299
+ return transformTemplateParam (SemaRef, DC, NTTP, Args, NewIndex, NewDepth);
300
+ llvm_unreachable (" Unhandled template parameter types" );
301
+ }
302
+
287
303
// / Transform to convert portions of a constructor declaration into the
288
304
// / corresponding deduction guide, per C++1z [over.match.class.deduct]p1.
289
305
struct ConvertConstructorToDeductionGuideTransform {
@@ -358,20 +374,21 @@ struct ConvertConstructorToDeductionGuideTransform {
358
374
Args.addOuterRetainedLevel ();
359
375
if (NestedPattern)
360
376
Args.addOuterRetainedLevels (NestedPattern->getTemplateDepth ());
361
- NamedDecl *NewParam = transformTemplateParameter (Param, Args);
377
+ auto [Depth, Index] = getDepthAndIndex (Param);
378
+ NamedDecl *NewParam = transformTemplateParameter (
379
+ SemaRef, DC, Param, Args, Index + Depth1IndexAdjustment, Depth - 1 );
362
380
if (!NewParam)
363
381
return nullptr ;
364
382
// Constraints require that we substitute depth-1 arguments
365
383
// to match depths when substituted for evaluation later
366
384
Depth1Args.push_back (SemaRef.Context .getInjectedTemplateArg (NewParam));
367
385
368
386
if (NestedPattern) {
369
- TemplateDeclInstantiator Instantiator (SemaRef, DC,
370
- OuterInstantiationArgs);
371
- Instantiator.setEvaluateConstraints (false );
372
- SemaRef.runWithSufficientStackSpace (NewParam->getLocation (), [&] {
373
- NewParam = cast<NamedDecl>(Instantiator.Visit (NewParam));
374
- });
387
+ auto [Depth, Index] = getDepthAndIndex (NewParam);
388
+ NewParam = transformTemplateParameter (
389
+ SemaRef, DC, NewParam, OuterInstantiationArgs, Index,
390
+ Depth - OuterInstantiationArgs.getNumSubstitutedLevels (),
391
+ /* EvaluateConstraint=*/ false );
375
392
}
376
393
377
394
assert (NewParam->getTemplateDepth () == 0 &&
@@ -479,25 +496,6 @@ struct ConvertConstructorToDeductionGuideTransform {
479
496
}
480
497
481
498
private:
482
- // / Transform a constructor template parameter into a deduction guide template
483
- // / parameter, rebuilding any internal references to earlier parameters and
484
- // / renumbering as we go.
485
- NamedDecl *transformTemplateParameter (NamedDecl *TemplateParam,
486
- MultiLevelTemplateArgumentList &Args) {
487
- if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(TemplateParam))
488
- return transformTemplateTypeParam (
489
- SemaRef, DC, TTP, Args, TTP->getDepth () - 1 ,
490
- Depth1IndexAdjustment + TTP->getIndex ());
491
- if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TemplateParam))
492
- return transformTemplateParam (SemaRef, DC, TTP, Args,
493
- Depth1IndexAdjustment + TTP->getIndex (),
494
- TTP->getDepth () - 1 );
495
- auto *NTTP = cast<NonTypeTemplateParmDecl>(TemplateParam);
496
- return transformTemplateParam (SemaRef, DC, NTTP, Args,
497
- Depth1IndexAdjustment + NTTP->getIndex (),
498
- NTTP->getDepth () - 1 );
499
- }
500
-
501
499
QualType transformFunctionProtoType (
502
500
TypeLocBuilder &TLB, FunctionProtoTypeLoc TL,
503
501
SmallVectorImpl<ParmVarDecl *> &Params,
@@ -634,26 +632,6 @@ struct ConvertConstructorToDeductionGuideTransform {
634
632
}
635
633
};
636
634
637
- unsigned getTemplateParameterDepth (NamedDecl *TemplateParam) {
638
- if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(TemplateParam))
639
- return TTP->getDepth ();
640
- if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TemplateParam))
641
- return TTP->getDepth ();
642
- if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(TemplateParam))
643
- return NTTP->getDepth ();
644
- llvm_unreachable (" Unhandled template parameter types" );
645
- }
646
-
647
- unsigned getTemplateParameterIndex (NamedDecl *TemplateParam) {
648
- if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(TemplateParam))
649
- return TTP->getIndex ();
650
- if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TemplateParam))
651
- return TTP->getIndex ();
652
- if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(TemplateParam))
653
- return NTTP->getIndex ();
654
- llvm_unreachable (" Unhandled template parameter types" );
655
- }
656
-
657
635
// Find all template parameters that appear in the given DeducedArgs.
658
636
// Return the indices of the template parameters in the TemplateParams.
659
637
SmallVector<unsigned > TemplateParamsReferencedInTemplateArgumentList (
@@ -689,8 +667,10 @@ SmallVector<unsigned> TemplateParamsReferencedInTemplateArgumentList(
689
667
690
668
void MarkAppeared (NamedDecl *ND) {
691
669
if (llvm::isa<NonTypeTemplateParmDecl, TemplateTypeParmDecl,
692
- TemplateTemplateParmDecl>(ND))
693
- Mark (getTemplateParameterDepth (ND), getTemplateParameterIndex (ND));
670
+ TemplateTemplateParmDecl>(ND)) {
671
+ auto [Depth, Index] = getDepthAndIndex (ND);
672
+ Mark (Depth, Index);
673
+ }
694
674
}
695
675
void Mark (unsigned Depth, unsigned Index) {
696
676
if (Index < TemplateParamList->size () &&
@@ -722,20 +702,6 @@ bool hasDeclaredDeductionGuides(DeclarationName Name, DeclContext *DC) {
722
702
return false ;
723
703
}
724
704
725
- NamedDecl *transformTemplateParameter (Sema &SemaRef, DeclContext *DC,
726
- NamedDecl *TemplateParam,
727
- MultiLevelTemplateArgumentList &Args,
728
- unsigned NewIndex, unsigned NewDepth) {
729
- if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(TemplateParam))
730
- return transformTemplateTypeParam (SemaRef, DC, TTP, Args, NewDepth,
731
- NewIndex);
732
- if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TemplateParam))
733
- return transformTemplateParam (SemaRef, DC, TTP, Args, NewIndex, NewDepth);
734
- if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(TemplateParam))
735
- return transformTemplateParam (SemaRef, DC, NTTP, Args, NewIndex, NewDepth);
736
- llvm_unreachable (" Unhandled template parameter types" );
737
- }
738
-
739
705
// Build the associated constraints for the alias deduction guides.
740
706
// C++ [over.match.class.deduct]p3.3:
741
707
// The associated constraints ([temp.constr.decl]) are the conjunction of the
@@ -791,7 +757,7 @@ buildAssociatedConstraints(Sema &SemaRef, FunctionTemplateDecl *F,
791
757
NamedDecl *NewParam = transformTemplateParameter (
792
758
SemaRef, AliasTemplate->getDeclContext (), TP, Args,
793
759
/* NewIndex=*/ AdjustedAliasTemplateArgs.size (),
794
- getTemplateParameterDepth (TP) + AdjustDepth);
760
+ getDepthAndIndex (TP). first + AdjustDepth);
795
761
796
762
TemplateArgument NewTemplateArgument =
797
763
Context.getInjectedTemplateArg (NewParam);
@@ -814,10 +780,10 @@ buildAssociatedConstraints(Sema &SemaRef, FunctionTemplateDecl *F,
814
780
Args.setKind (TemplateSubstitutionKind::Rewrite);
815
781
Args.addOuterTemplateArguments (TemplateArgsForBuildingRC);
816
782
// Rebuild the template parameter with updated depth and index.
817
- NamedDecl *NewParam = transformTemplateParameter (
818
- SemaRef, F->getDeclContext (), TP, Args,
819
- /* NewIndex=*/ FirstUndeducedParamIdx,
820
- getTemplateParameterDepth (TP) + AdjustDepth);
783
+ NamedDecl *NewParam =
784
+ transformTemplateParameter ( SemaRef, F->getDeclContext (), TP, Args,
785
+ /* NewIndex=*/ FirstUndeducedParamIdx,
786
+ getDepthAndIndex (TP). first + AdjustDepth);
821
787
FirstUndeducedParamIdx += 1 ;
822
788
assert (TemplateArgsForBuildingRC[Index].isNull ());
823
789
TemplateArgsForBuildingRC[Index] =
@@ -919,7 +885,7 @@ Expr *buildIsDeducibleConstraint(Sema &SemaRef,
919
885
NamedDecl *NewParam = transformTemplateParameter (
920
886
SemaRef, AliasTemplate->getDeclContext (), TP, Args,
921
887
/* NewIndex=*/ TransformedTemplateArgs.size (),
922
- getTemplateParameterDepth (TP) + AdjustDepth);
888
+ getDepthAndIndex (TP). first + AdjustDepth);
923
889
924
890
TemplateArgument NewTemplateArgument =
925
891
Context.getInjectedTemplateArg (NewParam);
@@ -1081,8 +1047,7 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef,
1081
1047
Args.addOuterTemplateArguments (TransformedDeducedAliasArgs);
1082
1048
NamedDecl *NewParam = transformTemplateParameter (
1083
1049
SemaRef, AliasTemplate->getDeclContext (), TP, Args,
1084
- /* NewIndex=*/ FPrimeTemplateParams.size (),
1085
- getTemplateParameterDepth (TP));
1050
+ /* NewIndex=*/ FPrimeTemplateParams.size (), getDepthAndIndex (TP).first );
1086
1051
FPrimeTemplateParams.push_back (NewParam);
1087
1052
1088
1053
TemplateArgument NewTemplateArgument =
@@ -1101,7 +1066,7 @@ BuildDeductionGuideForTypeAlias(Sema &SemaRef,
1101
1066
Args.addOuterTemplateArguments (TemplateArgsForBuildingFPrime);
1102
1067
NamedDecl *NewParam = transformTemplateParameter (
1103
1068
SemaRef, F->getDeclContext (), TP, Args, FPrimeTemplateParams.size (),
1104
- getTemplateParameterDepth (TP));
1069
+ getDepthAndIndex (TP). first );
1105
1070
FPrimeTemplateParams.push_back (NewParam);
1106
1071
1107
1072
assert (TemplateArgsForBuildingFPrime[FTemplateParamIdx].isNull () &&
0 commit comments