1028 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1028 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wdocumentation -Wdocumentation-pedantic -verify %s
 | |
| 
 | |
| // This file contains lots of corner cases, so ensure that XML we generate is not invalid.
 | |
| // RUN: c-index-test -test-load-source all -comments-xml-schema=%S/../../bindings/xml/comment-xml-schema.rng %s | FileCheck %s -check-prefix=WRONG
 | |
| // WRONG-NOT: CommentXMLInvalid
 | |
| 
 | |
| // expected-warning@+1 {{expected quoted string after equals sign}}
 | |
| /// <a href=>
 | |
| int test_html1(int);
 | |
| 
 | |
| // expected-warning@+1 {{expected quoted string after equals sign}}
 | |
| /// <a href==>
 | |
| int test_html2(int);
 | |
| 
 | |
| // expected-warning@+2 {{expected quoted string after equals sign}}
 | |
| // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
 | |
| /// <a href= blah
 | |
| int test_html3(int);
 | |
| 
 | |
| // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
 | |
| /// <a =>
 | |
| int test_html4(int);
 | |
| 
 | |
| // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
 | |
| /// <a "aaa">
 | |
| int test_html5(int);
 | |
| 
 | |
| // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
 | |
| /// <a a="b" =>
 | |
| int test_html6(int);
 | |
| 
 | |
| // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
 | |
| /// <a a="b" "aaa">
 | |
| int test_html7(int);
 | |
| 
 | |
| // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
 | |
| /// <a a="b" =
 | |
| int test_html8(int);
 | |
| 
 | |
| // expected-warning@+2 {{HTML start tag prematurely ended, expected attribute name or '>'}} expected-note@+1 {{HTML tag started here}}
 | |
| /** Aaa bbb<img ddd eee
 | |
|  * fff ggg.
 | |
|  */
 | |
| int test_html9(int);
 | |
| 
 | |
| // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
 | |
| /** Aaa bbb<img ddd eee 42%
 | |
|  * fff ggg.
 | |
|  */
 | |
| int test_html10(int);
 | |
| 
 | |
| // expected-warning@+1 {{HTML end tag 'br' is forbidden}}
 | |
| /// <br></br>
 | |
| int test_html11(int);
 | |
| 
 | |
| /// <blockquote>Meow</blockquote>
 | |
| int test_html_nesting1(int);
 | |
| 
 | |
| /// <b><i>Meow</i></b>
 | |
| int test_html_nesting2(int);
 | |
| 
 | |
| /// <p>Aaa<br>
 | |
| /// Bbb</p>
 | |
| int test_html_nesting3(int);
 | |
| 
 | |
| /// <p>Aaa<br />
 | |
| /// Bbb</p>
 | |
| int test_html_nesting4(int);
 | |
| 
 | |
| // expected-warning@+1 {{HTML end tag does not match any start tag}}
 | |
| /// <b><i>Meow</a>
 | |
| int test_html_nesting5(int);
 | |
| 
 | |
| // expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
 | |
| // expected-warning@+1 {{HTML end tag does not match any start tag}}
 | |
| /// <b><i>Meow</b></b>
 | |
| int test_html_nesting6(int);
 | |
| 
 | |
| // expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
 | |
| // expected-warning@+1 {{HTML end tag does not match any start tag}}
 | |
| /// <b><i>Meow</b></i>
 | |
| int test_html_nesting7(int);
 | |
| 
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\returns Aaa
 | |
| int test_block_command1(int);
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief \returns Aaa
 | |
| int test_block_command2(int);
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief
 | |
| /// \returns Aaa
 | |
| int test_block_command3(int);
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief
 | |
| ///
 | |
| /// \returns Aaa
 | |
| int test_block_command4(int);
 | |
| 
 | |
| // There is trailing whitespace on one of the following lines, don't remove it!
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief
 | |
| /// 
 | |
| /// \returns Aaa
 | |
| int test_block_command5(int);
 | |
| 
 | |
| /// \brief \c Aaa
 | |
| int test_block_command6(int);
 | |
| 
 | |
| // expected-warning@+5 {{duplicated command '\brief'}} expected-note@+1 {{previous command '\brief' here}}
 | |
| /// \brief Aaa
 | |
| ///
 | |
