2012-08-03 04:49:51 +08:00
// RUN: %clang_cc1 -std=c++11 -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
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
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
// 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 ) ;
// 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 ) ;
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 ;
// 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 ;
// 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
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
// 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.
///
/// 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 ) ;