[cfe-commits] r170928 - in /cfe/trunk: lib/AST/DeclPrinter.cpp test/Index/comment-cplus-decls.cpp

Fariborz Jahanian fjahanian at apple.com
Fri Dec 21 13:43:05 PST 2012


Author: fjahanian
Date: Fri Dec 21 15:43:05 2012
New Revision: 170928

URL: http://llvm.org/viewvc/llvm-project?rev=170928&view=rev
Log:
Fixes couple of friend declaration -ast-print bug
found by running -ast-print on all-std-headers.cpp
which caused it to go into infinite loop. Now
-ast-print prints all declarations found in 
all-std-headers.cpp.

Modified:
    cfe/trunk/lib/AST/DeclPrinter.cpp
    cfe/trunk/test/Index/comment-cplus-decls.cpp

Modified: cfe/trunk/lib/AST/DeclPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclPrinter.cpp?rev=170928&r1=170927&r2=170928&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclPrinter.cpp (original)
+++ cfe/trunk/lib/AST/DeclPrinter.cpp Fri Dec 21 15:43:05 2012
@@ -580,10 +580,8 @@
 
 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())) {
@@ -598,7 +596,7 @@
   else if (ClassTemplateDecl *CTD =
            dyn_cast<ClassTemplateDecl>(D->getFriendDecl())) {
     Out << "friend ";
-    VisitClassTemplateDecl(CTD);
+    VisitRedeclarableTemplateDecl(CTD);
   }
 }
 

Modified: cfe/trunk/test/Index/comment-cplus-decls.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/comment-cplus-decls.cpp?rev=170928&r1=170927&r2=170928&view=diff
==============================================================================
--- cfe/trunk/test/Index/comment-cplus-decls.cpp (original)
+++ cfe/trunk/test/Index/comment-cplus-decls.cpp Fri Dec 21 15:43:05 2012
@@ -77,7 +77,7 @@
   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>
@@ -144,3 +144,28 @@
 }
 // 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_;
+};





More information about the cfe-commits mailing list