| /// Bbb
 | |
| ///
 | |
| /// \brief Ccc
 | |
| int test_duplicate_brief1(int);
 | |
| 
 | |
| // expected-warning@+5 {{duplicated command '\short'}} expected-note@+1 {{previous command '\short' here}}
 | |
| /// \short Aaa
 | |
| ///
 | |
| /// Bbb
 | |
| ///
 | |
| /// \short Ccc
 | |
| int test_duplicate_brief2(int);
 | |
| 
 | |
| // expected-warning@+5 {{duplicated command '\brief'}} expected-note@+1 {{previous command '\short' (an alias of '\brief') here}}
 | |
| /// \short Aaa
 | |
| ///
 | |
| /// Bbb
 | |
| ///
 | |
| /// \brief Ccc
 | |
| int test_duplicate_brief3(int);
 | |
| 
 | |
| 
 | |
| /// \return Aaa
 | |
| ///
 | |
| /// Bbb
 | |
| ///
 | |
| /// \return Ccc
 | |
| int test_multiple_returns1(int);
 | |
| 
 | |
| /// \returns Aaa
 | |
| ///
 | |
| /// Bbb
 | |
| ///
 | |
| /// \returns Ccc
 | |
| int test_multiple_returns2(int);
 | |
| 
 | |
| /// \result Aaa
 | |
| ///
 | |
| /// Bbb
 | |
| ///
 | |
| /// \result Ccc
 | |
| int test_multiple_returns3(int);
 | |
| 
 | |
| /// \returns Aaa
 | |
| ///
 | |
| /// Bbb
 | |
| ///
 | |
| /// \return Ccc
 | |
| int test_multiple_returns4(int);
 | |
| 
 | |
| 
 | |
| // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
 | |
| /// \param a Blah blah.
 | |
| int test_param1;
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\param' command}}
 | |
| /// \param
 | |
| /// \param a Blah blah.
 | |
| int test_param2(int a);
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\param' command}}
 | |
| /// \param a
 | |
| int test_param3(int a);
 | |
| 
 | |
| /// \param a Blah blah.
 | |
| int test_param4(int a);
 | |
| 
 | |
| /// \param [in] a Blah blah.
 | |
| int test_param5(int a);
 | |
| 
 | |
| /// \param [out] a Blah blah.
 | |
| int test_param6(int a);
 | |
| 
 | |
| /// \param [in,out] a Blah blah.
 | |
| int test_param7(int a);
 | |
| 
 | |
| // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
 | |
| /// \param [ in ] a Blah blah.
 | |
| int test_param8(int a);
 | |
| 
 | |
| // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
 | |
| /// \param [in, out] a Blah blah.
 | |
| int test_param9(int a);
 | |
| 
 | |
| // expected-warning@+1 {{unrecognized parameter passing direction, valid directions are '[in]', '[out]' and '[in,out]'}}
 | |
| /// \param [ junk] a Blah blah.
 | |
| int test_param10(int a);
 | |
| 
 | |
| // expected-warning@+1 {{parameter 'a' not found in the function declaration}}
 | |
| /// \param a Blah blah.
 | |
| int test_param11();
 | |
| 
 | |
| // expected-warning@+1 {{parameter 'A' not found in the function declaration}} expected-note@+1 {{did you mean 'a'?}}
 | |
| /// \param A Blah blah.
 | |
| int test_param12(int a);
 | |
| 
 | |
| // expected-warning@+1 {{parameter 'aab' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
 | |
| /// \param aab Blah blah.
 | |
| int test_param13(int aaa, int bbb);
 | |
| 
 | |
| // expected-warning@+2 {{parameter 'aab' not found in the function declaration}} expected-note@+2 {{did you mean 'bbb'?}}
 | |
| /// \param aaa Blah blah.
 | |
| /// \param aab Blah blah.
 | |
| int test_param14(int aaa, int bbb);
 | |
| 
 | |
| // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
 | |
| /// \param aab Blah blah.
 | |
| int test_param15(int bbb, int ccc);
 | |
| 
 | |
| // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
 | |
| /// \param aab Ccc.
 | |
| /// \param aaa Aaa.
 | |
| /// \param bbb Bbb.
 | |
| int test_param16(int aaa, int bbb);
 | |
