blob: 8b38ddd81a96e813244657514c815fef17bccfab [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
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000221// expected-warning@+2 {{parameter 'aab' not found in the function declaration}} expected-note@+2 {{did you mean 'bbb'?}}
222/// \param aaa Blah blah.
223/// \param aab Blah blah.
224int test_param14(int aaa, int bbb);
225
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000226// expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
227/// \param aab Blah blah.
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000228int test_param15(int bbb, int ccc);
229
230// expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
231/// \param aab Ccc.
232/// \param aaa Aaa.
233/// \param bbb Bbb.
234int test_param16(int aaa, int bbb);
235
236// expected-warning@+2 {{parameter 'aab' not found in the function declaration}}
237/// \param aaa Aaa.
238/// \param aab Ccc.
239/// \param bbb Bbb.
240int test_param17(int aaa, int bbb);
241
242// expected-warning@+3 {{parameter 'aab' not found in the function declaration}}
243/// \param aaa Aaa.
244/// \param bbb Bbb.
245/// \param aab Ccc.
246int test_param18(int aaa, int bbb);
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000247
248class C {
249 // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
250 /// \param aaa Blah blah.
251 C(int bbb, int ccc);
252
253 // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
254 /// \param aaa Blah blah.
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000255 int test_param19(int bbb, int ccc);
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000256};
257
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000258// expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
259/// \param aab Blah blah.
260template<typename T>
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000261void test_param20(int bbb, int ccc);
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000262
Dmitri Gribenko65822772012-07-24 21:44:16 +0000263// expected-warning@+3 {{parameter 'a' is already documented}}
264// expected-note@+1 {{previous documentation}}
265/// \param a Aaa.
266/// \param a Aaa.
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000267int test_param21(int a);
Dmitri Gribenko65822772012-07-24 21:44:16 +0000268
269// expected-warning@+4 {{parameter 'x2' is already documented}}
270// expected-note@+2 {{previous documentation}}
271/// \param x1 Aaa.
272/// \param x2 Bbb.
273/// \param x2 Ccc.
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000274int test_param22(int x1, int x2, int x3);
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000275
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000276// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
Dmitri Gribenko70ff1092012-08-24 00:05:30 +0000277/// \param aaa Meow.
278/// \param bbb Bbb.
279/// \returns aaa.
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000280typedef int test_param23(int aaa, int ccc);
Dmitri Gribenko70ff1092012-08-24 00:05:30 +0000281
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000282// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
Dmitri Gribenko70ff1092012-08-24 00:05:30 +0000283/// \param aaa Meow.
284/// \param bbb Bbb.
285/// \returns aaa.
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000286typedef int (*test_param24)(int aaa, int ccc);
Dmitri Gribenko70ff1092012-08-24 00:05:30 +0000287
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000288// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
Dmitri Gribenko70ff1092012-08-24 00:05:30 +0000289/// \param aaa Meow.
290/// \param bbb Bbb.
291/// \returns aaa.
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000292typedef int (* const test_param25)(int aaa, int ccc);
Dmitri Gribenko70ff1092012-08-24 00:05:30 +0000293
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000294// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
Dmitri Gribenko70ff1092012-08-24 00:05:30 +0000295/// \param aaa Meow.
296/// \param bbb Bbb.
297/// \returns aaa.
Dmitri Gribenko9edd2c82012-08-24 17:45:39 +0000298typedef int (C::*test_param26)(int aaa, int ccc);
299
Dmitri Gribenkoec504e02012-09-15 21:13:36 +0000300typedef int (*test_param27)(int aaa);
301
302// expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
303/// \param aaa Meow.
304typedef test_param27 test_param28;
305
Dmitri Gribenko151b2ac2013-03-04 19:39:33 +0000306// rdar://13066276
307// expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
308/// @param aaa Meow.
309typedef unsigned int test_param29;
310
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000311
312// expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
313/// \tparam T Aaa
314int test_tparam1;
315
316// expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
317/// \tparam T Aaa
318void test_tparam2(int aaa);
319
320// expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
321/// \tparam
322/// \param aaa Blah blah
323template<typename T>
324void test_tparam3(T aaa);
325
326// expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
327/// \tparam T Aaa
328template<typename TT>
329void test_tparam4(TT aaa);
330
331// expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
332/// \tparam T Aaa
333template<typename TT>
334class test_tparam5 {
335 // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TTT'?}}
336 /// \tparam T Aaa
337 template<typename TTT>
338 void test_tparam6(TTT aaa);
339};
340
341/// \tparam T1 Aaa
342/// \tparam T2 Bbb
343template<typename T1, typename T2>
344void test_tparam7(T1 aaa, T2 bbb);
345
346// expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}}
347/// \tparam SomTy Aaa
348/// \tparam OtherTy Bbb
349template<typename SomeTy, typename OtherTy>
350void test_tparam8(SomeTy aaa, OtherTy bbb);
351
352// expected-warning@+2 {{template parameter 'T1' is already documented}} expected-note@+1 {{previous documentation}}
353/// \tparam T1 Aaa
354/// \tparam T1 Bbb
355template<typename T1, typename T2>
356void test_tparam9(T1 aaa, T2 bbb);
357
358/// \tparam T Aaa
359/// \tparam TT Bbb
360template<template<typename T> class TT>
361void test_tparam10(TT<int> aaa);
362
363/// \tparam T Aaa
364/// \tparam TT Bbb
365/// \tparam TTT Ccc
366template<template<template<typename T> class TT, class C> class TTT>
367void test_tparam11();
368
369/// \tparam I Aaa
370template<int I>
371void test_tparam12();
372
Dmitri Gribenko967e5d72012-08-02 21:36:57 +0000373template<typename T, typename U>
374class test_tparam13 { };
375
376/// \tparam T Aaa
377template<typename T>
378using test_tparam14 = test_tparam13<T, int>;
379
380// expected-warning@+1 {{template parameter 'U' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}}
381/// \tparam U Aaa
382template<typename T>
383using test_tparam15 = test_tparam13<T, int>;
384
Dmitri Gribenkod1e5c0d2013-01-27 21:18:39 +0000385// ----
386
387/// \tparam T Aaa
388template<typename T>
389class test_tparam16 { };
390
391typedef test_tparam16<int> test_tparam17;
392typedef test_tparam16<double> test_tparam18;
393
394// ----
395
396template<typename T>
397class test_tparam19;
398
399typedef test_tparam19<int> test_tparam20;
400typedef test_tparam19<double> test_tparam21;
401
402/// \tparam T Aaa
403template<typename T>
404class test_tparam19 { };
405
406// ----
407
Dmitri Gribenko8cc9c9d2013-03-04 20:23:16 +0000408// expected-warning@+1 {{'@tparam' command used in a comment that is not attached to a template declaration}}
409/// @tparam T Aaa
410int test_tparam22;
411
412// ----
413
Dmitri Gribenkoabcf0dc2012-09-13 20:36:01 +0000414
415/// Aaa
416/// \deprecated Bbb
Dmitri Gribenko0bd98382012-09-22 21:47:50 +0000417void test_deprecated_1(int a) __attribute__((deprecated));
Dmitri Gribenkoabcf0dc2012-09-13 20:36:01 +0000418
419// We don't want \deprecated to warn about empty paragraph. It is fine to use
420// \deprecated by itself without explanations.
421
422/// Aaa
423/// \deprecated
Dmitri Gribenko0bd98382012-09-22 21:47:50 +0000424void test_deprecated_2(int a) __attribute__((deprecated));
425
426/// Aaa
427/// \deprecated
428void test_deprecated_3(int a) __attribute__((availability(macosx,introduced=10.4)));
429
430/// Aaa
431/// \deprecated
432void test_deprecated_4(int a) __attribute__((unavailable));
433
434// 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}}
435/// Aaa
436/// \deprecated
437void test_deprecated_5(int a);
438
439// 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}}
440/// Aaa
441/// \deprecated
442void test_deprecated_6(int a) {
443}
444
445// expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
446/// Aaa
447/// \deprecated
448template<typename T>
449void test_deprecated_7(T aaa);
Dmitri Gribenkoabcf0dc2012-09-13 20:36:01 +0000450
451
Dmitri Gribenko151b2ac2013-03-04 19:39:33 +0000452// rdar://12397511
453// expected-note@+2 {{previous command '\headerfile' here}}
454// expected-warning@+2 {{duplicated command '\headerfile'}}
455/// \headerfile ""
456/// \headerfile foo.h
457int test__headerfile_1(int a);
458
459
Dmitri Gribenko388a5942012-09-14 15:37:29 +0000460/// \invariant aaa
461void test_invariant_1(int a);
462
463// expected-warning@+1 {{empty paragraph passed to '\invariant' command}}
464/// \invariant
465void test_invariant_2(int a);
466
467
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000468// no-warning
469/// \returns Aaa
470int test_returns_right_decl_1(int);
471
472class test_returns_right_decl_2 {
473 // no-warning
474 /// \returns Aaa
475 int test_returns_right_decl_3(int);
476};
477
478// no-warning
479/// \returns Aaa
480template<typename T>
481int test_returns_right_decl_4(T aaa);
482
483// no-warning
484/// \returns Aaa
485template<>
486int test_returns_right_decl_4(int aaa);
487
488/// \returns Aaa
489template<typename T>
490T test_returns_right_decl_5(T aaa);
491
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000492// 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 +0000493/// \returns Aaa
494int test_returns_wrong_decl_1;
495
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000496// 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 +0000497/// \return Aaa
498int test_returns_wrong_decl_2;
499
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000500// 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 +0000501/// \result Aaa
502int test_returns_wrong_decl_3;
503
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000504// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000505/// \returns Aaa
506void test_returns_wrong_decl_4(int);
507
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000508// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000509/// \returns Aaa
510template<typename T>
511void test_returns_wrong_decl_5(T aaa);
512
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000513// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
Dmitri Gribenko89ab7d02012-08-03 21:15:32 +0000514/// \returns Aaa
515template<>
516void test_returns_wrong_decl_5(int aaa);
517
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000518// 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 +0000519/// \returns Aaa
520struct test_returns_wrong_decl_6 { };
521
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000522// 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 +0000523/// \returns Aaa
524class test_returns_wrong_decl_7 {
525 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}}
526 /// \returns Aaa
527 test_returns_wrong_decl_7();
528
529 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}}
530 /// \returns Aaa
531 ~test_returns_wrong_decl_7();
532};
533
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000534// 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 +0000535/// \returns Aaa
536enum test_returns_wrong_decl_8 {
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000537 // 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 +0000538 /// \returns Aaa
539 test_returns_wrong_decl_9
540};
541
Dmitri Gribenko88815f32012-08-06 16:29:26 +0000542// 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 +0000543/// \returns Aaa
544namespace test_returns_wrong_decl_10 { };
545
Dmitri Gribenko151b2ac2013-03-04 19:39:33 +0000546// rdar://13066276
547// expected-warning@+1 {{'@returns' command used in a comment that is not attached to a function or method declaration}}
548/// @returns Aaa
549typedef unsigned int test_returns_wrong_decl_11;
550
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000551
Dmitri Gribenko36cbbe92012-11-18 00:30:31 +0000552// expected-warning@+1 {{'\endverbatim' command does not terminate a verbatim text block}}
553/// \endverbatim
554int test_verbatim_1();
555
556// expected-warning@+1 {{'\endcode' command does not terminate a verbatim text block}}
557/// \endcode
558int test_verbatim_2();
559
560// FIXME: we give a bad diagnostic here because we throw away non-documentation
561// comments early.
562//
NAKAMURA Takumibf823c02012-11-18 02:34:33 +0000563// expected-warning@+3 {{'\endcode' command does not terminate a verbatim text block}}
Dmitri Gribenko36cbbe92012-11-18 00:30:31 +0000564/// \code
565// foo
566/// \endcode
567int test_verbatim_3();
568
569
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000570// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000571int test1; ///< \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000572
573// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
574// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000575int test2, ///< \brief\author Aaa
576 test3; ///< \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000577
578// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
579int test4; ///< \brief
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000580 ///< \author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000581
582
583// Check that we attach the comment to the declaration during parsing in the
584// following cases. The test is based on the fact that we don't parse
585// documentation comments that are not attached to anything.
586
587// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000588/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000589int test_attach1;
590
591// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000592/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000593int test_attach2(int);
594
595// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000596/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000597struct test_attach3 {
598 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000599 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000600 int test_attach4;
601
602 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000603 int test_attach5; ///< \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000604
605 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000606 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000607 int test_attach6(int);
608};
609
610// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000611/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000612class test_attach7 {
613 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000614 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000615 int test_attach8;
616
617 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000618 int test_attach9; ///< \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000619
620 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000621 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000622 int test_attach10(int);
623};
624
625// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000626/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000627enum test_attach9 {
628 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000629 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000630 test_attach10,
631
632 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000633 test_attach11 ///< \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000634};
635
636// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000637/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000638struct test_noattach12 *test_attach13;
639
640// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000641/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000642typedef struct test_noattach14 *test_attach15;
643
644// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000645/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000646typedef struct test_attach16 { int a; } test_attach17;
647
648struct S { int a; };
649
650// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000651/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000652struct S *test_attach18;
653
654// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000655/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000656typedef struct S *test_attach19;
657
658// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000659/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000660struct test_attach20;
661
662// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000663/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000664typedef struct test_attach21 {
665 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000666 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000667 int test_attach22;
668} test_attach23;
669
670// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000671/// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000672namespace test_attach24 {
673 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000674 /// \brief\author Aaa
Dmitri Gribenkoa5ef44f2012-07-11 21:38:39 +0000675 namespace test_attach25 {
676 }
677}
678
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000679// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000680/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000681/// \tparam T Aaa
682template<typename T>
683void test_attach26(T aaa);
684
685// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000686/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000687/// \tparam T Aaa
688template<typename T, typename U>
689void test_attach27(T aaa, U bbb);
690
691// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
692// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000693/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000694/// \tparam T Aaa
695template<>
696void test_attach27(int aaa, int bbb);
697
698// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000699/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000700/// \tparam T Aaa
701template<typename T>
702class test_attach28 {
703 T aaa;
704};
705
706// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000707/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000708using test_attach29 = test_attach28<int>;
709
710// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000711/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000712/// \tparam T Aaa
713template<typename T, typename U>
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000714class test_attach30 { };
715
716// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000717/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000718/// \tparam T Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000719template<typename T>
720class test_attach30<T, int> { };
721
722// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000723/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000724template<>
725class test_attach30<int, int> { };
726
727// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000728/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000729template<typename T>
730using test_attach31 = test_attach30<T, int>;
731
732// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000733/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000734/// \tparam T Aaa
735template<typename T, typename U, typename V>
736class test_attach32 { };
737
738// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000739/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000740/// \tparam T Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000741template<typename T, typename U>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000742class test_attach32<T, U, int> { };
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000743
744// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000745/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000746/// \tparam T Aaa
747template<typename T>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000748class test_attach32<T, int, int> { };
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000749
750// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
751// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000752/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000753/// \tparam T Aaa
754template<>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000755class test_attach32<int, int, int> { };
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000756
757// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000758/// \brief\author Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000759class test_attach33 {
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000760 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000761 /// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000762 /// \tparam T Aaa
763 template<typename T, typename U>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000764 void test_attach34(T aaa, U bbb);
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000765};
766
767template<typename T>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000768class test_attach35 {
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000769 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
770 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000771 /// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000772 /// \tparam T Aaa
773 template<typename TT, typename UU>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000774 void test_attach36(TT aaa, UU bbb);
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000775};
776
777// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
778// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000779/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000780/// \tparam T Aaa
781template<> template<>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000782void test_attach35<int>::test_attach36(int aaa, int bbb) {}
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000783
784template<typename T>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000785class test_attach37 {
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000786 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
787 // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000788 /// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000789 /// \tparam T Aaa
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000790 void test_attach38(int aaa, int bbb);
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000791
Dmitri Gribenkoc41ace92012-08-14 17:17:18 +0000792 void test_attach39(int aaa, int bbb);
793};
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000794
795// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
796// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
Dmitri Gribenko9443c572012-08-06 17:08:27 +0000797/// \brief\author Aaa
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000798/// \tparam T Aaa
799template<>
Dmitri Gribenkoc27bc802012-08-02 20:49:51 +0000800void test_attach37<int>::test_attach38(int aaa, int bbb) {}
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000801
Dmitri Gribenkoc41ace92012-08-14 17:17:18 +0000802// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
803/// \brief\author Aaa
804/// \tparam T Aaa
805template<typename T>
806void test_attach37<T>::test_attach39(int aaa, int bbb) {}
807
Dmitri Gribenko1599eac2012-08-16 18:19:43 +0000808// We used to emit warning that parameter 'a' is not found because we parsed
809// the comment in context of the redeclaration which does not have parameter
810// names.
811template <typename T>
812struct test_attach38 {
813 /*!
814 \param a First param
815 \param b Second param
816 */
817 template <typename B>
818 void test_attach39(T a, B b);
819};
820
821template <>
822template <typename B>
823void test_attach38<int>::test_attach39(int, B);
Dmitri Gribenkoc41ace92012-08-14 17:17:18 +0000824
Dmitri Gribenko96b09862012-07-31 22:37:06 +0000825
Dmitri Gribenko9f08f492012-07-20 20:18:53 +0000826// PR13411, reduced. We used to crash on this.
827/**
828 * @code Aaa.
829 */
830void test_nocrash1(int);
831
Dmitri Gribenkoe5deb792012-07-30 18:05:28 +0000832// We used to crash on this.
833// expected-warning@+2 {{empty paragraph passed to '\param' command}}
834// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
835/// \param\brief
836void test_nocrash2(int);
837
Dmitri Gribenkoc41ace92012-08-14 17:17:18 +0000838// PR13593, example 1 and 2
Douglas Gregorcd81df22012-08-13 16:37:30 +0000839
840/**
841* Bla.
842*/
843template <typename>
844void test_nocrash3();
845
846/// Foo
847template <typename, typename>
848void test_nocrash4() { }
849
850template <typename>
851void test_nocrash3()
852{
853}
Dmitri Gribenkoc41ace92012-08-14 17:17:18 +0000854
855// PR13593, example 3
856
857/**
858 * aaa
859 */
860template <typename T>
861inline T test_nocrash5(T a1)
862{
863 return a1;
864}
865
866///
867//,
868
869inline void test_nocrash6()
870{
871 test_nocrash5(1);
872}
873
874// We used to crash on this.
875
876/*!
877 Blah.
878*/
879typedef const struct test_nocrash7 * test_nocrash8;
880
Dmitri Gribenkob0b8a962012-09-11 19:22:03 +0000881// We used to crash on this.
882
883/// aaa \unknown aaa \unknown aaa
884int test_nocrash9;
885
Dmitri Gribenko10442562013-01-26 00:36:14 +0000886
887// We used to crash on this. PR15068
888
Fariborz Jahanianc98e9132013-03-01 22:51:30 +0000889// expected-warning@+2 {{empty paragraph passed to '@param' command}}
890// expected-warning@+2 {{empty paragraph passed to '@param' command}}
Dmitri Gribenko10442562013-01-26 00:36:14 +0000891///@param x
892///@param y
893int test_nocrash10(int x, int y);
894
Fariborz Jahanianc98e9132013-03-01 22:51:30 +0000895// expected-warning@+2 {{empty paragraph passed to '@param' command}} expected-warning@+2 {{parameter 'x' not found in the function declaration}}
896// expected-warning@+2 {{empty paragraph passed to '@param' command}} expected-warning@+2 {{parameter 'y' not found in the function declaration}}
Dmitri Gribenko10442562013-01-26 00:36:14 +0000897///@param x
898///@param y
899int test_nocrash11();
900
Fariborz Jahanianc98e9132013-03-01 22:51:30 +0000901// expected-warning@+3 {{empty paragraph passed to '@param' command}} expected-warning@+3 {{parameter 'x' not found in the function declaration}}
902// expected-warning@+3 {{empty paragraph passed to '@param' command}} expected-warning@+3 {{parameter 'y' not found in the function declaration}}
Dmitri Gribenko10442562013-01-26 00:36:14 +0000903/**
904@param x
905@param y
906**/
907int test_nocrash12();
908
Fariborz Jahanianc98e9132013-03-01 22:51:30 +0000909// expected-warning@+2 {{empty paragraph passed to '@param' command}}
910// expected-warning@+1 {{empty paragraph passed to '@param' command}}
Dmitri Gribenko10442562013-01-26 00:36:14 +0000911///@param x@param y
912int test_nocrash13(int x, int y);
913
Fariborz Jahanian2a268f22013-03-05 01:05:07 +0000914// expected-warning@+3 {{'@function' command used in a comment that is attached to a non-function declaration immediately following it}}
915// expected-warning@+3 {{'@param' command used in a comment that is not attached to a function declaration}}
916// expected-warning@+3 {{'@result' command used in a comment that is not attached to a function or method declaration}}
917/*! @function Base64EncodeEx
918 @param inFlags This is error flag
919 @result Error
920*/
921typedef unsigned int Base64Flags;
922unsigned Base64EncodeEx(Base64Flags inFlags);