warn-documentation.cpp revision b0b8a96df25660cbdbf35d23c3ff5887c33f82f9
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=>
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}}
16// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
17/// <a href= blah
18int test_html3(int);
19
20// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
21/// <a =>
22int test_html4(int);
23
24// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
25/// <a "aaa">
26int test_html5(int);
27
28// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
29/// <a a="b" =>
30int test_html6(int);
31
32// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
33/// <a a="b" "aaa">
34int test_html7(int);
35
36// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
37/// <a a="b" =
38int 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 */
44int 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 */
50int test_html10(int);
51
52// expected-warning@+1 {{HTML end tag 'br' is forbidden}}
53/// <br></br>
54int test_html11(int);
55
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
70// expected-warning@+1 {{HTML end tag does not match any start tag}}
71/// <b><i>Meow</a>
72int 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>
77int 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>
82int test_html_nesting7(int);
83
84
85// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
86/// \brief\returns Aaa
87int test_block_command1(int);
88
89// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
90/// \brief \returns Aaa
91int test_block_command2(int);
92
93// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
94/// \brief
95/// \returns Aaa
96int test_block_command3(int);
97
98// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
99/// \brief
100///
101/// \returns Aaa
102int 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
109int test_block_command5(int);
110
111/// \brief \c Aaa
112int 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
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
172// 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
209// expected-warning@+1 {{parameter 'a' not found in the function declaration}}
210/// \param a Blah blah.
211int 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.
215int 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.
219int 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.
224int test_param14(int aaa, int bbb);
225
226// expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
227/// \param aab Blah blah.
228int 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);
247
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.
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.
260template<typename T>
261void 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.
267int 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.
274int 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.
280typedef 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.
286typedef 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.
292typedef 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.
298typedef 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
303int 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
307void test_tparam2(int aaa);
308
309// expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
310/// \tparam
311/// \param aaa Blah blah
312template<typename T>
313void 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
317template<typename TT>
318void 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
322template<typename TT>
323class 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
332template<typename T1, typename T2>
333void 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
338template<typename SomeTy, typename OtherTy>
339void 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
344template<typename T1, typename T2>
345void test_tparam9(T1 aaa, T2 bbb);
346
347/// \tparam T Aaa
348/// \tparam TT Bbb
349template<template<typename T> class TT>
350void test_tparam10(TT<int> aaa);
351
352/// \tparam T Aaa
353/// \tparam TT Bbb
354/// \tparam TTT Ccc
355template<template<template<typename T> class TT, class C> class TTT>
356void test_tparam11();
357
358/// \tparam I Aaa
359template<int I>
360void test_tparam12();
361
362template<typename T, typename U>
363class test_tparam13 { };
364
365/// \tparam T Aaa
366template<typename T>
367using 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
371template<typename T>
372using test_tparam15 = test_tparam13<T, int>;
373
374// no-warning
375/// \returns Aaa
376int test_returns_right_decl_1(int);
377
378class test_returns_right_decl_2 {
379  // no-warning
380  /// \returns Aaa
381  int test_returns_right_decl_3(int);
382};
383
384// no-warning
385/// \returns Aaa
386template<typename T>
387int test_returns_right_decl_4(T aaa);
388
389// no-warning
390/// \returns Aaa
391template<>
392int test_returns_right_decl_4(int aaa);
393
394/// \returns Aaa
395template<typename T>
396T test_returns_right_decl_5(T aaa);
397
398// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
399/// \returns Aaa
400int test_returns_wrong_decl_1;
401
402// expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
403/// \return Aaa
404int test_returns_wrong_decl_2;
405
406// expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}}
407/// \result Aaa
408int test_returns_wrong_decl_3;
409
410// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
411/// \returns Aaa
412void test_returns_wrong_decl_4(int);
413
414// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
415/// \returns Aaa
416template<typename T>
417void test_returns_wrong_decl_5(T aaa);
418
419// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
420/// \returns Aaa
421template<>
422void test_returns_wrong_decl_5(int aaa);
423
424// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
425/// \returns Aaa
426struct test_returns_wrong_decl_6 { };
427
428// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
429/// \returns Aaa
430class test_returns_wrong_decl_7 {
431  // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}}
432  /// \returns Aaa
433  test_returns_wrong_decl_7();
434
435  // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}}
436  /// \returns Aaa
437  ~test_returns_wrong_decl_7();
438};
439
440// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
441/// \returns Aaa
442enum test_returns_wrong_decl_8 {
443  // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
444  /// \returns Aaa
445  test_returns_wrong_decl_9
446};
447
448// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
449/// \returns Aaa
450namespace test_returns_wrong_decl_10 { };
451
452
453// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
454int test1; ///< \brief\author Aaa
455
456// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
457// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
458int test2, ///< \brief\author Aaa
459    test3; ///< \brief\author Aaa
460
461// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
462int test4; ///< \brief
463           ///< \author Aaa
464
465
466// Check that we attach the comment to the declaration during parsing in the
467// following cases.  The test is based on the fact that we don't parse
468// documentation comments that are not attached to anything.
469
470// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
471/// \brief\author Aaa
472int test_attach1;
473
474// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
475/// \brief\author Aaa
476int test_attach2(int);
477
478// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
479/// \brief\author Aaa
480struct test_attach3 {
481  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
482  /// \brief\author Aaa
483  int test_attach4;
484
485  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
486  int test_attach5; ///< \brief\author Aaa
487
488  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
489  /// \brief\author Aaa
490  int test_attach6(int);
491};
492
493// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
494/// \brief\author Aaa
495class test_attach7 {
496  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
497  /// \brief\author Aaa
498  int test_attach8;
499
500  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
501  int test_attach9; ///< \brief\author Aaa
502
503  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
504  /// \brief\author Aaa
505  int test_attach10(int);
506};
507
508// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
509/// \brief\author Aaa
510enum test_attach9 {
511  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
512  /// \brief\author Aaa
513  test_attach10,
514
515  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
516  test_attach11 ///< \brief\author Aaa
517};
518
519// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
520/// \brief\author Aaa
521struct test_noattach12 *test_attach13;
522
523// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
524/// \brief\author Aaa
525typedef struct test_noattach14 *test_attach15;
526
527// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
528/// \brief\author Aaa
529typedef struct test_attach16 { int a; } test_attach17;
530
531struct S { int a; };
532
533// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
534/// \brief\author Aaa
535struct S *test_attach18;
536
537// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
538/// \brief\author Aaa
539typedef struct S *test_attach19;
540
541// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
542/// \brief\author Aaa
543struct test_attach20;
544
545// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
546/// \brief\author Aaa
547typedef struct test_attach21 {
548  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
549  /// \brief\author Aaa
550  int test_attach22;
551} test_attach23;
552
553// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
554/// \brief\author Aaa
555namespace test_attach24 {
556  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
557  /// \brief\author Aaa
558  namespace test_attach25 {
559  }
560}
561
562// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
563/// \brief\author Aaa
564/// \tparam T Aaa
565template<typename T>
566void test_attach26(T aaa);
567
568// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
569/// \brief\author Aaa
570/// \tparam T Aaa
571template<typename T, typename U>
572void test_attach27(T aaa, U bbb);
573
574// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
575// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
576/// \brief\author Aaa
577/// \tparam T Aaa
578template<>
579void test_attach27(int aaa, int bbb);
580
581// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
582/// \brief\author Aaa
583/// \tparam T Aaa
584template<typename T>
585class test_attach28 {
586  T aaa;
587};
588
589// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
590/// \brief\author Aaa
591using test_attach29 = test_attach28<int>;
592
593// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
594/// \brief\author Aaa
595/// \tparam T Aaa
596template<typename T, typename U>
597class test_attach30 { };
598
599// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
600/// \brief\author Aaa
601/// \tparam T Aaa
602template<typename T>
603class test_attach30<T, int> { };
604
605// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
606/// \brief\author Aaa
607template<>
608class test_attach30<int, int> { };
609
610// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
611/// \brief\author Aaa
612template<typename T>
613using test_attach31 = test_attach30<T, int>;
614
615// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
616/// \brief\author Aaa
617/// \tparam T Aaa
618template<typename T, typename U, typename V>
619class test_attach32 { };
620
621// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
622/// \brief\author Aaa
623/// \tparam T Aaa
624template<typename T, typename U>
625class test_attach32<T, U, int> { };
626
627// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
628/// \brief\author Aaa
629/// \tparam T Aaa
630template<typename T>
631class test_attach32<T, int, int> { };
632
633// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
634// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
635/// \brief\author Aaa
636/// \tparam T Aaa
637template<>
638class test_attach32<int, int, int> { };
639
640// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
641/// \brief\author Aaa
642class test_attach33 {
643  // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
644  /// \brief\author Aaa
645  /// \tparam T Aaa
646  template<typename T, typename U>
647  void test_attach34(T aaa, U bbb);
648};
649
650template<typename T>
651class test_attach35 {
652  // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
653  // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
654  /// \brief\author Aaa
655  /// \tparam T Aaa
656  template<typename TT, typename UU>
657  void test_attach36(TT aaa, UU bbb);
658};
659
660// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
661// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
662/// \brief\author Aaa
663/// \tparam T Aaa
664template<> template<>
665void test_attach35<int>::test_attach36(int aaa, int bbb) {}
666
667template<typename T>
668class test_attach37 {
669  // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
670  // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}}
671  /// \brief\author Aaa
672  /// \tparam T Aaa
673  void test_attach38(int aaa, int bbb);
674
675  void test_attach39(int aaa, int bbb);
676};
677
678// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
679// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
680/// \brief\author Aaa
681/// \tparam T Aaa
682template<>
683void test_attach37<int>::test_attach38(int aaa, int bbb) {}
684
685// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
686/// \brief\author Aaa
687/// \tparam T Aaa
688template<typename T>
689void test_attach37<T>::test_attach39(int aaa, int bbb) {}
690
691// We used to emit warning that parameter 'a' is not found because we parsed
692// the comment in context of the redeclaration which does not have parameter
693// names.
694template <typename T>
695struct test_attach38 {
696  /*!
697    \param a  First param
698    \param b  Second param
699  */
700  template <typename B>
701  void test_attach39(T a, B b);
702};
703
704template <>
705template <typename B>
706void test_attach38<int>::test_attach39(int, B);
707
708
709// PR13411, reduced.  We used to crash on this.
710/**
711 * @code Aaa.
712 */
713void test_nocrash1(int);
714
715// We used to crash on this.
716// expected-warning@+2 {{empty paragraph passed to '\param' command}}
717// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
718/// \param\brief
719void test_nocrash2(int);
720
721// PR13593, example 1 and 2
722
723/**
724* Bla.
725*/
726template <typename>
727void test_nocrash3();
728
729/// Foo
730template <typename, typename>
731void test_nocrash4() { }
732
733template <typename>
734void test_nocrash3()
735{
736}
737
738// PR13593, example 3
739
740/**
741 * aaa
742 */
743template <typename T>
744inline T test_nocrash5(T a1)
745{
746    return a1;
747}
748
749///
750//,
751
752inline void test_nocrash6()
753{
754    test_nocrash5(1);
755}
756
757// We used to crash on this.
758
759/*!
760  Blah.
761*/
762typedef const struct test_nocrash7 * test_nocrash8;
763
764// We used to crash on this.
765
766/// aaa \unknown aaa \unknown aaa
767int test_nocrash9;
768
769