| 
 | |
| // expected-warning@+2 {{parameter 'aab' not found in the function declaration}}
 | |
| /// \param aaa Aaa.
 | |
| /// \param aab Ccc.
 | |
| /// \param bbb Bbb.
 | |
| int test_param17(int aaa, int bbb);
 | |
| 
 | |
| // expected-warning@+3 {{parameter 'aab' not found in the function declaration}}
 | |
| /// \param aaa Aaa.
 | |
| /// \param bbb Bbb.
 | |
| /// \param aab Ccc.
 | |
| int test_param18(int aaa, int bbb);
 | |
| 
 | |
| class C {
 | |
|   // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
 | |
|   /// \param aaa Blah blah.
 | |
|   C(int bbb, int ccc);
 | |
| 
 | |
|   // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
 | |
|   /// \param aaa Blah blah.
 | |
|  int test_param19(int bbb, int ccc);
 | |
| };
 | |
| 
 | |
| // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
 | |
| /// \param aab Blah blah.
 | |
| template<typename T>
 | |
| void test_param20(int bbb, int ccc);
 | |
| 
 | |
| // expected-warning@+3 {{parameter 'a' is already documented}}
 | |
| // expected-note@+1 {{previous documentation}}
 | |
| /// \param a Aaa.
 | |
| /// \param a Aaa.
 | |
| int test_param21(int a);
 | |
| 
 | |
| // expected-warning@+4 {{parameter 'x2' is already documented}}
 | |
| // expected-note@+2 {{previous documentation}}
 | |
| /// \param x1 Aaa.
 | |
| /// \param x2 Bbb.
 | |
| /// \param x2 Ccc.
 | |
| int test_param22(int x1, int x2, int x3);
 | |
| 
 | |
| // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
 | |
| /// \param aaa Meow.
 | |
| /// \param bbb Bbb.
 | |
| /// \returns aaa.
 | |
| typedef int test_param23(int aaa, int ccc);
 | |
| 
 | |
| // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
 | |
| /// \param aaa Meow.
 | |
| /// \param bbb Bbb.
 | |
| /// \returns aaa.
 | |
| typedef int (*test_param24)(int aaa, int ccc);
 | |
| 
 | |
| // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
 | |
| /// \param aaa Meow.
 | |
| /// \param bbb Bbb.
 | |
| /// \returns aaa.
 | |
| typedef int (* const test_param25)(int aaa, int ccc);
 | |
| 
 | |
| // expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
 | |
| /// \param aaa Meow.
 | |
| /// \param bbb Bbb.
 | |
| /// \returns aaa.
 | |
| typedef int (C::*test_param26)(int aaa, int ccc);
 | |
| 
 | |
| typedef int (*test_param27)(int aaa);
 | |
| 
 | |
| // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
 | |
| /// \param aaa Meow.
 | |
| typedef test_param27 test_param28;
 | |
| 
 | |
| // rdar://13066276
 | |
| // expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
 | |
| /// @param aaa Meow.
 | |
| typedef unsigned int test_param29;
 | |
| 
 | |
| 
 | |
| /// \param aaa Aaa
 | |
| /// \param ... Vararg
 | |
| int test_vararg_param1(int aaa, ...);
 | |
| 
 | |
| /// \param ... Vararg
 | |
| int test_vararg_param2(...);
 | |
| 
 | |
| // expected-warning@+1 {{parameter '...' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
 | |
| /// \param ... Vararg
 | |
| int test_vararg_param3(int aaa);
 | |
| 
 | |
| // expected-warning@+1 {{parameter '...' not found in the function declaration}}
 | |
| /// \param ... Vararg
 | |
| int test_vararg_param4();
 | |
| 
 | |
| 
 | |
| // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
 | |
| /// \tparam T Aaa
 | |
| int test_tparam1;
 | |
| 
 | |
| // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
 | |
| /// \tparam T Aaa
 | |
| void test_tparam2(int aaa);
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
 | |
| /// \tparam
 | |
| /// \param aaa Blah blah
 | |
| template<typename T>
 | |
| void test_tparam3(T aaa);
 | |
| 
 | |
| // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
 | |
| /// \tparam T Aaa
 | |
| template<typename TT>
 | |
