@@ -527,8 +527,8 @@ static NamedDecl *getTemplateParameterWithDefault(Sema &S, NamedDecl *A,
527
527
R->setDefaultArgument (
528
528
S.Context ,
529
529
S.getTrivialTemplateArgumentLoc (Default, QualType (), SourceLocation ()));
530
- if (T ->hasTypeConstraint ()) {
531
- auto *C = T ->getTypeConstraint ();
530
+ if (R ->hasTypeConstraint ()) {
531
+ auto *C = R ->getTypeConstraint ();
532
532
R->setTypeConstraint (C->getConceptReference (),
533
533
C->getImmediatelyDeclaredConstraint ());
534
534
}
@@ -583,53 +583,37 @@ DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,
583
583
return TemplateDeductionResult::Success;
584
584
585
585
auto NewDeduced = DeducedTemplateArgument (Arg);
586
- // Provisional resolution for CWG2398: If Arg names a template
587
- // specialization, then we deduce a synthesized template template parameter
588
- // based on A, but using the TS's arguments as defaults.
589
- if (DefaultArguments.size () != 0 ) {
586
+ // Provisional resolution for CWG2398: If Arg is also a template template
587
+ // param, and it names a template specialization, then we deduce a
588
+ // synthesized template template parameter based on A, but using the TS's
589
+ // arguments as defaults.
590
+ if (auto *TempArg = dyn_cast_or_null<TemplateTemplateParmDecl>(
591
+ Arg.getAsTemplateDecl ())) {
590
592
assert (Arg.getKind () == TemplateName::Template);
591
- TemplateDecl *TempArg = Arg.getAsTemplateDecl ();
593
+ assert (!TempArg->isExpandedParameterPack ());
594
+
592
595
TemplateParameterList *As = TempArg->getTemplateParameters ();
593
- assert (DefaultArguments.size () <= As->size ());
594
-
595
- SmallVector<NamedDecl *, 4 > Params (As->size ());
596
- for (unsigned I = 0 ; I < DefaultArguments.size (); ++I)
597
- Params[I] = getTemplateParameterWithDefault (S, As->getParam (I),
598
- DefaultArguments[I]);
599
- for (unsigned I = DefaultArguments.size (); I < As->size (); ++I)
600
- Params[I] = As->getParam (I);
601
- // FIXME: We could unique these, and also the parameters, but we don't
602
- // expect programs to contain a large enough amount of these deductions
603
- // for that to be worthwhile.
604
- auto *TPL = TemplateParameterList::Create (
605
- S.Context , SourceLocation (), SourceLocation (), Params,
606
- SourceLocation (), As->getRequiresClause ());
607
-
608
- TemplateDecl *TD;
609
- switch (TempArg->getKind ()) {
610
- case Decl::TemplateTemplateParm: {
611
- auto *A = cast<TemplateTemplateParmDecl>(TempArg);
612
- assert (!A->isExpandedParameterPack ());
613
- TD = TemplateTemplateParmDecl::Create (
614
- S.Context , A->getDeclContext (), SourceLocation (), A->getDepth (),
615
- A->getPosition (), A->isParameterPack (), A->getIdentifier (),
616
- A->wasDeclaredWithTypename (), TPL);
617
- break ;
618
- }
619
- case Decl::ClassTemplate: {
620
- auto *A = cast<ClassTemplateDecl>(TempArg);
621
- auto *CT = ClassTemplateDecl::Create (S.Context , A->getDeclContext (),
622
- SourceLocation (), A->getDeclName (),
623
- TPL, A->getTemplatedDecl ());
624
- CT->setPreviousDecl (A);
625
- TD = CT;
626
- break ;
627
- }
628
- default :
629
- llvm_unreachable (" Unexpected Template Kind" );
596
+ if (DefaultArguments.size () != 0 ) {
597
+ assert (DefaultArguments.size () <= As->size ());
598
+ SmallVector<NamedDecl *, 4 > Params (As->size ());
599
+ for (unsigned I = 0 ; I < DefaultArguments.size (); ++I)
600
+ Params[I] = getTemplateParameterWithDefault (S, As->getParam (I),
601
+ DefaultArguments[I]);
602
+ for (unsigned I = DefaultArguments.size (); I < As->size (); ++I)
603
+ Params[I] = As->getParam (I);
604
+ // FIXME: We could unique these, and also the parameters, but we don't
605
+ // expect programs to contain a large enough amount of these deductions
606
+ // for that to be worthwhile.
607
+ auto *TPL = TemplateParameterList::Create (
608
+ S.Context , SourceLocation (), SourceLocation (), Params,
609
+ SourceLocation (), As->getRequiresClause ());
610
+ NewDeduced = DeducedTemplateArgument (
611
+ TemplateName (TemplateTemplateParmDecl::Create (
612
+ S.Context , TempArg->getDeclContext (), SourceLocation (),
613
+ TempArg->getDepth (), TempArg->getPosition (),
614
+ TempArg->isParameterPack (), TempArg->getIdentifier (),
615
+ TempArg->wasDeclaredWithTypename (), TPL)));
630
616
}
631
- TD->setImplicit (true );
632
- NewDeduced = DeducedTemplateArgument (TemplateName (TD));
633
617
}
634
618
635
619
DeducedTemplateArgument Result = checkDeducedTemplateArguments (S.Context ,
0 commit comments