1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wdocumentation -Wdocumentation-pedantic -verify %s
2*67e74705SXin Li
3*67e74705SXin Li // This file contains lots of corner cases, so ensure that XML we generate is not invalid.
4*67e74705SXin Li // RUN: c-index-test -test-load-source all -comments-xml-schema=%S/../../bindings/xml/comment-xml-schema.rng %s | FileCheck %s -check-prefix=WRONG
5*67e74705SXin Li // WRONG-NOT: CommentXMLInvalid
6*67e74705SXin Li
7*67e74705SXin Li // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
8*67e74705SXin Li // expected-warning@+1 {{expected quoted string after equals sign}}
9*67e74705SXin Li /// <a href=>
10*67e74705SXin Li int test_html1(int);
11*67e74705SXin Li
12*67e74705SXin Li // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
13*67e74705SXin Li // expected-warning@+1 {{expected quoted string after equals sign}}
14*67e74705SXin Li /// <a href==>
15*67e74705SXin Li int test_html2(int);
16*67e74705SXin Li
17*67e74705SXin Li // expected-warning@+3 {{HTML tag 'a' requires an end tag}}
18*67e74705SXin Li // expected-warning@+2 {{expected quoted string after equals sign}}
19*67e74705SXin Li // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
20*67e74705SXin Li /// <a href= blah
21*67e74705SXin Li int test_html3(int);
22*67e74705SXin Li
23*67e74705SXin Li // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
24*67e74705SXin Li // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
25*67e74705SXin Li /// <a =>
26*67e74705SXin Li int test_html4(int);
27*67e74705SXin Li
28*67e74705SXin Li // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
29*67e74705SXin Li // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
30*67e74705SXin Li /// <a "aaa">
31*67e74705SXin Li int test_html5(int);
32*67e74705SXin Li
33*67e74705SXin Li // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
34*67e74705SXin Li // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
35*67e74705SXin Li /// <a a="b" =>
36*67e74705SXin Li int test_html6(int);
37*67e74705SXin Li
38*67e74705SXin Li // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
39*67e74705SXin Li // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
40*67e74705SXin Li /// <a a="b" "aaa">
41*67e74705SXin Li int test_html7(int);
42*67e74705SXin Li
43*67e74705SXin Li // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
44*67e74705SXin Li // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
45*67e74705SXin Li /// <a a="b" =
46*67e74705SXin Li int test_html8(int);
47*67e74705SXin Li
48*67e74705SXin Li // expected-warning@+2 {{HTML start tag prematurely ended, expected attribute name or '>'}} expected-note@+1 {{HTML tag started here}}
49*67e74705SXin Li /** Aaa bbb<img ddd eee
50*67e74705SXin Li * fff ggg.
51*67e74705SXin Li */
52*67e74705SXin Li int test_html9(int);
53*67e74705SXin Li
54*67e74705SXin Li // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
55*67e74705SXin Li /** Aaa bbb<img ddd eee 42%
56*67e74705SXin Li * fff ggg.
57*67e74705SXin Li */
58*67e74705SXin Li int test_html10(int);
59*67e74705SXin Li
60*67e74705SXin Li // expected-warning@+1 {{HTML end tag 'br' is forbidden}}
61*67e74705SXin Li /// <br></br>
62*67e74705SXin Li int test_html11(int);
63*67e74705SXin Li
64*67e74705SXin Li /// <blockquote>Meow</blockquote>
65*67e74705SXin Li int test_html_nesting1(int);
66*67e74705SXin Li
67*67e74705SXin Li /// <b><i>Meow</i></b>
68*67e74705SXin Li int test_html_nesting2(int);
69*67e74705SXin Li
70*67e74705SXin Li /// <p>Aaa<br>
71*67e74705SXin Li /// Bbb</p>
72*67e74705SXin Li int test_html_nesting3(int);
73*67e74705SXin Li
74*67e74705SXin Li /// <p>Aaa<br />
75*67e74705SXin Li /// Bbb</p>
76*67e74705SXin Li int test_html_nesting4(int);
77*67e74705SXin Li
78*67e74705SXin Li // expected-warning@+3 {{HTML tag 'b' requires an end tag}}
79*67e74705SXin Li // expected-warning@+2 {{HTML tag 'i' requires an end tag}}
80*67e74705SXin Li // expected-warning@+1 {{HTML end tag does not match any start tag}}
81*67e74705SXin Li /// <b><i>Meow</a>
82*67e74705SXin Li int test_html_nesting5(int);
83*67e74705SXin Li
84*67e74705SXin Li // expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
85*67e74705SXin Li // expected-warning@+1 {{HTML end tag does not match any start tag}}
86*67e74705SXin Li /// <b><i>Meow</b></b>
87*67e74705SXin Li int test_html_nesting6(int);
88*67e74705SXin Li
89*67e74705SXin Li // expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
90*67e74705SXin Li // expected-warning@+1 {{HTML end tag does not match any start tag}}
91*67e74705SXin Li /// <b><i>Meow</b></i>
92*67e74705SXin Li int test_html_nesting7(int);
93*67e74705SXin Li
94*67e74705SXin Li // expected-warning@+1 {{HTML tag 'b' requires an end tag}}
95*67e74705SXin Li /// <b>Meow
96*67e74705SXin Li int test_html_nesting8(int);
97*67e74705SXin Li
98*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
99*67e74705SXin Li /// \brief\returns Aaa
100*67e74705SXin Li int test_block_command1(int);
101*67e74705SXin Li
102*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
103*67e74705SXin Li /// \brief \returns Aaa
104*67e74705SXin Li int test_block_command2(int);
105*67e74705SXin Li
106*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
107*67e74705SXin Li /// \brief
108*67e74705SXin Li /// \returns Aaa
109*67e74705SXin Li int test_block_command3(int);
110*67e74705SXin Li
111*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
112*67e74705SXin Li /// \brief
113*67e74705SXin Li ///
114*67e74705SXin Li /// \returns Aaa
115*67e74705SXin Li int test_block_command4(int);
116*67e74705SXin Li
117*67e74705SXin Li // There is trailing whitespace on one of the following lines, don't remove it!
118*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
119*67e74705SXin Li /// \brief
120*67e74705SXin Li ///
121*67e74705SXin Li /// \returns Aaa
122*67e74705SXin Li int test_block_command5(int);
123*67e74705SXin Li
124*67e74705SXin Li /// \brief \c Aaa
125*67e74705SXin Li int test_block_command6(int);
126*67e74705SXin Li
127*67e74705SXin Li // expected-warning@+5 {{duplicated command '\brief'}} expected-note@+1 {{previous command '\brief' here}}
128*67e74705SXin Li /// \brief Aaa
129*67e74705SXin Li ///
130*67e74705SXin Li /// Bbb
131*67e74705SXin Li ///
132*67e74705SXin Li /// \brief Ccc
133*67e74705SXin Li int test_duplicate_brief1(int);
134*67e74705SXin Li
135*67e74705SXin Li // expected-warning@+5 {{duplicated command '\short'}} expected-note@+1 {{previous command '\short' here}}
136*67e74705SXin Li /// \short Aaa
137*67e74705SXin Li ///
138*67e74705SXin Li /// Bbb
139*67e74705SXin Li ///
140*67e74705SXin Li /// \short Ccc
141*67e74705SXin Li int test_duplicate_brief2(int);
142*67e74705SXin Li
143*67e74705SXin Li // expected-warning@+5 {{duplicated command '\brief'}} expected-note@+1 {{previous command '\short' (an alias of '\brief') here}}
144*67e74705SXin Li /// \short Aaa
145*67e74705SXin Li ///
146*67e74705SXin Li /// Bbb
147*67e74705SXin Li ///
148*67e74705SXin Li /// \brief Ccc
149*67e74705SXin Li int test_duplicate_brief3(int);
150*67e74705SXin Li
151*67e74705SXin Li
152*67e74705SXin Li /// \return Aaa
153*67e74705SXin Li ///
154*67e74705SXin Li /// Bbb
155*67e74705SXin Li ///
156*67e74705SXin Li /// \return Ccc
157*67e74705SXin Li int test_multiple_returns1(int);
158*67e74705SXin Li
159*67e74705SXin Li /// \returns Aaa
160*67e74705SXin Li ///
161*67e74705SXin Li /// Bbb
162*67e74705SXin Li ///
163*67e74705SXin Li /// \returns Ccc
164*67e74705SXin Li int test_multiple_returns2(int);
165*67e74705SXin Li
166*67e74705SXin Li /// \result Aaa
167*67e74705SXin Li ///
168*67e74705SXin Li /// Bbb
169*67e74705SXin Li ///
170*67e74705SXin Li /// \result Ccc
171*67e74705SXin Li int test_multiple_returns3(int);
172*67e74705SXin Li
173*67e74705SXin Li /// \returns Aaa
174*67e74705SXin Li ///
175*67e74705SXin Li /// Bbb
176*67e74705SXin Li ///
177*67e74705SXin Li /// \return Ccc
178*67e74705SXin Li int test_multiple_returns4(int);
179*67e74705SXin Li
180*67e74705SXin Li
181*67e74705SXin Li // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
182*67e74705SXin Li /// \param a Blah blah.
183*67e74705SXin Li int test_param1_backslash;
184*67e74705SXin Li
185*67e74705SXin Li // rdar://13066276
186*67e74705SXin Li // Check that the diagnostic uses the same command marker as the comment.
187*67e74705SXin Li // expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
188*67e74705SXin Li /// @param a Blah blah.
189*67e74705SXin Li int test_param1_at;
190*67e74705SXin Li
191*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\param' command}}
192*67e74705SXin Li /// \param
193*67e74705SXin Li /// \param a Blah blah.
194*67e74705SXin Li int test_param2(int a);
195*67e74705SXin Li
196*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\param' command}}
197*67e74705SXin Li /// \param a
198*67e74705SXin Li int test_param3(int a);
199*67e74705SXin Li
200*67e74705SXin Li /// \param a Blah blah.
201*67e74705SXin Li int test_param4(int a);
202*67e74705SXin Li
203*67e74705SXin Li /// \param [in] a Blah blah.
204*67e74705SXin Li int test_param5(int a);
205*67e74705SXin Li
206*67e74705SXin Li /// \param [out] a Blah blah.
207*67e74705SXin Li int test_param6(int a);
208*67e74705SXin Li
209*67e74705SXin Li /// \param [in,out] a Blah blah.
210*67e74705SXin Li int test_param7(int a);
211*67e74705SXin Li
212*67e74705SXin Li // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
213*67e74705SXin Li /// \param [ in ] a Blah blah.
214*67e74705SXin Li int test_param8(int a);
215*67e74705SXin Li
216*67e74705SXin Li // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
217*67e74705SXin Li /// \param [in, out] a Blah blah.
218*67e74705SXin Li int test_param9(int a);
219*67e74705SXin Li
220*67e74705SXin Li // expected-warning@+1 {{unrecognized parameter passing direction, valid directions are '[in]', '[out]' and '[in,out]'}}
221*67e74705SXin Li /// \param [ junk] a Blah blah.
222*67e74705SXin Li int test_param10(int a);
223*67e74705SXin Li
224*67e74705SXin Li // expected-warning@+1 {{parameter 'a' not found in the function declaration}}
225*67e74705SXin Li /// \param a Blah blah.
226*67e74705SXin Li int test_param11();
227*67e74705SXin Li
228*67e74705SXin Li // expected-warning@+1 {{parameter 'A' not found in the function declaration}} expected-note@+1 {{did you mean 'a'?}}
229*67e74705SXin Li /// \param A Blah blah.
230*67e74705SXin Li int test_param12(int a);
231*67e74705SXin Li
232*67e74705SXin Li // expected-warning@+1 {{parameter 'aab' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
233*67e74705SXin Li /// \param aab Blah blah.
234*67e74705SXin Li int test_param13(int aaa, int bbb);
235*67e74705SXin Li
236*67e74705SXin Li // expected-warning@+2 {{parameter 'aab' not found in the function declaration}} expected-note@+2 {{did you mean 'bbb'?}}
237*67e74705SXin Li /// \param aaa Blah blah.
238*67e74705SXin Li /// \param aab Blah blah.
239*67e74705SXin Li int test_param14(int aaa, int bbb);
240*67e74705SXin Li
241*67e74705SXin Li // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
242*67e74705SXin Li /// \param aab Blah blah.
243*67e74705SXin Li int test_param15(int bbb, int ccc);
244*67e74705SXin Li
245*67e74705SXin Li // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
246*67e74705SXin Li /// \param aab Ccc.
247*67e74705SXin Li /// \param aaa Aaa.
248*67e74705SXin Li /// \param bbb Bbb.
249*67e74705SXin Li int test_param16(int aaa, int bbb);
250*67e74705SXin Li
251*67e74705SXin Li // expected-warning@+2 {{parameter 'aab' not found in the function declaration}}
252*67e74705SXin Li /// \param aaa Aaa.
253*67e74705SXin Li /// \param aab Ccc.
254*67e74705SXin Li /// \param bbb Bbb.
255*67e74705SXin Li int test_param17(int aaa, int bbb);
256*67e74705SXin Li
257*67e74705SXin Li // expected-warning@+3 {{parameter 'aab' not found in the function declaration}}
258*67e74705SXin Li /// \param aaa Aaa.
259*67e74705SXin Li /// \param bbb Bbb.
260*67e74705SXin Li /// \param aab Ccc.
261*67e74705SXin Li int test_param18(int aaa, int bbb);
262*67e74705SXin Li
263*67e74705SXin Li class C {
264*67e74705SXin Li // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
265*67e74705SXin Li /// \param aaa Blah blah.
266*67e74705SXin Li C(int bbb, int ccc);
267*67e74705SXin Li
268*67e74705SXin Li // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
269*67e74705SXin Li /// \param aaa Blah blah.
270*67e74705SXin Li int test_param19(int bbb, int ccc);
271*67e74705SXin Li };
272*67e74705SXin Li
273*67e74705SXin Li // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
274*67e74705SXin Li /// \param aab Blah blah.
275*67e74705SXin Li template<typename T>
276*67e74705SXin Li void test_param20(int bbb, int ccc);
277*67e74705SXin Li
278*67e74705SXin Li // expected-warning@+3 {{parameter 'a' is already documented}}
279*67e74705SXin Li // expected-note@+1 {{previous documentation}}
280*67e74705SXin Li /// \param a Aaa.
281*67e74705SXin Li /// \param a Aaa.
282*67e74705SXin Li int test_param21(int a);
283*67e74705SXin Li
284*67e74705SXin Li // expected-warning@+4 {{parameter 'x2' is already documented}}
285*67e74705SXin Li // expected-note@+2 {{previous documentation}}
286*67e74705SXin Li /// \param x1 Aaa.
287*67e74705SXin Li /// \param x2 Bbb.
288*67e74705SXin Li /// \param x2 Ccc.
289*67e74705SXin Li int test_param22(int x1, int x2, int x3);
290*67e74705SXin Li
291*67e74705SXin Li //===---
292*67e74705SXin Li // Test that we treat typedefs to some non-function types as functions for the
293*67e74705SXin Li // purposes of documentation comment parsing.
294*67e74705SXin Li //===---
295*67e74705SXin Li
296*67e74705SXin Li namespace foo {
297*67e74705SXin Li inline namespace bar {
298*67e74705SXin Li template<typename>
299*67e74705SXin Li struct function_wrapper {};
300*67e74705SXin Li
301*67e74705SXin Li template<unsigned>
302*67e74705SXin Li struct not_a_function_wrapper {};
303*67e74705SXin Li }
304*67e74705SXin Li };
305*67e74705SXin Li
306*67e74705SXin Li // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
307*67e74705SXin Li /// \param aaa Meow.
308*67e74705SXin Li /// \param bbb Bbb.
309*67e74705SXin Li /// \returns aaa.
310*67e74705SXin Li typedef int test_function_like_typedef1(int aaa, int ccc);
311*67e74705SXin Li
312*67e74705SXin Li // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
313*67e74705SXin Li /// \param aaa Meow.
314*67e74705SXin Li /// \param bbb Bbb.
315*67e74705SXin Li /// \returns aaa.
316*67e74705SXin Li typedef int (*test_function_like_typedef2)(int aaa, int ccc);
317*67e74705SXin Li
318*67e74705SXin Li // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
319*67e74705SXin Li /// \param aaa Meow.
320*67e74705SXin Li /// \param bbb Bbb.
321*67e74705SXin Li /// \returns aaa.
322*67e74705SXin Li typedef int (* const test_function_like_typedef3)(int aaa, int ccc);
323*67e74705SXin Li
324*67e74705SXin Li // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
325*67e74705SXin Li /// \param aaa Meow.
326*67e74705SXin Li /// \param bbb Bbb.
327*67e74705SXin Li /// \returns aaa.
328*67e74705SXin Li typedef int (C::*test_function_like_typedef4)(int aaa, int ccc);
329*67e74705SXin Li
330*67e74705SXin Li // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
331*67e74705SXin Li /// \param aaa Meow.
332*67e74705SXin Li /// \param bbb Bbb.
333*67e74705SXin Li /// \returns aaa.
334*67e74705SXin Li typedef foo::function_wrapper<int (int aaa, int ccc)> test_function_like_typedef5;
335*67e74705SXin Li
336*67e74705SXin Li // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
337*67e74705SXin Li /// \param aaa Meow.
338*67e74705SXin Li /// \param bbb Bbb.
339*67e74705SXin Li /// \returns aaa.
340*67e74705SXin Li typedef foo::function_wrapper<int (int aaa, int ccc)> *test_function_like_typedef6;
341*67e74705SXin Li
342*67e74705SXin Li // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
343*67e74705SXin Li /// \param aaa Meow.
344*67e74705SXin Li /// \param bbb Bbb.
345*67e74705SXin Li /// \returns aaa.
346*67e74705SXin Li typedef foo::function_wrapper<int (int aaa, int ccc)> &test_function_like_typedef7;
347*67e74705SXin Li
348*67e74705SXin Li // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
349*67e74705SXin Li /// \param aaa Meow.
350*67e74705SXin Li /// \param bbb Bbb.
351*67e74705SXin Li /// \returns aaa.
352*67e74705SXin Li typedef foo::function_wrapper<int (int aaa, int ccc)> &&test_function_like_typedef8;
353*67e74705SXin Li
354*67e74705SXin Li
355*67e74705SXin Li typedef int (*test_not_function_like_typedef1)(int aaa);
356*67e74705SXin Li
357*67e74705SXin Li // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
358*67e74705SXin Li /// \param aaa Meow.
359*67e74705SXin Li typedef test_not_function_like_typedef1 test_not_function_like_typedef2;
360*67e74705SXin Li
361*67e74705SXin Li // rdar://13066276
362*67e74705SXin Li // Check that the diagnostic uses the same command marker as the comment.
363*67e74705SXin Li // expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
364*67e74705SXin Li /// @param aaa Meow.
365*67e74705SXin Li typedef unsigned int test_not_function_like_typedef3;
366*67e74705SXin Li
367*67e74705SXin Li // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
368*67e74705SXin Li /// \param aaa Meow.
369*67e74705SXin Li typedef foo::not_a_function_wrapper<1> test_not_function_like_typedef4;
370*67e74705SXin Li
371*67e74705SXin Li /// \param aaa Aaa
372*67e74705SXin Li /// \param ... Vararg
373*67e74705SXin Li int test_vararg_param1(int aaa, ...);
374*67e74705SXin Li
375*67e74705SXin Li /// \param ... Vararg
376*67e74705SXin Li int test_vararg_param2(...);
377*67e74705SXin Li
378*67e74705SXin Li // expected-warning@+1 {{parameter '...' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
379*67e74705SXin Li /// \param ... Vararg
380*67e74705SXin Li int test_vararg_param3(int aaa);
381*67e74705SXin Li
382*67e74705SXin Li // expected-warning@+1 {{parameter '...' not found in the function declaration}}
383*67e74705SXin Li /// \param ... Vararg
384*67e74705SXin Li int test_vararg_param4();
385*67e74705SXin Li
386*67e74705SXin Li
387*67e74705SXin Li /// \param aaa Aaa
388*67e74705SXin Li /// \param ... Vararg
389*67e74705SXin Li template<typename T>
390*67e74705SXin Li int test_template_vararg_param1(int aaa, ...);
391*67e74705SXin Li
392*67e74705SXin Li /// \param ... Vararg
393*67e74705SXin Li template<typename T>
394*67e74705SXin Li int test_template_vararg_param2(...);
395*67e74705SXin Li
396*67e74705SXin Li // expected-warning@+1 {{parameter '...' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
397*67e74705SXin Li /// \param ... Vararg
398*67e74705SXin Li template<typename T>
399*67e74705SXin Li int test_template_vararg_param3(int aaa);
400*67e74705SXin Li
401*67e74705SXin Li // expected-warning@+1 {{parameter '...' not found in the function declaration}}
402*67e74705SXin Li /// \param ... Vararg
403*67e74705SXin Li template<typename T>
404*67e74705SXin Li int test_template_vararg_param4();
405*67e74705SXin Li
406*67e74705SXin Li
407*67e74705SXin Li // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
408*67e74705SXin Li /// \tparam T Aaa
409*67e74705SXin Li int test_tparam1;
410*67e74705SXin Li
411*67e74705SXin Li // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
412*67e74705SXin Li /// \tparam T Aaa
413*67e74705SXin Li void test_tparam2(int aaa);
414*67e74705SXin Li
415*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
416*67e74705SXin Li /// \tparam
417*67e74705SXin Li /// \param aaa Blah blah
418*67e74705SXin Li template<typename T>
419*67e74705SXin Li void test_tparam3(T aaa);
420*67e74705SXin Li
421*67e74705SXin Li // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
422*67e74705SXin Li /// \tparam T Aaa
423*67e74705SXin Li template<typename TT>
424*67e74705SXin Li void test_tparam4(TT aaa);
425*67e74705SXin Li
426*67e74705SXin Li // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
427*67e74705SXin Li /// \tparam T Aaa
428*67e74705SXin Li template<typename TT>
429*67e74705SXin Li class test_tparam5 {
430*67e74705SXin Li // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TTT'?}}
431*67e74705SXin Li /// \tparam T Aaa
432*67e74705SXin Li template<typename TTT>
433*67e74705SXin Li void test_tparam6(TTT aaa);
434*67e74705SXin Li };
435*67e74705SXin Li
436*67e74705SXin Li /// \tparam T1 Aaa
437*67e74705SXin Li /// \tparam T2 Bbb
438*67e74705SXin Li template<typename T1, typename T2>
439*67e74705SXin Li void test_tparam7(T1 aaa, T2 bbb);
440*67e74705SXin Li
441*67e74705SXin Li // expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}}
442*67e74705SXin Li /// \tparam SomTy Aaa
443*67e74705SXin Li /// \tparam OtherTy Bbb
444*67e74705SXin Li template<typename SomeTy, typename OtherTy>
445*67e74705SXin Li void test_tparam8(SomeTy aaa, OtherTy bbb);
446*67e74705SXin Li
447*67e74705SXin Li // expected-warning@+2 {{template parameter 'T1' is already documented}} expected-note@+1 {{previous documentation}}
448*67e74705SXin Li /// \tparam T1 Aaa
449*67e74705SXin Li /// \tparam T1 Bbb
450*67e74705SXin Li template<typename T1, typename T2>
451*67e74705SXin Li void test_tparam9(T1 aaa, T2 bbb);
452*67e74705SXin Li
453*67e74705SXin Li /// \tparam T Aaa
454*67e74705SXin Li /// \tparam TT Bbb
455*67e74705SXin Li template<template<typename T> class TT>
456*67e74705SXin Li void test_tparam10(TT<int> aaa);
457*67e74705SXin Li
458*67e74705SXin Li /// \tparam T Aaa
459*67e74705SXin Li /// \tparam TT Bbb
460*67e74705SXin Li /// \tparam TTT Ccc
461*67e74705SXin Li template<template<template<typename T> class TT, class C> class TTT>
462*67e74705SXin Li void test_tparam11();
463*67e74705SXin Li
464*67e74705SXin Li /// \tparam I Aaa
465*67e74705SXin Li template<int I>
466*67e74705SXin Li void test_tparam12();
467*67e74705SXin Li
468*67e74705SXin Li template<typename T, typename U>
469*67e74705SXin Li class test_tparam13 { };
470*67e74705SXin Li
471*67e74705SXin Li /// \tparam T Aaa
472*67e74705SXin Li template<typename T>
473*67e74705SXin Li using test_tparam14 = test_tparam13<T, int>;
474*67e74705SXin Li
475*67e74705SXin Li // expected-warning@+1 {{template parameter 'U' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}}
476*67e74705SXin Li /// \tparam U Aaa
477*67e74705SXin Li template<typename T>
478*67e74705SXin Li using test_tparam15 = test_tparam13<T, int>;
479*67e74705SXin Li
480*67e74705SXin Li // ----
481*67e74705SXin Li
482*67e74705SXin Li /// \tparam T Aaa
483*67e74705SXin Li template<typename T>
484*67e74705SXin Li class test_tparam16 { };
485*67e74705SXin Li
486*67e74705SXin Li typedef test_tparam16<int> test_tparam17;
487*67e74705SXin Li typedef test_tparam16<double> test_tparam18;
488*67e74705SXin Li
489*67e74705SXin Li // ----
490*67e74705SXin Li
491*67e74705SXin Li template<typename T>
492*67e74705SXin Li class test_tparam19;
493*67e74705SXin Li
494*67e74705SXin Li typedef test_tparam19<int> test_tparam20;
495*67e74705SXin Li typedef test_tparam19<double> test_tparam21;
496*67e74705SXin Li
497*67e74705SXin Li /// \tparam T Aaa
498*67e74705SXin Li template<typename T>
499*67e74705SXin Li class test_tparam19 { };
500*67e74705SXin Li
501*67e74705SXin Li // ----
502*67e74705SXin Li
503*67e74705SXin Li // expected-warning@+1 {{'@tparam' command used in a comment that is not attached to a template declaration}}
504*67e74705SXin Li /// @tparam T Aaa
505*67e74705SXin Li int test_tparam22;
506*67e74705SXin Li
507*67e74705SXin Li // ----
508*67e74705SXin Li
509*67e74705SXin Li
510*67e74705SXin Li /// Aaa
511*67e74705SXin Li /// \deprecated Bbb
512*67e74705SXin Li void test_deprecated_1(int a) __attribute__((deprecated));
513*67e74705SXin Li
514*67e74705SXin Li // We don't want \deprecated to warn about empty paragraph. It is fine to use
515*67e74705SXin Li // \deprecated by itself without explanations.
516*67e74705SXin Li
517*67e74705SXin Li /// Aaa
518*67e74705SXin Li /// \deprecated
519*67e74705SXin Li void test_deprecated_2(int a) __attribute__((deprecated));
520*67e74705SXin Li
521*67e74705SXin Li /// Aaa
522*67e74705SXin Li /// \deprecated
523*67e74705SXin Li void test_deprecated_3(int a) __attribute__((availability(macosx,introduced=10.4)));
524*67e74705SXin Li
525*67e74705SXin Li /// Aaa
526*67e74705SXin Li /// \deprecated
527*67e74705SXin Li void test_deprecated_4(int a) __attribute__((unavailable));
528*67e74705SXin Li
529*67e74705SXin Li // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+3 {{add a deprecation attribute to the declaration to silence this warning}}
530*67e74705SXin Li /// Aaa
531*67e74705SXin Li /// \deprecated
532*67e74705SXin Li void test_deprecated_5(int a);
533*67e74705SXin Li
534*67e74705SXin Li // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+3 {{add a deprecation attribute to the declaration to silence this warning}}
535*67e74705SXin Li /// Aaa
536*67e74705SXin Li /// \deprecated
test_deprecated_6(int a)537*67e74705SXin Li void test_deprecated_6(int a) {
538*67e74705SXin Li }
539*67e74705SXin Li
540*67e74705SXin Li // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
541*67e74705SXin Li /// Aaa
542*67e74705SXin Li /// \deprecated
543*67e74705SXin Li template<typename T>
544*67e74705SXin Li void test_deprecated_7(T aaa);
545*67e74705SXin Li
546*67e74705SXin Li
547*67e74705SXin Li // rdar://12397511
548*67e74705SXin Li // expected-note@+2 {{previous command '\headerfile' here}}
549*67e74705SXin Li // expected-warning@+2 {{duplicated command '\headerfile'}}
550*67e74705SXin Li /// \headerfile ""
551*67e74705SXin Li /// \headerfile foo.h
552*67e74705SXin Li int test__headerfile_1(int a);
553*67e74705SXin Li
554*67e74705SXin Li
555*67e74705SXin Li /// \invariant aaa
556*67e74705SXin Li void test_invariant_1(int a);
557*67e74705SXin Li
558*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\invariant' command}}
559*67e74705SXin Li /// \invariant
560*67e74705SXin Li void test_invariant_2(int a);
561*67e74705SXin Li
562*67e74705SXin Li
563*67e74705SXin Li // no-warning
564*67e74705SXin Li /// \returns Aaa
565*67e74705SXin Li int test_returns_right_decl_1(int);
566*67e74705SXin Li
567*67e74705SXin Li class test_returns_right_decl_2 {
568*67e74705SXin Li // no-warning
569*67e74705SXin Li /// \returns Aaa
570*67e74705SXin Li int test_returns_right_decl_3(int);
571*67e74705SXin Li };
572*67e74705SXin Li
573*67e74705SXin Li // no-warning
574*67e74705SXin Li /// \returns Aaa
575*67e74705SXin Li template<typename T>
576*67e74705SXin Li int test_returns_right_decl_4(T aaa);
577*67e74705SXin Li
578*67e74705SXin Li // no-warning
579*67e74705SXin Li /// \returns Aaa
580*67e74705SXin Li template<>
581*67e74705SXin Li int test_returns_right_decl_4(int aaa);
582*67e74705SXin Li
583*67e74705SXin Li /// \returns Aaa
584*67e74705SXin Li template<typename T>
585*67e74705SXin Li T test_returns_right_decl_5(T aaa);
586*67e74705SXin Li
587*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
588*67e74705SXin Li /// \returns Aaa
589*67e74705SXin Li int test_returns_wrong_decl_1_backslash;
590*67e74705SXin Li
591*67e74705SXin Li // rdar://13066276
592*67e74705SXin Li // Check that the diagnostic uses the same command marker as the comment.
593*67e74705SXin Li // expected-warning@+1 {{'@returns' command used in a comment that is not attached to a function or method declaration}}
594*67e74705SXin Li /// @returns Aaa
595*67e74705SXin Li int test_returns_wrong_decl_1_at;
596*67e74705SXin Li
597*67e74705SXin Li // expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
598*67e74705SXin Li /// \return Aaa
599*67e74705SXin Li int test_returns_wrong_decl_2;
600*67e74705SXin Li
601*67e74705SXin Li // expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}}
602*67e74705SXin Li /// \result Aaa
603*67e74705SXin Li int test_returns_wrong_decl_3;
604*67e74705SXin Li
605*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
606*67e74705SXin Li /// \returns Aaa
607*67e74705SXin Li void test_returns_wrong_decl_4(int);
608*67e74705SXin Li
609*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
610*67e74705SXin Li /// \returns Aaa
611*67e74705SXin Li template<typename T>
612*67e74705SXin Li void test_returns_wrong_decl_5(T aaa);
613*67e74705SXin Li
614*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
615*67e74705SXin Li /// \returns Aaa
616*67e74705SXin Li template<>
617*67e74705SXin Li void test_returns_wrong_decl_5(int aaa);
618*67e74705SXin Li
619*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
620*67e74705SXin Li /// \returns Aaa
621*67e74705SXin Li struct test_returns_wrong_decl_6 { };
622*67e74705SXin Li
623*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
624*67e74705SXin Li /// \returns Aaa
625*67e74705SXin Li class test_returns_wrong_decl_7 {
626*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}}
627*67e74705SXin Li /// \returns Aaa
628*67e74705SXin Li test_returns_wrong_decl_7();
629*67e74705SXin Li
630*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}}
631*67e74705SXin Li /// \returns Aaa
632*67e74705SXin Li ~test_returns_wrong_decl_7();
633*67e74705SXin Li };
634*67e74705SXin Li
635*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
636*67e74705SXin Li /// \returns Aaa
637*67e74705SXin Li enum test_returns_wrong_decl_8 {
638*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
639*67e74705SXin Li /// \returns Aaa
640*67e74705SXin Li test_returns_wrong_decl_9
641*67e74705SXin Li };
642*67e74705SXin Li
643*67e74705SXin Li // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
644*67e74705SXin Li /// \returns Aaa
645*67e74705SXin Li namespace test_returns_wrong_decl_10 { };
646*67e74705SXin Li
647*67e74705SXin Li // rdar://13094352
648*67e74705SXin Li // expected-warning@+1 {{'@function' command should be used in a comment attached to a function declaration}}
649*67e74705SXin Li /*! @function test_function
650*67e74705SXin Li */
651*67e74705SXin Li typedef unsigned int Base64Flags;
652*67e74705SXin Li unsigned test_function(Base64Flags inFlags);
653*67e74705SXin Li
654*67e74705SXin Li // expected-warning@+1 {{'@callback' command should be used in a comment attached to a pointer to function declaration}}
655*67e74705SXin Li /*! @callback test_callback
656*67e74705SXin Li */
657*67e74705SXin Li typedef unsigned int BaseFlags;
658*67e74705SXin Li unsigned (*test_callback)(BaseFlags inFlags);
659*67e74705SXin Li
660*67e74705SXin Li // expected-warning@+1 {{'\endverbatim' command does not terminate a verbatim text block}}
661*67e74705SXin Li /// \endverbatim
662*67e74705SXin Li int test_verbatim_1();
663*67e74705SXin Li
664*67e74705SXin Li // expected-warning@+1 {{'\endcode' command does not terminate a verbatim text block}}
665*67e74705SXin Li /// \endcode
666*67e74705SXin Li int test_verbatim_2();
667*67e74705SXin Li
668*67e74705SXin Li // FIXME: we give a bad diagnostic here because we throw away non-documentation
669*67e74705SXin Li // comments early.
670*67e74705SXin Li //
671*67e74705SXin Li // expected-warning@+3 {{'\endcode' command does not terminate a verbatim text block}}
672*67e74705SXin Li /// \code
673*67e74705SXin Li // foo
674*67e74705SXin Li /// \endcode
675*67e74705SXin Li int test_verbatim_3();
676*67e74705SXin Li
677*67e74705SXin Li
678*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
679*67e74705SXin Li int test1; ///< \brief\author Aaa
680*67e74705SXin Li
681*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
682*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
683*67e74705SXin Li int test2, ///< \brief\author Aaa
684*67e74705SXin Li test3; ///< \brief\author Aaa
685*67e74705SXin Li
686*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
687*67e74705SXin Li int test4; ///< \brief
688*67e74705SXin Li ///< \author Aaa
689*67e74705SXin Li
690*67e74705SXin Li
691*67e74705SXin Li class TestRelates {};
692*67e74705SXin Li
693*67e74705SXin Li /// \relates TestRelates
694*67e74705SXin Li /// \brief Aaa
695*67e74705SXin Li void test_relates_1();
696*67e74705SXin Li
697*67e74705SXin Li /// \related TestRelates
698*67e74705SXin Li /// \brief Aaa
699*67e74705SXin Li void test_relates_2();
700*67e74705SXin Li
701*67e74705SXin Li /// \relatesalso TestRelates
702*67e74705SXin Li /// \brief Aaa
703*67e74705SXin Li void test_relates_3();
704*67e74705SXin Li
705*67e74705SXin Li /// \relatedalso TestRelates
706*67e74705SXin Li /// \brief Aaa
707*67e74705SXin Li void test_relates_4();
708*67e74705SXin Li
709*67e74705SXin Li
710*67e74705SXin Li // Check that we attach the comment to the declaration during parsing in the
711*67e74705SXin Li // following cases. The test is based on the fact that we don't parse
712*67e74705SXin Li // documentation comments that are not attached to anything.
713*67e74705SXin Li
714*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
715*67e74705SXin Li /// \brief\author Aaa
716*67e74705SXin Li int test_attach1;
717*67e74705SXin Li
718*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
719*67e74705SXin Li /// \brief\author Aaa
720*67e74705SXin Li int test_attach2(int);
721*67e74705SXin Li
722*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
723*67e74705SXin Li /// \brief\author Aaa
724*67e74705SXin Li struct test_attach3 {
725*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
726*67e74705SXin Li /// \brief\author Aaa
727*67e74705SXin Li int test_attach4;
728*67e74705SXin Li
729*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
730*67e74705SXin Li int test_attach5; ///< \brief\author Aaa
731*67e74705SXin Li
732*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
733*67e74705SXin Li /// \brief\author Aaa
734*67e74705SXin Li int test_attach6(int);
735*67e74705SXin Li };
736*67e74705SXin Li
737*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
738*67e74705SXin Li /// \brief\author Aaa
739*67e74705SXin Li class test_attach7 {
740*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
741*67e74705SXin Li /// \brief\author Aaa
742*67e74705SXin Li int test_attach8;
743*67e74705SXin Li
744*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
745*67e74705SXin Li int test_attach9; ///< \brief\author Aaa
746*67e74705SXin Li
747*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
748*67e74705SXin Li /// \brief\author Aaa
749*67e74705SXin Li int test_attach10(int);
750*67e74705SXin Li };
751*67e74705SXin Li
752*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
753*67e74705SXin Li /// \brief\author Aaa
754*67e74705SXin Li enum test_attach9 {
755*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
756*67e74705SXin Li /// \brief\author Aaa
757*67e74705SXin Li test_attach10,
758*67e74705SXin Li
759*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
760*67e74705SXin Li test_attach11 ///< \brief\author Aaa
761*67e74705SXin Li };
762*67e74705SXin Li
763*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
764*67e74705SXin Li /// \brief\author Aaa
765*67e74705SXin Li struct test_noattach12 *test_attach13;
766*67e74705SXin Li
767*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
768*67e74705SXin Li /// \brief\author Aaa
769*67e74705SXin Li typedef struct test_noattach14 *test_attach15;
770*67e74705SXin Li
771*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
772*67e74705SXin Li /// \brief\author Aaa
773*67e74705SXin Li typedef struct test_attach16 { int a; } test_attach17;
774*67e74705SXin Li
775*67e74705SXin Li struct S { int a; };
776*67e74705SXin Li
777*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
778*67e74705SXin Li /// \brief\author Aaa
779*67e74705SXin Li struct S *test_attach18;
780*67e74705SXin Li
781*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
782*67e74705SXin Li /// \brief\author Aaa
783*67e74705SXin Li typedef struct S *test_attach19;
784*67e74705SXin Li
785*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
786*67e74705SXin Li /// \brief\author Aaa
787*67e74705SXin Li struct test_attach20;
788*67e74705SXin Li
789*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
790*67e74705SXin Li /// \brief\author Aaa
791*67e74705SXin Li typedef struct test_attach21 {
792*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
793*67e74705SXin Li /// \brief\author Aaa
794*67e74705SXin Li int test_attach22;
795*67e74705SXin Li } test_attach23;
796*67e74705SXin Li
797*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
798*67e74705SXin Li /// \brief\author Aaa
799*67e74705SXin Li namespace test_attach24 {
800*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
801*67e74705SXin Li /// \brief\author Aaa
802*67e74705SXin Li namespace test_attach25 {
803*67e74705SXin Li }
804*67e74705SXin Li }
805*67e74705SXin Li
806*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
807*67e74705SXin Li /// \brief\author Aaa
808*67e74705SXin Li /// \tparam T Aaa
809*67e74705SXin Li template<typename T>
810*67e74705SXin Li void test_attach26(T aaa);
811*67e74705SXin Li
812*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
813*67e74705SXin Li /// \brief\author Aaa
814*67e74705SXin Li /// \tparam T Aaa
815*67e74705SXin Li template<typename T, typename U>
816*67e74705SXin Li void test_attach27(T aaa, U bbb);
817*67e74705SXin Li
818*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
819*67e74705SXin Li // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
820*67e74705SXin Li /// \brief\author Aaa
821*67e74705SXin Li /// \tparam T Aaa
822*67e74705SXin Li template<>
823*67e74705SXin Li void test_attach27(int aaa, int bbb);
824*67e74705SXin Li
825*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
826*67e74705SXin Li /// \brief\author Aaa
827*67e74705SXin Li /// \tparam T Aaa
828*67e74705SXin Li template<typename T>
829*67e74705SXin Li class test_attach28 {
830*67e74705SXin Li T aaa;
831*67e74705SXin Li };
832*67e74705SXin Li
833*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
834*67e74705SXin Li /// \brief\author Aaa
835*67e74705SXin Li using test_attach29 = test_attach28<int>;
836*67e74705SXin Li
837*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
838*67e74705SXin Li /// \brief\author Aaa
839*67e74705SXin Li /// \tparam T Aaa
840*67e74705SXin Li template<typename T, typename U>
841*67e74705SXin Li class test_attach30 { };
842*67e74705SXin Li
843*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
844*67e74705SXin Li /// \brief\author Aaa
845*67e74705SXin Li /// \tparam T Aaa
846*67e74705SXin Li template<typename T>
847*67e74705SXin Li class test_attach30<T, int> { };
848*67e74705SXin Li
849*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
850*67e74705SXin Li /// \brief\author Aaa
851*67e74705SXin Li template<>
852*67e74705SXin Li class test_attach30<int, int> { };
853*67e74705SXin Li
854*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
855*67e74705SXin Li /// \brief\author Aaa
856*67e74705SXin Li template<typename T>
857*67e74705SXin Li using test_attach31 = test_attach30<T, int>;
858*67e74705SXin Li
859*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
860*67e74705SXin Li /// \brief\author Aaa
861*67e74705SXin Li /// \tparam T Aaa
862*67e74705SXin Li template<typename T, typename U, typename V>
863*67e74705SXin Li class test_attach32 { };
864*67e74705SXin Li
865*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
866*67e74705SXin Li /// \brief\author Aaa
867*67e74705SXin Li /// \tparam T Aaa
868*67e74705SXin Li template<typename T, typename U>
869*67e74705SXin Li class test_attach32<T, U, int> { };
870*67e74705SXin Li
871*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
872*67e74705SXin Li /// \brief\author Aaa
873*67e74705SXin Li /// \tparam T Aaa
874*67e74705SXin Li template<typename T>
875*67e74705SXin Li class test_attach32<T, int, int> { };
876*67e74705SXin Li
877*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
878*67e74705SXin Li // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
879*67e74705SXin Li /// \brief\author Aaa
880*67e74705SXin Li /// \tparam T Aaa
881*67e74705SXin Li template<>
882*67e74705SXin Li class test_attach32<int, int, int> { };
883*67e74705SXin Li
884*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
885*67e74705SXin Li /// \brief\author Aaa
886*67e74705SXin Li class test_attach33 {
887*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
888*67e74705SXin Li /// \brief\author Aaa
889*67e74705SXin Li /// \tparam T Aaa
890*67e74705SXin Li template<typename T, typename U>
891*67e74705SXin Li void test_attach34(T aaa, U bbb);
892*67e74705SXin Li };
893*67e74705SXin Li
894*67e74705SXin Li template<typename T>
895*67e74705SXin Li class test_attach35 {
896*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
897*67e74705SXin Li // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
898*67e74705SXin Li /// \brief\author Aaa
899*67e74705SXin Li /// \tparam T Aaa
900*67e74705SXin Li template<typename TT, typename UU>
901*67e74705SXin Li void test_attach36(TT aaa, UU bbb);
902*67e74705SXin Li };
903*67e74705SXin Li
904*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
905*67e74705SXin Li // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
906*67e74705SXin Li /// \brief\author Aaa
907*67e74705SXin Li /// \tparam T Aaa
908*67e74705SXin Li template<> template<>
test_attach36(int aaa,int bbb)909*67e74705SXin Li void test_attach35<int>::test_attach36(int aaa, int bbb) {}
910*67e74705SXin Li
911*67e74705SXin Li template<typename T>
912*67e74705SXin Li class test_attach37 {
913*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
914*67e74705SXin Li // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}}
915*67e74705SXin Li /// \brief\author Aaa
916*67e74705SXin Li /// \tparam T Aaa
917*67e74705SXin Li void test_attach38(int aaa, int bbb);
918*67e74705SXin Li
919*67e74705SXin Li void test_attach39(int aaa, int bbb);
920*67e74705SXin Li };
921*67e74705SXin Li
922*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
923*67e74705SXin Li // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
924*67e74705SXin Li /// \brief\author Aaa
925*67e74705SXin Li /// \tparam T Aaa
926*67e74705SXin Li template<>
test_attach38(int aaa,int bbb)927*67e74705SXin Li void test_attach37<int>::test_attach38(int aaa, int bbb) {}
928*67e74705SXin Li
929*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
930*67e74705SXin Li /// \brief\author Aaa
931*67e74705SXin Li /// \tparam T Aaa
932*67e74705SXin Li template<typename T>
test_attach39(int aaa,int bbb)933*67e74705SXin Li void test_attach37<T>::test_attach39(int aaa, int bbb) {}
934*67e74705SXin Li
935*67e74705SXin Li // We used to emit warning that parameter 'a' is not found because we parsed
936*67e74705SXin Li // the comment in context of the redeclaration which does not have parameter
937*67e74705SXin Li // names.
938*67e74705SXin Li template <typename T>
939*67e74705SXin Li struct test_attach38 {
940*67e74705SXin Li /*!
941*67e74705SXin Li \param a First param
942*67e74705SXin Li \param b Second param
943*67e74705SXin Li */
944*67e74705SXin Li template <typename B>
945*67e74705SXin Li void test_attach39(T a, B b);
946*67e74705SXin Li };
947*67e74705SXin Li
948*67e74705SXin Li template <>
949*67e74705SXin Li template <typename B>
950*67e74705SXin Li void test_attach38<int>::test_attach39(int, B);
951*67e74705SXin Li
952*67e74705SXin Li
953*67e74705SXin Li // PR13411, reduced. We used to crash on this.
954*67e74705SXin Li /**
955*67e74705SXin Li * @code Aaa.
956*67e74705SXin Li */
957*67e74705SXin Li void test_nocrash1(int);
958*67e74705SXin Li
959*67e74705SXin Li // We used to crash on this.
960*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '\param' command}}
961*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
962*67e74705SXin Li /// \param\brief
963*67e74705SXin Li void test_nocrash2(int);
964*67e74705SXin Li
965*67e74705SXin Li // PR13593, example 1 and 2
966*67e74705SXin Li
967*67e74705SXin Li /**
968*67e74705SXin Li * Bla.
969*67e74705SXin Li */
970*67e74705SXin Li template <typename>
971*67e74705SXin Li void test_nocrash3();
972*67e74705SXin Li
973*67e74705SXin Li /// Foo
974*67e74705SXin Li template <typename, typename>
test_nocrash4()975*67e74705SXin Li void test_nocrash4() { }
976*67e74705SXin Li
977*67e74705SXin Li template <typename>
test_nocrash3()978*67e74705SXin Li void test_nocrash3()
979*67e74705SXin Li {
980*67e74705SXin Li }
981*67e74705SXin Li
982*67e74705SXin Li // PR13593, example 3
983*67e74705SXin Li
984*67e74705SXin Li /**
985*67e74705SXin Li * aaa
986*67e74705SXin Li */
987*67e74705SXin Li template <typename T>
test_nocrash5(T a1)988*67e74705SXin Li inline T test_nocrash5(T a1)
989*67e74705SXin Li {
990*67e74705SXin Li return a1;
991*67e74705SXin Li }
992*67e74705SXin Li
993*67e74705SXin Li ///
994*67e74705SXin Li //,
995*67e74705SXin Li
test_nocrash6()996*67e74705SXin Li inline void test_nocrash6()
997*67e74705SXin Li {
998*67e74705SXin Li test_nocrash5(1);
999*67e74705SXin Li }
1000*67e74705SXin Li
1001*67e74705SXin Li // We used to crash on this.
1002*67e74705SXin Li
1003*67e74705SXin Li /*!
1004*67e74705SXin Li Blah.
1005*67e74705SXin Li */
1006*67e74705SXin Li typedef const struct test_nocrash7 * test_nocrash8;
1007*67e74705SXin Li
1008*67e74705SXin Li // We used to crash on this.
1009*67e74705SXin Li
1010*67e74705SXin Li // expected-warning@+1 {{unknown command tag name}}
1011*67e74705SXin Li /// aaa \unknown aaa \unknown aaa
1012*67e74705SXin Li int test_nocrash9;
1013*67e74705SXin Li
1014*67e74705SXin Li // We used to crash on this. PR15068
1015*67e74705SXin Li
1016*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '@param' command}}
1017*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '@param' command}}
1018*67e74705SXin Li ///@param x
1019*67e74705SXin Li ///@param y
1020*67e74705SXin Li int test_nocrash10(int x, int y);
1021*67e74705SXin Li
1022*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '@param' command}} expected-warning@+2 {{parameter 'x' not found in the function declaration}}
1023*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '@param' command}} expected-warning@+2 {{parameter 'y' not found in the function declaration}}
1024*67e74705SXin Li ///@param x
1025*67e74705SXin Li ///@param y
1026*67e74705SXin Li int test_nocrash11();
1027*67e74705SXin Li
1028*67e74705SXin Li // expected-warning@+3 {{empty paragraph passed to '@param' command}} expected-warning@+3 {{parameter 'x' not found in the function declaration}}
1029*67e74705SXin Li // expected-warning@+3 {{empty paragraph passed to '@param' command}} expected-warning@+3 {{parameter 'y' not found in the function declaration}}
1030*67e74705SXin Li /**
1031*67e74705SXin Li @param x
1032*67e74705SXin Li @param y
1033*67e74705SXin Li **/
1034*67e74705SXin Li int test_nocrash12();
1035*67e74705SXin Li
1036*67e74705SXin Li // expected-warning@+2 {{empty paragraph passed to '@param' command}}
1037*67e74705SXin Li // expected-warning@+1 {{empty paragraph passed to '@param' command}}
1038*67e74705SXin Li ///@param x@param y
1039*67e74705SXin Li int test_nocrash13(int x, int y);
1040*67e74705SXin Li
1041*67e74705SXin Li /**
1042*67e74705SXin Li * \verbatim
1043*67e74705SXin Li * Aaa
1044*67e74705SXin Li **/
1045*67e74705SXin Li int test_nocrash14();
1046*67e74705SXin Li
1047*67e74705SXin Li // rdar://12379114
1048*67e74705SXin Li // expected-warning@+2 {{'@union' command should not be used in a comment attached to a non-union declaration}}
1049*67e74705SXin Li /*!
1050*67e74705SXin Li @union U This is new
1051*67e74705SXin Li */
1052*67e74705SXin Li struct U { int iS; };
1053*67e74705SXin Li
1054*67e74705SXin Li /*!
1055*67e74705SXin Li @union U1
1056*67e74705SXin Li */
1057*67e74705SXin Li union U1 {int i; };
1058*67e74705SXin Li
1059*67e74705SXin Li // expected-warning@+2 {{'@struct' command should not be used in a comment attached to a non-struct declaration}}
1060*67e74705SXin Li /*!
1061*67e74705SXin Li @struct S2
1062*67e74705SXin Li */
1063*67e74705SXin Li union S2 {};
1064*67e74705SXin Li
1065*67e74705SXin Li /*!
1066*67e74705SXin Li @class C1
1067*67e74705SXin Li */
1068*67e74705SXin Li class C1;
1069*67e74705SXin Li
1070*67e74705SXin Li /*!
1071*67e74705SXin Li @struct S3;
1072*67e74705SXin Li */
1073*67e74705SXin Li class S3;
1074*67e74705SXin Li
1075*67e74705SXin Li // rdar://14124702
1076*67e74705SXin Li //----------------------------------------------------------------------
1077*67e74705SXin Li /// @class Predicate Predicate.h "lldb/Host/Predicate.h"
1078*67e74705SXin Li /// @brief A C++ wrapper class for providing threaded access to a value
1079*67e74705SXin Li /// of type T.
1080*67e74705SXin Li ///
1081*67e74705SXin Li /// A templatized class.
1082*67e74705SXin Li /// specified values.
1083*67e74705SXin Li //----------------------------------------------------------------------
1084*67e74705SXin Li template <class T, class T1>
1085*67e74705SXin Li class Predicate
1086*67e74705SXin Li {
1087*67e74705SXin Li };
1088*67e74705SXin Li
1089*67e74705SXin Li //----------------------------------------------------------------------
1090*67e74705SXin Li /// @class Predicate<int, char> Predicate.h "lldb/Host/Predicate.h"
1091*67e74705SXin Li /// @brief A C++ wrapper class for providing threaded access to a value
1092*67e74705SXin Li /// of type T.
1093*67e74705SXin Li ///
1094*67e74705SXin Li /// A template specilization class.
1095*67e74705SXin Li //----------------------------------------------------------------------
1096*67e74705SXin Li template<> class Predicate<int, char>
1097*67e74705SXin Li {
1098*67e74705SXin Li };
1099*67e74705SXin Li
1100*67e74705SXin Li //----------------------------------------------------------------------
1101*67e74705SXin Li /// @class Predicate<T, int> Predicate.h "lldb/Host/Predicate.h"
1102*67e74705SXin Li /// @brief A C++ wrapper class for providing threaded access to a value
1103*67e74705SXin Li /// of type T.
1104*67e74705SXin Li ///
1105*67e74705SXin Li /// A partial specialization template class.
1106*67e74705SXin Li //----------------------------------------------------------------------
1107*67e74705SXin Li template<class T> class Predicate<T, int>
1108*67e74705SXin Li {
1109*67e74705SXin Li };
1110*67e74705SXin Li
1111*67e74705SXin Li /*! @function test_function
1112*67e74705SXin Li */
1113*67e74705SXin Li template <class T> T test_function (T arg);
1114*67e74705SXin Li
1115*67e74705SXin Li /*! @function test_function<int>
1116*67e74705SXin Li */
1117*67e74705SXin Li template <> int test_function<int> (int arg);
1118