| void test_tparam4(TT aaa);
 | |
| 
 | |
| // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
 | |
| /// \tparam T Aaa
 | |
| template<typename TT>
 | |
| class test_tparam5 {
 | |
|   // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TTT'?}}
 | |
|   /// \tparam T Aaa
 | |
|   template<typename TTT>
 | |
|   void test_tparam6(TTT aaa);
 | |
| };
 | |
| 
 | |
| /// \tparam T1 Aaa
 | |
| /// \tparam T2 Bbb
 | |
| template<typename T1, typename T2>
 | |
| void test_tparam7(T1 aaa, T2 bbb);
 | |
| 
 | |
| // expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}}
 | |
| /// \tparam SomTy Aaa
 | |
| /// \tparam OtherTy Bbb
 | |
| template<typename SomeTy, typename OtherTy>
 | |
| void test_tparam8(SomeTy aaa, OtherTy bbb);
 | |
| 
 | |
| // expected-warning@+2 {{template parameter 'T1' is already documented}} expected-note@+1 {{previous documentation}}
 | |
| /// \tparam T1 Aaa
 | |
| /// \tparam T1 Bbb
 | |
| template<typename T1, typename T2>
 | |
| void test_tparam9(T1 aaa, T2 bbb);
 | |
| 
 | |
| /// \tparam T Aaa
 | |
| /// \tparam TT Bbb
 | |
| template<template<typename T> class TT>
 | |
| void test_tparam10(TT<int> aaa);
 | |
| 
 | |
| /// \tparam T Aaa
 | |
| /// \tparam TT Bbb
 | |
| /// \tparam TTT Ccc
 | |
| template<template<template<typename T> class TT, class C> class TTT>
 | |
| void test_tparam11();
 | |
| 
 | |
| /// \tparam I Aaa
 | |
| template<int I>
 | |
| void test_tparam12();
 | |
| 
 | |
| template<typename T, typename U>
 | |
| class test_tparam13 { };
 | |
| 
 | |
| /// \tparam T Aaa
 | |
| template<typename T>
 | |
| using test_tparam14 = test_tparam13<T, int>;
 | |
| 
 | |
| // expected-warning@+1 {{template parameter 'U' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}}
 | |
| /// \tparam U Aaa
 | |
| template<typename T>
 | |
| using test_tparam15 = test_tparam13<T, int>;
 | |
| 
 | |
| // ----
 | |
| 
 | |
| /// \tparam T Aaa
 | |
| template<typename T>
 | |
| class test_tparam16 { };
 | |
| 
 | |
| typedef test_tparam16<int> test_tparam17;
 | |
| typedef test_tparam16<double> test_tparam18;
 | |
| 
 | |
| // ----
 | |
| 
 | |
| template<typename T>
 | |
| class test_tparam19;
 | |
| 
 | |
| typedef test_tparam19<int> test_tparam20;
 | |
| typedef test_tparam19<double> test_tparam21;
 | |
| 
 | |
| /// \tparam T Aaa
 | |
| template<typename T>
 | |
| class test_tparam19 { };
 | |
| 
 | |
| // ----
 | |
| 
 | |
| // expected-warning@+1 {{'@tparam' command used in a comment that is not attached to a template declaration}}
 | |
| /// @tparam T Aaa
 | |
| int test_tparam22;
 | |
| 
 | |
| // ----
 | |
| 
 | |
| 
 | |
| /// Aaa
 | |
| /// \deprecated Bbb
 | |
| void test_deprecated_1(int a) __attribute__((deprecated));
 | |
| 
 | |
| // We don't want \deprecated to warn about empty paragraph.  It is fine to use
 | |
| // \deprecated by itself without explanations.
 | |
| 
 | |
| /// Aaa
 | |
| /// \deprecated
 | |
| void test_deprecated_2(int a) __attribute__((deprecated));
 | |
| 
 | |
| /// Aaa
 | |
| /// \deprecated
 | |
| void test_deprecated_3(int a) __attribute__((availability(macosx,introduced=10.4)));
 | |
| 
 | |
| /// Aaa
 | |
| /// \deprecated
 | |
| void test_deprecated_4(int a) __attribute__((unavailable));
 | |
| 
 | |
| // 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}}
 | |
| /// Aaa
 | |
