void DeclPrinter::VisitFriendDecl(FriendDecl *D) {
if (TypeSourceInfo *TSI = D->getFriendType()) {
- if (CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl()) {
- Out << "friend ";
- VisitCXXRecordDecl(FriendD);
- }
+ Out << "friend ";
+ Out << " " << TSI->getType().getAsString(Policy);
}
else if (FunctionDecl *FD =
dyn_cast<FunctionDecl>(D->getFriendDecl())) {
else if (ClassTemplateDecl *CTD =
dyn_cast<ClassTemplateDecl>(D->getFriendDecl())) {
Out << "friend ";
- VisitClassTemplateDecl(CTD);
+ VisitRedeclarableTemplateDecl(CTD);
}
}
template <typename T> friend class TemplateFriendClass;
};
-// CHECK: <Declaration>friend class Test {\n}</Declaration>
+// CHECK: <Declaration>friend class Test</Declaration>
// CHECK: <Declaration>friend void foo()</Declaration>
// CHECK: <Declaration>friend int int_func()</Declaration>
// CHECK: <Declaration>friend bool operator==(const Test &, const Test &)</Declaration>
}
// CHECK: <Declaration>void f(const T &t = T())</Declaration>
// CHECK: <Declaration>friend void f(const test3::A &)</Declaration>
+
+class MyClass
+{
+/**
+ * \brief plain friend test.
+*/
+ friend class MyClass;
+};
+// CHECK: <Declaration>friend class MyClass</Declaration>
+
+template<class _Tp> class valarray
+{
+private:
+/**
+ * \brief template friend test.
+*/
+ template <class T> friend class valarray;
+};
+// CHECK: <Declaration>template <class T = unsigned int> class valarray {\n}\ntemplate <class T> class valarray</Declaration>
+// CHECK: <Declaration>friend template <class T> class valarray</Declaration>
+
+class gslice
+{
+ valarray<unsigned> __size_;
+};