2016-05-27 03:42:56 +08:00
// RUN: %clang_cc1 -triple i686-pc-win32 -fsyntax-only -verify %s -DMS
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu-pc-win32 -fsyntax-only -verify %s
2009-09-04 14:33:52 +08:00
template < typename T >
class X0 {
public :
void f ( T t ) ;
2009-09-12 04:35:49 +08:00
struct Inner {
void g ( T t ) ;
} ;
2009-09-04 14:33:52 +08:00
} ;
template < typename T >
void X0 < T > : : f ( T t ) {
2009-09-12 05:19:12 +08:00
t = 17 ; // expected-error{{incompatible}}
2009-09-04 14:33:52 +08:00
}
extern template class X0 < int > ;
2009-09-12 04:35:49 +08:00
extern template class X0 < int * > ;
template < typename T >
void X0 < T > : : Inner : : g ( T t ) {
2016-05-27 03:42:56 +08:00
# ifdef MS
2020-02-25 22:49:59 +08:00
t = 17 ; // expected-error{{incompatible integer to pointer conversion assigning to 'long *'}} expected-error{{incompatible integer to pointer conversion assigning to 'int *'}}
2016-05-27 03:42:56 +08:00
# else
2020-02-25 22:49:59 +08:00
t = 17 ; // expected-error{{incompatible integer to pointer conversion assigning to 'long *'}}
2016-05-27 03:42:56 +08:00
# endif
2009-09-12 04:35:49 +08:00
}
void test_intptr ( X0 < int * > xi , X0 < int * > : : Inner xii ) {
xi . f ( 0 ) ;
2016-05-27 03:42:56 +08:00
# ifdef MS
xii . g ( 0 ) ; // expected-note {{instantiation}}
# else
2009-09-12 04:35:49 +08:00
xii . g ( 0 ) ;
2016-05-27 03:42:56 +08:00
# endif
2009-09-12 04:35:49 +08:00
}
2009-09-12 05:19:12 +08:00
2009-10-16 06:53:21 +08:00
extern template class X0 < long * > ;
2009-09-12 05:19:12 +08:00
void test_longptr ( X0 < long * > xl , X0 < long * > : : Inner xli ) {
xl . f ( 0 ) ;
2009-10-08 07:56:10 +08:00
xli . g ( 0 ) ;
2009-09-12 05:19:12 +08:00
}
2009-10-16 06:53:21 +08:00
template class X0 < long * > ; // expected-note 2{{instantiation}}
2009-09-29 22:38:03 +08:00
template < typename T >
class X1 {
public :
void f ( T t ) { t + = 2 ; }
void g ( T t ) ;
} ;
template < typename T >
void X1 < T > : : g ( T t ) {
t + = 2 ;
}
extern template class X1 < void * > ;
void g_X1 ( X1 < void * > x1 , void * ptr ) {
x1 . g ( ptr ) ;
}
extern template void X1 < const void * > : : g ( const void * ) ;
void g_X1_2 ( X1 < const void * > x1 , const void * ptr ) {
2009-10-08 09:19:17 +08:00
x1 . g ( ptr ) ;
2009-09-29 22:38:03 +08:00
}
2017-10-19 06:45:01 +08:00
namespace static_const_member {
template < typename T > struct A { static const int n ; } ;
template < typename T > const int A < T > : : n = 3 ;
extern template struct A < int > ;
int arr [ A < int > : : n ] ;
}