| /// \deprecated
 | |
| void test_deprecated_5(int a);
 | |
| 
 | |
| // 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}}
 | |
| /// Aaa
 | |
| /// \deprecated
 | |
| void test_deprecated_6(int a) {
 | |
| }
 | |
| 
 | |
| // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
 | |
| /// Aaa
 | |
| /// \deprecated
 | |
| template<typename T>
 | |
| void test_deprecated_7(T aaa);
 | |
| 
 | |
| 
 | |
| // rdar://12397511
 | |
| // expected-note@+2 {{previous command '\headerfile' here}}
 | |
| // expected-warning@+2 {{duplicated command '\headerfile'}}
 | |
| /// \headerfile ""
 | |
| /// \headerfile foo.h
 | |
| int test__headerfile_1(int a);
 | |
| 
 | |
| 
 | |
| /// \invariant aaa
 | |
| void test_invariant_1(int a);
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\invariant' command}}
 | |
| /// \invariant
 | |
| void test_invariant_2(int a);
 | |
| 
 | |
| 
 | |
| // no-warning
 | |
| /// \returns Aaa
 | |
| int test_returns_right_decl_1(int);
 | |
| 
 | |
| class test_returns_right_decl_2 {
 | |
|   // no-warning
 | |
|   /// \returns Aaa
 | |
|   int test_returns_right_decl_3(int);
 | |
| };
 | |
| 
 | |
| // no-warning
 | |
| /// \returns Aaa
 | |
| template<typename T>
 | |
| int test_returns_right_decl_4(T aaa);
 | |
| 
 | |
| // no-warning
 | |
| /// \returns Aaa
 | |
| template<>
 | |
| int test_returns_right_decl_4(int aaa);
 | |
| 
 | |
| /// \returns Aaa
 | |
| template<typename T>
 | |
| T test_returns_right_decl_5(T aaa);
 | |
| 
 | |
| // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
 | |
| /// \returns Aaa
 | |
| int test_returns_wrong_decl_1;
 | |
| 
 | |
| // expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
 | |
| /// \return Aaa
 | |
| int test_returns_wrong_decl_2;
 | |
| 
 | |
| // expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}}
 | |
| /// \result Aaa
 | |
| int test_returns_wrong_decl_3;
 | |
| 
 | |
| // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
 | |
| /// \returns Aaa
 | |
| void test_returns_wrong_decl_4(int);
 | |
| 
 | |
| // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
 | |
| /// \returns Aaa
 | |
| template<typename T>
 | |
| void test_returns_wrong_decl_5(T aaa);
 | |
| 
 | |
| // expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
 | |
| /// \returns Aaa
 | |
| template<>
 | |
| void test_returns_wrong_decl_5(int aaa);
 | |
| 
 | |
| // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
 | |
| /// \returns Aaa
 | |
| struct test_returns_wrong_decl_6 { };
 | |
| 
 | |
| // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
 | |
| /// \returns Aaa
 | |
| class test_returns_wrong_decl_7 {
 | |
|   // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}}
 | |
|   /// \returns Aaa
 | |
|   test_returns_wrong_decl_7();
 | |
| 
 | |
|   // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}}
 | |
|   /// \returns Aaa
 | |
|   ~test_returns_wrong_decl_7();
 | |
| };
 | |
| 
 | |
| // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
 | |
| /// \returns Aaa
 | |
| enum test_returns_wrong_decl_8 {
 | |
|   // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
 | |
|   /// \returns Aaa
 | |
|   test_returns_wrong_decl_9
 | |
| };
 | |
| 
 | |
| // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
 | |
| /// \returns Aaa
 | |
| namespace test_returns_wrong_decl_10 { };
 | |
| 
 | |
| // rdar://13066276
 | |
| // expected-warning@+1 {{'@returns' command used in a comment that is not attached to a function or method declaration}}
 | |
| /// @returns Aaa
 | |
| typedef unsigned int test_returns_wrong_decl_11;
 | |
| 
 | |
| // rdar://13094352
 | |
| // expected-warning@+1 {{'@function' command should be used in a comment attached to a function declaration}}
 | |
| /*!	@function test_function
 | |
| */
 | |
| typedef unsigned int Base64Flags;
 | |
