xref: /aosp_15_r20/external/clang/test/Index/comment-cplus-decls.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 &amp;, const Test &amp;)</Declaration>
84*67e74705SXin Li // CHECK: <Declaration>friend template &lt;typename T&gt; void TemplateFriend()</Declaration>
85*67e74705SXin Li // CHECK: <Declaration>friend template &lt;typename T&gt; 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 &amp;t = T())</Declaration>
146*67e74705SXin Li // CHECK: <Declaration>friend void f(const test3::A &amp;)</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 &lt;class T&gt; class valarray</Declaration>
166*67e74705SXin Li // CHECK: <Declaration>friend template &lt;class T&gt; class valarray</Declaration>
167*67e74705SXin Li 
168*67e74705SXin Li class gslice
169*67e74705SXin Li {
170*67e74705SXin Li   valarray<unsigned> __size_;
171*67e74705SXin Li };
172