warn-documentation.cpp revision c41ace950dcf2254c9aa48e73647b89c35109f80
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=> 9int test_html1(int); 10 11// expected-warning@+1 {{expected quoted string after equals sign}} 12/// <a href==> 13int 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 18int test_html3(int); 19 20// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}} 21/// <a => 22int test_html4(int); 23 24// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}} 25/// <a "aaa"> 26int test_html5(int); 27 28// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}} 29/// <a a="b" => 30int test_html6(int); 31 32// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}} 33/// <a a="b" "aaa"> 34int test_html7(int); 35 36// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}} 37/// <a a="b" = 38int 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<ccc ddd eee 42 * fff ggg. 43 */ 44int test_html9(int); 45 46// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}} 47/** Aaa bbb<ccc ddd eee 42% 48 * fff ggg. 49 */ 50int test_html10(int); 51 52// expected-warning@+1 {{HTML end tag 'br' is forbidden}} 53/// <br></br> 54int test_html11(int); 55 56/// <blockquote>Meow</blockquote> 57int test_html_nesting1(int); 58 59/// <b><i>Meow</i></b> 60int test_html_nesting2(int); 61 62/// <p>Aaa<br> 63/// Bbb</p> 64int test_html_nesting3(int); 65 66/// <p>Aaa<br /> 67/// Bbb</p> 68int test_html_nesting4(int); 69 70// expected-warning@+1 {{HTML end tag does not match any start tag}} 71/// <b><i>Meow</a> 72int 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> 77int 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> 82int test_html_nesting7(int); 83 84 85// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 86/// \brief\returns Aaa 87int test_block_command1(int); 88 89// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 90/// \brief \returns Aaa 91int test_block_command2(int); 92 93// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 94/// \brief 95/// \returns Aaa 96int test_block_command3(int); 97 98// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 99/// \brief 100/// 101/// \returns Aaa 102int 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 109int test_block_command5(int); 110 111/// \brief \c Aaa 112int 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 120int 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 128int 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 136int 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 145int 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 153int 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 161int 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 169int 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. 174int test_param1; 175 176// expected-warning@+1 {{empty paragraph passed to '\param' command}} 177/// \param 178/// \param a Blah blah. 179int test_param2(int a); 180 181// expected-warning@+1 {{empty paragraph passed to '\param' command}} 182/// \param a 183int test_param3(int a); 184 185/// \param a Blah blah. 186int test_param4(int a); 187 188/// \param [in] a Blah blah. 189int test_param5(int a); 190 191/// \param [out] a Blah blah. 192int test_param6(int a); 193 194/// \param [in,out] a Blah blah. 195int test_param7(int a); 196 197// expected-warning@+1 {{whitespace is not allowed in parameter passing direction}} 198/// \param [ in ] a Blah blah. 199int test_param8(int a); 200 201// expected-warning@+1 {{whitespace is not allowed in parameter passing direction}} 202/// \param [in, out] a Blah blah. 203int 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. 207int test_param10(int a); 208 209// expected-warning@+1 {{parameter 'a' not found in the function declaration}} 210/// \param a Blah blah. 211int 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. 215int 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. 219int test_param13(int aaa, int bbb); 220 221// expected-warning@+1 {{parameter 'aab' not found in the function declaration}} 222/// \param aab Blah blah. 223int test_param14(int bbb, int ccc); 224 225class C { 226 // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}} 227 /// \param aaa Blah blah. 228 C(int bbb, int ccc); 229 230 // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}} 231 /// \param aaa Blah blah. 232 int test_param15(int bbb, int ccc); 233}; 234 235// expected-warning@+1 {{parameter 'aab' not found in the function declaration}} 236/// \param aab Blah blah. 237template<typename T> 238void test_param16(int bbb, int ccc); 239 240// expected-warning@+3 {{parameter 'a' is already documented}} 241// expected-note@+1 {{previous documentation}} 242/// \param a Aaa. 243/// \param a Aaa. 244int test_param17(int a); 245 246// expected-warning@+4 {{parameter 'x2' is already documented}} 247// expected-note@+2 {{previous documentation}} 248/// \param x1 Aaa. 249/// \param x2 Bbb. 250/// \param x2 Ccc. 251int test_param18(int x1, int x2, int x3); 252 253 254// expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}} 255/// \tparam T Aaa 256int test_tparam1; 257 258// expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}} 259/// \tparam T Aaa 260void test_tparam2(int aaa); 261 262// expected-warning@+1 {{empty paragraph passed to '\tparam' command}} 263/// \tparam 264/// \param aaa Blah blah 265template<typename T> 266void test_tparam3(T aaa); 267 268// expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}} 269/// \tparam T Aaa 270template<typename TT> 271void test_tparam4(TT aaa); 272 273// expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}} 274/// \tparam T Aaa 275template<typename TT> 276class test_tparam5 { 277 // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TTT'?}} 278 /// \tparam T Aaa 279 template<typename TTT> 280 void test_tparam6(TTT aaa); 281}; 282 283/// \tparam T1 Aaa 284/// \tparam T2 Bbb 285template<typename T1, typename T2> 286void test_tparam7(T1 aaa, T2 bbb); 287 288// expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}} 289/// \tparam SomTy Aaa 290/// \tparam OtherTy Bbb 291template<typename SomeTy, typename OtherTy> 292void test_tparam8(SomeTy aaa, OtherTy bbb); 293 294// expected-warning@+2 {{template parameter 'T1' is already documented}} expected-note@+1 {{previous documentation}} 295/// \tparam T1 Aaa 296/// \tparam T1 Bbb 297template<typename T1, typename T2> 298void test_tparam9(T1 aaa, T2 bbb); 299 300/// \tparam T Aaa 301/// \tparam TT Bbb 302template<template<typename T> class TT> 303void test_tparam10(TT<int> aaa); 304 305/// \tparam T Aaa 306/// \tparam TT Bbb 307/// \tparam TTT Ccc 308template<template<template<typename T> class TT, class C> class TTT> 309void test_tparam11(); 310 311/// \tparam I Aaa 312template<int I> 313void test_tparam12(); 314 315template<typename T, typename U> 316class test_tparam13 { }; 317 318/// \tparam T Aaa 319template<typename T> 320using test_tparam14 = test_tparam13<T, int>; 321 322// expected-warning@+1 {{template parameter 'U' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}} 323/// \tparam U Aaa 324template<typename T> 325using test_tparam15 = test_tparam13<T, int>; 326 327// no-warning 328/// \returns Aaa 329int test_returns_right_decl_1(int); 330 331class test_returns_right_decl_2 { 332 // no-warning 333 /// \returns Aaa 334 int test_returns_right_decl_3(int); 335}; 336 337// no-warning 338/// \returns Aaa 339template<typename T> 340int test_returns_right_decl_4(T aaa); 341 342// no-warning 343/// \returns Aaa 344template<> 345int test_returns_right_decl_4(int aaa); 346 347/// \returns Aaa 348template<typename T> 349T test_returns_right_decl_5(T aaa); 350 351// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 352/// \returns Aaa 353int test_returns_wrong_decl_1; 354 355// expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}} 356/// \return Aaa 357int test_returns_wrong_decl_2; 358 359// expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}} 360/// \result Aaa 361int test_returns_wrong_decl_3; 362 363// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}} 364/// \returns Aaa 365void test_returns_wrong_decl_4(int); 366 367// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}} 368/// \returns Aaa 369template<typename T> 370void test_returns_wrong_decl_5(T aaa); 371 372// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}} 373/// \returns Aaa 374template<> 375void test_returns_wrong_decl_5(int aaa); 376 377// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 378/// \returns Aaa 379struct test_returns_wrong_decl_6 { }; 380 381// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 382/// \returns Aaa 383class test_returns_wrong_decl_7 { 384 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}} 385 /// \returns Aaa 386 test_returns_wrong_decl_7(); 387 388 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}} 389 /// \returns Aaa 390 ~test_returns_wrong_decl_7(); 391}; 392 393// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 394/// \returns Aaa 395enum test_returns_wrong_decl_8 { 396 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 397 /// \returns Aaa 398 test_returns_wrong_decl_9 399}; 400 401// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} 402/// \returns Aaa 403namespace test_returns_wrong_decl_10 { }; 404 405 406// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 407int test1; ///< \brief\author Aaa 408 409// expected-warning@+2 {{empty paragraph passed to '\brief' command}} 410// expected-warning@+2 {{empty paragraph passed to '\brief' command}} 411int test2, ///< \brief\author Aaa 412 test3; ///< \brief\author Aaa 413 414// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 415int test4; ///< \brief 416 ///< \author Aaa 417 418 419// Check that we attach the comment to the declaration during parsing in the 420// following cases. The test is based on the fact that we don't parse 421// documentation comments that are not attached to anything. 422 423// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 424/// \brief\author Aaa 425int test_attach1; 426 427// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 428/// \brief\author Aaa 429int test_attach2(int); 430 431// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 432/// \brief\author Aaa 433struct test_attach3 { 434 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 435 /// \brief\author Aaa 436 int test_attach4; 437 438 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 439 int test_attach5; ///< \brief\author Aaa 440 441 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 442 /// \brief\author Aaa 443 int test_attach6(int); 444}; 445 446// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 447/// \brief\author Aaa 448class test_attach7 { 449 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 450 /// \brief\author Aaa 451 int test_attach8; 452 453 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 454 int test_attach9; ///< \brief\author Aaa 455 456 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 457 /// \brief\author Aaa 458 int test_attach10(int); 459}; 460 461// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 462/// \brief\author Aaa 463enum test_attach9 { 464 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 465 /// \brief\author Aaa 466 test_attach10, 467 468 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 469 test_attach11 ///< \brief\author Aaa 470}; 471 472// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 473/// \brief\author Aaa 474struct test_noattach12 *test_attach13; 475 476// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 477/// \brief\author Aaa 478typedef struct test_noattach14 *test_attach15; 479 480// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 481/// \brief\author Aaa 482typedef struct test_attach16 { int a; } test_attach17; 483 484struct S { int a; }; 485 486// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 487/// \brief\author Aaa 488struct S *test_attach18; 489 490// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 491/// \brief\author Aaa 492typedef struct S *test_attach19; 493 494// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 495/// \brief\author Aaa 496struct test_attach20; 497 498// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 499/// \brief\author Aaa 500typedef struct test_attach21 { 501 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 502 /// \brief\author Aaa 503 int test_attach22; 504} test_attach23; 505 506// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 507/// \brief\author Aaa 508namespace test_attach24 { 509 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 510 /// \brief\author Aaa 511 namespace test_attach25 { 512 } 513} 514 515// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 516/// \brief\author Aaa 517/// \tparam T Aaa 518template<typename T> 519void test_attach26(T aaa); 520 521// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 522/// \brief\author Aaa 523/// \tparam T Aaa 524template<typename T, typename U> 525void test_attach27(T aaa, U bbb); 526 527// expected-warning@+2 {{empty paragraph passed to '\brief' command}} 528// expected-warning@+2 {{template parameter 'T' not found in the template declaration}} 529/// \brief\author Aaa 530/// \tparam T Aaa 531template<> 532void test_attach27(int aaa, int bbb); 533 534// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 535/// \brief\author Aaa 536/// \tparam T Aaa 537template<typename T> 538class test_attach28 { 539 T aaa; 540}; 541 542// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 543/// \brief\author Aaa 544using test_attach29 = test_attach28<int>; 545 546// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 547/// \brief\author Aaa 548/// \tparam T Aaa 549template<typename T, typename U> 550class test_attach30 { }; 551 552// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 553/// \brief\author Aaa 554/// \tparam T Aaa 555template<typename T> 556class test_attach30<T, int> { }; 557 558// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 559/// \brief\author Aaa 560template<> 561class test_attach30<int, int> { }; 562 563// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 564/// \brief\author Aaa 565template<typename T> 566using test_attach31 = test_attach30<T, int>; 567 568// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 569/// \brief\author Aaa 570/// \tparam T Aaa 571template<typename T, typename U, typename V> 572class test_attach32 { }; 573 574// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 575/// \brief\author Aaa 576/// \tparam T Aaa 577template<typename T, typename U> 578class test_attach32<T, U, int> { }; 579 580// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 581/// \brief\author Aaa 582/// \tparam T Aaa 583template<typename T> 584class test_attach32<T, int, int> { }; 585 586// expected-warning@+2 {{empty paragraph passed to '\brief' command}} 587// expected-warning@+2 {{template parameter 'T' not found in the template declaration}} 588/// \brief\author Aaa 589/// \tparam T Aaa 590template<> 591class test_attach32<int, int, int> { }; 592 593// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 594/// \brief\author Aaa 595class test_attach33 { 596 // expected-warning@+1 {{empty paragraph passed to '\brief' command}} 597 /// \brief\author Aaa 598 /// \tparam T Aaa 599 template<typename T, typename U> 600 void test_attach34(T aaa, U bbb); 601}; 602 603template<typename T> 604class test_attach35 { 605 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} 606 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}} 607 /// \brief\author Aaa 608 /// \tparam T Aaa 609 template<typename TT, typename UU> 610 void test_attach36(TT aaa, UU bbb); 611}; 612 613// expected-warning@+2 {{empty paragraph passed to '\brief' command}} 614// expected-warning@+2 {{template parameter 'T' not found in the template declaration}} 615/// \brief\author Aaa 616/// \tparam T Aaa 617template<> template<> 618void test_attach35<int>::test_attach36(int aaa, int bbb) {} 619 620template<typename T> 621class test_attach37 { 622 // expected-warning@+2 {{empty paragraph passed to '\brief' command}} 623 // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}} 624 /// \brief\author Aaa 625 /// \tparam T Aaa 626 void test_attach38(int aaa, int bbb); 627 628 void test_attach39(int aaa, int bbb); 629}; 630 631// expected-warning@+2 {{empty paragraph passed to '\brief' command}} 632// expected-warning@+2 {{template parameter 'T' not found in the template declaration}} 633/// \brief\author Aaa 634/// \tparam T Aaa 635template<> 636void test_attach37<int>::test_attach38(int aaa, int bbb) {} 637 638// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 639/// \brief\author Aaa 640/// \tparam T Aaa 641template<typename T> 642void test_attach37<T>::test_attach39(int aaa, int bbb) {} 643 644 645 646// PR13411, reduced. We used to crash on this. 647/** 648 * @code Aaa. 649 */ 650void test_nocrash1(int); 651 652// We used to crash on this. 653// expected-warning@+2 {{empty paragraph passed to '\param' command}} 654// expected-warning@+1 {{empty paragraph passed to '\brief' command}} 655/// \param\brief 656void test_nocrash2(int); 657 658// PR13593, example 1 and 2 659 660/** 661* Bla. 662*/ 663template <typename> 664void test_nocrash3(); 665 666/// Foo 667template <typename, typename> 668void test_nocrash4() { } 669 670template <typename> 671void test_nocrash3() 672{ 673} 674 675// PR13593, example 3 676 677/** 678 * aaa 679 */ 680template <typename T> 681inline T test_nocrash5(T a1) 682{ 683 return a1; 684} 685 686/// 687//, 688 689inline void test_nocrash6() 690{ 691 test_nocrash5(1); 692} 693 694// We used to crash on this. 695 696/*! 697 Blah. 698*/ 699typedef const struct test_nocrash7 * test_nocrash8; 700 701