| unsigned test_function(Base64Flags inFlags);
 | |
| 
 | |
| // expected-warning@+1 {{'@callback' command should be used in a comment attached to a pointer to function declaration}}
 | |
| /*! @callback test_callback
 | |
| */
 | |
| typedef unsigned int BaseFlags;
 | |
| unsigned (*test_callback)(BaseFlags inFlags);
 | |
| 
 | |
| // expected-warning@+1 {{'\endverbatim' command does not terminate a verbatim text block}}
 | |
| /// \endverbatim
 | |
| int test_verbatim_1();
 | |
| 
 | |
| // expected-warning@+1 {{'\endcode' command does not terminate a verbatim text block}}
 | |
| /// \endcode
 | |
| int test_verbatim_2();
 | |
| 
 | |
| // FIXME: we give a bad diagnostic here because we throw away non-documentation
 | |
| // comments early.
 | |
| //
 | |
| // expected-warning@+3 {{'\endcode' command does not terminate a verbatim text block}}
 | |
| /// \code
 | |
| //  foo
 | |
| /// \endcode
 | |
| int test_verbatim_3();
 | |
| 
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| int test1; ///< \brief\author Aaa
 | |
| 
 | |
| // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
 | |
| // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
 | |
| int test2, ///< \brief\author Aaa
 | |
|     test3; ///< \brief\author Aaa
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| int test4; ///< \brief
 | |
|            ///< \author Aaa
 | |
| 
 | |
| 
 | |
| class TestRelates {};
 | |
| 
 | |
| /// \relates TestRelates
 | |
| /// \brief Aaa
 | |
| void test_relates_1();
 | |
| 
 | |
| /// \related TestRelates
 | |
| /// \brief Aaa
 | |
| void test_relates_2();
 | |
| 
 | |
| /// \relatesalso TestRelates
 | |
| /// \brief Aaa
 | |
| void test_relates_3();
 | |
| 
 | |
| /// \relatedalso TestRelates
 | |
| /// \brief Aaa
 | |
| void test_relates_4();
 | |
| 
 | |
| 
 | |
| // Check that we attach the comment to the declaration during parsing in the
 | |
| // following cases.  The test is based on the fact that we don't parse
 | |
| // documentation comments that are not attached to anything.
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| int test_attach1;
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| int test_attach2(int);
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| struct test_attach3 {
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   /// \brief\author Aaa
 | |
|   int test_attach4;
 | |
| 
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   int test_attach5; ///< \brief\author Aaa
 | |
| 
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   /// \brief\author Aaa
 | |
|   int test_attach6(int);
 | |
| };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| class test_attach7 {
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   /// \brief\author Aaa
 | |
|   int test_attach8;
 | |
| 
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   int test_attach9; ///< \brief\author Aaa
 | |
| 
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   /// \brief\author Aaa
 | |
|   int test_attach10(int);
 | |
| };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| enum test_attach9 {
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   /// \brief\author Aaa
 | |
|   test_attach10,
 | |
| 
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   test_attach11 ///< \brief\author Aaa
 | |
| };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| struct test_noattach12 *test_attach13;
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| typedef struct test_noattach14 *test_attach15;
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| typedef struct test_attach16 { int a; } test_attach17;
 | |
| 
 | |
| struct S { int a; };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| struct S *test_attach18;
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| typedef struct S *test_attach19;
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| struct test_attach20;
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| typedef struct test_attach21 {
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   /// \brief\author Aaa
 | |
|   int test_attach22;
 | |
| } test_attach23;
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| namespace test_attach24 {
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   /// \brief\author Aaa
 | |
|   namespace test_attach25 {
 | |
|   }
 | |
| }
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<typename T>
 | |
| void test_attach26(T aaa);
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<typename T, typename U>
 | |
| void test_attach27(T aaa, U bbb);
 | |
| 
 | |
| // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
 | |
| // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<>
 | |
| void test_attach27(int aaa, int bbb);
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<typename T>
 | |
| class test_attach28 {
 | |
|   T aaa;
 | |
| };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| using test_attach29 = test_attach28<int>;
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<typename T, typename U>
 | |
| class test_attach30 { };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<typename T>
 | |
| class test_attach30<T, int> { };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| template<>
 | |
