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 
307 // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
308 /// \tparam T Aaa
309 int test_tparam1;
310 
311 // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
312 /// \tparam T Aaa
313 void test_tparam2(int aaa);
314 
315 // expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
316 /// \tparam
317 /// \param aaa Blah blah
318 template<typename T>
319 void test_tparam3(T aaa);
320 
321 // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
322 /// \tparam T Aaa
323 template<typename TT>
324 void test_tparam4(TT 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 class test_tparam5 {
330   // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TTT'?}}
331   /// \tparam T Aaa
332   template<typename TTT>
333   void test_tparam6(TTT aaa);
334 };
335 
336 /// \tparam T1 Aaa
337 /// \tparam T2 Bbb
338 template<typename T1, typename T2>
339 void test_tparam7(T1 aaa, T2 bbb);
340 
341 // expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}}
342 /// \tparam SomTy Aaa
343 /// \tparam OtherTy Bbb
344 template<typename SomeTy, typename OtherTy>
345 void test_tparam8(SomeTy aaa, OtherTy bbb);
346 
347 // expected-warning@+2 {{template parameter 'T1' is already documented}} expected-note@+1 {{previous documentation}}
348 /// \tparam T1 Aaa
349 /// \tparam T1 Bbb
350 template<typename T1, typename T2>
351 void test_tparam9(T1 aaa, T2 bbb);
352 
353 /// \tparam T Aaa
354 /// \tparam TT Bbb
355 template<template<typename T> class TT>
356 void test_tparam10(TT<int> aaa);
357 
358 /// \tparam T Aaa
359 /// \tparam TT Bbb
360 /// \tparam TTT Ccc
361 template<template<template<typename T> class TT, class C> class TTT>
362 void test_tparam11();
363 
364 /// \tparam I Aaa
365 template<int I>
366 void test_tparam12();
367 
368 template<typename T, typename U>
369 class test_tparam13 { };
370 
371 /// \tparam T Aaa
372 template<typename T>
373 using test_tparam14 = test_tparam13<T, int>;
374 
375 // expected-warning@+1 {{template parameter 'U' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}}
376 /// \tparam U Aaa
377 template<typename T>
378 using test_tparam15 = test_tparam13<T, int>;
379 
380 
381 /// Aaa
382 /// \deprecated Bbb
383 void test_deprecated_1(int a) __attribute__((deprecated));
384 
385 // We don't want \deprecated to warn about empty paragraph.  It is fine to use
386 // \deprecated by itself without explanations.
387 
388 /// Aaa
389 /// \deprecated
390 void test_deprecated_2(int a) __attribute__((deprecated));
391 
392 /// Aaa
393 /// \deprecated
394 void test_deprecated_3(int a) __attribute__((availability(macosx,introduced=10.4)));
395 
396 /// Aaa
397 /// \deprecated
398 void test_deprecated_4(int a) __attribute__((unavailable));
399 
400 // 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}}
401 /// Aaa
402 /// \deprecated
403 void test_deprecated_5(int a);
404 
405 // 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}}
406 /// Aaa
407 /// \deprecated
408 void test_deprecated_6(int a) {
409 }
410 
411 // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
412 /// Aaa
413 /// \deprecated
414 template<typename T>
415 void test_deprecated_7(T aaa);
416 
417 
418 /// \invariant aaa
419 void test_invariant_1(int a);
420 
421 // expected-warning@+1 {{empty paragraph passed to '\invariant' command}}
422 /// \invariant
423 void test_invariant_2(int a);
424 
425 
426 // no-warning
427 /// \returns Aaa
428 int test_returns_right_decl_1(int);
429 
430 class test_returns_right_decl_2 {
431   // no-warning
432   /// \returns Aaa
433   int test_returns_right_decl_3(int);
434 };
435 
436 // no-warning
437 /// \returns Aaa
438 template<typename T>
439 int test_returns_right_decl_4(T aaa);
440 
441 // no-warning
442 /// \returns Aaa
443 template<>
444 int test_returns_right_decl_4(int aaa);
445 
446 /// \returns Aaa
447 template<typename T>
448 T test_returns_right_decl_5(T aaa);
449 
450 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
451 /// \returns Aaa
452 int test_returns_wrong_decl_1;
453 
454 // expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
455 /// \return Aaa
456 int test_returns_wrong_decl_2;
457 
458 // expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}}
459 /// \result Aaa
460 int test_returns_wrong_decl_3;
461 
462 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
463 /// \returns Aaa
464 void test_returns_wrong_decl_4(int);
465 
466 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
467 /// \returns Aaa
468 template<typename T>
469 void test_returns_wrong_decl_5(T aaa);
470 
471 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
472 /// \returns Aaa
473 template<>
474 void test_returns_wrong_decl_5(int aaa);
475 
476 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
477 /// \returns Aaa
478 struct test_returns_wrong_decl_6 { };
479 
480 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
481 /// \returns Aaa
482 class test_returns_wrong_decl_7 {
483   // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}}
484   /// \returns Aaa
485   test_returns_wrong_decl_7();
486 
487   // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}}
488   /// \returns Aaa
489   ~test_returns_wrong_decl_7();
490 };
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 enum test_returns_wrong_decl_8 {
495   // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
496   /// \returns Aaa
497   test_returns_wrong_decl_9
498 };
499 
500 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
501 /// \returns Aaa
502 namespace test_returns_wrong_decl_10 { };
503 
504 
505 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
506 int test1; ///< \brief\author Aaa
507 
508 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
509 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
510 int test2, ///< \brief\author Aaa
511     test3; ///< \brief\author Aaa
512 
513 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
514 int test4; ///< \brief
515            ///< \author Aaa
516 
517 
518 // Check that we attach the comment to the declaration during parsing in the
519 // following cases.  The test is based on the fact that we don't parse
520 // documentation comments that are not attached to anything.
521 
522 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
523 /// \brief\author Aaa
524 int test_attach1;
525 
526 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
527 /// \brief\author Aaa
528 int test_attach2(int);
529 
530 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
531 /// \brief\author Aaa
532 struct test_attach3 {
533   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
534   /// \brief\author Aaa
535   int test_attach4;
536 
537   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
538   int test_attach5; ///< \brief\author Aaa
539 
540   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
541   /// \brief\author Aaa
542   int test_attach6(int);
543 };
544 
545 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
546 /// \brief\author Aaa
547 class test_attach7 {
548   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
549   /// \brief\author Aaa
550   int test_attach8;
551 
552   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
553   int test_attach9; ///< \brief\author Aaa
554 
555   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
556   /// \brief\author Aaa
557   int test_attach10(int);
558 };
559 
560 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
561 /// \brief\author Aaa
562 enum test_attach9 {
563   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
564   /// \brief\author Aaa
565   test_attach10,
566 
567   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
568   test_attach11 ///< \brief\author Aaa
569 };
570 
571 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
572 /// \brief\author Aaa
573 struct test_noattach12 *test_attach13;
574 
575 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
576 /// \brief\author Aaa
577 typedef struct test_noattach14 *test_attach15;
578 
579 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
580 /// \brief\author Aaa
581 typedef struct test_attach16 { int a; } test_attach17;
582 
583 struct S { int a; };
584 
585 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
586 /// \brief\author Aaa
587 struct S *test_attach18;
588 
589 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
590 /// \brief\author Aaa
591 typedef struct S *test_attach19;
592 
593 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
594 /// \brief\author Aaa
595 struct test_attach20;
596 
597 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
598 /// \brief\author Aaa
599 typedef struct test_attach21 {
600   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
601   /// \brief\author Aaa
602   int test_attach22;
603 } test_attach23;
604 
605 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
606 /// \brief\author Aaa
607 namespace test_attach24 {
608   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
609   /// \brief\author Aaa
610   namespace test_attach25 {
611   }
612 }
613 
614 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
615 /// \brief\author Aaa
616 /// \tparam T Aaa
617 template<typename T>
618 void test_attach26(T aaa);
619 
620 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
621 /// \brief\author Aaa
622 /// \tparam T Aaa
623 template<typename T, typename U>
624 void test_attach27(T aaa, U bbb);
625 
626 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
627 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
628 /// \brief\author Aaa
629 /// \tparam T Aaa
630 template<>
631 void test_attach27(int aaa, int bbb);
632 
633 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
634 /// \brief\author Aaa
635 /// \tparam T Aaa
636 template<typename T>
637 class test_attach28 {
638   T aaa;
639 };
640 
641 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
642 /// \brief\author Aaa
643 using test_attach29 = test_attach28<int>;
644 
645 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
646 /// \brief\author Aaa
647 /// \tparam T Aaa
648 template<typename T, typename U>
649 class test_attach30 { };
650 
651 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
652 /// \brief\author Aaa
653 /// \tparam T Aaa
654 template<typename T>
655 class test_attach30<T, int> { };
656 
657 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
658 /// \brief\author Aaa
659 template<>
660 class test_attach30<int, int> { };
661 
662 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
663 /// \brief\author Aaa
664 template<typename T>
665 using test_attach31 = test_attach30<T, int>;
666 
667 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
668 /// \brief\author Aaa
669 /// \tparam T Aaa
670 template<typename T, typename U, typename V>
671 class test_attach32 { };
672 
673 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
674 /// \brief\author Aaa
675 /// \tparam T Aaa
676 template<typename T, typename U>
677 class test_attach32<T, U, int> { };
678 
679 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
680 /// \brief\author Aaa
681 /// \tparam T Aaa
682 template<typename T>
683 class test_attach32<T, int, int> { };
684 
685 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
686 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
687 /// \brief\author Aaa
688 /// \tparam T Aaa
689 template<>
690 class test_attach32<int, int, int> { };
691 
692 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
693 /// \brief\author Aaa
694 class test_attach33 {
695   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
696   /// \brief\author Aaa
697   /// \tparam T Aaa
698   template<typename T, typename U>
699   void test_attach34(T aaa, U bbb);
700 };
701 
702 template<typename T>
703 class test_attach35 {
704   // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
705   // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
706   /// \brief\author Aaa
707   /// \tparam T Aaa
708   template<typename TT, typename UU>
709   void test_attach36(TT aaa, UU bbb);
710 };
711 
712 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
713 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
714 /// \brief\author Aaa
715 /// \tparam T Aaa
716 template<> template<>
717 void test_attach35<int>::test_attach36(int aaa, int bbb) {}
718 
719 template<typename T>
720 class test_attach37 {
721   // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
722   // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}}
723   /// \brief\author Aaa
724   /// \tparam T Aaa
725   void test_attach38(int aaa, int bbb);
726 
727   void test_attach39(int aaa, int bbb);
728 };
729 
730 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
731 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
732 /// \brief\author Aaa
733 /// \tparam T Aaa
734 template<>
735 void test_attach37<int>::test_attach38(int aaa, int bbb) {}
736 
737 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
738 /// \brief\author Aaa
739 /// \tparam T Aaa
740 template<typename T>
741 void test_attach37<T>::test_attach39(int aaa, int bbb) {}
742 
743 // We used to emit warning that parameter 'a' is not found because we parsed
744 // the comment in context of the redeclaration which does not have parameter
745 // names.
746 template <typename T>
747 struct test_attach38 {
748   /*!
749     \param a  First param
750     \param b  Second param
751   */
752   template <typename B>
753   void test_attach39(T a, B b);
754 };
755 
756 template <>
757 template <typename B>
758 void test_attach38<int>::test_attach39(int, B);
759 
760 
761 // PR13411, reduced.  We used to crash on this.
762 /**
763  * @code Aaa.
764  */
765 void test_nocrash1(int);
766 
767 // We used to crash on this.
768 // expected-warning@+2 {{empty paragraph passed to '\param' command}}
769 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
770 /// \param\brief
771 void test_nocrash2(int);
772 
773 // PR13593, example 1 and 2
774 
775 /**
776 * Bla.
777 */
778 template <typename>
779 void test_nocrash3();
780 
781 /// Foo
782 template <typename, typename>
783 void test_nocrash4() { }
784 
785 template <typename>
786 void test_nocrash3()
787 {
788 }
789 
790 // PR13593, example 3
791 
792 /**
793  * aaa
794  */
795 template <typename T>
796 inline T test_nocrash5(T a1)
797 {
798     return a1;
799 }
800 
801 ///
802 //,
803 
804 inline void test_nocrash6()
805 {
806     test_nocrash5(1);
807 }
808 
809 // We used to crash on this.
810 
811 /*!
812   Blah.
813 */
814 typedef const struct test_nocrash7 * test_nocrash8;
815 
816 // We used to crash on this.
817 
818 /// aaa \unknown aaa \unknown aaa
819 int test_nocrash9;
820 
821