blob: 43143ff83d0217b9e22e62b59846869af9c78fad [file] [log] [blame]
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +00001// RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wdocumentation -Wdocumentation-pedantic -verify %s
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00002
Dmitri Gribenkof303d4c2012-08-07 17:54:38 +00003// This file contains lots of corner cases, so ensure that XML we generate is not invalid.
4// 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// WRONG-NOT: CommentXMLInvalid
6
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +00007// expected-warning@+1 {{expected quoted string after equals sign}}
8/// <a href=>
9int test_html1(int);
10
11// expected-warning@+1 {{expected quoted string after equals sign}}
12/// <a href==>
13int test_html2(int);
14
15// expected-warning@+2 {{expected quoted string after equals sign}}
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000016// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000017/// <a href= blah
18int test_html3(int);
19
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000020// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000021/// <a =>
22int test_html4(int);
23
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000024// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000025/// <a "aaa">
26int test_html5(int);
27
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000028// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000029/// <a a="b" =>
30int test_html6(int);
31
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000032// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000033/// <a a="b" "aaa">
34int test_html7(int);
35
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000036// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000037/// <a a="b" =
38int test_html8(int);
39
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000040// expected-warning@+2 {{HTML start tag prematurely ended, expected attribute name or '>'}} expected-note@+1 {{HTML tag started here}}
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +000041/** Aaa bbb<img ddd eee
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000042 * fff ggg.
43 */
44int test_html9(int);
45
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000046// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
Dmitri Gribenko834a5bd2012-08-22 22:56:08 +000047/** Aaa bbb<img ddd eee 42%
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000048 * fff ggg.
49 */
50int test_html10(int);
51
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000052// expected-warning@+1 {{HTML end tag 'br' is forbidden}}
Dmitri Gribenko3d986982012-07-12 23:37:09 +000053/// <br></br>
54int test_html11(int);
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000055
56/// <blockquote>Meow</blockquote>
57int test_html_nesting1(int);
58
59/// <b><i>Meow</i></b>
60int test_html_nesting2(int);
61
62/// <p>Aaa<br>
63/// Bbb</p>
64int test_html_nesting3(int);
65
66/// <p>Aaa<br />
67/// Bbb</p>
68int test_html_nesting4(int);
69
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000070// expected-warning@+1 {{HTML end tag does not match any start tag}}
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000071/// <b><i>Meow</a>
72int test_html_nesting5(int);
73
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000074// expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
75// expected-warning@+1 {{HTML end tag does not match any start tag}}
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000076/// <b><i>Meow</b></b>
77int test_html_nesting6(int);
78
Dmitri Gribenko3f38bf22012-07-13 00:44:24 +000079// expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
80// expected-warning@+1 {{HTML end tag does not match any start tag}}
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000081/// <b><i>Meow</b></i>
82int test_html_nesting7(int);
83
84
85// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +000086/// \brief\returns Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000087int test_block_command1(int);
88
89// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +000090/// \brief \returns Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000091int test_block_command2(int);
92
93// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
94/// \brief
Dmitri Gribenko9443c572012-08-06 17:08:27 +000095/// \returns Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +000096int test_block_command3(int);
97
98// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
99/// \brief
100///
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000101/// \returns Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000102int test_block_command4(int);
103
104// There is trailing whitespace on one of the following lines, don't remove it!
105// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
106/// \brief
107///
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000108/// \returns Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000109int test_block_command5(int);
110
Dmitri Gribenko858e69f2012-07-19 00:01:56 +0000111/// \brief \c Aaa
112int test_block_command6(int);
113
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000114// expected-warning@+5 {{duplicated command '\brief'}} expected-note@+1 {{previous command '\brief' here}}
115/// \brief Aaa
116///
117/// Bbb
118///
119/// \brief Ccc
120int test_duplicate_brief1(int);
121
122// expected-warning@+5 {{duplicated command '\short'}} expected-note@+1 {{previous command '\short' here}}
123/// \short Aaa
124///
125/// Bbb
126///
127/// \short Ccc
128int test_duplicate_brief2(int);
129
130// expected-warning@+5 {{duplicated command '\brief'}} expected-note@+1 {{previous command '\short' (an alias of '\brief') here}}
131/// \short Aaa
132///
133/// Bbb
134///
135/// \brief Ccc
136int test_duplicate_brief3(int);
137
138
139// expected-warning@+5 {{duplicated command '\return'}} expected-note@+1 {{previous command '\return' here}}
140/// \return Aaa
141///
142/// Bbb
143///
144/// \return Ccc
145int test_duplicate_returns1(int);
146
147// expected-warning@+5 {{duplicated command '\returns'}} expected-note@+1 {{previous command '\returns' here}}
148/// \returns Aaa
149///
150/// Bbb
151///
152/// \returns Ccc
153int test_duplicate_returns2(int);
154
155// expected-warning@+5 {{duplicated command '\result'}} expected-note@+1 {{previous command '\result' here}}
156/// \result Aaa
157///
158/// Bbb
159///
160/// \result Ccc
161int test_duplicate_returns3(int);
162
163// expected-warning@+5 {{duplicated command '\return'}} expected-note@+1 {{previous command '\returns' (an alias of '\return') here}}
164/// \returns Aaa
165///
166/// Bbb
167///
168/// \return Ccc
169int test_duplicate_returns4(int);
170
171
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000172// expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
173/// \param a Blah blah.
174int test_param1;
175
176// expected-warning@+1 {{empty paragraph passed to '\param' command}}
177/// \param
178/// \param a Blah blah.
179int test_param2(int a);
180
181// expected-warning@+1 {{empty paragraph passed to '\param' command}}
182/// \param a
183int test_param3(int a);
184
185/// \param a Blah blah.
186int test_param4(int a);
187
188/// \param [in] a Blah blah.
189int test_param5(int a);
190
191/// \param [out] a Blah blah.
192int test_param6(int a);
193
194/// \param [in,out] a Blah blah.
195int test_param7(int a);
196
197// expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
198/// \param [ in ] a Blah blah.
199int test_param8(int a);
200
201// expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
202/// \param [in, out] a Blah blah.
203int test_param9(int a);
204
205// expected-warning@+1 {{unrecognized parameter passing direction, valid directions are '[in]', '[out]' and '[in,out]'}}
206/// \param [ junk] a Blah blah.
207int test_param10(int a);
208
Dmitri Gribenko2e721042012-07-24 21:56:59 +0000209// expected-warning@+1 {{parameter 'a' not found in the function declaration}}
Dmitri Gribenko56bf6fd2012-07-24 21:46:24 +0000210/// \param a Blah blah.
211int test_param11();
212
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000213// expected-warning@+1 {{parameter 'A' not found in the function declaration}} expected-note@+1 {{did you mean 'a'?}}
214/// \param A Blah blah.
Dmitri Gribenko56bf6fd2012-07-24 21:46:24 +0000215int test_param12(int a);
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000216
217// expected-warning@+1 {{parameter 'aab' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
218/// \param aab Blah blah.
Dmitri Gribenko56bf6fd2012-07-24 21:46:24 +0000219int test_param13(int aaa, int bbb);
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000220
221// expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
222/// \param aab Blah blah.
Dmitri Gribenko56bf6fd2012-07-24 21:46:24 +0000223int test_param14(int bbb, int ccc);
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000224
225class C {
226 // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
227 /// \param aaa Blah blah.
228 C(int bbb, int ccc);
229
230 // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
231 /// \param aaa Blah blah.
Dmitri Gribenko56bf6fd2012-07-24 21:46:24 +0000232 int test_param15(int bbb, int ccc);
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000233};
234
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000235// expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
236/// \param aab Blah blah.
237template<typename T>
238void test_param16(int bbb, int ccc);
239
Dmitri Gribenko65822772012-07-24 21:44:16 +0000240// expected-warning@+3 {{parameter 'a' is already documented}}
241// expected-note@+1 {{previous documentation}}
242/// \param a Aaa.
243/// \param a Aaa.
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000244int test_param17(int a);
Dmitri Gribenko65822772012-07-24 21:44:16 +0000245
246// expected-warning@+4 {{parameter 'x2' is already documented}}
247// expected-note@+2 {{previous documentation}}
248/// \param x1 Aaa.
249/// \param x2 Bbb.
250/// \param x2 Ccc.
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000251int test_param18(int x1, int x2, int x3);
252
Dmitri Gribenko70ff1092012-08-24 00:05:30 +0000253// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'aaa'?}}
254/// \param aaa Meow.
255/// \param bbb Bbb.
256/// \returns aaa.
257typedef int test_param19(int aaa);
258
259// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'aaa'?}}
260/// \param aaa Meow.
261/// \param bbb Bbb.
262/// \returns aaa.
263typedef int (*test_param20)(int aaa);
264
265// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'aaa'?}}
266/// \param aaa Meow.
267/// \param bbb Bbb.
268/// \returns aaa.
269typedef int (* const test_param21)(int aaa);
270
271// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'aaa'?}}
272/// \param aaa Meow.
273/// \param bbb Bbb.
274/// \returns aaa.
275typedef int (C::*test_param22)(int aaa);
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000276
277// expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
278/// \tparam T Aaa
279int test_tparam1;
280
281// expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
282/// \tparam T Aaa
283void test_tparam2(int aaa);
284
285// expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
286/// \tparam
287/// \param aaa Blah blah
288template<typename T>
289void test_tparam3(T aaa);
290
291// expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
292/// \tparam T Aaa
293template<typename TT>
294void test_tparam4(TT aaa);
295
296// expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
297/// \tparam T Aaa
298template<typename TT>
299class test_tparam5 {
300 // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TTT'?}}
301 /// \tparam T Aaa
302 template<typename TTT>
303 void test_tparam6(TTT aaa);
304};
305
306/// \tparam T1 Aaa
307/// \tparam T2 Bbb
308template<typename T1, typename T2>
309void test_tparam7(T1 aaa, T2 bbb);
310
311// expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}}
312/// \tparam SomTy Aaa
313/// \tparam OtherTy Bbb
314template<typename SomeTy, typename OtherTy>
315void test_tparam8(SomeTy aaa, OtherTy bbb);
316
317// expected-warning@+2 {{template parameter 'T1' is already documented}} expected-note@+1 {{previous documentation}}
318/// \tparam T1 Aaa
319/// \tparam T1 Bbb
320template<typename T1, typename T2>
321void test_tparam9(T1 aaa, T2 bbb);
322
323/// \tparam T Aaa
324/// \tparam TT Bbb
325template<template<typename T> class TT>
326void test_tparam10(TT<int> aaa);
327
328/// \tparam T Aaa
329/// \tparam TT Bbb
330/// \tparam TTT Ccc
331template<template<template<typename T> class TT, class C> class TTT>
332void test_tparam11();
333
334/// \tparam I Aaa
335template<int I>
336void test_tparam12();
337
Dmitri Gribenko967e5d72012-08-02 21:36:57 +0000338template<typename T, typename U>
339class test_tparam13 { };
340
341/// \tparam T Aaa
342template<typename T>
343using test_tparam14 = test_tparam13<T, int>;
344
345// expected-warning@+1 {{template parameter 'U' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}}
346/// \tparam U Aaa
347template<typename T>
348using test_tparam15 = test_tparam13<T, int>;
349
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000350// no-warning
351/// \returns Aaa
352int test_returns_right_decl_1(int);
353
354class test_returns_right_decl_2 {
355 // no-warning
356 /// \returns Aaa
357 int test_returns_right_decl_3(int);
358};
359
360// no-warning
361/// \returns Aaa
362template<typename T>
363int test_returns_right_decl_4(T aaa);
364
365// no-warning
366/// \returns Aaa
367template<>
368int test_returns_right_decl_4(int aaa);
369
370/// \returns Aaa
371template<typename T>
372T test_returns_right_decl_5(T aaa);
373
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000374// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000375/// \returns Aaa
376int test_returns_wrong_decl_1;
377
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000378// expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000379/// \return Aaa
380int test_returns_wrong_decl_2;
381
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000382// expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000383/// \result Aaa
384int test_returns_wrong_decl_3;
385
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000386// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000387/// \returns Aaa
388void test_returns_wrong_decl_4(int);
389
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000390// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000391/// \returns Aaa
392template<typename T>
393void test_returns_wrong_decl_5(T aaa);
394
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000395// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000396/// \returns Aaa
397template<>
398void test_returns_wrong_decl_5(int aaa);
399
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000400// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000401/// \returns Aaa
402struct test_returns_wrong_decl_6 { };
403
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000404// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000405/// \returns Aaa
406class test_returns_wrong_decl_7 {
407 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}}
408 /// \returns Aaa
409 test_returns_wrong_decl_7();
410
411 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}}
412 /// \returns Aaa
413 ~test_returns_wrong_decl_7();
414};
415
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000416// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000417/// \returns Aaa
418enum test_returns_wrong_decl_8 {
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000419 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000420 /// \returns Aaa
421 test_returns_wrong_decl_9
422};
423
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000424// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000425/// \returns Aaa
426namespace test_returns_wrong_decl_10 { };
427
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000428
429// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000430int test1; ///< \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000431
432// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
433// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000434int test2, ///< \brief\author Aaa
435 test3; ///< \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000436
437// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
438int test4; ///< \brief
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000439 ///< \author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000440
441
442// Check that we attach the comment to the declaration during parsing in the
443// following cases. The test is based on the fact that we don't parse
444// documentation comments that are not attached to anything.
445
446// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000447/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000448int test_attach1;
449
450// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000451/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000452int test_attach2(int);
453
454// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000455/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000456struct test_attach3 {
457 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000458 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000459 int test_attach4;
460
461 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000462 int test_attach5; ///< \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000463
464 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000465 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000466 int test_attach6(int);
467};
468
469// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000470/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000471class test_attach7 {
472 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000473 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000474 int test_attach8;
475
476 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000477 int test_attach9; ///< \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000478
479 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000480 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000481 int test_attach10(int);
482};
483
484// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000485/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000486enum test_attach9 {
487 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000488 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000489 test_attach10,
490
491 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000492 test_attach11 ///< \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000493};
494
495// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000496/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000497struct test_noattach12 *test_attach13;
498
499// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000500/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000501typedef struct test_noattach14 *test_attach15;
502
503// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000504/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000505typedef struct test_attach16 { int a; } test_attach17;
506
507struct S { int a; };
508
509// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000510/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000511struct S *test_attach18;
512
513// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000514/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000515typedef struct S *test_attach19;
516
517// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000518/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000519struct test_attach20;
520
521// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000522/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000523typedef struct test_attach21 {
524 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000525 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000526 int test_attach22;
527} test_attach23;
528
529// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000530/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000531namespace test_attach24 {
532 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000533 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000534 namespace test_attach25 {
535 }
536}
537
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000538// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000539/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000540/// \tparam T Aaa
541template<typename T>
542void test_attach26(T aaa);
543
544// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000545/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000546/// \tparam T Aaa
547template<typename T, typename U>
548void test_attach27(T aaa, U bbb);
549
550// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
551// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000552/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000553/// \tparam T Aaa
554template<>
555void test_attach27(int aaa, int bbb);
556
557// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000558/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000559/// \tparam T Aaa
560template<typename T>
561class test_attach28 {
562 T aaa;
563};
564
565// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000566/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000567using test_attach29 = test_attach28<int>;
568
569// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000570/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000571/// \tparam T Aaa
572template<typename T, typename U>
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000573class test_attach30 { };
574
575// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000576/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000577/// \tparam T Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000578template<typename T>
579class test_attach30<T, int> { };
580
581// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000582/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000583template<>
584class test_attach30<int, int> { };
585
586// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000587/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000588template<typename T>
589using test_attach31 = test_attach30<T, int>;
590
591// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000592/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000593/// \tparam T Aaa
594template<typename T, typename U, typename V>
595class test_attach32 { };
596
597// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000598/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000599/// \tparam T Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000600template<typename T, typename U>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000601class test_attach32<T, U, int> { };
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000602
603// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000604/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000605/// \tparam T Aaa
606template<typename T>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000607class test_attach32<T, int, int> { };
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000608
609// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
610// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000611/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000612/// \tparam T Aaa
613template<>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000614class test_attach32<int, int, int> { };
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000615
616// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000617/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000618class test_attach33 {
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000619 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000620 /// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000621 /// \tparam T Aaa
622 template<typename T, typename U>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000623 void test_attach34(T aaa, U bbb);
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000624};
625
626template<typename T>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000627class test_attach35 {
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000628 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
629 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000630 /// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000631 /// \tparam T Aaa
632 template<typename TT, typename UU>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000633 void test_attach36(TT aaa, UU bbb);
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000634};
635
636// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
637// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000638/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000639/// \tparam T Aaa
640template<> template<>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000641void test_attach35<int>::test_attach36(int aaa, int bbb) {}
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000642
643template<typename T>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000644class test_attach37 {
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000645 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
646 // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000647 /// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000648 /// \tparam T Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000649 void test_attach38(int aaa, int bbb);
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000650
Dmitri Gribenkoc41ace92012-08-14 17:17:18 +0000651 void test_attach39(int aaa, int bbb);
652};
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000653
654// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
655// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000656/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000657/// \tparam T Aaa
658template<>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000659void test_attach37<int>::test_attach38(int aaa, int bbb) {}
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000660
Dmitri Gribenkoc41ace92012-08-14 17:17:18 +0000661// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
662/// \brief\author Aaa
663/// \tparam T Aaa
664template<typename T>
665void test_attach37<T>::test_attach39(int aaa, int bbb) {}
666
Dmitri Gribenko1599eac2012-08-16 18:19:43 +0000667// We used to emit warning that parameter 'a' is not found because we parsed
668// the comment in context of the redeclaration which does not have parameter
669// names.
670template <typename T>
671struct test_attach38 {
672 /*!
673 \param a First param
674 \param b Second param
675 */
676 template <typename B>
677 void test_attach39(T a, B b);
678};
679
680template <>
681template <typename B>
682void test_attach38<int>::test_attach39(int, B);
Dmitri Gribenkoc41ace92012-08-14 17:17:18 +0000683
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000684
Dmitri Gribenko9f08f492012-07-20 20:18:53 +0000685// PR13411, reduced. We used to crash on this.
686/**
687 * @code Aaa.
688 */
689void test_nocrash1(int);
690
Dmitri Gribenkoe5deb792012-07-30 18:05:28 +0000691// We used to crash on this.
692// expected-warning@+2 {{empty paragraph passed to '\param' command}}
693// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
694/// \param\brief
695void test_nocrash2(int);
696
Dmitri Gribenkoc41ace92012-08-14 17:17:18 +0000697// PR13593, example 1 and 2
Douglas Gregorcd81df22012-08-13 16:37:30 +0000698
699/**
700* Bla.
701*/
702template <typename>
703void test_nocrash3();
704
705/// Foo
706template <typename, typename>
707void test_nocrash4() { }
708
709template <typename>
710void test_nocrash3()
711{
712}
Dmitri Gribenkoc41ace92012-08-14 17:17:18 +0000713
714// PR13593, example 3
715
716/**
717 * aaa
718 */
719template <typename T>
720inline T test_nocrash5(T a1)
721{
722 return a1;
723}
724
725///
726//,
727
728inline void test_nocrash6()
729{
730 test_nocrash5(1);
731}
732
733// We used to crash on this.
734
735/*!
736 Blah.
737*/
738typedef const struct test_nocrash7 * test_nocrash8;
739