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 &amp;, const Test &amp;)</Declaration>
848920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend template &lt;typename T&gt; void TemplateFriend()</Declaration>
858920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend template &lt;typename T&gt; 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 &amp;t = T())</Declaration>
1468920eb7a957f3b0bc4a8213ecdaec9a7fcd139eaFariborz Jahanian// CHECK: <Declaration>friend void f(const test3::A &amp;)</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 &lt;class T&gt; class valarray</Declaration>
166d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian// CHECK: <Declaration>friend template &lt;class T&gt; class valarray</Declaration>
167d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian
168d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanianclass gslice
169d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian{
170d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian  valarray<unsigned> __size_;
171d4ae6535a667d515afc0af3e67ca287548aba985Fariborz Jahanian};
172