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 // expected-warning@+5 {{duplicated command '\return'}} expected-note@+1 {{previous command '\return' here}}
    140 /// \return Aaa
    141 ///
    142 /// Bbb
    143 ///
    144 /// \return Ccc
    145 int test_duplicate_returns1(int);
    146 
    147 // expected-warning@+5 {{duplicated command '\returns'}} expected-note@+1 {{previous command '\returns' here}}
    148 /// \returns Aaa
    149 ///
    150 /// Bbb
    151 ///
    152 /// \returns Ccc
    153 int test_duplicate_returns2(int);
    154 
    155 // expected-warning@+5 {{duplicated command '\result'}} expected-note@+1 {{previous command '\result' here}}
    156 /// \result Aaa
    157 ///
    158 /// Bbb
    159 ///
    160 /// \result Ccc
    161 int test_duplicate_returns3(int);
    162 
    163 // expected-warning@+5 {{duplicated command '\return'}} expected-note@+1 {{previous command '\returns' (an alias of '\return') here}}
    164 /// \returns Aaa
    165 ///
    166 /// Bbb
    167 ///
    168 /// \return Ccc
    169 int test_duplicate_returns4(int);
    170 
    171 
    172 // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
    173 /// \param a Blah blah.
    174 int test_param1;
    175 
    176 // expected-warning@+1 {{empty paragraph passed to '\param' command}}
    177 /// \param
    178 /// \param a Blah blah.
    179 int test_param2(int a);
    180 
    181 // expected-warning@+1 {{empty paragraph passed to '\param' command}}
    182 /// \param a
    183 int test_param3(int a);
    184 
    185 /// \param a Blah blah.
    186 int test_param4(int a);
    187 
    188 /// \param [in] a Blah blah.
    189 int test_param5(int a);
    190 
    191 /// \param [out] a Blah blah.
    192 int test_param6(int a);
    193 
    194 /// \param [in,out] a Blah blah.
    195 int test_param7(int a);
    196 
    197 // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
    198 /// \param [ in ] a Blah blah.
    199 int test_param8(int a);
    200 
    201 // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
    202 /// \param [in, out] a Blah blah.
    203 int test_param9(int a);
    204 
    205 // expected-warning@+1 {{unrecognized parameter passing direction, valid directions are '[in]', '[out]' and '[in,out]'}}
    206 /// \param [ junk] a Blah blah.
    207 int test_param10(int a);
    208 
    209 // expected-warning@+1 {{parameter 'a' not found in the function declaration}}
    210 /// \param a Blah blah.
    211 int test_param11();
    212 
    213 // expected-warning@+1 {{parameter 'A' not found in the function declaration}} expected-note@+1 {{did you mean 'a'?}}
    214 /// \param A Blah blah.
    215 int test_param12(int a);
    216 
    217 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
    218 /// \param aab Blah blah.
    219 int test_param13(int aaa, int bbb);
    220 
    221 // expected-warning@+2 {{parameter 'aab' not found in the function declaration}} expected-note@+2 {{did you mean 'bbb'?}}
    222 /// \param aaa Blah blah.
    223 /// \param aab Blah blah.
    224 int test_param14(int aaa, int bbb);
    225 
    226 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
    227 /// \param aab Blah blah.
    228 int test_param15(int bbb, int ccc);
    229 
    230 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
    231 /// \param aab Ccc.
    232 /// \param aaa Aaa.
    233 /// \param bbb Bbb.
    234 int test_param16(int aaa, int bbb);
    235 
    236 // expected-warning@+2 {{parameter 'aab' not found in the function declaration}}
    237 /// \param aaa Aaa.
    238 /// \param aab Ccc.
    239 /// \param bbb Bbb.
    240 int test_param17(int aaa, int bbb);
    241 
    242 // expected-warning@+3 {{parameter 'aab' not found in the function declaration}}
    243 /// \param aaa Aaa.
    244 /// \param bbb Bbb.
    245 /// \param aab Ccc.
    246 int test_param18(int aaa, int bbb);
    247 
    248 class C {
    249   // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
    250   /// \param aaa Blah blah.
    251   C(int bbb, int ccc);
    252 
    253   // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
    254   /// \param aaa Blah blah.
    255  int test_param19(int bbb, int ccc);
    256 };
    257 
    258 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
    259 /// \param aab Blah blah.
    260 template<typename T>
    261 void test_param20(int bbb, int ccc);
    262 
    263 // expected-warning@+3 {{parameter 'a' is already documented}}
    264 // expected-note@+1 {{previous documentation}}
    265 /// \param a Aaa.
    266 /// \param a Aaa.
    267 int test_param21(int a);
    268 
    269 // expected-warning@+4 {{parameter 'x2' is already documented}}
    270 // expected-note@+2 {{previous documentation}}
    271 /// \param x1 Aaa.
    272 /// \param x2 Bbb.
    273 /// \param x2 Ccc.
    274 int test_param22(int x1, int x2, int x3);
    275 
    276 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    277 /// \param aaa Meow.
    278 /// \param bbb Bbb.
    279 /// \returns aaa.
    280 typedef int test_param23(int aaa, int ccc);
    281 
    282 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    283 /// \param aaa Meow.
    284 /// \param bbb Bbb.
    285 /// \returns aaa.
    286 typedef int (*test_param24)(int aaa, int ccc);
    287 
    288 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    289 /// \param aaa Meow.
    290 /// \param bbb Bbb.
    291 /// \returns aaa.
    292 typedef int (* const test_param25)(int aaa, int ccc);
    293 
    294 // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
    295 /// \param aaa Meow.
    296 /// \param bbb Bbb.
    297 /// \returns aaa.
    298 typedef int (C::*test_param26)(int aaa, int ccc);
    299 
    300 typedef 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.
    304 typedef 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.
    309 typedef 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
    314 int 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
    318 void test_tparam2(int aaa);
    319 
    320 // expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
    321 /// \tparam
    322 /// \param aaa Blah blah
    323 template<typename T>
    324 void 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
    328 template<typename TT>
    329 void 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
    333 template<typename TT>
    334 class 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
    343 template<typename T1, typename T2>
    344 void 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
    349 template<typename SomeTy, typename OtherTy>
    350 void 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
    355 template<typename T1, typename T2>
    356 void test_tparam9(T1 aaa, T2 bbb);
    357 
    358 /// \tparam T Aaa
    359 /// \tparam TT Bbb
    360 template<template<typename T> class TT>
    361 void test_tparam10(TT<int> aaa);
    362 
    363 /// \tparam T Aaa
    364 /// \tparam TT Bbb
    365 /// \tparam TTT Ccc
    366 template<template<template<typename T> class TT, class C> class TTT>
    367 void test_tparam11();
    368 
    369 /// \tparam I Aaa
    370 template<int I>
    371 void test_tparam12();
    372 
    373 template<typename T, typename U>
    374 class test_tparam13 { };
    375 
    376 /// \tparam T Aaa
    377 template<typename T>
    378 using 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
    382 template<typename T>
    383 using test_tparam15 = test_tparam13<T, int>;
    384 
    385 // ----
    386 
    387 /// \tparam T Aaa
    388 template<typename T>
    389 class test_tparam16 { };
    390 
    391 typedef test_tparam16<int> test_tparam17;
    392 typedef test_tparam16<double> test_tparam18;
    393 
    394 // ----
    395 
    396 template<typename T>
    397 class test_tparam19;
    398 
    399 typedef test_tparam19<int> test_tparam20;
    400 typedef test_tparam19<double> test_tparam21;
    401 
    402 /// \tparam T Aaa
    403 template<typename T>
    404 class 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
    410 int test_tparam22;
    411 
    412 // ----
    413 
    414 
    415 /// Aaa
    416 /// \deprecated Bbb
    417 void 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
    424 void test_deprecated_2(int a) __attribute__((deprecated));
    425 
    426 /// Aaa
    427 /// \deprecated
    428 void test_deprecated_3(int a) __attribute__((availability(macosx,introduced=10.4)));
    429 
    430 /// Aaa
    431 /// \deprecated
    432 void 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
    437 void 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
    442 void 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
    448 template<typename T>
    449 void 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
    457 int test__headerfile_1(int a);
    458 
    459 
    460 /// \invariant aaa
    461 void test_invariant_1(int a);
    462 
    463 // expected-warning@+1 {{empty paragraph passed to '\invariant' command}}
    464 /// \invariant
    465 void test_invariant_2(int a);
    466 
    467 
    468 // no-warning
    469 /// \returns Aaa
    470 int test_returns_right_decl_1(int);
    471 
    472 class 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
    480 template<typename T>
    481 int test_returns_right_decl_4(T aaa);
    482 
    483 // no-warning
    484 /// \returns Aaa
    485 template<>
    486 int test_returns_right_decl_4(int aaa);
    487 
    488 /// \returns Aaa
    489 template<typename T>
    490 T 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
    494 int 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
    498 int 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
    502 int 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
    506 void 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
    510 template<typename T>
    511 void 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
    515 template<>
    516 void 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
    520 struct 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
    524 class 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
    536 enum 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
    544 namespace 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
    549 typedef 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 */
    555 typedef unsigned int Base64Flags;
    556 unsigned 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 */
    561 typedef unsigned int BaseFlags;
    562 unsigned (*test_callback)(BaseFlags inFlags);
    563 
    564 // expected-warning@+1 {{'\endverbatim' command does not terminate a verbatim text block}}
    565 /// \endverbatim
    566 int test_verbatim_1();
    567 
    568 // expected-warning@+1 {{'\endcode' command does not terminate a verbatim text block}}
    569 /// \endcode
    570 int 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
    579 int test_verbatim_3();
    580 
    581 
    582 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    583 int 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}}
    587 int test2, ///< \brief\author Aaa
    588     test3; ///< \brief\author Aaa
    589 
    590 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    591 int 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
    601 int test_attach1;
    602 
    603 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    604 /// \brief\author Aaa
    605 int test_attach2(int);
    606 
    607 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    608 /// \brief\author Aaa
    609 struct 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
    624 class 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
    639 enum 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
    650 struct test_noattach12 *test_attach13;
    651 
    652 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    653 /// \brief\author Aaa
    654 typedef struct test_noattach14 *test_attach15;
    655 
    656 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    657 /// \brief\author Aaa
    658 typedef struct test_attach16 { int a; } test_attach17;
    659 
    660 struct S { int a; };
    661 
    662 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    663 /// \brief\author Aaa
    664 struct S *test_attach18;
    665 
    666 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    667 /// \brief\author Aaa
    668 typedef struct S *test_attach19;
    669 
    670 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    671 /// \brief\author Aaa
    672 struct test_attach20;
    673 
    674 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    675 /// \brief\author Aaa
    676 typedef 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
    684 namespace 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
    694 template<typename T>
    695 void test_attach26(T aaa);
    696 
    697 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    698 /// \brief\author Aaa
    699 /// \tparam T Aaa
    700 template<typename T, typename U>
    701 void 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
    707 template<>
    708 void 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
    713 template<typename T>
    714 class test_attach28 {
    715   T aaa;
    716 };
    717 
    718 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    719 /// \brief\author Aaa
    720 using test_attach29 = test_attach28<int>;
    721 
    722 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    723 /// \brief\author Aaa
    724 /// \tparam T Aaa
    725 template<typename T, typename U>
    726 class test_attach30 { };
    727 
    728 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    729 /// \brief\author Aaa
    730 /// \tparam T Aaa
    731 template<typename T>
    732 class test_attach30<T, int> { };
    733 
    734 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    735 /// \brief\author Aaa
    736 template<>
    737 class test_attach30<int, int> { };
    738 
    739 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    740 /// \brief\author Aaa
    741 template<typename T>
    742 using 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
    747 template<typename T, typename U, typename V>
    748 class test_attach32 { };
    749 
    750 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    751 /// \brief\author Aaa
    752 /// \tparam T Aaa
    753 template<typename T, typename U>
    754 class test_attach32<T, U, int> { };
    755 
    756 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    757 /// \brief\author Aaa
    758 /// \tparam T Aaa
    759 template<typename T>
    760 class 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
    766 template<>
    767 class test_attach32<int, int, int> { };
    768 
    769 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
    770 /// \brief\author Aaa
    771 class 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 
    779 template<typename T>
    780 class 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
    793 template<> template<>
    794 void test_attach35<int>::test_attach36(int aaa, int bbb) {}
    795 
    796 template<typename T>
    797 class 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
    811 template<>
    812 void 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
    817 template<typename T>
    818 void 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.
    823 template <typename T>
    824 struct 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 
    833 template <>
    834 template <typename B>
    835 void test_attach38<int>::test_attach39(int, B);
    836 
    837 
    838 // PR13411, reduced.  We used to crash on this.
    839 /**
    840  * @code Aaa.
    841  */
    842 void 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
    848 void test_nocrash2(int);
    849 
    850 // PR13593, example 1 and 2
    851 
    852 /**
    853 * Bla.
    854 */
    855 template <typename>
    856 void test_nocrash3();
    857 
    858 /// Foo
    859 template <typename, typename>
    860 void test_nocrash4() { }
    861 
    862 template <typename>
    863 void test_nocrash3()
    864 {
    865 }
    866 
    867 // PR13593, example 3
    868 
    869 /**
    870  * aaa
    871  */
    872 template <typename T>
    873 inline T test_nocrash5(T a1)
    874 {
    875     return a1;
    876 }
    877 
    878 ///
    879 //,
    880 
    881 inline void test_nocrash6()
    882 {
    883     test_nocrash5(1);
    884 }
    885 
    886 // We used to crash on this.
    887 
    888 /*!
    889   Blah.
    890 */
    891 typedef const struct test_nocrash7 * test_nocrash8;
    892 
    893 // We used to crash on this.
    894 
    895 /// aaa \unknown aaa \unknown aaa
    896 int test_nocrash9;
    897 
    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
    905 int 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
    911 int 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 **/
    919 int 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
    924 int 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 */
    931 struct U { int iS; };
    932 
    933 /*!
    934   @union U1
    935 */
    936 union 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 */
    942 union S2 {};
    943 
    944 /*!
    945   @class C1
    946 */
    947 class C1;
    948 
    949 /*!
    950   @struct S3;
    951 */
    952 class S3;
    953