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