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