forked from OSchip/llvm-project
Instantiate class template friends better; fixes PR5332.
llvm-svn: 85612
This commit is contained in:
parent
dc916f11b5
commit
412e8bc56d
|
@ -425,12 +425,19 @@ Decl *TemplateDeclInstantiator::VisitClassTemplateDecl(ClassTemplateDecl *D) {
|
||||||
= ClassTemplateDecl::Create(SemaRef.Context, Owner, D->getLocation(),
|
= ClassTemplateDecl::Create(SemaRef.Context, Owner, D->getLocation(),
|
||||||
D->getIdentifier(), InstParams, RecordInst, 0);
|
D->getIdentifier(), InstParams, RecordInst, 0);
|
||||||
RecordInst->setDescribedClassTemplate(Inst);
|
RecordInst->setDescribedClassTemplate(Inst);
|
||||||
Inst->setAccess(D->getAccess());
|
if (D->getFriendObjectKind())
|
||||||
|
Inst->setObjectOfFriendDecl(true);
|
||||||
|
else
|
||||||
|
Inst->setAccess(D->getAccess());
|
||||||
Inst->setInstantiatedFromMemberTemplate(D);
|
Inst->setInstantiatedFromMemberTemplate(D);
|
||||||
|
|
||||||
// Trigger creation of the type for the instantiation.
|
// Trigger creation of the type for the instantiation.
|
||||||
SemaRef.Context.getTypeDeclType(RecordInst);
|
SemaRef.Context.getTypeDeclType(RecordInst);
|
||||||
|
|
||||||
|
// We're done with friends now.
|
||||||
|
if (Inst->getFriendObjectKind())
|
||||||
|
return Inst;
|
||||||
|
|
||||||
Owner->addDecl(Inst);
|
Owner->addDecl(Inst);
|
||||||
|
|
||||||
// First, we sort the partial specializations by location, so
|
// First, we sort the partial specializations by location, so
|
||||||
|
|
|
@ -9,3 +9,5 @@ class B {
|
||||||
template <class T> friend class A<T>::Member;
|
template <class T> friend class A<T>::Member;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
A<int> a;
|
||||||
|
B b;
|
||||||
|
|
|
@ -54,6 +54,7 @@ struct X1 {
|
||||||
template<typename U> void f2(U);
|
template<typename U> void f2(U);
|
||||||
|
|
||||||
X1<int> x1i;
|
X1<int> x1i;
|
||||||
|
X0<int*> x0ip;
|
||||||
|
|
||||||
template<> void f2(int);
|
template<> void f2(int);
|
||||||
|
|
||||||
|
@ -62,3 +63,12 @@ template<> void f2(int);
|
||||||
template<typename U> void f3(U);
|
template<typename U> void f3(U);
|
||||||
|
|
||||||
template<> void f3(int);
|
template<> void f3(int);
|
||||||
|
|
||||||
|
// PR5332
|
||||||
|
template <typename T>
|
||||||
|
class Foo {
|
||||||
|
template <typename U>
|
||||||
|
friend class Foo;
|
||||||
|
};
|
||||||
|
|
||||||
|
Foo<int> foo;
|
||||||
|
|
Loading…
Reference in New Issue