1*67e74705SXin Li // RUN: rm -rf %t 2*67e74705SXin Li // RUN: mkdir %t 3*67e74705SXin Li // RUN: c-index-test -test-load-source all -comments-xml-schema=%S/../../bindings/xml/comment-xml-schema.rng -target x86_64-apple-darwin10 %s > %t/out 4*67e74705SXin Li // RUN: FileCheck %s < %t/out 5*67e74705SXin Li 6*67e74705SXin Li // Ensure that XML we generate is not invalid. 7*67e74705SXin Li // RUN: FileCheck %s -check-prefix=WRONG < %t/out 8*67e74705SXin Li // WRONG-NOT: CommentXMLInvalid 9*67e74705SXin Li // rdar://12378714 10*67e74705SXin Li 11*67e74705SXin Li /** 12*67e74705SXin Li * \brief plain c++ class 13*67e74705SXin Li */ 14*67e74705SXin Li class Test 15*67e74705SXin Li { 16*67e74705SXin Li public: 17*67e74705SXin Li /** 18*67e74705SXin Li * \brief plain c++ constructor 19*67e74705SXin Li */ Test()20*67e74705SXin Li Test () : reserved (new data()) {} 21*67e74705SXin Li 22*67e74705SXin Li /** 23*67e74705SXin Li * \brief plain c++ member function 24*67e74705SXin Li */ getID() const25*67e74705SXin Li unsigned getID() const 26*67e74705SXin Li { 27*67e74705SXin Li return reserved->objectID; 28*67e74705SXin Li } 29*67e74705SXin Li /** 30*67e74705SXin Li * \brief plain c++ destructor 31*67e74705SXin Li */ ~Test()32*67e74705SXin Li ~Test () {} 33*67e74705SXin Li protected: 34*67e74705SXin Li struct data { 35*67e74705SXin Li unsigned objectID; 36*67e74705SXin Li }; 37*67e74705SXin Li /** 38*67e74705SXin Li * \brief plain c++ data field 39*67e74705SXin Li */ 40*67e74705SXin Li data* reserved; 41*67e74705SXin Li }; 42*67e74705SXin Li // CHECK: <Declaration>class Test {}</Declaration> 43*67e74705SXin Li // CHECK: <Declaration>Test() : reserved(new Test::data())</Declaration> 44*67e74705SXin Li // CHECK: <Declaration>unsigned int getID() const</Declaration> 45*67e74705SXin Li // CHECK: <Declaration>~Test()</Declaration> 46*67e74705SXin Li // CHECK: <Declaration>Test::data *reserved</Declaration> 47*67e74705SXin Li 48*67e74705SXin Li 49*67e74705SXin Li class S { 50*67e74705SXin Li /** 51*67e74705SXin Li * \brief Aaa 52*67e74705SXin Li */ 53*67e74705SXin Li friend class Test; 54*67e74705SXin Li /** 55*67e74705SXin Li * \brief Bbb 56*67e74705SXin Li */ foo()57*67e74705SXin Li friend void foo() {} 58*67e74705SXin Li 59*67e74705SXin Li /** 60*67e74705SXin Li * \brief Ccc 61*67e74705SXin Li */ 62*67e74705SXin Li friend int int_func(); 63*67e74705SXin Li 64*67e74705SXin Li /** 65*67e74705SXin Li * \brief Ddd 66*67e74705SXin Li */ 67*67e74705SXin Li friend bool operator==(const Test &, const Test &); 68*67e74705SXin Li 69*67e74705SXin Li /** 70*67e74705SXin Li * \brief Eee 71*67e74705SXin Li */ 72*67e74705SXin Li template <typename T> friend void TemplateFriend(); 73*67e74705SXin Li 74*67e74705SXin Li /** 75*67e74705SXin Li * \brief Eee 76*67e74705SXin Li */ 77*67e74705SXin Li template <typename T> friend class TemplateFriendClass; 78*67e74705SXin Li 79*67e74705SXin Li }; 80*67e74705SXin Li // CHECK: <Declaration>friend class Test</Declaration> 81*67e74705SXin Li // CHECK: <Declaration>friend void foo()</Declaration> 82*67e74705SXin Li // CHECK: <Declaration>friend int int_func()</Declaration> 83*67e74705SXin Li // CHECK: <Declaration>friend bool operator==(const Test &, const Test &)</Declaration> 84*67e74705SXin Li // CHECK: <Declaration>friend template <typename T> void TemplateFriend()</Declaration> 85*67e74705SXin Li // CHECK: <Declaration>friend template <typename T> class TemplateFriendClass</Declaration> 86*67e74705SXin Li 87*67e74705SXin Li namespace test0 { 88*67e74705SXin Li namespace ns { 89*67e74705SXin Li void f(int); 90*67e74705SXin Li } 91*67e74705SXin Li 92*67e74705SXin Li struct A { 93*67e74705SXin Li /** 94*67e74705SXin Li * \brief Fff 95*67e74705SXin Li */ 96*67e74705SXin Li friend void ns::f(int a); 97*67e74705SXin Li }; 98*67e74705SXin Li } 99*67e74705SXin Li // CHECK: <Declaration>friend void f(int a)</Declaration> 100*67e74705SXin Li 101*67e74705SXin Li namespace test1 { 102*67e74705SXin Li template <class T> struct Outer { 103*67e74705SXin Li void foo(T); 104*67e74705SXin Li struct Inner { 105*67e74705SXin Li /** 106*67e74705SXin Li * \brief Ggg 107*67e74705SXin Li */ 108*67e74705SXin Li friend void Outer::foo(T); 109*67e74705SXin Li }; 110*67e74705SXin Li }; 111*67e74705SXin Li } 112*67e74705SXin Li // CHECK: <Declaration>friend void foo(T)</Declaration> 113*67e74705SXin Li 114*67e74705SXin Li namespace test2 { 115*67e74705SXin Li namespace foo { 116*67e74705SXin Li void Func(int x); 117*67e74705SXin Li } 118*67e74705SXin Li 119*67e74705SXin Li class Bar { 120*67e74705SXin Li /** 121*67e74705SXin Li * \brief Hhh 122*67e74705SXin Li */ 123*67e74705SXin Li friend void ::test2::foo::Func(int x); 124*67e74705SXin Li }; 125*67e74705SXin Li } 126*67e74705SXin Li // CHECK: <Declaration>friend void Func(int x)</Declaration> 127*67e74705SXin Li 128*67e74705SXin Li namespace test3 { 129*67e74705SXin Li template<class T> class vector { 130*67e74705SXin Li public: vector(int i)131*67e74705SXin Li vector(int i) {} 132*67e74705SXin Li /** 133*67e74705SXin Li * \brief Iii 134*67e74705SXin Li */ f(const T & t=T ())135*67e74705SXin Li void f(const T& t = T()) {} 136*67e74705SXin Li }; 137*67e74705SXin Li class A { 138*67e74705SXin Li private: 139*67e74705SXin Li /** 140*67e74705SXin Li * \brief Jjj 141*67e74705SXin Li */ 142*67e74705SXin Li friend void vector<A>::f(const A&); 143*67e74705SXin Li }; 144*67e74705SXin Li } 145*67e74705SXin Li // CHECK: <Declaration>void f(const T &t = T())</Declaration> 146*67e74705SXin Li // CHECK: <Declaration>friend void f(const test3::A &)</Declaration> 147*67e74705SXin Li 148*67e74705SXin Li class MyClass 149*67e74705SXin Li { 150*67e74705SXin Li /** 151*67e74705SXin Li * \brief plain friend test. 152*67e74705SXin Li */ 153*67e74705SXin Li friend class MyClass; 154*67e74705SXin Li }; 155*67e74705SXin Li // CHECK: <Declaration>friend class MyClass</Declaration> 156*67e74705SXin Li 157*67e74705SXin Li template<class _Tp> class valarray 158*67e74705SXin Li { 159*67e74705SXin Li private: 160*67e74705SXin Li /** 161*67e74705SXin Li * \brief template friend test. 162*67e74705SXin Li */ 163*67e74705SXin Li template <class T> friend class valarray; 164*67e74705SXin Li }; 165*67e74705SXin Li // CHECK: <Declaration>template <class T> class valarray</Declaration> 166*67e74705SXin Li // CHECK: <Declaration>friend template <class T> class valarray</Declaration> 167*67e74705SXin Li 168*67e74705SXin Li class gslice 169*67e74705SXin Li { 170*67e74705SXin Li valarray<unsigned> __size_; 171*67e74705SXin Li }; 172