2010-05-09 01:41:32 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify %s
2015-12-10 09:07:17 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2010-05-09 01:41:32 +08:00
template < typename T >
const T & min ( const T & , const T & ) ; // expected-note{{candidate template ignored: deduced conflicting types for parameter 'T' ('int' vs. 'long')}}
void test_min ( ) {
( void ) min ( 1 , 2l ) ; // expected-error{{no matching function for call to 'min'}}
}
2010-05-09 03:15:54 +08:00
template < typename R , typename T >
R * dyn_cast ( const T & ) ; // expected-note{{candidate template ignored: couldn't infer template argument 'R'}}
void test_dyn_cast ( int * ptr ) {
( void ) dyn_cast ( ptr ) ; // expected-error{{no matching function for call to 'dyn_cast'}}
}
template < int I , typename T >
void get ( const T & ) ; // expected-note{{candidate template ignored: invalid explicitly-specified argument for template parameter 'I'}}
template < template < class T > class , typename T >
void get ( const T & ) ; // expected-note{{candidate template ignored: invalid explicitly-specified argument for 1st template parameter}}
void test_get ( void * ptr ) {
get < int > ( ptr ) ; // expected-error{{no matching function for call to 'get'}}
}
2010-05-09 04:07:26 +08:00
template < typename T >
2012-05-07 17:03:25 +08:00
typename T : : type get_type ( const T & ) ; // expected-note{{candidate template ignored: substitution failure [with T = int *]: type 'int *' cannot be used prior to '::'}}
template < typename T >
void get_type ( T * , int [ ( int ) sizeof ( T ) - 9 ] = 0 ) ; // expected-note{{candidate template ignored: substitution failure [with T = int]: array size is negative}}
2010-05-09 04:07:26 +08:00
void test_get_type ( int * ptr ) {
( void ) get_type ( ptr ) ; // expected-error{{no matching function for call to 'get_type'}}
}
2010-05-09 04:18:54 +08:00
struct X {
template < typename T >
const T & min ( const T & , const T & ) ; // expected-note{{candidate template ignored: deduced conflicting types for parameter 'T' ('int' vs. 'long')}}
} ;
void test_X_min ( X x ) {
( void ) x . min ( 1 , 2l ) ; // expected-error{{no matching member function for call to 'min'}}
}
2012-05-09 13:17:00 +08:00
namespace boost {
template < bool , typename = void > struct enable_if { } ;
template < typename T > struct enable_if < true , T > { typedef T type ; } ;
}
2017-07-06 04:20:14 +08:00
template < typename T > typename boost : : enable_if < sizeof ( T ) = = 4 , int > : : type if_size_4 ( ) ; // expected-note{{candidate template ignored: requirement 'sizeof(char) == 4' was not satisfied [with T = char]}}
2012-05-09 13:17:00 +08:00
int k = if_size_4 < char > ( ) ; // expected-error{{no matching function}}
namespace llvm {
template < typename Cond , typename T = void > struct enable_if : boost : : enable_if < Cond : : value , T > { } ;
}
template < typename T > struct is_int { enum { value = false } ; } ;
template < > struct is_int < int > { enum { value = true } ; } ;
template < typename T > typename llvm : : enable_if < is_int < T > > : : type if_int ( ) ; // expected-note{{candidate template ignored: disabled by 'enable_if' [with T = char]}}
void test_if_int ( ) {
if_int < char > ( ) ; // expected-error{{no matching function}}
}
template < typename T > struct NonTemplateFunction {
2017-07-06 04:20:14 +08:00
typename boost : : enable_if < sizeof ( T ) = = 4 , int > : : type f ( ) ; // expected-error{{failed requirement 'sizeof(char) == 4'; 'enable_if' cannot be used to disable this declaration}}
2012-05-09 13:17:00 +08:00
} ;
NonTemplateFunction < char > NTFC ; // expected-note{{here}}
2013-04-09 05:11:40 +08:00
namespace NS1 {
template < class A >
class array { } ;
}
namespace NS2 {
template < class A >
class array { } ;
}
template < class A >
void foo ( NS2 : : array < A > ) ; // expected-note{{candidate template ignored: could not match 'NS2::array' against 'NS1::array'}}
void test ( ) {
foo ( NS1 : : array < int > ( ) ) ; // expected-error{{no matching function for call to 'foo'}}
}
2013-07-04 09:01:24 +08:00
namespace std {
template < bool , typename = void > struct enable_if { } ;
template < typename T > struct enable_if < true , T > { typedef T type ; } ;
template < typename T , T V > struct integral_constant { static const T value = V ; } ;
typedef integral_constant < bool , false > false_type ;
typedef integral_constant < bool , true > true_type ;
} ;
namespace PR15673 {
template < typename T >
struct a_trait : std : : false_type { } ;
template < typename T ,
2015-12-10 09:07:17 +08:00
typename Requires = typename std : : enable_if < a_trait < T > : : value > : : type >
# if __cplusplus <= 199711L
// expected-warning@-2 {{default template arguments for a function template are a C++11 extension}}
# endif
2017-07-06 04:20:14 +08:00
// expected-note@+1 {{candidate template ignored: requirement 'a_trait<int>::value' was not satisfied [with T = int]}}
2013-07-04 09:01:24 +08:00
void foo ( ) { }
void bar ( ) { foo < int > ( ) ; } // expected-error {{no matching function for call to 'foo'}}
template < typename T >
struct some_trait : std : : false_type { } ;
// FIXME: It would be nice to tunnel the 'disabled by enable_if' diagnostic through here.
template < typename T >
struct a_pony : std : : enable_if < some_trait < T > : : value > { } ;
template < typename T ,
2015-12-10 09:07:17 +08:00
typename Requires = typename a_pony < T > : : type >
# if __cplusplus <= 199711L
// expected-warning@-2 {{default template arguments for a function template are a C++11 extension}}
# endif
2013-07-04 09:01:24 +08:00
// FIXME: The source location here is poor.
void baz ( ) { } // expected-note {{candidate template ignored: substitution failure [with T = int]: no type named 'type' in 'PR15673::a_pony<int>'}}
void quux ( ) { baz < int > ( ) ; } // expected-error {{no matching function for call to 'baz'}}
// FIXME: This note doesn't make it clear which candidate we rejected.
template < typename T >
2015-12-10 09:07:17 +08:00
using unicorns = typename std : : enable_if < some_trait < T > : : value > : : type ;
# if __cplusplus <= 199711L
// expected-warning@-2 {{alias declarations are a C++11 extension}}
# endif
2017-07-06 04:20:14 +08:00
// expected-note@+7 {{candidate template ignored: requirement 'some_trait<int>::value' was not satisfied [with T = int]}}
2013-07-04 09:01:24 +08:00
template < typename T ,
2015-12-10 09:07:17 +08:00
typename Requires = unicorns < T > >
# if __cplusplus <= 199711L
// expected-warning@-2 {{default template arguments for a function template are a C++11 extension}}
# endif
2013-07-04 09:01:24 +08:00
void wibble ( ) { }
void wobble ( ) { wibble < int > ( ) ; } // expected-error {{no matching function for call to 'wibble'}}
}