@@ -1653,33 +1653,12 @@ Decl *TemplateDeclInstantiator::VisitClassTemplateDecl(ClassTemplateDecl *D) {
1653
1653
<< QualifierLoc.getSourceRange();
1654
1654
return nullptr;
1655
1655
}
1656
-
1657
- if (PrevClassTemplate) {
1658
- const ClassTemplateDecl *MostRecentPrevCT =
1659
- PrevClassTemplate->getMostRecentDecl ();
1660
- TemplateParameterList *PrevParams =
1661
- MostRecentPrevCT->getTemplateParameters ();
1662
-
1663
- // Make sure the parameter lists match.
1664
- if (!SemaRef.TemplateParameterListsAreEqual (
1665
- D->getTemplatedDecl (), InstParams,
1666
- MostRecentPrevCT->getTemplatedDecl (), PrevParams, true ,
1667
- Sema::TPL_TemplateMatch))
1668
- return nullptr ;
1669
-
1670
- // Do some additional validation, then merge default arguments
1671
- // from the existing declarations.
1672
- if (SemaRef.CheckTemplateParameterList (InstParams, PrevParams,
1673
- Sema::TPC_ClassTemplate))
1674
- return nullptr ;
1675
- }
1676
1656
}
1677
1657
1678
1658
CXXRecordDecl *RecordInst = CXXRecordDecl::Create(
1679
1659
SemaRef.Context, Pattern->getTagKind(), DC, Pattern->getBeginLoc(),
1680
1660
Pattern->getLocation(), Pattern->getIdentifier(), PrevDecl,
1681
1661
/*DelayTypeCreation=*/true);
1682
-
1683
1662
if (QualifierLoc)
1684
1663
RecordInst->setQualifierInfo(QualifierLoc);
1685
1664
@@ -1689,16 +1668,37 @@ Decl *TemplateDeclInstantiator::VisitClassTemplateDecl(ClassTemplateDecl *D) {
1689
1668
ClassTemplateDecl *Inst
1690
1669
= ClassTemplateDecl::Create(SemaRef.Context, DC, D->getLocation(),
1691
1670
D->getIdentifier(), InstParams, RecordInst);
1692
- assert (!(isFriend && Owner->isDependentContext ()));
1693
- Inst->setPreviousDecl (PrevClassTemplate);
1694
-
1695
1671
RecordInst->setDescribedClassTemplate(Inst);
1696
1672
1697
1673
if (isFriend) {
1698
- if (PrevClassTemplate)
1674
+ assert(!Owner->isDependentContext());
1675
+ Inst->setLexicalDeclContext(Owner);
1676
+ RecordInst->setLexicalDeclContext(Owner);
1677
+
1678
+ if (PrevClassTemplate) {
1679
+ RecordInst->setTypeForDecl(
1680
+ PrevClassTemplate->getTemplatedDecl()->getTypeForDecl());
1681
+ const ClassTemplateDecl *MostRecentPrevCT =
1682
+ PrevClassTemplate->getMostRecentDecl();
1683
+ TemplateParameterList *PrevParams =
1684
+ MostRecentPrevCT->getTemplateParameters();
1685
+
1686
+ // Make sure the parameter lists match.
1687
+ if (!SemaRef.TemplateParameterListsAreEqual(
1688
+ RecordInst, InstParams, MostRecentPrevCT->getTemplatedDecl(),
1689
+ PrevParams, true, Sema::TPL_TemplateMatch))
1690
+ return nullptr;
1691
+
1692
+ // Do some additional validation, then merge default arguments
1693
+ // from the existing declarations.
1694
+ if (SemaRef.CheckTemplateParameterList(InstParams, PrevParams,
1695
+ Sema::TPC_ClassTemplate))
1696
+ return nullptr;
1697
+
1699
1698
Inst->setAccess(PrevClassTemplate->getAccess());
1700
- else
1699
+ } else {
1701
1700
Inst->setAccess(D->getAccess());
1701
+ }
1702
1702
1703
1703
Inst->setObjectOfFriendDecl();
1704
1704
// TODO: do we want to track the instantiation progeny of this
@@ -1709,15 +1709,15 @@ Decl *TemplateDeclInstantiator::VisitClassTemplateDecl(ClassTemplateDecl *D) {
1709
1709
Inst->setInstantiatedFromMemberTemplate(D);
1710
1710
}
1711
1711
1712
+ Inst->setPreviousDecl(PrevClassTemplate);
1713
+
1712
1714
// Trigger creation of the type for the instantiation.
1713
- SemaRef.Context .getInjectedClassNameType (RecordInst,
1714
- Inst->getInjectedClassNameSpecialization ());
1715
+ SemaRef.Context.getInjectedClassNameType(
1716
+ RecordInst, Inst->getInjectedClassNameSpecialization());
1715
1717
1716
1718
// Finish handling of friends.
1717
1719
if (isFriend) {
1718
1720
DC->makeDeclVisibleInContext(Inst);
1719
- Inst->setLexicalDeclContext (Owner);
1720
- RecordInst->setLexicalDeclContext (Owner);
1721
1721
return Inst;
1722
1722
}
1723
1723
0 commit comments