| class test_attach30<int, int> { };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| template<typename T>
 | |
| using test_attach31 = test_attach30<T, int>;
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<typename T, typename U, typename V>
 | |
| class test_attach32 { };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<typename T, typename U>
 | |
| class test_attach32<T, U, int> { };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<typename T>
 | |
| class test_attach32<T, int, int> { };
 | |
| 
 | |
| // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
 | |
| // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<>
 | |
| class test_attach32<int, int, int> { };
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| class test_attach33 {
 | |
|   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
|   /// \brief\author Aaa
 | |
|   /// \tparam T Aaa
 | |
|   template<typename T, typename U>
 | |
|   void test_attach34(T aaa, U bbb);
 | |
| };
 | |
| 
 | |
| template<typename T>
 | |
| class test_attach35 {
 | |
|   // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
 | |
|   // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
 | |
|   /// \brief\author Aaa
 | |
|   /// \tparam T Aaa
 | |
|   template<typename TT, typename UU>
 | |
|   void test_attach36(TT aaa, UU bbb);
 | |
| };
 | |
| 
 | |
| // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
 | |
| // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<> template<>
 | |
| void test_attach35<int>::test_attach36(int aaa, int bbb) {}
 | |
| 
 | |
| template<typename T>
 | |
| class test_attach37 {
 | |
|   // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
 | |
|   // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}}
 | |
|   /// \brief\author Aaa
 | |
|   /// \tparam T Aaa
 | |
|   void test_attach38(int aaa, int bbb);
 | |
| 
 | |
|   void test_attach39(int aaa, int bbb);
 | |
| };
 | |
| 
 | |
| // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
 | |
| // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<>
 | |
| void test_attach37<int>::test_attach38(int aaa, int bbb) {}
 | |
| 
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \brief\author Aaa
 | |
| /// \tparam T Aaa
 | |
| template<typename T>
 | |
| void test_attach37<T>::test_attach39(int aaa, int bbb) {}
 | |
| 
 | |
| // We used to emit warning that parameter 'a' is not found because we parsed
 | |
| // the comment in context of the redeclaration which does not have parameter
 | |
| // names.
 | |
| template <typename T>
 | |
| struct test_attach38 {
 | |
|   /*!
 | |
|     \param a  First param
 | |
|     \param b  Second param
 | |
|   */
 | |
|   template <typename B>
 | |
|   void test_attach39(T a, B b);
 | |
| };
 | |
| 
 | |
| template <>
 | |
| template <typename B>
 | |
| void test_attach38<int>::test_attach39(int, B);
 | |
| 
 | |
| 
 | |
| // PR13411, reduced.  We used to crash on this.
 | |
| /**
 | |
|  * @code Aaa.
 | |
|  */
 | |
| void test_nocrash1(int);
 | |
| 
 | |
| // We used to crash on this.
 | |
| // expected-warning@+2 {{empty paragraph passed to '\param' command}}
 | |
| // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
 | |
| /// \param\brief
 | |
| void test_nocrash2(int);
 | |
| 
 | |
| // PR13593, example 1 and 2
 | |
| 
 | |
| /**
 | |
| * Bla.
 | |
| */
 | |
| template <typename>
 | |
| void test_nocrash3();
 | |
| 
 | |
| /// Foo
 | |
| template <typename, typename>
 | |
| void test_nocrash4() { }
 | |
| 
 | |
| template <typename>
 | |
| void test_nocrash3()
 | |
| {
 | |
| }
 | |
| 
 | |
| // PR13593, example 3
 | |
| 
 | |
| /**
 | |
|  * aaa
 | |
|  */
 | |
| template <typename T>
 | |
| inline T test_nocrash5(T a1)
 | |
| {
 | |
|     return a1;
 | |
| }
 | |
| 
 | |
| ///
 | |
| //,
 | |
| 
 | |
| inline void test_nocrash6()
 | |
| {
 | |
|     test_nocrash5(1);
 | |
| }
 | |
| 
 | |
| // We used to crash on this.
 | |
| 
 | |
| /*!
 | |
|   Blah.
 | |
| */
 | |
| typedef const struct test_nocrash7 * test_nocrash8;
 | |
| 
 | |
| // We used to crash on this.
 | |
| 
 | |
