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