@@ -479,6 +479,9 @@ struct TemplateParameterListBuilder {
479479 DeclContext *DC = Builder.Record ->getDeclContext ();
480480 TemplateArgumentListInfo TALI (loc, loc);
481481
482+ TemplateTypeParmDecl *ConceptTTPD = dyn_cast<TemplateTypeParmDecl>(
483+ CD->getTemplateParameters ()->getParam (0 ));
484+
482485 clang::TemplateTypeParmDecl *T = clang::TemplateTypeParmDecl::Create (
483486 context, // AST context
484487 context.getTranslationUnitDecl (), // DeclContext
@@ -494,21 +497,31 @@ struct TemplateParameterListBuilder {
494497 T->setDeclContext (DC);
495498 T->setReferenced ();
496499
497- clang::QualType TType = context.getTypeDeclType (T);
500+ clang::QualType TType = context.getTypeDeclType (ConceptTTPD);
501+
502+ TemplateArgument TA = TemplateArgument (TType);
503+
504+ ArrayRef<TemplateArgument> ConvertedArgs = {TA};
498505
499- ArrayRef<TemplateArgument> ConvertedArgs = {TemplateArgument (TType)};
506+ clang::QualType CSETType = context.getTypeDeclType (T);
507+
508+ TemplateArgument CSETA = TemplateArgument (CSETType);
509+
510+ ArrayRef<TemplateArgument> CSEConvertedArgs = {CSETA};
500511
501512 ImplicitConceptSpecializationDecl *IDecl =
502513 ImplicitConceptSpecializationDecl::Create (
503- context, Builder.Record ->getDeclContext (), loc, ConvertedArgs );
514+ context, Builder.Record ->getDeclContext (), loc, CSEConvertedArgs );
504515
505516 const ConstraintSatisfaction CS (CD, ConvertedArgs);
506- TemplateArgumentLoc tal = S. getTrivialTemplateArgumentLoc (
507- TemplateArgument (TType) , QualType (), SourceLocation ());
517+ TemplateArgumentLoc tal =
518+ S. getTrivialTemplateArgumentLoc (TA , QualType (), SourceLocation ());
508519
509520 TALI.addArgument (tal);
510521 const ASTTemplateArgumentListInfo *ATALI =
511522 ASTTemplateArgumentListInfo::Create (context, TALI);
523+
524+ // In CR, ATALI is what adds the extra TemplateArgument node underneath CSE
512525 ConceptReference *CR = ConceptReference::Create (S.getASTContext (), NNS, loc,
513526 DNI, CD, CD, ATALI);
514527
0 commit comments