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 307 // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}} 308 /// \tparam T Aaa 309 int test_tparam1; 310 311 // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}} 312 /// \tparam T Aaa 313 void test_tparam2(int aaa); 314 315 // expected-warning@+1 {{empty paragraph passed to '\tparam' command}} 316 /// \tparam 317 /// \param aaa Blah blah 318 template<typename T> 319 void test_tparam3(T aaa); 320 321 // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}} 322 /// \tparam T Aaa 323 template<typename TT> 324 void test_tparam4(TT 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 class test_tparam5 { 330 // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TTT'?}} 331 /// \tparam T Aaa 332 template<typename TTT> 333 void test_tparam6(TTT aaa); 334 }; 335 336 /// \tparam T1 Aaa 337 /// \tparam T2 Bbb 338 template<typename T1, typename T2> 339 void test_tparam7(T1 aaa, T2 bbb); 340 341 // expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}} 342 /// \tparam SomTy Aaa 343 /// \tparam OtherTy Bbb 344 template<typename SomeTy, typename OtherTy> 345 void test_tparam8(SomeTy aaa, OtherTy bbb); 346 347 // expected-warning@+2 {{template parameter 'T1' is already documented}} expected-note@+1 {{previous documentation}} 348 /// \tparam T1 Aaa 349 /// \tparam T1 Bbb 350 template<typename T1, typename T2> 351 void test_tparam9(T1 aaa, T2 bbb); 352 353 /// \tparam T Aaa 354 /// \tparam TT Bbb 355 template<template<typename T> class TT> 356 void test_tparam10(TT<int> aaa); 357 358 /// \tparam T Aaa 359 /// \tparam TT Bbb 360 /// \tparam TTT Ccc 361 template<template<template<typename T> class TT, class C> class TTT> 362 void test_tparam11(); 363 364 /// \tparam I Aaa 365 template<int I> 366 void test_tparam12(); 367 368 template<typename T, typename U> 369 class test_tparam13 { }; 370 371 /// \tparam T Aaa 372 template<typename T> 373 using test_tparam14 = test_tparam13<T, int>; 374 375 // expected-warning@+1 {{template parameter 'U' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}} 376 /// \tparam U Aaa 377 template<typename T> 378 using test_tparam15 = test_tparam13<T, int>; 379 380 381 /// Aaa 382 /// \deprecated Bbb 383 void test_deprecated_1(int a) __attribute__((deprecated)); 384 385 // We don't want \deprecated to warn about empty paragraph. It is fine to use 386 // \deprecated by itself without explanations. 387 388 /// Aaa 389 /// \deprecated 390 void test_deprecated_2(int a) __attribute__((deprecated)); 391 392 /// Aaa 393 /// \deprecated 394 void test_deprecated_3(int a) __attribute__((availability(macosx,introduced=10.4))); 395 396 /// Aaa 397 /// \deprecated 398 void test_deprecated_4(int a) __attribute__((unavailable)); 399 400 // 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}} 401 /// Aaa 402 /// \deprecated 403 void test_deprecated_5(int a); 404 405 // 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}} 406 /// Aaa 407 /// \deprecated 408 void test_deprecated_6(int a) { 409 } 410 411 // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} 412 /// Aaa 413 /// \deprecated 414 template<typename T> 415 void test_deprecated_7(T aaa); 416 417 418 /// \invariant aaa 419 void test_invariant_1(int a); 420 421 // expected-warning@+1 {{empty paragraph passed to '\invariant' command}} 422 /// \invariant 423 void test_invariant_2(int a); 424 425 426 // no-warning 427 /// \returns Aaa 428 int test_returns_right_decl_1(int); 429 430 class test_returns_right_decl_2 { 431 // no-warning 432 /// \returns Aaa 433 int test_returns_right_decl_3(int); 434 }; 435 436 // no-warning 437 /// \returns Aaa 438 template<typename T> 439 int test_returns_right_decl_4(T aaa); 440 441 // no-warning 442 /// \returns Aaa 443 template<> 444 int test_returns_right_decl_4(int aaa); 445 446 /// \returns Aaa 447 template<typename T> 448 T test_returns_right_decl_5(T aaa); 449 450 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 451 /// \returns Aaa 452 int test_returns_wrong_decl_1; 453 454 // expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}} 455 /// \return Aaa 456 int test_returns_wrong_decl_2; 457 458 // expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}} 459 /// \result Aaa 460 int test_returns_wrong_decl_3; 461 462 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}} 463 /// \returns Aaa 464 void test_returns_wrong_decl_4(int); 465 466 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}} 467 /// \returns Aaa 468 template<typename T> 469 void test_returns_wrong_decl_5(T aaa); 470 471 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}} 472 /// \returns Aaa 473 template<> 474 void test_returns_wrong_decl_5(int aaa); 475 476 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 477 /// \returns Aaa 478 struct test_returns_wrong_decl_6 { }; 479 480 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 481 /// \returns Aaa 482 class test_returns_wrong_decl_7 { 483 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}} 484 /// \returns Aaa 485 test_returns_wrong_decl_7(); 486 487 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}} 488 /// \returns Aaa 489 ~test_returns_wrong_decl_7(); 490 }; 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 enum test_returns_wrong_decl_8 { 495 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 496 /// \returns Aaa 497 test_returns_wrong_decl_9 498 }; 499 500 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 501 /// \returns Aaa 502 namespace test_returns_wrong_decl_10 { }; 503 504 505 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 506 int test1; ///< \brief\author Aaa 507 508 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} 509 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} 510 int test2, ///< \brief\author Aaa 511 test3; ///< \brief\author Aaa 512 513 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 514 int test4; ///< \brief 515 ///< \author Aaa 516 517 518 // Check that we attach the comment to the declaration during parsing in the 519 // following cases. The test is based on the fact that we don't parse 520 // documentation comments that are not attached to anything. 521 522 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 523 /// \brief\author Aaa 524 int test_attach1; 525 526 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 527 /// \brief\author Aaa 528 int test_attach2(int); 529 530 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 531 /// \brief\author Aaa 532 struct test_attach3 { 533 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 534 /// \brief\author Aaa 535 int test_attach4; 536 537 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 538 int test_attach5; ///< \brief\author Aaa 539 540 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 541 /// \brief\author Aaa 542 int test_attach6(int); 543 }; 544 545 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 546 /// \brief\author Aaa 547 class test_attach7 { 548 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 549 /// \brief\author Aaa 550 int test_attach8; 551 552 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 553 int test_attach9; ///< \brief\author Aaa 554 555 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 556 /// \brief\author Aaa 557 int test_attach10(int); 558 }; 559 560 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 561 /// \brief\author Aaa 562 enum test_attach9 { 563 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 564 /// \brief\author Aaa 565 test_attach10, 566 567 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 568 test_attach11 ///< \brief\author Aaa 569 }; 570 571 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 572 /// \brief\author Aaa 573 struct test_noattach12 *test_attach13; 574 575 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 576 /// \brief\author Aaa 577 typedef struct test_noattach14 *test_attach15; 578 579 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 580 /// \brief\author Aaa 581 typedef struct test_attach16 { int a; } test_attach17; 582 583 struct S { int a; }; 584 585 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 586 /// \brief\author Aaa 587 struct S *test_attach18; 588 589 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 590 /// \brief\author Aaa 591 typedef struct S *test_attach19; 592 593 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 594 /// \brief\author Aaa 595 struct test_attach20; 596 597 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 598 /// \brief\author Aaa 599 typedef struct test_attach21 { 600 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 601 /// \brief\author Aaa 602 int test_attach22; 603 } test_attach23; 604 605 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 606 /// \brief\author Aaa 607 namespace test_attach24 { 608 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 609 /// \brief\author Aaa 610 namespace test_attach25 { 611 } 612 } 613 614 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 615 /// \brief\author Aaa 616 /// \tparam T Aaa 617 template<typename T> 618 void test_attach26(T aaa); 619 620 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 621 /// \brief\author Aaa 622 /// \tparam T Aaa 623 template<typename T, typename U> 624 void test_attach27(T aaa, U bbb); 625 626 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} 627 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}} 628 /// \brief\author Aaa 629 /// \tparam T Aaa 630 template<> 631 void test_attach27(int aaa, int bbb); 632 633 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 634 /// \brief\author Aaa 635 /// \tparam T Aaa 636 template<typename T> 637 class test_attach28 { 638 T aaa; 639 }; 640 641 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 642 /// \brief\author Aaa 643 using test_attach29 = test_attach28<int>; 644 645 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 646 /// \brief\author Aaa 647 /// \tparam T Aaa 648 template<typename T, typename U> 649 class test_attach30 { }; 650 651 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 652 /// \brief\author Aaa 653 /// \tparam T Aaa 654 template<typename T> 655 class test_attach30<T, int> { }; 656 657 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 658 /// \brief\author Aaa 659 template<> 660 class test_attach30<int, int> { }; 661 662 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 663 /// \brief\author Aaa 664 template<typename T> 665 using test_attach31 = test_attach30<T, int>; 666 667 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 668 /// \brief\author Aaa 669 /// \tparam T Aaa 670 template<typename T, typename U, typename V> 671 class test_attach32 { }; 672 673 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 674 /// \brief\author Aaa 675 /// \tparam T Aaa 676 template<typename T, typename U> 677 class test_attach32<T, U, int> { }; 678 679 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 680 /// \brief\author Aaa 681 /// \tparam T Aaa 682 template<typename T> 683 class test_attach32<T, int, int> { }; 684 685 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} 686 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}} 687 /// \brief\author Aaa 688 /// \tparam T Aaa 689 template<> 690 class test_attach32<int, int, int> { }; 691 692 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 693 /// \brief\author Aaa 694 class test_attach33 { 695 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 696 /// \brief\author Aaa 697 /// \tparam T Aaa 698 template<typename T, typename U> 699 void test_attach34(T aaa, U bbb); 700 }; 701 702 template<typename T> 703 class test_attach35 { 704 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} 705 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}} 706 /// \brief\author Aaa 707 /// \tparam T Aaa 708 template<typename TT, typename UU> 709 void test_attach36(TT aaa, UU bbb); 710 }; 711 712 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} 713 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}} 714 /// \brief\author Aaa 715 /// \tparam T Aaa 716 template<> template<> 717 void test_attach35<int>::test_attach36(int aaa, int bbb) {} 718 719 template<typename T> 720 class test_attach37 { 721 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} 722 // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}} 723 /// \brief\author Aaa 724 /// \tparam T Aaa 725 void test_attach38(int aaa, int bbb); 726 727 void test_attach39(int aaa, int bbb); 728 }; 729 730 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} 731 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}} 732 /// \brief\author Aaa 733 /// \tparam T Aaa 734 template<> 735 void test_attach37<int>::test_attach38(int aaa, int bbb) {} 736 737 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 738 /// \brief\author Aaa 739 /// \tparam T Aaa 740 template<typename T> 741 void test_attach37<T>::test_attach39(int aaa, int bbb) {} 742 743 // We used to emit warning that parameter 'a' is not found because we parsed 744 // the comment in context of the redeclaration which does not have parameter 745 // names. 746 template <typename T> 747 struct test_attach38 { 748 /*! 749 \param a First param 750 \param b Second param 751 */ 752 template <typename B> 753 void test_attach39(T a, B b); 754 }; 755 756 template <> 757 template <typename B> 758 void test_attach38<int>::test_attach39(int, B); 759 760 761 // PR13411, reduced. We used to crash on this. 762 /** 763 * @code Aaa. 764 */ 765 void test_nocrash1(int); 766 767 // We used to crash on this. 768 // expected-warning@+2 {{empty paragraph passed to '\param' command}} 769 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 770 /// \param\brief 771 void test_nocrash2(int); 772 773 // PR13593, example 1 and 2 774 775 /** 776 * Bla. 777 */ 778 template <typename> 779 void test_nocrash3(); 780 781 /// Foo 782 template <typename, typename> 783 void test_nocrash4() { } 784 785 template <typename> 786 void test_nocrash3() 787 { 788 } 789 790 // PR13593, example 3 791 792 /** 793 * aaa 794 */ 795 template <typename T> 796 inline T test_nocrash5(T a1) 797 { 798 return a1; 799 } 800 801 /// 802 //, 803 804 inline void test_nocrash6() 805 { 806 test_nocrash5(1); 807 } 808 809 // We used to crash on this. 810 811 /*! 812 Blah. 813 */ 814 typedef const struct test_nocrash7 * test_nocrash8; 815 816 // We used to crash on this. 817 818 /// aaa \unknown aaa \unknown aaa 819 int test_nocrash9; 820 821