2009-12-16 04:14:24 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify %s
2009-09-26 02:43:00 +08:00
template void * ; // expected-error{{expected unqualified-id}}
template typedef void f0 ; // expected-error{{explicit instantiation of typedef}}
int v0 ; // expected-note{{refers here}}
template int v0 ; // expected-error{{does not refer}}
template < typename T >
struct X0 {
static T value ;
T f0 ( T x ) {
return x + 1 ; // expected-error{{invalid operands}}
}
2012-08-09 01:33:31 +08:00
T * f0 ( T * , T * ) { return T ( ) ; } // expected-warning{{expression which evaluates to zero treated as a null pointer constant of type 'int *'}}
2013-07-20 07:00:19 +08:00
2013-12-14 09:07:05 +08:00
template < typename U > T f0 ( T , U ) { return T ( ) ; } / / expected - note - re { { candidate template ignored : could not match ' int ( int , U ) { { ( __attribute__ \ ( \ ( thiscall \ ) \ ) ) ? } } ' against ' int ( int ) { { ( __attribute__ \ ( \ ( thiscall \ ) \ ) ) ? } } const ' } } \
2013-07-20 07:00:19 +08:00
// expected-note {{candidate template ignored: could not match 'int' against 'int *'}}
2009-09-26 02:43:00 +08:00
} ;
2009-10-15 07:41:34 +08:00
template < typename T >
T X0 < T > : : value ; // expected-error{{no matching constructor}}
2009-09-26 02:43:00 +08:00
template int X0 < int > : : value ;
2010-01-13 08:25:19 +08:00
struct NotDefaultConstructible { // expected-note{{candidate constructor (the implicit copy constructor)}}
2010-01-06 17:43:14 +08:00
NotDefaultConstructible ( int ) ; // expected-note{{candidate constructor}}
2009-09-26 02:43:00 +08:00
} ;
2009-10-15 07:41:34 +08:00
template NotDefaultConstructible X0 < NotDefaultConstructible > : : value ; // expected-note{{instantiation}}
2009-09-26 02:43:00 +08:00
template int X0 < int > : : f0 ( int ) ;
2012-08-09 01:33:31 +08:00
template int * X0 < int > : : f0 ( int * , int * ) ; // expected-note{{in instantiation of member function 'X0<int>::f0' requested here}}
2009-09-26 02:43:00 +08:00
template int X0 < int > : : f0 ( int , float ) ;
template int X0 < int > : : f0 ( int ) const ; // expected-error{{does not refer}}
template int * X0 < int > : : f0 ( int * , float * ) ; // expected-error{{does not refer}}
struct X1 { } ;
typedef int X1 : : * MemPtr ;
template MemPtr X0 < MemPtr > : : f0 ( MemPtr ) ; // expected-note{{requested here}}
struct X2 {
int f0 ( int ) ; // expected-note{{refers here}}
2009-10-15 07:41:34 +08:00
template < typename T > T f1 ( T ) { return T ( ) ; }
template < typename T > T * f1 ( T * ) { return 0 ; }
2009-09-26 02:43:00 +08:00
2009-10-15 07:41:34 +08:00
template < typename T , typename U > void f2 ( T , U * ) { } // expected-note{{candidate}}
template < typename T , typename U > void f2 ( T * , U ) { } // expected-note{{candidate}}
2009-09-26 02:43:00 +08:00
} ;
template int X2 : : f0 ( int ) ; // expected-error{{not an instantiation}}
template int * X2 : : f1 ( int * ) ; // okay
template void X2 : : f2 ( int * , int * ) ; // expected-error{{ambiguous}}
2009-09-26 05:45:23 +08:00
2013-07-20 07:00:19 +08:00
template < typename T >
void print_type ( ) { } // expected-note {{candidate template ignored: could not match 'void ()' against 'void (float *)'}}
2009-09-26 05:45:23 +08:00
template void print_type < int > ( ) ;
template void print_type < float > ( ) ;
2013-07-20 07:00:19 +08:00
template < typename T >
void print_type ( T * ) { } // expected-note {{candidate template ignored: could not match 'void (int *)' against 'void (float *)'}}
2009-09-26 05:45:23 +08:00
template void print_type ( int * ) ;
template void print_type < int > ( float * ) ; // expected-error{{does not refer}}
void print_type ( double * ) ;
template void print_type < double > ( double * ) ;
2009-10-02 07:51:25 +08:00
// PR5069
template < int I > void foo0 ( int ( & ) [ I + 1 ] ) { }
template void foo0 < 2 > ( int ( & ) [ 3 ] ) ;
2010-02-13 18:17:50 +08:00
namespace explicit_instantiation_after_implicit_instantiation {
template < int I > struct X0 { static int x ; } ;
template < int I > int X0 < I > : : x ;
void test1 ( ) { ( void ) & X0 < 1 > : : x ; }
template struct X0 < 1 > ;
}
2010-07-13 08:10:04 +08:00
2010-12-02 04:32:20 +08:00
template < typename > struct X3 { } ;
inline template struct X3 < int > ; // expected-warning{{ignoring 'inline' keyword on explicit template instantiation}}
static template struct X3 < float > ; // expected-warning{{ignoring 'static' keyword on explicit template instantiation}}
2011-04-25 00:27:48 +08:00
namespace PR7622 {
2010-07-13 08:10:04 +08:00
template < typename , typename = int >
struct basic_streambuf ;
template < typename , typename >
struct basic_streambuf { friend bob < > ( ) } ; / / expected - error { { unknown type name ' bob ' } } \
2013-07-20 07:00:19 +08:00
// expected-error{{expected member name or ';' after declaration specifiers}}
2011-04-25 00:27:48 +08:00
template struct basic_streambuf < int > ;
}
2011-12-23 10:16:45 +08:00
// Test that we do not crash.
class TC1 {
class TC2 {
template // FIXME: error here.
void foo ( ) { }
} ;
} ;
2013-09-12 01:04:24 +08:00
namespace PR8020 {
template < typename T > struct X { X ( ) { } } ;
template < > struct X < int > { X ( ) ; } ;
template X < int > : : X ( ) { } // expected-error{{function cannot be defined in an explicit instantiation}}
}
namespace PR10086 {
template void foobar ( int i ) { } // expected-error{{function cannot be defined in an explicit instantiation}}
int func ( ) {
foobar ( 5 ) ;
}
}
2013-09-28 04:14:12 +08:00
namespace undefined_static_data_member {
template < typename T > struct A {
static int a ; // expected-note {{here}}
template < typename U > static int b ; // expected-note {{here}} expected-warning {{extension}}
} ;
struct B {
template < typename U > static int c ; // expected-note {{here}} expected-warning {{extension}}
} ;
template int A < int > : : a ; // expected-error {{explicit instantiation of undefined static data member 'a' of class template 'undefined_static_data_member::A<int>'}}
template int A < int > : : b < int > ; // expected-error {{explicit instantiation of undefined variable template 'undefined_static_data_member::A<int>::b<int>'}}
template int B : : c < int > ; // expected-error {{explicit instantiation of undefined variable template 'undefined_static_data_member::B::c<int>'}}
template < typename T > struct C {
static int a ;
template < typename U > static int b ; // expected-warning {{extension}}
} ;
struct D {
template < typename U > static int c ; // expected-warning {{extension}}
} ;
template < typename T > int C < T > : : a ;
template < typename T > template < typename U > int C < T > : : b ; // expected-warning {{extension}}
template < typename U > int D : : c ; // expected-warning {{extension}}
template int C < int > : : a ;
template int C < int > : : b < int > ;
template int D : : c < int > ;
}