@@ -527,8 +527,8 @@ static NamedDecl *getTemplateParameterWithDefault(Sema &S, NamedDecl *A,
527527 R->setDefaultArgument (
528528 S.Context ,
529529 S.getTrivialTemplateArgumentLoc (Default, QualType (), SourceLocation ()));
530- if (T ->hasTypeConstraint ()) {
531- auto *C = T ->getTypeConstraint ();
530+ if (R ->hasTypeConstraint ()) {
531+ auto *C = R ->getTypeConstraint ();
532532 R->setTypeConstraint (C->getConceptReference (),
533533 C->getImmediatelyDeclaredConstraint ());
534534 }
@@ -583,53 +583,37 @@ DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,
583583 return TemplateDeductionResult::Success;
584584
585585 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 ())) {
590592 assert (Arg.getKind () == TemplateName::Template);
591- TemplateDecl *TempArg = Arg.getAsTemplateDecl ();
593+ assert (!TempArg->isExpandedParameterPack ());
594+
592595 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)));
630616 }
631- TD->setImplicit (true );
632- NewDeduced = DeducedTemplateArgument (TemplateName (TD));
633617 }
634618
635619 DeducedTemplateArgument Result = checkDeducedTemplateArguments (S.Context ,
0 commit comments