warn-documentation.cpp revision 2d588b4bc7127adf1a1c621002dfe452a99fef6f
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
300typedef int (*test_param27)(int aaa);
301
302// expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
303/// \param aaa Meow.
304typedef test_param27 test_param28;
305
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.
309typedef 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
314int test_tparam1;
315
316// expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
317/// \tparam T Aaa
318void test_tparam2(int aaa);
319
320// expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
321/// \tparam
322/// \param aaa Blah blah
323template<typename T>
324void test_tparam3(T aaa);
325
326// expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
327/// \tparam T Aaa
328template<typename TT>
329void test_tparam4(TT aaa);
330
331// expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
332/// \tparam T Aaa
333template<typename TT>
334class test_tparam5 {
335  // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TTT'?}}
336  /// \tparam T Aaa
337  template<typename TTT>
338  void test_tparam6(TTT aaa);
339};
340
341/// \tparam T1 Aaa
342/// \tparam T2 Bbb
343template<typename T1, typename T2>
344void test_tparam7(T1 aaa, T2 bbb);
345
346// expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}}
347/// \tparam SomTy Aaa
348/// \tparam OtherTy Bbb
349template<typename SomeTy, typename OtherTy>
350void test_tparam8(SomeTy aaa, OtherTy bbb);
351
352// expected-warning@+2 {{template parameter 'T1' is already documented}} expected-note@+1 {{previous documentation}}
353/// \tparam T1 Aaa
354/// \tparam T1 Bbb
355template<typename T1, typename T2>
356void test_tparam9(T1 aaa, T2 bbb);
357
358/// \tparam T Aaa
359/// \tparam TT Bbb
360template<template<typename T> class TT>
361void test_tparam10(TT<int> aaa);
362
363/// \tparam T Aaa
364/// \tparam TT Bbb
365/// \tparam TTT Ccc
366template<template<template<typename T> class TT, class C> class TTT>
367void test_tparam11();
368
369/// \tparam I Aaa
370template<int I>
371void test_tparam12();
372
373template<typename T, typename U>
374class test_tparam13 { };
375
376/// \tparam T Aaa
377template<typename T>
378using test_tparam14 = test_tparam13<T, int>;
379
380// expected-warning@+1 {{template parameter 'U' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}}
381/// \tparam U Aaa
382template<typename T>
383using test_tparam15 = test_tparam13<T, int>;
384
385// ----
386
387/// \tparam T Aaa
388template<typename T>
389class test_tparam16 { };
390
391typedef test_tparam16<int> test_tparam17;
392typedef test_tparam16<double> test_tparam18;
393
394// ----
395
396template<typename T>
397class test_tparam19;
398
399typedef test_tparam19<int> test_tparam20;
400typedef test_tparam19<double> test_tparam21;
401
402/// \tparam T Aaa
403template<typename T>
404class test_tparam19 { };
405
406// ----
407
408// expected-warning@+1 {{'@tparam' command used in a comment that is not attached to a template declaration}}
409/// @tparam T Aaa
410int test_tparam22;
411
412// ----
413
414
415/// Aaa
416/// \deprecated Bbb
417void 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
424void test_deprecated_2(int a) __attribute__((deprecated));
425
426/// Aaa
427/// \deprecated
428void test_deprecated_3(int a) __attribute__((availability(macosx,introduced=10.4)));
429
430/// Aaa
431/// \deprecated
432void test_deprecated_4(int a) __attribute__((unavailable));
433
434// expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+3 {{add a deprecation attribute to the declaration to silence this warning}}
435/// Aaa
436/// \deprecated
437void test_deprecated_5(int a);
438
439// expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+3 {{add a deprecation attribute to the declaration to silence this warning}}
440/// Aaa
441/// \deprecated
442void test_deprecated_6(int a) {
443}
444
445// expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
446/// Aaa
447/// \deprecated
448template<typename T>
449void test_deprecated_7(T aaa);
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
457int test__headerfile_1(int a);
458
459
460/// \invariant aaa
461void test_invariant_1(int a);
462
463// expected-warning@+1 {{empty paragraph passed to '\invariant' command}}
464/// \invariant
465void test_invariant_2(int a);
466
467
468// no-warning
469/// \returns Aaa
470int test_returns_right_decl_1(int);
471
472class test_returns_right_decl_2 {
473  // no-warning
474  /// \returns Aaa
475  int test_returns_right_decl_3(int);
476};
477
478// no-warning
479/// \returns Aaa
480template<typename T>
481int test_returns_right_decl_4(T aaa);
482
483// no-warning
484/// \returns Aaa
485template<>
486int test_returns_right_decl_4(int aaa);
487
488/// \returns Aaa
489template<typename T>
490T test_returns_right_decl_5(T aaa);
491
492// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
493/// \returns Aaa
494int 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
498int 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
502int 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
506void 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
510template<typename T>
511void 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
515template<>
516void 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
520struct 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
524class test_returns_wrong_decl_7 {
525  // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}}
526  /// \returns Aaa
527  test_returns_wrong_decl_7();
528
529  // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}}
530  /// \returns Aaa
531  ~test_returns_wrong_decl_7();
532};
533
534// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
535/// \returns Aaa
536enum 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
544namespace 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
549typedef 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*/
555typedef unsigned int Base64Flags;
556unsigned 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*/
561typedef unsigned int BaseFlags;
562unsigned (*test_callback)(BaseFlags inFlags);
563
564// expected-warning@+1 {{'\endverbatim' command does not terminate a verbatim text block}}
565/// \endverbatim
566int test_verbatim_1();
567
568// expected-warning@+1 {{'\endcode' command does not terminate a verbatim text block}}
569/// \endcode
570int 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
579int test_verbatim_3();
580
581
582// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
583int 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}}
587int test2, ///< \brief\author Aaa
588    test3; ///< \brief\author Aaa
589
590// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
591int 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
601int test_attach1;
602
603// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
604/// \brief\author Aaa
605int test_attach2(int);
606
607// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
608/// \brief\author Aaa
609struct 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
624class 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
639enum 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
650struct test_noattach12 *test_attach13;
651
652// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
653/// \brief\author Aaa
654typedef struct test_noattach14 *test_attach15;
655
656// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
657/// \brief\author Aaa
658typedef struct test_attach16 { int a; } test_attach17;
659
660struct S { int a; };
661
662// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
663/// \brief\author Aaa
664struct S *test_attach18;
665
666// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
667/// \brief\author Aaa
668typedef struct S *test_attach19;
669
670// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
671/// \brief\author Aaa
672struct test_attach20;
673
674// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
675/// \brief\author Aaa
676typedef 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
684namespace 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
694template<typename T>
695void test_attach26(T aaa);
696
697// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
698/// \brief\author Aaa
699/// \tparam T Aaa
700template<typename T, typename U>
701void 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
707template<>
708void 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
713template<typename T>
714class test_attach28 {
715  T aaa;
716};
717
718// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
719/// \brief\author Aaa
720using test_attach29 = test_attach28<int>;
721
722// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
723/// \brief\author Aaa
724/// \tparam T Aaa
725template<typename T, typename U>
726class test_attach30 { };
727
728// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
729/// \brief\author Aaa
730/// \tparam T Aaa
731template<typename T>
732class test_attach30<T, int> { };
733
734// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
735/// \brief\author Aaa
736template<>
737class test_attach30<int, int> { };
738
739// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
740/// \brief\author Aaa
741template<typename T>
742using 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
747template<typename T, typename U, typename V>
748class test_attach32 { };
749
750// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
751/// \brief\author Aaa
752/// \tparam T Aaa
753template<typename T, typename U>
754class test_attach32<T, U, int> { };
755
756// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
757/// \brief\author Aaa
758/// \tparam T Aaa
759template<typename T>
760class 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
766template<>
767class test_attach32<int, int, int> { };
768
769// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
770/// \brief\author Aaa
771class 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
779template<typename T>
780class 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
793template<> template<>
794void test_attach35<int>::test_attach36(int aaa, int bbb) {}
795
796template<typename T>
797class 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
811template<>
812void 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
817template<typename T>
818void 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.
823template <typename T>
824struct 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
833template <>
834template <typename B>
835void test_attach38<int>::test_attach39(int, B);
836
837
838// PR13411, reduced.  We used to crash on this.
839/**
840 * @code Aaa.
841 */
842void 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
848void test_nocrash2(int);
849
850// PR13593, example 1 and 2
851
852/**
853* Bla.
854*/
855template <typename>
856void test_nocrash3();
857
858/// Foo
859template <typename, typename>
860void test_nocrash4() { }
861
862template <typename>
863void test_nocrash3()
864{
865}
866
867// PR13593, example 3
868
869/**
870 * aaa
871 */
872template <typename T>
873inline T test_nocrash5(T a1)
874{
875    return a1;
876}
877
878///
879//,
880
881inline void test_nocrash6()
882{
883    test_nocrash5(1);
884}
885
886// We used to crash on this.
887
888/*!
889  Blah.
890*/
891typedef 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
897int 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
905int 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
911int 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**/
919int 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
924int 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*/
931struct U { int iS; };
932
933/*!
934  @union U1
935*/
936union 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*/
942union S2 {};
943
944/*!
945  @class C1
946*/
947class C1;
948
949/*!
950  @struct S3;
951*/
952class S3;
953
954// rdar://14124702
955//----------------------------------------------------------------------
956/// @class Predicate Predicate.h "lldb/Host/Predicate.h"
957/// @brief A C++ wrapper class for providing threaded access to a value
958/// of type T.
959///
960/// A templatized class.
961/// specified values.
962//----------------------------------------------------------------------
963template <class T, class T1>
964class Predicate
965{
966};
967
968//----------------------------------------------------------------------
969/// @class Predicate<int, char> Predicate.h "lldb/Host/Predicate.h"
970/// @brief A C++ wrapper class for providing threaded access to a value
971/// of type T.
972///
973/// A template specilization class.
974//----------------------------------------------------------------------
975template<> class Predicate<int, char>
976{
977};
978
979//----------------------------------------------------------------------
980/// @class Predicate<T, int> Predicate.h "lldb/Host/Predicate.h"
981/// @brief A C++ wrapper class for providing threaded access to a value
982/// of type T.
983///
984/// A partial specialization template class.
985//----------------------------------------------------------------------
986template<class T> class Predicate<T, int>
987{
988};
989
990/*!     @function test_function
991*/
992template <class T> T test_function (T arg);
993
994/*!     @function test_function<int>
995*/
996template <> int test_function<int> (int arg);
997