Home | History | Annotate | Download | only in Sema
      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@+2 {{HTML tag 'a' requires an end tag}}
      8 // expected-warning@+1 {{expected quoted string after equals sign}}
      9 /// <a href=>
     10 int test_html1(int);
     11 
     12 // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
     13 // expected-warning@+1 {{expected quoted string after equals sign}}
     14 /// <a href==>
     15 int test_html2(int);
     16 
     17 // expected-warning@+3 {{HTML tag 'a' requires an end tag}}
     18 // expected-warning@+2 {{expected quoted string after equals sign}}
     19 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
     20 /// <a href= blah
     21 int test_html3(int);
     22 
     23 // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
     24 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
     25 /// <a =>
     26 int test_html4(int);
     27 
     28 // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
     29 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
     30 /// <a "aaa">
     31 int test_html5(int);
     32 
     33 // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
     34 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
     35 /// <a a="b" =>
     36 int test_html6(int);
     37 
     38 // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
     39 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
     40 /// <a a="b" "aaa">
     41 int test_html7(int);
     42 
     43 // expected-warning@+2 {{HTML tag 'a' requires an end tag}}
     44 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
     45 /// <a a="b" =
     46 int test_html8(int);
     47 
     48 // expected-warning@+2 {{HTML start tag prematurely ended, expected attribute name or '>'}} expected-note@+1 {{HTML tag started here}}
     49 /** Aaa bbb<img ddd eee
     50  * fff ggg.
     51  */
     52 int test_html9(int);
     53 
     54 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
     55 /** Aaa bbb<img ddd eee 42%
     56  * fff ggg.
     57  */
     58 int test_html10(int);
     59 
     60 // expected-warning@+1 {{HTML end tag 'br' is forbidden}}
     61 /// <br></br>
     62 int test_html11(int);
     63 
     64 /// <blockquote>Meow</blockquote>
     65 int test_html_nesting1(int);
     66 
     67 /// <b><i>Meow</i></b>
     68 int test_html_nesting2(int);
     69 
     70 /// <p>Aaa<br>
     71 /// Bbb</p>
     72 int test_html_nesting3(int);
     73 
     74 /// <p>Aaa<br />
     75 /// Bbb</p>
     76 int test_html_nesting4(int);
     77 
     78 // expected-warning@+3 {{HTML tag 'b' requires an end tag}}
     79 // expected-warning@+2 {{HTML tag 'i' requires an end tag}}
     80 // expected-warning@+1 {{HTML end tag does not match any start tag}}
     81 /// <b><i>Meow</a>
     82 int test_html_nesting5(int);
     83 
     84 // expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
     85 // expected-warning@+1 {{HTML end tag does not match any start tag}}
     86 /// <b><i>Meow</b></b>
     87 int test_html_nesting6(int);
     88 
     89 // expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
     90 // expected-warning@+1 {{HTML end tag does not match any start tag}}
     91 /// <b><i>Meow</b></i>
     92 int test_html_nesting7(int);
     93 
     94 // expected-warning@+1 {{HTML tag 'b' requires an end tag}}
     95 /// <b>Meow
     96 int test_html_nesting8(int);
     97 
     98 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
     99 /// \brief\returns Aaa
    100 int test_block_command1(int);
    101 
    102 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    103 /// \brief \returns Aaa
    104 int test_block_command2(int);
    105 
    106 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    107 /// \brief
    108 /// \returns Aaa
    109 int test_block_command3(int);
    110 
    111 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    112 /// \brief
    113 ///
    114 /// \returns Aaa
    115 int test_block_command4(int);
    116 
    117 // There is trailing whitespace on one of the following lines, don't remove it!
    118 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    119 /// \brief
    120 ///
    121 /// \returns Aaa
    122 int test_block_command5(int);
    123 
    124 /// \brief \c Aaa
    125 int test_block_command6(int);
    126 
    127 // expected-warning@+5 {{duplicated command '\brief'}} expected-note@+1 {{previous command '\brief' here}}
    128 /// \brief Aaa
    129 ///
    130 /// Bbb
    131 ///
    132 /// \brief Ccc
    133 int test_duplicate_brief1(int);
    134 
    135 // expected-warning@+5 {{duplicated command '\short'}} expected-note@+1 {{previous command '\short' here}}
    136 /// \short Aaa
    137 ///
    138 /// Bbb
    139 ///
    140 /// \short Ccc
    141 int test_duplicate_brief2(int);
    142 
    143 // expected-warning@+5 {{duplicated command '\brief'}} expected-note@+1 {{previous command '\short' (an alias of '\brief') here}}
    144 /// \short Aaa
    145 ///
    146 /// Bbb
    147 ///
    148 /// \brief Ccc
    149 int test_duplicate_brief3(int);
    150 
    151 
    152 /// \return Aaa
    153 ///
    154 /// Bbb
    155 ///
    156 /// \return Ccc
    157 int test_multiple_returns1(int);
    158 
    159 /// \returns Aaa
    160 ///
    161 /// Bbb
    162 ///
    163 /// \returns Ccc
    164 int test_multiple_returns2(int);
    165 
    166 /// \result Aaa
    167 ///
    168 /// Bbb
    169 ///
    170 /// \result Ccc
    171 int test_multiple_returns3(int);
    172 
    173 /// \returns Aaa
    174 ///
    175 /// Bbb
    176 ///
    177 /// \return Ccc
    178 int test_multiple_returns4(int);
    179 
    180 
    181 // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
    182 /// \param a Blah blah.
    183 int test_param1_backslash;
    184 
    185 // rdar://13066276
    186 // Check that the diagnostic uses the same command marker as the comment.
    187 // expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
    188 /// @param a Blah blah.
    189 int test_param1_at;
    190 
    191 // expected-warning@+1 {{empty paragraph passed to '\param' command}}
    192 /// \param
    193 /// \param a Blah blah.
    194 int test_param2(int a);
    195 
    196 // expected-warning@+1 {{empty paragraph passed to '\param' command}}
    197 /// \param a
    198 int test_param3(int a);
    199 
    200 /// \param a Blah blah.
    201 int test_param4(int a);
    202 
    203 /// \param [in] a Blah blah.
    204 int test_param5(int a);
    205 
    206 /// \param [out] a Blah blah.
    207 int test_param6(int a);
    208 
    209 /// \param [in,out] a Blah blah.
    210 int test_param7(int a);
    211 
    212 // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
    213 /// \param [ in ] a Blah blah.
    214 int test_param8(int a);
    215 
    216 // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
    217 /// \param [in, out] a Blah blah.
    218 int test_param9(int a);
    219 
    220 // expected-warning@+1 {{unrecognized parameter passing direction, valid directions are '[in]', '[out]' and '[in,out]'}}
    221 /// \param [ junk] a Blah blah.
    222 int test_param10(int a);
    223 
    224 // expected-warning@+1 {{parameter 'a' not found in the function declaration}}
    225 /// \param a Blah blah.
    226 int test_param11();
    227 
    228 // expected-warning@+1 {{parameter 'A' not found in the function declaration}} expected-note@+1 {{did you mean 'a'?}}
    229 /// \param A Blah blah.
    230 int test_param12(int a);
    231 
    232 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
    233 /// \param aab Blah blah.
    234 int test_param13(int aaa, int bbb);
    235 
    236 // expected-warning@+2 {{parameter 'aab' not found in the function declaration}} expected-note@+2 {{did you mean 'bbb'?}}
    237 /// \param aaa Blah blah.
    238 /// \param aab Blah blah.
    239 int test_param14(int aaa, int bbb);
    240 
    241 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
    242 /// \param aab Blah blah.
    243 int test_param15(int bbb, int ccc);
    244 
    245 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
    246 /// \param aab Ccc.
    247 /// \param aaa Aaa.
    248 /// \param bbb Bbb.
    249 int test_param16(int aaa, int bbb);
    250 
    251 // expected-warning@+2 {{parameter 'aab' not found in the function declaration}}
    252 /// \param aaa Aaa.
    253 /// \param aab Ccc.
    254 /// \param bbb Bbb.
    255 int test_param17(int aaa, int bbb);
    256 
    257 // expected-warning@+3 {{parameter 'aab' not found in the function declaration}}
    258 /// \param aaa Aaa.
    259 /// \param bbb Bbb.
    260 /// \param aab Ccc.
    261 int test_param18(int aaa, int bbb);
    262 
    263 class C {
    264   // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
    265   /// \param aaa Blah blah.
    266   C(int bbb, int ccc);
    267 
    268   // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
    269   /// \param aaa Blah blah.
    270  int test_param19(int bbb, int ccc);
    271 };
    272 
    273 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
    274 /// \param aab Blah blah.
    275 template<typename T>
    276 void test_param20(int bbb, int ccc);
    277 
    278 // expected-warning@+3 {{parameter 'a' is already documented}}
    279 // expected-note@+1 {{previous documentation}}
    280 /// \param a Aaa.
    281 /// \param a Aaa.
    282 int test_param21(int a);
    283 
    284 // expected-warning@+4 {{parameter 'x2' is already documented}}
    285 // expected-note@+2 {{previous documentation}}
    286 /// \param x1 Aaa.
    287 /// \param x2 Bbb.
    288 /// \param x2 Ccc.
    289 int test_param22(int x1, int x2, int x3);
    290 
    291 //===---
    292 // Test that we treat typedefs to some non-function types as functions for the
    293 // purposes of documentation comment parsing.
    294 //===---
    295 
    296 namespace foo {
    297   inline namespace bar {
    298     template<typename>
    299     struct function_wrapper {};
    300 
    301     template<unsigned>
    302     struct not_a_function_wrapper {};
    303   }
    304 };
    305 
    306 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    307 /// \param aaa Meow.
    308 /// \param bbb Bbb.
    309 /// \returns aaa.
    310 typedef int test_function_like_typedef1(int aaa, int ccc);
    311 
    312 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    313 /// \param aaa Meow.
    314 /// \param bbb Bbb.
    315 /// \returns aaa.
    316 typedef int (*test_function_like_typedef2)(int aaa, int ccc);
    317 
    318 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    319 /// \param aaa Meow.
    320 /// \param bbb Bbb.
    321 /// \returns aaa.
    322 typedef int (* const test_function_like_typedef3)(int aaa, int ccc);
    323 
    324 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    325 /// \param aaa Meow.
    326 /// \param bbb Bbb.
    327 /// \returns aaa.
    328 typedef int (C::*test_function_like_typedef4)(int aaa, int ccc);
    329 
    330 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    331 /// \param aaa Meow.
    332 /// \param bbb Bbb.
    333 /// \returns aaa.
    334 typedef foo::function_wrapper<int (int aaa, int ccc)> test_function_like_typedef5;
    335 
    336 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    337 /// \param aaa Meow.
    338 /// \param bbb Bbb.
    339 /// \returns aaa.
    340 typedef foo::function_wrapper<int (int aaa, int ccc)> *test_function_like_typedef6;
    341 
    342 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    343 /// \param aaa Meow.
    344 /// \param bbb Bbb.
    345 /// \returns aaa.
    346 typedef foo::function_wrapper<int (int aaa, int ccc)> &test_function_like_typedef7;
    347 
    348 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    349 /// \param aaa Meow.
    350 /// \param bbb Bbb.
    351 /// \returns aaa.
    352 typedef foo::function_wrapper<int (int aaa, int ccc)> &&test_function_like_typedef8;
    353 
    354 
    355 typedef int (*test_not_function_like_typedef1)(int aaa);
    356 
    357 // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
    358 /// \param aaa Meow.
    359 typedef test_not_function_like_typedef1 test_not_function_like_typedef2;
    360 
    361 // rdar://13066276
    362 // Check that the diagnostic uses the same command marker as the comment.
    363 // expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
    364 /// @param aaa Meow.
    365 typedef unsigned int test_not_function_like_typedef3;
    366 
    367 // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
    368 /// \param aaa Meow.
    369 typedef foo::not_a_function_wrapper<1> test_not_function_like_typedef4;
    370 
    371 /// \param aaa Aaa
    372 /// \param ... Vararg
    373 int test_vararg_param1(int aaa, ...);
    374 
    375 /// \param ... Vararg
    376 int test_vararg_param2(...);
    377 
    378 // expected-warning@+1 {{parameter '...' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
    379 /// \param ... Vararg
    380 int test_vararg_param3(int aaa);
    381 
    382 // expected-warning@+1 {{parameter '...' not found in the function declaration}}
    383 /// \param ... Vararg
    384 int test_vararg_param4();
    385 
    386 
    387 /// \param aaa Aaa
    388 /// \param ... Vararg
    389 template<typename T>
    390 int test_template_vararg_param1(int aaa, ...);
    391 
    392 /// \param ... Vararg
    393 template<typename T>
    394 int test_template_vararg_param2(...);
    395 
    396 // expected-warning@+1 {{parameter '...' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
    397 /// \param ... Vararg
    398 template<typename T>
    399 int test_template_vararg_param3(int aaa);
    400 
    401 // expected-warning@+1 {{parameter '...' not found in the function declaration}}
    402 /// \param ... Vararg
    403 template<typename T>
    404 int test_template_vararg_param4();
    405 
    406 
    407 // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
    408 /// \tparam T Aaa
    409 int test_tparam1;
    410 
    411 // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
    412 /// \tparam T Aaa
    413 void test_tparam2(int aaa);
    414 
    415 // expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
    416 /// \tparam
    417 /// \param aaa Blah blah
    418 template<typename T>
    419 void test_tparam3(T aaa);
    420 
    421 // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
    422 /// \tparam T Aaa
    423 template<typename TT>
    424 void test_tparam4(TT aaa);
    425 
    426 // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
    427 /// \tparam T Aaa
    428 template<typename TT>
    429 class test_tparam5 {
    430   // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TTT'?}}
    431   /// \tparam T Aaa
    432   template<typename TTT>
    433   void test_tparam6(TTT aaa);
    434 };
    435 
    436 /// \tparam T1 Aaa
    437 /// \tparam T2 Bbb
    438 template<typename T1, typename T2>
    439 void test_tparam7(T1 aaa, T2 bbb);
    440 
    441 // expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}}
    442 /// \tparam SomTy Aaa
    443 /// \tparam OtherTy Bbb
    444 template<typename SomeTy, typename OtherTy>
    445 void test_tparam8(SomeTy aaa, OtherTy bbb);
    446 
    447 // expected-warning@+2 {{template parameter 'T1' is already documented}} expected-note@+1 {{previous documentation}}
    448 /// \tparam T1 Aaa
    449 /// \tparam T1 Bbb
    450 template<typename T1, typename T2>
    451 void test_tparam9(T1 aaa, T2 bbb);
    452 
    453 /// \tparam T Aaa
    454 /// \tparam TT Bbb
    455 template<template<typename T> class TT>
    456 void test_tparam10(TT<int> aaa);
    457 
    458 /// \tparam T Aaa
    459 /// \tparam TT Bbb
    460 /// \tparam TTT Ccc
    461 template<template<template<typename T> class TT, class C> class TTT>
    462 void test_tparam11();
    463 
    464 /// \tparam I Aaa
    465 template<int I>
    466 void test_tparam12();
    467 
    468 template<typename T, typename U>
    469 class test_tparam13 { };
    470 
    471 /// \tparam T Aaa
    472 template<typename T>
    473 using test_tparam14 = test_tparam13<T, int>;
    474 
    475 // expected-warning@+1 {{template parameter 'U' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}}
    476 /// \tparam U Aaa
    477 template<typename T>
    478 using test_tparam15 = test_tparam13<T, int>;
    479 
    480 // ----
    481 
    482 /// \tparam T Aaa
    483 template<typename T>
    484 class test_tparam16 { };
    485 
    486 typedef test_tparam16<int> test_tparam17;
    487 typedef test_tparam16<double> test_tparam18;
    488 
    489 // ----
    490 
    491 template<typename T>
    492 class test_tparam19;
    493 
    494 typedef test_tparam19<int> test_tparam20;
    495 typedef test_tparam19<double> test_tparam21;
    496 
    497 /// \tparam T Aaa
    498 template<typename T>
    499 class test_tparam19 { };
    500 
    501 // ----
    502 
    503 // expected-warning@+1 {{'@tparam' command used in a comment that is not attached to a template declaration}}
    504 /// @tparam T Aaa
    505 int test_tparam22;
    506 
    507 // ----
    508 
    509 
    510 /// Aaa
    511 /// \deprecated Bbb
    512 void test_deprecated_1(int a) __attribute__((deprecated));
    513 
    514 // We don't want \deprecated to warn about empty paragraph.  It is fine to use
    515 // \deprecated by itself without explanations.
    516 
    517 /// Aaa
    518 /// \deprecated
    519 void test_deprecated_2(int a) __attribute__((deprecated));
    520 
    521 /// Aaa
    522 /// \deprecated
    523 void test_deprecated_3(int a) __attribute__((availability(macosx,introduced=10.4)));
    524 
    525 /// Aaa
    526 /// \deprecated
    527 void test_deprecated_4(int a) __attribute__((unavailable));
    528 
    529 // 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}}
    530 /// Aaa
    531 /// \deprecated
    532 void test_deprecated_5(int a);
    533 
    534 // 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}}
    535 /// Aaa
    536 /// \deprecated
    537 void test_deprecated_6(int a) {
    538 }
    539 
    540 // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
    541 /// Aaa
    542 /// \deprecated
    543 template<typename T>
    544 void test_deprecated_7(T aaa);
    545 
    546 
    547 // rdar://12397511
    548 // expected-note@+2 {{previous command '\headerfile' here}}
    549 // expected-warning@+2 {{duplicated command '\headerfile'}}
    550 /// \headerfile ""
    551 /// \headerfile foo.h
    552 int test__headerfile_1(int a);
    553 
    554 
    555 /// \invariant aaa
    556 void test_invariant_1(int a);
    557 
    558 // expected-warning@+1 {{empty paragraph passed to '\invariant' command}}
    559 /// \invariant
    560 void test_invariant_2(int a);
    561 
    562 
    563 // no-warning
    564 /// \returns Aaa
    565 int test_returns_right_decl_1(int);
    566 
    567 class test_returns_right_decl_2 {
    568   // no-warning
    569   /// \returns Aaa
    570   int test_returns_right_decl_3(int);
    571 };
    572 
    573 // no-warning
    574 /// \returns Aaa
    575 template<typename T>
    576 int test_returns_right_decl_4(T aaa);
    577 
    578 // no-warning
    579 /// \returns Aaa
    580 template<>
    581 int test_returns_right_decl_4(int aaa);
    582 
    583 /// \returns Aaa
    584 template<typename T>
    585 T test_returns_right_decl_5(T aaa);
    586 
    587 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
    588 /// \returns Aaa
    589 int test_returns_wrong_decl_1_backslash;
    590 
    591 // rdar://13066276
    592 // Check that the diagnostic uses the same command marker as the comment.
    593 // expected-warning@+1 {{'@returns' command used in a comment that is not attached to a function or method declaration}}
    594 /// @returns Aaa
    595 int test_returns_wrong_decl_1_at;
    596 
    597 // expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
    598 /// \return Aaa
    599 int test_returns_wrong_decl_2;
    600 
    601 // expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}}
    602 /// \result Aaa
    603 int test_returns_wrong_decl_3;
    604 
    605 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
    606 /// \returns Aaa
    607 void test_returns_wrong_decl_4(int);
    608 
    609 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
    610 /// \returns Aaa
    611 template<typename T>
    612 void test_returns_wrong_decl_5(T aaa);
    613 
    614 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
    615 /// \returns Aaa
    616 template<>
    617 void test_returns_wrong_decl_5(int aaa);
    618 
    619 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
    620 /// \returns Aaa
    621 struct test_returns_wrong_decl_6 { };
    622 
    623 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
    624 /// \returns Aaa
    625 class test_returns_wrong_decl_7 {
    626   // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}}
    627   /// \returns Aaa
    628   test_returns_wrong_decl_7();
    629 
    630   // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}}
    631   /// \returns Aaa
    632   ~test_returns_wrong_decl_7();
    633 };
    634 
    635 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
    636 /// \returns Aaa
    637 enum test_returns_wrong_decl_8 {
    638   // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
    639   /// \returns Aaa
    640   test_returns_wrong_decl_9
    641 };
    642 
    643 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
    644 /// \returns Aaa
    645 namespace test_returns_wrong_decl_10 { };
    646 
    647 // rdar://13094352
    648 // expected-warning@+1 {{'@function' command should be used in a comment attached to a function declaration}}
    649 /*!	@function test_function
    650 */
    651 typedef unsigned int Base64Flags;
    652 unsigned test_function(Base64Flags inFlags);
    653 
    654 // expected-warning@+1 {{'@callback' command should be used in a comment attached to a pointer to function declaration}}
    655 /*! @callback test_callback
    656 */
    657 typedef unsigned int BaseFlags;
    658 unsigned (*test_callback)(BaseFlags inFlags);
    659 
    660 // expected-warning@+1 {{'\endverbatim' command does not terminate a verbatim text block}}
    661 /// \endverbatim
    662 int test_verbatim_1();
    663 
    664 // expected-warning@+1 {{'\endcode' command does not terminate a verbatim text block}}
    665 /// \endcode
    666 int test_verbatim_2();
    667 
    668 // FIXME: we give a bad diagnostic here because we throw away non-documentation
    669 // comments early.
    670 //
    671 // expected-warning@+3 {{'\endcode' command does not terminate a verbatim text block}}
    672 /// \code
    673 //  foo
    674 /// \endcode
    675 int test_verbatim_3();
    676 
    677 
    678 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    679 int test1; ///< \brief\author Aaa
    680 
    681 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
    682 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
    683 int test2, ///< \brief\author Aaa
    684     test3; ///< \brief\author Aaa
    685 
    686 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    687 int test4; ///< \brief
    688            ///< \author Aaa
    689 
    690 
    691 class TestRelates {};
    692 
    693 /// \relates TestRelates
    694 /// \brief Aaa
    695 void test_relates_1();
    696 
    697 /// \related TestRelates
    698 /// \brief Aaa
    699 void test_relates_2();
    700 
    701 /// \relatesalso TestRelates
    702 /// \brief Aaa
    703 void test_relates_3();
    704 
    705 /// \relatedalso TestRelates
    706 /// \brief Aaa
    707 void test_relates_4();
    708 
    709 
    710 // Check that we attach the comment to the declaration during parsing in the
    711 // following cases.  The test is based on the fact that we don't parse
    712 // documentation comments that are not attached to anything.
    713 
    714 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    715 /// \brief\author Aaa
    716 int test_attach1;
    717 
    718 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    719 /// \brief\author Aaa
    720 int test_attach2(int);
    721 
    722 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    723 /// \brief\author Aaa
    724 struct test_attach3 {
    725   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    726   /// \brief\author Aaa
    727   int test_attach4;
    728 
    729   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    730   int test_attach5; ///< \brief\author Aaa
    731 
    732   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    733   /// \brief\author Aaa
    734   int test_attach6(int);
    735 };
    736 
    737 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    738 /// \brief\author Aaa
    739 class test_attach7 {
    740   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    741   /// \brief\author Aaa
    742   int test_attach8;
    743 
    744   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    745   int test_attach9; ///< \brief\author Aaa
    746 
    747   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    748   /// \brief\author Aaa
    749   int test_attach10(int);
    750 };
    751 
    752 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    753 /// \brief\author Aaa
    754 enum test_attach9 {
    755   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    756   /// \brief\author Aaa
    757   test_attach10,
    758 
    759   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    760   test_attach11 ///< \brief\author Aaa
    761 };
    762 
    763 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    764 /// \brief\author Aaa
    765 struct test_noattach12 *test_attach13;
    766 
    767 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    768 /// \brief\author Aaa
    769 typedef struct test_noattach14 *test_attach15;
    770 
    771 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    772 /// \brief\author Aaa
    773 typedef struct test_attach16 { int a; } test_attach17;
    774 
    775 struct S { int a; };
    776 
    777 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    778 /// \brief\author Aaa
    779 struct S *test_attach18;
    780 
    781 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    782 /// \brief\author Aaa
    783 typedef struct S *test_attach19;
    784 
    785 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    786 /// \brief\author Aaa
    787 struct test_attach20;
    788 
    789 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    790 /// \brief\author Aaa
    791 typedef struct test_attach21 {
    792   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    793   /// \brief\author Aaa
    794   int test_attach22;
    795 } test_attach23;
    796 
    797 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    798 /// \brief\author Aaa
    799 namespace test_attach24 {
    800   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    801   /// \brief\author Aaa
    802   namespace test_attach25 {
    803   }
    804 }
    805 
    806 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    807 /// \brief\author Aaa
    808 /// \tparam T Aaa
    809 template<typename T>
    810 void test_attach26(T aaa);
    811 
    812 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    813 /// \brief\author Aaa
    814 /// \tparam T Aaa
    815 template<typename T, typename U>
    816 void test_attach27(T aaa, U bbb);
    817 
    818 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
    819 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
    820 /// \brief\author Aaa
    821 /// \tparam T Aaa
    822 template<>
    823 void test_attach27(int aaa, int bbb);
    824 
    825 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    826 /// \brief\author Aaa
    827 /// \tparam T Aaa
    828 template<typename T>
    829 class test_attach28 {
    830   T aaa;
    831 };
    832 
    833 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    834 /// \brief\author Aaa
    835 using test_attach29 = test_attach28<int>;
    836 
    837 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    838 /// \brief\author Aaa
    839 /// \tparam T Aaa
    840 template<typename T, typename U>
    841 class test_attach30 { };
    842 
    843 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    844 /// \brief\author Aaa
    845 /// \tparam T Aaa
    846 template<typename T>
    847 class test_attach30<T, int> { };
    848 
    849 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    850 /// \brief\author Aaa
    851 template<>
    852 class test_attach30<int, int> { };
    853 
    854 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    855 /// \brief\author Aaa
    856 template<typename T>
    857 using test_attach31 = test_attach30<T, int>;
    858 
    859 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    860 /// \brief\author Aaa
    861 /// \tparam T Aaa
    862 template<typename T, typename U, typename V>
    863 class test_attach32 { };
    864 
    865 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    866 /// \brief\author Aaa
    867 /// \tparam T Aaa
    868 template<typename T, typename U>
    869 class test_attach32<T, U, int> { };
    870 
    871 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    872 /// \brief\author Aaa
    873 /// \tparam T Aaa
    874 template<typename T>
    875 class test_attach32<T, int, int> { };
    876 
    877 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
    878 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
    879 /// \brief\author Aaa
    880 /// \tparam T Aaa
    881 template<>
    882 class test_attach32<int, int, int> { };
    883 
    884 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    885 /// \brief\author Aaa
    886 class test_attach33 {
    887   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    888   /// \brief\author Aaa
    889   /// \tparam T Aaa
    890   template<typename T, typename U>
    891   void test_attach34(T aaa, U bbb);
    892 };
    893 
    894 template<typename T>
    895 class test_attach35 {
    896   // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
    897   // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
    898   /// \brief\author Aaa
    899   /// \tparam T Aaa
    900   template<typename TT, typename UU>
    901   void test_attach36(TT aaa, UU bbb);
    902 };
    903 
    904 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
    905 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
    906 /// \brief\author Aaa
    907 /// \tparam T Aaa
    908 template<> template<>
    909 void test_attach35<int>::test_attach36(int aaa, int bbb) {}
    910 
    911 template<typename T>
    912 class test_attach37 {
    913   // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
    914   // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}}
    915   /// \brief\author Aaa
    916   /// \tparam T Aaa
    917   void test_attach38(int aaa, int bbb);
    918 
    919   void test_attach39(int aaa, int bbb);
    920 };
    921 
    922 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
    923 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
    924 /// \brief\author Aaa
    925 /// \tparam T Aaa
    926 template<>
    927 void test_attach37<int>::test_attach38(int aaa, int bbb) {}
    928 
    929 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    930 /// \brief\author Aaa
    931 /// \tparam T Aaa
    932 template<typename T>
    933 void test_attach37<T>::test_attach39(int aaa, int bbb) {}
    934 
    935 // We used to emit warning that parameter 'a' is not found because we parsed
    936 // the comment in context of the redeclaration which does not have parameter
    937 // names.
    938 template <typename T>
    939 struct test_attach38 {
    940   /*!
    941     \param a  First param
    942     \param b  Second param
    943   */
    944   template <typename B>
    945   void test_attach39(T a, B b);
    946 };
    947 
    948 template <>
    949 template <typename B>
    950 void test_attach38<int>::test_attach39(int, B);
    951 
    952 
    953 // PR13411, reduced.  We used to crash on this.
    954 /**
    955  * @code Aaa.
    956  */
    957 void test_nocrash1(int);
    958 
    959 // We used to crash on this.
    960 // expected-warning@+2 {{empty paragraph passed to '\param' command}}
    961 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    962 /// \param\brief
    963 void test_nocrash2(int);
    964 
    965 // PR13593, example 1 and 2
    966 
    967 /**
    968 * Bla.
    969 */
    970 template <typename>
    971 void test_nocrash3();
    972 
    973 /// Foo
    974 template <typename, typename>
    975 void test_nocrash4() { }
    976 
    977 template <typename>
    978 void test_nocrash3()
    979 {
    980 }
    981 
    982 // PR13593, example 3
    983 
    984 /**
    985  * aaa
    986  */
    987 template <typename T>
    988 inline T test_nocrash5(T a1)
    989 {
    990     return a1;
    991 }
    992 
    993 ///
    994 //,
    995 
    996 inline void test_nocrash6()
    997 {
    998     test_nocrash5(1);
    999 }
   1000 
   1001 // We used to crash on this.
   1002 
   1003 /*!
   1004   Blah.
   1005 */
   1006 typedef const struct test_nocrash7 * test_nocrash8;
   1007 
   1008 // We used to crash on this.
   1009 
   1010 // expected-warning@+1 {{unknown command tag name}}
   1011 /// aaa \unknown aaa \unknown aaa
   1012 int test_nocrash9;
   1013 
   1014 // We used to crash on this.  PR15068
   1015 
   1016 // expected-warning@+2 {{empty paragraph passed to '@param' command}}
   1017 // expected-warning@+2 {{empty paragraph passed to '@param' command}}
   1018 ///@param x
   1019 ///@param y
   1020 int test_nocrash10(int x, int y);
   1021 
   1022 // expected-warning@+2 {{empty paragraph passed to '@param' command}} expected-warning@+2 {{parameter 'x' not found in the function declaration}}
   1023 // expected-warning@+2 {{empty paragraph passed to '@param' command}} expected-warning@+2 {{parameter 'y' not found in the function declaration}}
   1024 ///@param x
   1025 ///@param y
   1026 int test_nocrash11();
   1027 
   1028 // expected-warning@+3 {{empty paragraph passed to '@param' command}} expected-warning@+3 {{parameter 'x' not found in the function declaration}}
   1029 // expected-warning@+3 {{empty paragraph passed to '@param' command}} expected-warning@+3 {{parameter 'y' not found in the function declaration}}
   1030 /**
   1031 @param x
   1032 @param y
   1033 **/
   1034 int test_nocrash12();
   1035 
   1036 // expected-warning@+2 {{empty paragraph passed to '@param' command}}
   1037 // expected-warning@+1 {{empty paragraph passed to '@param' command}}
   1038 ///@param x@param y
   1039 int test_nocrash13(int x, int y);
   1040 
   1041 // rdar://12379114
   1042 // expected-warning@+2 {{'@union' command should not be used in a comment attached to a non-union declaration}}
   1043 /*!
   1044    @union U This is new
   1045 */
   1046 struct U { int iS; };
   1047 
   1048 /*!
   1049   @union U1
   1050 */
   1051 union U1 {int i; };
   1052 
   1053 // expected-warning@+2 {{'@struct' command should not be used in a comment attached to a non-struct declaration}}
   1054 /*!
   1055  @struct S2
   1056 */
   1057 union S2 {};
   1058 
   1059 /*!
   1060   @class C1
   1061 */
   1062 class C1;
   1063 
   1064 /*!
   1065   @struct S3;
   1066 */
   1067 class S3;
   1068 
   1069 // rdar://14124702
   1070 //----------------------------------------------------------------------
   1071 /// @class Predicate Predicate.h "lldb/Host/Predicate.h"
   1072 /// @brief A C++ wrapper class for providing threaded access to a value
   1073 /// of type T.
   1074 ///
   1075 /// A templatized class.
   1076 /// specified values.
   1077 //----------------------------------------------------------------------
   1078 template <class T, class T1>
   1079 class Predicate
   1080 {
   1081 };
   1082 
   1083 //----------------------------------------------------------------------
   1084 /// @class Predicate<int, char> Predicate.h "lldb/Host/Predicate.h"
   1085 /// @brief A C++ wrapper class for providing threaded access to a value
   1086 /// of type T.
   1087 ///
   1088 /// A template specilization class.
   1089 //----------------------------------------------------------------------
   1090 template<> class Predicate<int, char>
   1091 {
   1092 };
   1093 
   1094 //----------------------------------------------------------------------
   1095 /// @class Predicate<T, int> Predicate.h "lldb/Host/Predicate.h"
   1096 /// @brief A C++ wrapper class for providing threaded access to a value
   1097 /// of type T.
   1098 ///
   1099 /// A partial specialization template class.
   1100 //----------------------------------------------------------------------
   1101 template<class T> class Predicate<T, int>
   1102 {
   1103 };
   1104 
   1105 /*!     @function test_function
   1106 */
   1107 template <class T> T test_function (T arg);
   1108 
   1109 /*!     @function test_function<int>
   1110 */
   1111 template <> int test_function<int> (int arg);
   1112