]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Sema/warn-documentation.cpp
Vendor import of clang tags/RELEASE_33/final r183502 (effectively, 3.3
[FreeBSD/FreeBSD.git] / test / Sema / warn-documentation.cpp
1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wdocumentation -Wdocumentation-pedantic -verify %s
2
3 // 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
7 // expected-warning@+1 {{expected quoted string after equals sign}}
8 /// <a href=>
9 int test_html1(int);
10
11 // expected-warning@+1 {{expected quoted string after equals sign}}
12 /// <a href==>
13 int test_html2(int);
14
15 // expected-warning@+2 {{expected quoted string after equals sign}}
16 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
17 /// <a href= blah
18 int test_html3(int);
19
20 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
21 /// <a =>
22 int test_html4(int);
23
24 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
25 /// <a "aaa">
26 int test_html5(int);
27
28 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
29 /// <a a="b" =>
30 int test_html6(int);
31
32 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
33 /// <a a="b" "aaa">
34 int test_html7(int);
35
36 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
37 /// <a a="b" =
38 int test_html8(int);
39
40 // expected-warning@+2 {{HTML start tag prematurely ended, expected attribute name or '>'}} expected-note@+1 {{HTML tag started here}}
41 /** Aaa bbb<img ddd eee
42  * fff ggg.
43  */
44 int test_html9(int);
45
46 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
47 /** Aaa bbb<img ddd eee 42%
48  * fff ggg.
49  */
50 int test_html10(int);
51
52 // expected-warning@+1 {{HTML end tag 'br' is forbidden}}
53 /// <br></br>
54 int test_html11(int);
55
56 /// <blockquote>Meow</blockquote>
57 int test_html_nesting1(int);
58
59 /// <b><i>Meow</i></b>
60 int test_html_nesting2(int);
61
62 /// <p>Aaa<br>
63 /// Bbb</p>
64 int test_html_nesting3(int);
65
66 /// <p>Aaa<br />
67 /// Bbb</p>
68 int test_html_nesting4(int);
69
70 // expected-warning@+1 {{HTML end tag does not match any start tag}}
71 /// <b><i>Meow</a>
72 int test_html_nesting5(int);
73
74 // expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
75 // expected-warning@+1 {{HTML end tag does not match any start tag}}
76 /// <b><i>Meow</b></b>
77 int test_html_nesting6(int);
78
79 // expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
80 // expected-warning@+1 {{HTML end tag does not match any start tag}}
81 /// <b><i>Meow</b></i>
82 int test_html_nesting7(int);
83
84
85 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
86 /// \brief\returns Aaa
87 int test_block_command1(int);
88
89 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
90 /// \brief \returns Aaa
91 int test_block_command2(int);
92
93 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
94 /// \brief
95 /// \returns Aaa
96 int test_block_command3(int);
97
98 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
99 /// \brief
100 ///
101 /// \returns Aaa
102 int 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 /// 
108 /// \returns Aaa
109 int test_block_command5(int);
110
111 /// \brief \c Aaa
112 int test_block_command6(int);
113
114 // expected-warning@+5 {{duplicated command '\brief'}} expected-note@+1 {{previous command '\brief' here}}
115 /// \brief Aaa
116 ///
117 /// Bbb
118 ///
119 /// \brief Ccc
120 int 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
128 int 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
136 int 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
145 int 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
153 int 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
161 int 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
169 int test_duplicate_returns4(int);
170
171
172 // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
173 /// \param a Blah blah.
174 int test_param1;
175
176 // expected-warning@+1 {{empty paragraph passed to '\param' command}}
177 /// \param
178 /// \param a Blah blah.
179 int test_param2(int a);
180
181 // expected-warning@+1 {{empty paragraph passed to '\param' command}}
182 /// \param a
183 int test_param3(int a);
184
185 /// \param a Blah blah.
186 int test_param4(int a);
187
188 /// \param [in] a Blah blah.
189 int test_param5(int a);
190
191 /// \param [out] a Blah blah.
192 int test_param6(int a);
193
194 /// \param [in,out] a Blah blah.
195 int test_param7(int a);
196
197 // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
198 /// \param [ in ] a Blah blah.
199 int test_param8(int a);
200
201 // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
202 /// \param [in, out] a Blah blah.
203 int 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.
207 int test_param10(int a);
208
209 // expected-warning@+1 {{parameter 'a' not found in the function declaration}}
210 /// \param a Blah blah.
211 int test_param11();
212
213 // expected-warning@+1 {{parameter 'A' not found in the function declaration}} expected-note@+1 {{did you mean 'a'?}}
214 /// \param A Blah blah.
215 int test_param12(int a);
216
217 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
218 /// \param aab Blah blah.
219 int test_param13(int aaa, int bbb);
220
221 // 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.
224 int test_param14(int aaa, int bbb);
225
226 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
227 /// \param aab Blah blah.
228 int 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.
234 int 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.
240 int 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.
246 int test_param18(int aaa, int bbb);
247
248 class 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.
255  int test_param19(int bbb, int ccc);
256 };
257
258 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
259 /// \param aab Blah blah.
260 template<typename T>
261 void test_param20(int bbb, int ccc);
262
263 // expected-warning@+3 {{parameter 'a' is already documented}}
264 // expected-note@+1 {{previous documentation}}
265 /// \param a Aaa.
266 /// \param a Aaa.
267 int test_param21(int a);
268
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.
274 int test_param22(int x1, int x2, int x3);
275
276 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
277 /// \param aaa Meow.
278 /// \param bbb Bbb.
279 /// \returns aaa.
280 typedef int test_param23(int aaa, int ccc);
281
282 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
283 /// \param aaa Meow.
284 /// \param bbb Bbb.
285 /// \returns aaa.
286 typedef int (*test_param24)(int aaa, int ccc);
287
288 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
289 /// \param aaa Meow.
290 /// \param bbb Bbb.
291 /// \returns aaa.
292 typedef int (* const test_param25)(int aaa, int ccc);
293
294 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
295 /// \param aaa Meow.
296 /// \param bbb Bbb.
297 /// \returns aaa.
298 typedef int (C::*test_param26)(int aaa, int ccc);
299
300 typedef 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.
304 typedef test_param27 test_param28;
305
306 // rdar://13066276
307 // expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
308 /// @param aaa Meow.
309 typedef unsigned int test_param29;
310
311
312 // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
313 /// \tparam T Aaa
314 int 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
318 void test_tparam2(int aaa);
319
320 // expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
321 /// \tparam
322 /// \param aaa Blah blah
323 template<typename T>
324 void 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
328 template<typename TT>
329 void 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
333 template<typename TT>
334 class 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
343 template<typename T1, typename T2>
344 void 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
349 template<typename SomeTy, typename OtherTy>
350 void 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
355 template<typename T1, typename T2>
356 void test_tparam9(T1 aaa, T2 bbb);
357
358 /// \tparam T Aaa
359 /// \tparam TT Bbb
360 template<template<typename T> class TT>
361 void test_tparam10(TT<int> aaa);
362
363 /// \tparam T Aaa
364 /// \tparam TT Bbb
365 /// \tparam TTT Ccc
366 template<template<template<typename T> class TT, class C> class TTT>
367 void test_tparam11();
368
369 /// \tparam I Aaa
370 template<int I>
371 void test_tparam12();
372
373 template<typename T, typename U>
374 class test_tparam13 { };
375
376 /// \tparam T Aaa
377 template<typename T>
378 using 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
382 template<typename T>
383 using test_tparam15 = test_tparam13<T, int>;
384
385 // ----
386
387 /// \tparam T Aaa
388 template<typename T>
389 class test_tparam16 { };
390
391 typedef test_tparam16<int> test_tparam17;
392 typedef test_tparam16<double> test_tparam18;
393
394 // ----
395
396 template<typename T>
397 class test_tparam19;
398
399 typedef test_tparam19<int> test_tparam20;
400 typedef test_tparam19<double> test_tparam21;
401
402 /// \tparam T Aaa
403 template<typename T>
404 class test_tparam19 { };
405
406 // ----
407
408 // expected-warning@+1 {{'@tparam' command used in a comment that is not attached to a template declaration}}
409 /// @tparam T Aaa
410 int test_tparam22;
411
412 // ----
413
414
415 /// Aaa
416 /// \deprecated Bbb
417 void test_deprecated_1(int a) __attribute__((deprecated));
418
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
424 void test_deprecated_2(int a) __attribute__((deprecated));
425
426 /// Aaa
427 /// \deprecated
428 void test_deprecated_3(int a) __attribute__((availability(macosx,introduced=10.4)));
429
430 /// Aaa
431 /// \deprecated
432 void 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
437 void 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
442 void 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
448 template<typename T>
449 void test_deprecated_7(T aaa);
450
451
452 // rdar://12397511
453 // expected-note@+2 {{previous command '\headerfile' here}}
454 // expected-warning@+2 {{duplicated command '\headerfile'}}
455 /// \headerfile ""
456 /// \headerfile foo.h
457 int test__headerfile_1(int a);
458
459
460 /// \invariant aaa
461 void test_invariant_1(int a);
462
463 // expected-warning@+1 {{empty paragraph passed to '\invariant' command}}
464 /// \invariant
465 void test_invariant_2(int a);
466
467
468 // no-warning
469 /// \returns Aaa
470 int test_returns_right_decl_1(int);
471
472 class 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
480 template<typename T>
481 int test_returns_right_decl_4(T aaa);
482
483 // no-warning
484 /// \returns Aaa
485 template<>
486 int test_returns_right_decl_4(int aaa);
487
488 /// \returns Aaa
489 template<typename T>
490 T test_returns_right_decl_5(T aaa);
491
492 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
493 /// \returns Aaa
494 int test_returns_wrong_decl_1;
495
496 // expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
497 /// \return Aaa
498 int test_returns_wrong_decl_2;
499
500 // expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}}
501 /// \result Aaa
502 int test_returns_wrong_decl_3;
503
504 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
505 /// \returns Aaa
506 void test_returns_wrong_decl_4(int);
507
508 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
509 /// \returns Aaa
510 template<typename T>
511 void test_returns_wrong_decl_5(T aaa);
512
513 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
514 /// \returns Aaa
515 template<>
516 void test_returns_wrong_decl_5(int aaa);
517
518 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
519 /// \returns Aaa
520 struct test_returns_wrong_decl_6 { };
521
522 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
523 /// \returns Aaa
524 class 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
534 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
535 /// \returns Aaa
536 enum test_returns_wrong_decl_8 {
537   // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
538   /// \returns Aaa
539   test_returns_wrong_decl_9
540 };
541
542 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
543 /// \returns Aaa
544 namespace test_returns_wrong_decl_10 { };
545
546 // 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
549 typedef unsigned int test_returns_wrong_decl_11;
550
551 // rdar://13094352
552 // expected-warning@+1 {{'@function' command should be used in a comment attached to a function declaration}}
553 /*!     @function test_function
554 */
555 typedef unsigned int Base64Flags;
556 unsigned test_function(Base64Flags inFlags);
557
558 // expected-warning@+1 {{'@callback' command should be used in a comment attached to a pointer to function declaration}}
559 /*! @callback test_callback
560 */
561 typedef unsigned int BaseFlags;
562 unsigned (*test_callback)(BaseFlags inFlags);
563
564 // expected-warning@+1 {{'\endverbatim' command does not terminate a verbatim text block}}
565 /// \endverbatim
566 int test_verbatim_1();
567
568 // expected-warning@+1 {{'\endcode' command does not terminate a verbatim text block}}
569 /// \endcode
570 int test_verbatim_2();
571
572 // FIXME: we give a bad diagnostic here because we throw away non-documentation
573 // comments early.
574 //
575 // expected-warning@+3 {{'\endcode' command does not terminate a verbatim text block}}
576 /// \code
577 //  foo
578 /// \endcode
579 int test_verbatim_3();
580
581
582 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
583 int test1; ///< \brief\author Aaa
584
585 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
586 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
587 int test2, ///< \brief\author Aaa
588     test3; ///< \brief\author Aaa
589
590 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
591 int test4; ///< \brief
592            ///< \author Aaa
593
594
595 // Check that we attach the comment to the declaration during parsing in the
596 // following cases.  The test is based on the fact that we don't parse
597 // documentation comments that are not attached to anything.
598
599 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
600 /// \brief\author Aaa
601 int test_attach1;
602
603 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
604 /// \brief\author Aaa
605 int test_attach2(int);
606
607 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
608 /// \brief\author Aaa
609 struct test_attach3 {
610   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
611   /// \brief\author Aaa
612   int test_attach4;
613
614   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
615   int test_attach5; ///< \brief\author Aaa
616
617   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
618   /// \brief\author Aaa
619   int test_attach6(int);
620 };
621
622 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
623 /// \brief\author Aaa
624 class test_attach7 {
625   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
626   /// \brief\author Aaa
627   int test_attach8;
628
629   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
630   int test_attach9; ///< \brief\author Aaa
631
632   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
633   /// \brief\author Aaa
634   int test_attach10(int);
635 };
636
637 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
638 /// \brief\author Aaa
639 enum test_attach9 {
640   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
641   /// \brief\author Aaa
642   test_attach10,
643
644   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
645   test_attach11 ///< \brief\author Aaa
646 };
647
648 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
649 /// \brief\author Aaa
650 struct test_noattach12 *test_attach13;
651
652 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
653 /// \brief\author Aaa
654 typedef struct test_noattach14 *test_attach15;
655
656 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
657 /// \brief\author Aaa
658 typedef struct test_attach16 { int a; } test_attach17;
659
660 struct S { int a; };
661
662 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
663 /// \brief\author Aaa
664 struct S *test_attach18;
665
666 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
667 /// \brief\author Aaa
668 typedef struct S *test_attach19;
669
670 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
671 /// \brief\author Aaa
672 struct test_attach20;
673
674 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
675 /// \brief\author Aaa
676 typedef struct test_attach21 {
677   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
678   /// \brief\author Aaa
679   int test_attach22;
680 } test_attach23;
681
682 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
683 /// \brief\author Aaa
684 namespace test_attach24 {
685   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
686   /// \brief\author Aaa
687   namespace test_attach25 {
688   }
689 }
690
691 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
692 /// \brief\author Aaa
693 /// \tparam T Aaa
694 template<typename T>
695 void test_attach26(T aaa);
696
697 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
698 /// \brief\author Aaa
699 /// \tparam T Aaa
700 template<typename T, typename U>
701 void test_attach27(T aaa, U bbb);
702
703 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
704 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
705 /// \brief\author Aaa
706 /// \tparam T Aaa
707 template<>
708 void test_attach27(int aaa, int bbb);
709
710 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
711 /// \brief\author Aaa
712 /// \tparam T Aaa
713 template<typename T>
714 class test_attach28 {
715   T aaa;
716 };
717
718 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
719 /// \brief\author Aaa
720 using test_attach29 = test_attach28<int>;
721
722 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
723 /// \brief\author Aaa
724 /// \tparam T Aaa
725 template<typename T, typename U>
726 class test_attach30 { };
727
728 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
729 /// \brief\author Aaa
730 /// \tparam T Aaa
731 template<typename T>
732 class test_attach30<T, int> { };
733
734 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
735 /// \brief\author Aaa
736 template<>
737 class test_attach30<int, int> { };
738
739 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
740 /// \brief\author Aaa
741 template<typename T>
742 using test_attach31 = test_attach30<T, int>;
743
744 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
745 /// \brief\author Aaa
746 /// \tparam T Aaa
747 template<typename T, typename U, typename V>
748 class test_attach32 { };
749
750 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
751 /// \brief\author Aaa
752 /// \tparam T Aaa
753 template<typename T, typename U>
754 class test_attach32<T, U, int> { };
755
756 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
757 /// \brief\author Aaa
758 /// \tparam T Aaa
759 template<typename T>
760 class test_attach32<T, int, int> { };
761
762 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
763 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
764 /// \brief\author Aaa
765 /// \tparam T Aaa
766 template<>
767 class test_attach32<int, int, int> { };
768
769 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
770 /// \brief\author Aaa
771 class test_attach33 {
772   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
773   /// \brief\author Aaa
774   /// \tparam T Aaa
775   template<typename T, typename U>
776   void test_attach34(T aaa, U bbb);
777 };
778
779 template<typename T>
780 class test_attach35 {
781   // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
782   // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
783   /// \brief\author Aaa
784   /// \tparam T Aaa
785   template<typename TT, typename UU>
786   void test_attach36(TT aaa, UU bbb);
787 };
788
789 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
790 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
791 /// \brief\author Aaa
792 /// \tparam T Aaa
793 template<> template<>
794 void test_attach35<int>::test_attach36(int aaa, int bbb) {}
795
796 template<typename T>
797 class test_attach37 {
798   // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
799   // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}}
800   /// \brief\author Aaa
801   /// \tparam T Aaa
802   void test_attach38(int aaa, int bbb);
803
804   void test_attach39(int aaa, int bbb);
805 };
806
807 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
808 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
809 /// \brief\author Aaa
810 /// \tparam T Aaa
811 template<>
812 void test_attach37<int>::test_attach38(int aaa, int bbb) {}
813
814 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
815 /// \brief\author Aaa
816 /// \tparam T Aaa
817 template<typename T>
818 void test_attach37<T>::test_attach39(int aaa, int bbb) {}
819
820 // We used to emit warning that parameter 'a' is not found because we parsed
821 // the comment in context of the redeclaration which does not have parameter
822 // names.
823 template <typename T>
824 struct test_attach38 {
825   /*!
826     \param a  First param
827     \param b  Second param
828   */
829   template <typename B>
830   void test_attach39(T a, B b);
831 };
832
833 template <>
834 template <typename B>
835 void test_attach38<int>::test_attach39(int, B);
836
837
838 // PR13411, reduced.  We used to crash on this.
839 /**
840  * @code Aaa.
841  */
842 void test_nocrash1(int);
843
844 // We used to crash on this.
845 // expected-warning@+2 {{empty paragraph passed to '\param' command}}
846 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
847 /// \param\brief
848 void test_nocrash2(int);
849
850 // PR13593, example 1 and 2
851
852 /**
853 * Bla.
854 */
855 template <typename>
856 void test_nocrash3();
857
858 /// Foo
859 template <typename, typename>
860 void test_nocrash4() { }
861
862 template <typename>
863 void test_nocrash3()
864 {
865 }
866
867 // PR13593, example 3
868
869 /**
870  * aaa
871  */
872 template <typename T>
873 inline T test_nocrash5(T a1)
874 {
875     return a1;
876 }
877
878 ///
879 //,
880
881 inline void test_nocrash6()
882 {
883     test_nocrash5(1);
884 }
885
886 // We used to crash on this.
887
888 /*!
889   Blah.
890 */
891 typedef const struct test_nocrash7 * test_nocrash8;
892
893 // We used to crash on this.
894
895 // expected-warning@+1 {{unknown command tag name}}
896 /// aaa \unknown aaa \unknown aaa
897 int test_nocrash9;
898
899 // We used to crash on this.  PR15068
900
901 // expected-warning@+2 {{empty paragraph passed to '@param' command}}
902 // expected-warning@+2 {{empty paragraph passed to '@param' command}}
903 ///@param x
904 ///@param y
905 int test_nocrash10(int x, int y);
906
907 // expected-warning@+2 {{empty paragraph passed to '@param' command}} expected-warning@+2 {{parameter 'x' not found in the function declaration}}
908 // expected-warning@+2 {{empty paragraph passed to '@param' command}} expected-warning@+2 {{parameter 'y' not found in the function declaration}}
909 ///@param x
910 ///@param y
911 int test_nocrash11();
912
913 // expected-warning@+3 {{empty paragraph passed to '@param' command}} expected-warning@+3 {{parameter 'x' not found in the function declaration}}
914 // expected-warning@+3 {{empty paragraph passed to '@param' command}} expected-warning@+3 {{parameter 'y' not found in the function declaration}}
915 /**
916 @param x
917 @param y
918 **/
919 int test_nocrash12();
920
921 // expected-warning@+2 {{empty paragraph passed to '@param' command}}
922 // expected-warning@+1 {{empty paragraph passed to '@param' command}}
923 ///@param x@param y
924 int test_nocrash13(int x, int y);
925
926 // rdar://12379114
927 // expected-warning@+2 {{'@union' command should not be used in a comment attached to a non-union declaration}}
928 /*!
929    @union U This is new 
930 */
931 struct U { int iS; };
932
933 /*!
934   @union U1
935 */
936 union U1 {int i; };
937
938 // expected-warning@+2 {{'@struct' command should not be used in a comment attached to a non-struct declaration}}
939 /*!
940  @struct S2
941 */
942 union S2 {};
943
944 /*!
945   @class C1
946 */
947 class C1;
948
949 /*!
950   @struct S3;
951 */
952 class S3;