| // expected-warning@+1 {{unknown command tag name}}
 | |
| /// aaa \unknown aaa \unknown aaa
 | |
| int test_nocrash9;
 | |
| 
 | |
| // We used to crash on this.  PR15068
 | |
| 
 | |
| // expected-warning@+2 {{empty paragraph passed to '@param' command}}
 | |
| // expected-warning@+2 {{empty paragraph passed to '@param' command}}
 | |
| ///@param x
 | |
| ///@param y
 | |
| int test_nocrash10(int x, int y);
 | |
| 
 | |
| // expected-warning@+2 {{empty paragraph passed to '@param' command}} expected-warning@+2 {{parameter 'x' not found in the function declaration}}
 | |
| // expected-warning@+2 {{empty paragraph passed to '@param' command}} expected-warning@+2 {{parameter 'y' not found in the function declaration}}
 | |
| ///@param x
 | |
| ///@param y
 | |
| int test_nocrash11();
 | |
| 
 | |
| // expected-warning@+3 {{empty paragraph passed to '@param' command}} expected-warning@+3 {{parameter 'x' not found in the function declaration}}
 | |
| // expected-warning@+3 {{empty paragraph passed to '@param' command}} expected-warning@+3 {{parameter 'y' not found in the function declaration}}
 | |
| /**
 | |
| @param x
 | |
| @param y
 | |
| **/
 | |
| int test_nocrash12();
 | |
| 
 | |
| // expected-warning@+2 {{empty paragraph passed to '@param' command}}
 | |
| // expected-warning@+1 {{empty paragraph passed to '@param' command}}
 | |
| ///@param x@param y
 | |
| int test_nocrash13(int x, int y);
 | |
| 
 | |
| // rdar://12379114
 | |
| // expected-warning@+2 {{'@union' command should not be used in a comment attached to a non-union declaration}}
 | |
| /*!
 | |
|    @union U This is new 
 | |
| */
 | |
| struct U { int iS; };
 | |
| 
 | |
| /*!
 | |
|   @union U1
 | |
| */
 | |
| union U1 {int i; };
 | |
| 
 | |
| // expected-warning@+2 {{'@struct' command should not be used in a comment attached to a non-struct declaration}}
 | |
| /*!
 | |
|  @struct S2
 | |
| */
 | |
| union S2 {};
 | |
| 
 | |
| /*!
 | |
|   @class C1
 | |
| */
 | |
| class C1;
 | |
| 
 | |
| /*!
 | |
|   @struct S3;
 | |
| */
 | |
| class S3;
 | |
| 
 | |
| // rdar://14124702
 | |
| //----------------------------------------------------------------------
 | |
| /// @class Predicate Predicate.h "lldb/Host/Predicate.h"
 | |
| /// @brief A C++ wrapper class for providing threaded access to a value
 | |
| /// of type T.
 | |
| ///
 | |
| /// A templatized class.
 | |
| /// specified values.
 | |
| //----------------------------------------------------------------------
 | |
| template <class T, class T1>
 | |
| class Predicate
 | |
| {
 | |
| };
 | |
| 
 | |
| //----------------------------------------------------------------------
 | |
| /// @class Predicate<int, char> Predicate.h "lldb/Host/Predicate.h"
 | |
| /// @brief A C++ wrapper class for providing threaded access to a value
 | |
| /// of type T.
 | |
| ///
 | |
| /// A template specilization class.
 | |
| //----------------------------------------------------------------------
 | |
| template<> class Predicate<int, char>
 | |
| {
 | |
| };
 | |
| 
 | |
| //----------------------------------------------------------------------
 | |
| /// @class Predicate<T, int> Predicate.h "lldb/Host/Predicate.h"
 | |
| /// @brief A C++ wrapper class for providing threaded access to a value
 | |
| /// of type T.
 | |
| ///
 | |
| /// A partial specialization template class.
 | |
| //----------------------------------------------------------------------
 | |
| template<class T> class Predicate<T, int>
 | |
| {
 | |
| };
 | |
| 
 | |
| /*!     @function test_function
 | |
| */
 | |
| template <class T> T test_function (T arg);
 | |
| 
 | |
| /*!     @function test_function<int>
 | |
| */
 | |
| template <> int test_function<int> (int arg);
 | 
