2012-08-03 04:49:51 +08:00
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wdocumentation -Wdocumentation-pedantic -verify %s
2019-12-11 01:32:29 +08:00
// RUN: %clang_cc1 -std=c++14 -fsyntax-only -Wdocumentation -Wdocumentation-pedantic -verify %s
2012-07-12 05:38:39 +08:00
2012-08-08 01:54:38 +08:00
// 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
2014-04-22 18:59:13 +08:00
// expected-warning@+2 {{HTML tag 'a' requires an end tag}}
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{expected quoted string after equals sign}}
/// <a href=>
int test_html1 ( int ) ;
2014-04-22 18:59:13 +08:00
// expected-warning@+2 {{HTML tag 'a' requires an end tag}}
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{expected quoted string after equals sign}}
/// <a href==>
int test_html2 ( int ) ;
2014-04-22 18:59:13 +08:00
// expected-warning@+3 {{HTML tag 'a' requires an end tag}}
2012-07-12 05:38:39 +08:00
// expected-warning@+2 {{expected quoted string after equals sign}}
2012-07-13 08:44:24 +08:00
// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
2012-07-12 05:38:39 +08:00
/// <a href= blah
int test_html3 ( int ) ;
2014-04-22 18:59:13 +08:00
// expected-warning@+2 {{HTML tag 'a' requires an end tag}}
2012-07-13 08:44:24 +08:00
// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
2012-07-12 05:38:39 +08:00
/// <a =>
int test_html4 ( int ) ;
2014-04-22 18:59:13 +08:00
// expected-warning@+2 {{HTML tag 'a' requires an end tag}}
2012-07-13 08:44:24 +08:00
// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
2012-07-12 05:38:39 +08:00
/// <a "aaa">
int test_html5 ( int ) ;
2014-04-22 18:59:13 +08:00
// expected-warning@+2 {{HTML tag 'a' requires an end tag}}
2012-07-13 08:44:24 +08:00
// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
2012-07-12 05:38:39 +08:00
/// <a a="b" =>
int test_html6 ( int ) ;
2014-04-22 18:59:13 +08:00
// expected-warning@+2 {{HTML tag 'a' requires an end tag}}
2012-07-13 08:44:24 +08:00
// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
2012-07-12 05:38:39 +08:00
/// <a a="b" "aaa">
int test_html7 ( int ) ;
2014-04-22 18:59:13 +08:00
// expected-warning@+2 {{HTML tag 'a' requires an end tag}}
2012-07-13 08:44:24 +08:00
// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
2012-07-12 05:38:39 +08:00
/// <a a="b" =
int test_html8 ( int ) ;
2012-07-13 08:44:24 +08:00
// expected-warning@+2 {{HTML start tag prematurely ended, expected attribute name or '>'}} expected-note@+1 {{HTML tag started here}}
2012-08-23 06:56:08 +08:00
/** Aaa bbb<img ddd eee
2012-07-12 05:38:39 +08:00
* fff ggg .
*/
int test_html9 ( int ) ;
2012-07-13 08:44:24 +08:00
// expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
2012-08-23 06:56:08 +08:00
/** Aaa bbb<img ddd eee 42%
2012-07-12 05:38:39 +08:00
* fff ggg .
*/
int test_html10 ( int ) ;
2012-07-13 08:44:24 +08:00
// expected-warning@+1 {{HTML end tag 'br' is forbidden}}
2012-07-13 07:37:09 +08:00
/// <br></br>
int test_html11 ( int ) ;
2012-07-12 05:38:39 +08:00
/// <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 ) ;
2014-04-22 18:59:13 +08:00
// expected-warning@+3 {{HTML tag 'b' requires an end tag}}
// expected-warning@+2 {{HTML tag 'i' requires an end tag}}
2012-07-13 08:44:24 +08:00
// expected-warning@+1 {{HTML end tag does not match any start tag}}
2012-07-12 05:38:39 +08:00
/// <b><i>Meow</a>
int test_html_nesting5 ( int ) ;
2012-07-13 08:44:24 +08:00
// expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
// expected-warning@+1 {{HTML end tag does not match any start tag}}
2012-07-12 05:38:39 +08:00
/// <b><i>Meow</b></b>
int test_html_nesting6 ( int ) ;
2012-07-13 08:44:24 +08:00
// expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
// expected-warning@+1 {{HTML end tag does not match any start tag}}
2012-07-12 05:38:39 +08:00
/// <b><i>Meow</b></i>
int test_html_nesting7 ( int ) ;
2014-04-22 18:59:13 +08:00
// expected-warning@+1 {{HTML tag 'b' requires an end tag}}
/// <b>Meow
int test_html_nesting8 ( int ) ;
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\returns Aaa
2012-07-12 05:38:39 +08:00
int test_block_command1 ( int ) ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief \returns Aaa
2012-07-12 05:38:39 +08:00
int test_block_command2 ( int ) ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
/// \brief
2012-08-07 01:08:27 +08:00
/// \returns Aaa
2012-07-12 05:38:39 +08:00
int test_block_command3 ( int ) ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
/// \brief
///
2012-08-07 01:08:27 +08:00
/// \returns Aaa
2012-07-12 05:38:39 +08:00
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
///
2012-08-07 01:08:27 +08:00
/// \returns Aaa
2012-07-12 05:38:39 +08:00
int test_block_command5 ( int ) ;
2012-07-19 08:01:56 +08:00
/// \brief \c Aaa
int test_block_command6 ( int ) ;
2012-08-07 01:08:27 +08:00
// 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
2013-06-23 07:03:37 +08:00
int test_multiple_returns1 ( int ) ;
2012-08-07 01:08:27 +08:00
/// \returns Aaa
///
/// Bbb
///
/// \returns Ccc
2013-06-23 07:03:37 +08:00
int test_multiple_returns2 ( int ) ;
2012-08-07 01:08:27 +08:00
/// \result Aaa
///
/// Bbb
///
/// \result Ccc
2013-06-23 07:03:37 +08:00
int test_multiple_returns3 ( int ) ;
2012-08-07 01:08:27 +08:00
/// \returns Aaa
///
/// Bbb
///
/// \return Ccc
2013-06-23 07:03:37 +08:00
int test_multiple_returns4 ( int ) ;
2012-08-07 01:08:27 +08:00
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
/// \param a Blah blah.
2013-12-18 03:45:12 +08:00
int test_param1_backslash ;
// rdar://13066276
// Check that the diagnostic uses the same command marker as the comment.
// expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
/// @param a Blah blah.
int test_param1_at ;
2012-07-12 05:38:39 +08:00
// 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 ) ;
2012-07-25 05:56:59 +08:00
// expected-warning@+1 {{parameter 'a' not found in the function declaration}}
2012-07-25 05:46:24 +08:00
/// \param a Blah blah.
int test_param11 ( ) ;
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{parameter 'A' not found in the function declaration}} expected-note@+1 {{did you mean 'a'?}}
/// \param A Blah blah.
2012-07-25 05:46:24 +08:00
int test_param12 ( int a ) ;
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{parameter 'aab' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
/// \param aab Blah blah.
2012-07-25 05:46:24 +08:00
int test_param13 ( int aaa , int bbb ) ;
2012-07-12 05:38:39 +08:00
2012-08-25 01:45:39 +08:00
// 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 ) ;
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
/// \param aab Blah blah.
2012-08-25 01:45:39 +08:00
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 ) ;
2012-07-12 05:38:39 +08:00
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.
2012-08-25 01:45:39 +08:00
int test_param19 ( int bbb , int ccc ) ;
2012-07-12 05:38:39 +08:00
} ;
2012-08-01 06:37:06 +08:00
// expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
/// \param aab Blah blah.
template < typename T >
2012-08-25 01:45:39 +08:00
void test_param20 ( int bbb , int ccc ) ;
2012-08-01 06:37:06 +08:00
2012-07-25 05:44:16 +08:00
// expected-warning@+3 {{parameter 'a' is already documented}}
// expected-note@+1 {{previous documentation}}
/// \param a Aaa.
/// \param a Aaa.
2012-08-25 01:45:39 +08:00
int test_param21 ( int a ) ;
2012-07-25 05:44:16 +08:00
// expected-warning@+4 {{parameter 'x2' is already documented}}
// expected-note@+2 {{previous documentation}}
/// \param x1 Aaa.
/// \param x2 Bbb.
/// \param x2 Ccc.
2012-08-25 01:45:39 +08:00
int test_param22 ( int x1 , int x2 , int x3 ) ;
2012-08-01 06:37:06 +08:00
2019-08-20 16:36:21 +08:00
// expected-warning@+1 {{empty paragraph passed to '\param' command}}
/// \param a
/// \retval 0 Blah blah.
int test_param23 ( int a ) ;
2020-03-06 02:24:28 +08:00
/// \param a \ref test_param23 has an empty paragraph, this doesn't.
int test_param24 ( int a ) ;
2013-12-18 06:06:11 +08:00
//===---
// Test that we treat typedefs to some non-function types as functions for the
// purposes of documentation comment parsing.
//===---
namespace foo {
inline namespace bar {
template < typename >
struct function_wrapper { } ;
template < unsigned >
struct not_a_function_wrapper { } ;
}
} ;
2012-08-25 01:45:39 +08:00
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
2012-08-24 08:05:30 +08:00
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
2013-12-18 03:45:12 +08:00
typedef int test_function_like_typedef1 ( int aaa , int ccc ) ;
2012-08-24 08:05:30 +08:00
2012-08-25 01:45:39 +08:00
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
2012-08-24 08:05:30 +08:00
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
2013-12-18 03:45:12 +08:00
typedef int ( * test_function_like_typedef2 ) ( int aaa , int ccc ) ;
2012-08-24 08:05:30 +08:00
2012-08-25 01:45:39 +08:00
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
2012-08-24 08:05:30 +08:00
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
2013-12-18 03:45:12 +08:00
typedef int ( * const test_function_like_typedef3 ) ( int aaa , int ccc ) ;
2012-08-24 08:05:30 +08:00
2012-08-25 01:45:39 +08:00
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
2012-08-24 08:05:30 +08:00
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
2013-12-18 03:45:12 +08:00
typedef int ( C : : * test_function_like_typedef4 ) ( int aaa , int ccc ) ;
2012-08-25 01:45:39 +08:00
2013-12-18 06:06:11 +08:00
// 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 foo : : function_wrapper < int ( int aaa , int ccc ) > test_function_like_typedef5 ;
// 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 foo : : function_wrapper < int ( int aaa , int ccc ) > * test_function_like_typedef6 ;
2013-12-18 06:22:14 +08:00
// 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 foo : : function_wrapper < int ( int aaa , int ccc ) > & test_function_like_typedef7 ;
// 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 foo : : function_wrapper < int ( int aaa , int ccc ) > & & test_function_like_typedef8 ;
2013-12-18 06:06:11 +08:00
2013-12-18 03:45:12 +08:00
typedef int ( * test_not_function_like_typedef1 ) ( int aaa ) ;
2012-09-16 05:13:36 +08:00
// expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
/// \param aaa Meow.
2013-12-18 03:45:12 +08:00
typedef test_not_function_like_typedef1 test_not_function_like_typedef2 ;
2012-09-16 05:13:36 +08:00
2013-03-05 03:39:33 +08:00
// rdar://13066276
2013-12-18 03:45:12 +08:00
// Check that the diagnostic uses the same command marker as the comment.
2013-03-05 03:39:33 +08:00
// expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
/// @param aaa Meow.
2013-12-18 03:45:12 +08:00
typedef unsigned int test_not_function_like_typedef3 ;
2013-03-05 03:39:33 +08:00
2013-12-18 06:06:11 +08:00
// expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
/// \param aaa Meow.
typedef foo : : not_a_function_wrapper < 1 > test_not_function_like_typedef4 ;
2012-08-01 06:37:06 +08:00
2016-08-25 05:11:43 +08:00
// 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.
using test_function_like_using1 = int ( 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.
using test_function_like_using2 = int ( * ) ( 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.
using test_function_like_using3 = int ( * const ) ( 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.
using test_function_like_using4 = int ( C : : * ) ( 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.
using test_function_like_using5 = foo : : function_wrapper < int ( 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.
using test_function_like_using6 = foo : : function_wrapper < int ( 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.
using test_function_like_using7 = foo : : function_wrapper < int ( 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.
using test_function_like_using8 = foo : : function_wrapper < int ( int aaa , int ccc ) > & & ;
2016-08-26 01:09:33 +08:00
// expected-warning@+4 {{template parameter 'U' not found in the template declaration}} expected-note@+4 {{did you mean 'T'?}}
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \tparam U Uuu.
template < typename T >
using test_function_like_using9 = int ( T aaa , int ccc ) ;
// expected-warning@+4 {{template parameter 'U' not found in the template declaration}} expected-note@+4 {{did you mean 'T'?}}
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \tparam U Uuu.
template < typename T >
using test_function_like_using10 = int ( * ) ( T aaa , int ccc ) ;
// expected-warning@+4 {{template parameter 'U' not found in the template declaration}} expected-note@+4 {{did you mean 'T'?}}
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \tparam U Uuu.
template < typename T >
using test_function_like_using11 = foo : : function_wrapper < int ( T aaa , int ccc ) > ;
// expected-warning@+4 {{template parameter 'U' not found in the template declaration}} expected-note@+4 {{did you mean 'T'?}}
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \tparam U Uuu.
template < typename T >
using test_function_like_using12 = foo : : function_wrapper < int ( T aaa , int ccc ) > * ;
2016-08-25 05:11:43 +08:00
using test_not_function_like_using1 = int ( * ) ( int aaa ) ;
// expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
/// \param aaa Meow.
using test_not_function_like_using2 = test_not_function_like_using1 ;
// Check that the diagnostic uses the same command marker as the comment.
// expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
/// @param aaa Meow.
using test_not_function_like_using3 = unsigned int ;
// expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
/// \param aaa Meow.
using test_not_function_like_using4 = foo : : not_a_function_wrapper < 1 > ;
2013-06-24 12:41:32 +08:00
/// \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 ( ) ;
2014-03-19 21:59:36 +08:00
/// \param aaa Aaa
/// \param ... Vararg
template < typename T >
int test_template_vararg_param1 ( int aaa , . . . ) ;
/// \param ... Vararg
template < typename T >
int test_template_vararg_param2 ( . . . ) ;
// expected-warning@+1 {{parameter '...' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
/// \param ... Vararg
template < typename T >
int test_template_vararg_param3 ( int aaa ) ;
// expected-warning@+1 {{parameter '...' not found in the function declaration}}
/// \param ... Vararg
template < typename T >
int test_template_vararg_param4 ( ) ;
2012-08-01 06:37:06 +08:00
// 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 ( ) ;
2012-08-03 05:36:57 +08:00
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 > ;
2013-01-28 05:18:39 +08:00
// ----
/// \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 { } ;
// ----
2013-03-05 04:23:16 +08:00
// expected-warning@+1 {{'@tparam' command used in a comment that is not attached to a template declaration}}
/// @tparam T Aaa
int test_tparam22 ;
// ----
2012-09-14 04:36:01 +08:00
/// Aaa
/// \deprecated Bbb
2012-09-23 05:47:50 +08:00
void test_deprecated_1 ( int a ) __attribute__ ( ( deprecated ) ) ;
2012-09-14 04:36:01 +08:00
2019-12-11 01:32:30 +08:00
# if __cplusplus >= 201402L
/// Aaa
/// \deprecated Bbb
[[deprecated]] void test_deprecated_no_warning_std14 ( int a ) ;
# endif
2012-09-14 04:36:01 +08:00
// We don't want \deprecated to warn about empty paragraph. It is fine to use
// \deprecated by itself without explanations.
/// Aaa
/// \deprecated
2012-09-23 05:47:50 +08:00
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 ) ;
2019-12-11 01:32:28 +08:00
// 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}}
2012-09-23 05:47:50 +08:00
/// Aaa
2019-12-11 01:32:28 +08:00
/// @deprecated
2012-09-23 05:47:50 +08:00
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 ) ;
2012-09-14 04:36:01 +08:00
2019-12-11 01:32:29 +08:00
class PR43753 {
// expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
// expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
/// \deprecated
static void test_deprecated_static ( ) ;
// expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
// expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
/// \deprecated
static auto test_deprecated_static_trailing_return ( ) - > int ;
# if __cplusplus >= 201402L
// expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
// expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
/// \deprecated
static decltype ( auto ) test_deprecated_static_decltype_auto ( ) { return 1 ; }
# endif
// expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
// expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
/// \deprecated
void test_deprecated_const ( ) const ;
// expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
// expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
/// \deprecated
auto test_deprecated_trailing_return ( ) - > int ;
# if __cplusplus >= 201402L
// expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
// expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
/// \deprecated
decltype ( auto ) test_deprecated_decltype_auto ( ) const { return a ; }
private :
int a { 0 } ;
# endif
} ;
2012-09-14 04:36:01 +08:00
2013-03-05 03:39:33 +08:00
// 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 ) ;
2012-09-14 23:37:29 +08:00
/// \invariant aaa
void test_invariant_1 ( int a ) ;
// expected-warning@+1 {{empty paragraph passed to '\invariant' command}}
/// \invariant
void test_invariant_2 ( int a ) ;
2012-08-04 05:15:32 +08:00
// 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 ) ;
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
2012-08-04 05:15:32 +08:00
/// \returns Aaa
2013-12-18 03:45:12 +08:00
int test_returns_wrong_decl_1_backslash ;
// rdar://13066276
// Check that the diagnostic uses the same command marker as the comment.
// 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_at ;
2012-08-04 05:15:32 +08:00
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
2012-08-04 05:15:32 +08:00
/// \return Aaa
int test_returns_wrong_decl_2 ;
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}}
2012-08-04 05:15:32 +08:00
/// \result Aaa
int test_returns_wrong_decl_3 ;
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
2012-08-04 05:15:32 +08:00
/// \returns Aaa
void test_returns_wrong_decl_4 ( int ) ;
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
2012-08-04 05:15:32 +08:00
/// \returns Aaa
template < typename T >
void test_returns_wrong_decl_5 ( T aaa ) ;
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}}
2012-08-04 05:15:32 +08:00
/// \returns Aaa
template < >
void test_returns_wrong_decl_5 ( int aaa ) ;
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
2012-08-04 05:15:32 +08:00
/// \returns Aaa
struct test_returns_wrong_decl_6 { } ;
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
2012-08-04 05:15:32 +08:00
/// \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 ( ) ;
} ;
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
2012-08-04 05:15:32 +08:00
/// \returns Aaa
enum test_returns_wrong_decl_8 {
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
2012-08-04 05:15:32 +08:00
/// \returns Aaa
test_returns_wrong_decl_9
} ;
2012-08-07 00:29:26 +08:00
// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
2012-08-04 05:15:32 +08:00
/// \returns Aaa
namespace test_returns_wrong_decl_10 { } ;
2013-03-06 03:40:47 +08:00
// rdar://13094352
2013-03-06 06:46:07 +08:00
// expected-warning@+1 {{'@function' command should be used in a comment attached to a function declaration}}
2013-03-06 03:40:47 +08:00
/*! @function test_function
*/
typedef unsigned int Base64Flags ;
unsigned test_function ( Base64Flags inFlags ) ;
2013-03-06 06:46:07 +08:00
// expected-warning@+1 {{'@callback' command should be used in a comment attached to a pointer to function declaration}}
2013-03-06 03:40:47 +08:00
/*! @callback test_callback
*/
typedef unsigned int BaseFlags ;
unsigned ( * test_callback ) ( BaseFlags inFlags ) ;
2012-07-12 05:38:39 +08:00
2012-11-18 08:30:31 +08:00
// 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.
//
2012-11-18 10:34:33 +08:00
// expected-warning@+3 {{'\endcode' command does not terminate a verbatim text block}}
2012-11-18 08:30:31 +08:00
/// \code
// foo
/// \endcode
int test_verbatim_3 ( ) ;
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
int test1 ; ///< \brief\author Aaa
2012-07-12 05:38:39 +08:00
// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
int test2 , ///< \brief\author Aaa
test3 ; ///< \brief\author Aaa
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
int test4 ; ///< \brief
2012-08-07 01:08:27 +08:00
///< \author Aaa
2012-07-12 05:38:39 +08:00
2013-06-24 07:33:14 +08:00
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 ( ) ;
2012-07-12 05:38:39 +08:00
// 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}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
int test_attach1 ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
int test_attach2 ( int ) ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
struct test_attach3 {
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
int test_attach4 ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
int test_attach5 ; ///< \brief\author Aaa
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
int test_attach6 ( int ) ;
} ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
class test_attach7 {
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
int test_attach8 ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
int test_attach9 ; ///< \brief\author Aaa
2012-07-12 05:38:39 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
int test_attach10 ( int ) ;
} ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
enum test_attach9 {
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
test_attach10 ,
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
test_attach11 ///< \brief\author Aaa
2012-07-12 05:38:39 +08:00
} ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
struct test_noattach12 * test_attach13 ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
typedef struct test_noattach14 * test_attach15 ;
2019-11-14 04:30:31 +08:00
// expected-warning@+1 + {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
typedef struct test_attach16 { int a ; } test_attach17 ;
struct S { int a ; } ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
struct S * test_attach18 ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
typedef struct S * test_attach19 ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
struct test_attach20 ;
2019-11-14 04:30:31 +08:00
// expected-warning@+1 + {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
typedef struct test_attach21 {
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
int test_attach22 ;
} test_attach23 ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
namespace test_attach24 {
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-07-12 05:38:39 +08:00
namespace test_attach25 {
}
}
2012-08-01 06:37:06 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < typename T >
void test_attach26 ( T aaa ) ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \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}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < >
void test_attach27 ( int aaa , int bbb ) ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < typename T >
class test_attach28 {
T aaa ;
} ;
2012-08-03 04:49:51 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-03 04:49:51 +08:00
using test_attach29 = test_attach28 < int > ;
2012-08-01 06:37:06 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < typename T , typename U >
2012-08-03 04:49:51 +08:00
class test_attach30 { } ;
2012-08-01 06:37:06 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < typename T >
2012-08-03 04:49:51 +08:00
class test_attach30 < T , int > { } ;
2012-08-01 06:37:06 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
template < >
2012-08-03 04:49:51 +08:00
class test_attach30 < int , int > { } ;
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-03 04:49:51 +08:00
template < typename T >
using test_attach31 = test_attach30 < T , int > ;
2012-08-01 06:37:06 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < typename T , typename U , typename V >
2012-08-03 04:49:51 +08:00
class test_attach32 { } ;
2012-08-01 06:37:06 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < typename T , typename U >
2012-08-03 04:49:51 +08:00
class test_attach32 < T , U , int > { } ;
2012-08-01 06:37:06 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < typename T >
2012-08-03 04:49:51 +08:00
class test_attach32 < T , int , int > { } ;
2012-08-01 06:37:06 +08:00
// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < >
2012-08-03 04:49:51 +08:00
class test_attach32 < int , int , int > { } ;
2012-08-01 06:37:06 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-03 04:49:51 +08:00
class test_attach33 {
2012-08-01 06:37:06 +08:00
// expected-warning@+1 {{empty paragraph passed to '\brief' command}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < typename T , typename U >
2012-08-03 04:49:51 +08:00
void test_attach34 ( T aaa , U bbb ) ;
2012-08-01 06:37:06 +08:00
} ;
template < typename T >
2012-08-03 04:49:51 +08:00
class test_attach35 {
2012-08-01 06:37:06 +08:00
// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < typename TT , typename UU >
2012-08-03 04:49:51 +08:00
void test_attach36 ( TT aaa , UU bbb ) ;
2012-08-01 06:37:06 +08:00
} ;
// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < > template < >
2012-08-03 04:49:51 +08:00
void test_attach35 < int > : : test_attach36 ( int aaa , int bbb ) { }
2012-08-01 06:37:06 +08:00
template < typename T >
2012-08-03 04:49:51 +08:00
class test_attach37 {
2012-08-01 06:37:06 +08:00
// 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}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
2012-08-03 04:49:51 +08:00
void test_attach38 ( int aaa , int bbb ) ;
2012-08-01 06:37:06 +08:00
2012-08-15 01:17:18 +08:00
void test_attach39 ( int aaa , int bbb ) ;
} ;
2012-08-01 06:37:06 +08:00
// expected-warning@+2 {{empty paragraph passed to '\brief' command}}
// expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
2012-08-07 01:08:27 +08:00
/// \brief\author Aaa
2012-08-01 06:37:06 +08:00
/// \tparam T Aaa
template < >
2012-08-03 04:49:51 +08:00
void test_attach37 < int > : : test_attach38 ( int aaa , int bbb ) { }
2012-08-01 06:37:06 +08:00
2012-08-15 01:17:18 +08:00
// 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 ) { }
2012-08-17 02:19:43 +08:00
// 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 ) ;
2012-08-15 01:17:18 +08:00
2019-08-05 16:05:16 +08:00
// The inline comments expect a string after the command.
2019-08-26 02:20:18 +08:00
// expected-warning@+1 {{'\a' command does not have a valid word argument}}
2019-08-05 16:05:16 +08:00
/// \a
int test_inline_no_argument_a_bad ( int ) ;
/// \a A
int test_inline_no_argument_a_good ( int ) ;
2019-12-21 21:47:52 +08:00
// expected-warning@+1 {{'\anchor' command does not have a valid word argument}}
/// \anchor
int test_inline_no_argument_anchor_bad ( int ) ;
/// \anchor A
int test_inline_no_argument_anchor_good ( int ) ;
2019-08-26 02:20:18 +08:00
// expected-warning@+1 {{'@b' command does not have a valid word argument}}
2019-08-05 16:05:16 +08:00
/// @b
int test_inline_no_argument_b_bad ( int ) ;
/// @b A
int test_inline_no_argument_b_good ( int ) ;
2019-08-26 02:20:18 +08:00
// expected-warning@+1 {{'\c' command does not have a valid word argument}}
2019-08-05 16:05:16 +08:00
/// \c
int test_inline_no_argument_c_bad ( int ) ;
/// \c A
int test_inline_no_argument_c_good ( int ) ;
2019-08-26 02:20:18 +08:00
// expected-warning@+1 {{'\e' command does not have a valid word argument}}
2019-08-05 16:05:16 +08:00
/// \e
int test_inline_no_argument_e_bad ( int ) ;
/// \e A
int test_inline_no_argument_e_good ( int ) ;
2019-08-26 02:20:18 +08:00
// expected-warning@+1 {{'\em' command does not have a valid word argument}}
2019-08-05 16:05:16 +08:00
/// \em
int test_inline_no_argument_em_bad ( int ) ;
/// \em A
int test_inline_no_argument_em_good ( int ) ;
2019-08-26 02:20:18 +08:00
// expected-warning@+1 {{'\p' command does not have a valid word argument}}
2019-08-05 16:05:16 +08:00
/// \p
int test_inline_no_argument_p_bad ( int ) ;
/// \p A
int test_inline_no_argument_p_good ( int ) ;
2012-08-01 06:37:06 +08:00
2012-07-21 04:18:53 +08:00
// PR13411, reduced. We used to crash on this.
/**
* @ code Aaa .
*/
void test_nocrash1 ( int ) ;
2012-07-31 02:05:28 +08:00
// 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 ) ;
2012-08-15 01:17:18 +08:00
// PR13593, example 1 and 2
2012-08-14 00:37:30 +08:00
/**
* Bla .
*/
template < typename >
void test_nocrash3 ( ) ;
/// Foo
template < typename , typename >
void test_nocrash4 ( ) { }
template < typename >
void test_nocrash3 ( )
{
}
2012-08-15 01:17:18 +08:00
// 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 ;
2012-09-12 03:22:03 +08:00
// We used to crash on this.
2013-05-04 07:15:20 +08:00
// expected-warning@+1 {{unknown command tag name}}
2012-09-12 03:22:03 +08:00
/// aaa \unknown aaa \unknown aaa
int test_nocrash9 ;
2013-01-26 08:36:14 +08:00
// We used to crash on this. PR15068
2013-03-02 06:51:30 +08:00
// expected-warning@+2 {{empty paragraph passed to '@param' command}}
// expected-warning@+2 {{empty paragraph passed to '@param' command}}
2013-01-26 08:36:14 +08:00
///@param x
///@param y
int test_nocrash10 ( int x , int y ) ;
2013-03-02 06:51:30 +08:00
// 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}}
2013-01-26 08:36:14 +08:00
///@param x
///@param y
int test_nocrash11 ( ) ;
2013-03-02 06:51:30 +08:00
// 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}}
2013-01-26 08:36:14 +08:00
/**
@ param x
@ param y
* */
int test_nocrash12 ( ) ;
2013-03-02 06:51:30 +08:00
// expected-warning@+2 {{empty paragraph passed to '@param' command}}
// expected-warning@+1 {{empty paragraph passed to '@param' command}}
2013-01-26 08:36:14 +08:00
///@param x@param y
int test_nocrash13 ( int x , int y ) ;
2013-03-08 07:33:11 +08:00
2015-04-16 07:45:43 +08:00
/**
* \ verbatim
* Aaa
* */
int test_nocrash14 ( ) ;
2013-03-08 07:33:11 +08:00
// 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 ;
2013-06-20 02:08:03 +08:00
// 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.
///
2017-07-02 14:12:49 +08:00
/// A template specialization class.
2013-06-20 02:08:03 +08:00
//----------------------------------------------------------------------
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 ) ;
2017-04-21 22:17:49 +08:00
namespace AllowParamAndReturnsOnFunctionPointerVars {
/**
* functionPointerVariable
*
* @ param i is integer .
* @ returns integer .
*/
int ( * functionPointerVariable ) ( int i ) ;
2021-11-10 05:24:44 +08:00
# if __cplusplus >= 201402L
/**
* functionPointerVariableTemplate
*
* @ param i is something .
* @ returns integer .
*/
template < typename T >
int ( * functionPointerVariableTemplate ) ( T i ) ;
# endif
2017-04-21 22:17:49 +08:00
struct HasFields {
/**
* functionPointerField
*
* @ param i is integer .
* @ returns integer .
*/
int ( * functionPointerField ) ( int i ) ;
2021-11-10 05:24:44 +08:00
# if __cplusplus >= 201402L
/**
* functionPointerTemplateMember
*
* @ tparam T some type .
* @ param i is integer .
* @ returns integer .
*/
template < typename T >
static int ( * functionPointerTemplateMember ) ( int i ) ;
# endif
2017-04-21 22:17:49 +08:00
} ;
2021-11-10 04:51:38 +08:00
// expected-warning@+5 {{parameter 'p' not found in the function declaration}}
2017-04-21 22:17:49 +08:00
// expected-warning@+5 {{'\returns' command used in a comment that is attached to a function returning void}}
/**
* functionPointerVariable
*
* \ param p not here .
* \ returns integer .
*/
void ( * functionPointerVariableThatLeadsNowhere ) ( ) ;
2021-11-10 05:24:44 +08:00
# if __cplusplus >= 201402L
// expected-warning@+8 {{template parameter 'X' not found in the template declaration}}
// expected-note@+7 {{did you mean 'T'?}}
// expected-warning@+7 {{parameter 'p' not found in the function declaration}}
// expected-note@+6 {{did you mean 'x'?}}
// expected-warning@+6 {{'\returns' command used in a comment that is attached to a function returning void}}
/**
* functionPointerVariable
*
* \ tparam X typo
* \ param p not here .
* \ returns integer .
*/
template < typename T >
void ( * functionPointerVariableTemplateThatLeadsNowhere ) ( T x ) ;
# endif
2017-04-21 22:17:49 +08:00
// Still warn about param/returns commands for variables that don't specify
// the type directly:
/**
* FunctionPointerTypedef
*
* \ param i is integer .
* \ returns integer .
*/
typedef int ( * FunctionPointerTypedef ) ( int i ) ;
/**
* FunctionPointerTypealias
*
* \ param i is integer .
* \ returns integer .
*/
using FunctionPointerTypealias = int ( * ) ( int i ) ;
// expected-warning@+5 {{'@param' command used in a comment that is not attached to a function declaration}}
// expected-warning@+5 {{'@returns' command used in a comment that is not attached to a function or method declaration}}
/**
* functionPointerVariable
*
* @ param i is integer .
* @ returns integer .
*/
FunctionPointerTypedef functionPointerTypedefVariable ;
struct HasMoreFields {
// expected-warning@+5 {{'\param' command used in a comment that is not attached to a function declaration}}
// expected-warning@+5 {{'\returns' command used in a comment that is not attached to a function or method declaration}}
/**
* functionPointerTypealiasField
*
* \ param i is integer .
* \ returns integer .
*/
FunctionPointerTypealias functionPointerTypealiasField ;
} ;
}
2017-10-07 04:51:04 +08:00
/*!
* Function pointer typedef with variadic params .
*
* @ param a
* works
*
* @ param . . .
* now should work too .
*/
typedef void ( * VariadicFnType ) ( int a , . . . ) ;
/*!
* Function pointer type alias with variadic params .
*
* @ param a
* works
*
* @ param . . .
* now should work too .
*/
using VariadicFnType2 = void ( * ) ( int a , . . . ) ;
2018-10-03 06:23:27 +08:00
2021-11-13 04:09:16 +08:00
/*!
* Function pointer type variable .
*
* @ param a
* works
*
* @ param . . .
* now should work too .
*/
void ( * variadicFnVar ) ( int a , . . . ) ;
2018-10-03 06:23:27 +08:00
// expected-warning@+2 {{empty paragraph passed to '@note' command}}
/**
@ note
\ f $ \ texttt { mu } _ { 00 } = \ texttt { m } _ { 00 } \ f $ , \ f $ \ texttt { nu } _ { 00 } = 1 \ f $
\ f $ \ texttt { nu } _ { 10 } = \ texttt { mu } _ { 10 } = \ texttt { mu } _ { 01 } = \ texttt { mu } _ { 10 } = 0 \ f $
*/
class EmptyNoteNoCrash {
} ;
2019-09-03 02:24:33 +08:00
namespace PR42844 { // Assertion failures when using typedefed function pointers
typedef void ( * AA ) ( ) ;
typedef AA A ( ) ;
A * a ; ///< \return none
// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
typedef void B ( ) ;
B * b ; ///< \return none
// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
void CC ( ) ;
typedef void C ( ) ;
C & c = CC ; ///< \return none
// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
using DD = void ( * ) ( ) ;
using D = DD ( ) ;
D * d ; ///< \return none
// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
using E = void ( ) ;
E * e ; ///< \return none
// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
void FF ( ) ;
using F = void ( ) ;
F & f = FF ; ///< \return none
// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}}
} // namespace PR42844