18920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// RUN: rm -rf %t 28920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// RUN: mkdir %t 38920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// 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 48920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// RUN: FileCheck %s < %t/out 58920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 68920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// Ensure that XML we generate is not invalid. 78920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// RUN: FileCheck %s -check-prefix=WRONG < %t/out 88920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// WRONG-NOT: CommentXMLInvalid 98920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// rdar://12378714 108920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 118920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 128920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief plain c++ class 138920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 148920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanianclass Test 158920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian{ 168920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanianpublic: 178920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 188920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief plain c++ constructor 198920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 208920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian Test () : reserved (new data()) {} 218920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 228920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 238920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief plain c++ member function 248920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 258920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian unsigned getID() const 268920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian { 278920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian return reserved->objectID; 288920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian } 298920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 308920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief plain c++ destructor 318920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 328920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian ~Test () {} 338920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanianprotected: 348920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian struct data { 358920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian unsigned objectID; 368920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian }; 378920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 388920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief plain c++ data field 398920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 408920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian data* reserved; 418920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian}; 4236fab8d70eee342d66e03c9b09c029f126196103Manuel Klimek// CHECK: <Declaration>class Test {}</Declaration> 438920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>Test() : reserved(new Test::data())</Declaration> 448920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>unsigned int getID() const</Declaration> 458920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>void ~Test()</Declaration> 468920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>Test::data *reserved</Declaration> 478920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 488920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 498920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanianclass S { 508920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 518920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Aaa 528920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 538920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian friend class Test; 548920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 558920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Bbb 568920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 578920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian friend void foo() {} 588920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 598920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 608920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Ccc 618920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 628920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian friend int int_func(); 638920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 648920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 658920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Ddd 668920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 678920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian friend bool operator==(const Test &, const Test &); 688920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 698920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 708920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Eee 718920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 728920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahaniantemplate <typename T> friend void TemplateFriend(); 738920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 748920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 758920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Eee 768920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 778920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian template <typename T> friend class TemplateFriendClass; 788920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 798920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian}; 80d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian// CHECK: <Declaration>friend class Test</Declaration> 818920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend void foo()</Declaration> 828920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend int int_func()</Declaration> 838920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend bool operator==(const Test &, const Test &)</Declaration> 848920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend template <typename T> void TemplateFriend()</Declaration> 858920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend template <typename T> class TemplateFriendClass</Declaration> 868920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 878920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahaniannamespace test0 { 888920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian namespace ns { 898920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian void f(int); 908920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian } 918920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 928920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian struct A { 938920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 948920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Fff 958920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 968920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian friend void ns::f(int a); 978920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian }; 988920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian} 998920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend void f(int a)</Declaration> 1008920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 1018920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahaniannamespace test1 { 1028920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian template <class T> struct Outer { 1038920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian void foo(T); 1048920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian struct Inner { 1058920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 1068920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Ggg 1078920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 1088920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian friend void Outer::foo(T); 1098920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian }; 1108920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian }; 1118920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian} 1128920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend void foo(T)</Declaration> 1138920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 1148920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahaniannamespace test2 { 1158920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian namespace foo { 1168920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian void Func(int x); 1178920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian } 1188920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 1198920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian class Bar { 1208920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 1218920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Hhh 1228920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 1238920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian friend void ::test2::foo::Func(int x); 1248920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian }; 1258920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian} 1268920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend void Func(int x)</Declaration> 1278920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian 1288920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahaniannamespace test3 { 1298920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian template<class T> class vector { 1308920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian public: 1318920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian vector(int i) {} 1328920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 1338920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Iii 1348920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 1358920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian void f(const T& t = T()) {} 1368920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian }; 1378920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian class A { 1388920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian private: 1398920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian/** 1408920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian * \brief Jjj 1418920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian*/ 1428920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian friend void vector<A>::f(const A&); 1438920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian }; 1448920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian} 1458920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>void f(const T &t = T())</Declaration> 1468920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend void f(const test3::A &)</Declaration> 147d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian 148d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanianclass MyClass 149d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian{ 150d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian/** 151d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian * \brief plain friend test. 152d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian*/ 153d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian friend class MyClass; 154d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian}; 155d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian// CHECK: <Declaration>friend class MyClass</Declaration> 156d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian 157d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahaniantemplate<class _Tp> class valarray 158d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian{ 159d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanianprivate: 160d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian/** 161d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian * \brief template friend test. 162d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian*/ 163d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian template <class T> friend class valarray; 164d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian}; 16527c2cb24d5e2e9fda68b929c6d03c761196d8e2dDmitri Gribenko// CHECK: <Declaration>template <class T> class valarray</Declaration> 166d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian// CHECK: <Declaration>friend template <class T> class valarray</Declaration> 167d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian 168d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanianclass gslice 169d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian{ 170d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian valarray<unsigned> __size_; 171d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian}; 172