2011-08-14 11:52:19 +08:00
// RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify %s
2013-04-29 16:53:40 +08:00
// RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify %s
2011-08-14 11:52:19 +08:00
class A {
public :
template < class U >
A ( U p ) {
}
template < >
2011-08-15 06:30:29 +08:00
A ( int p ) { // expected-warning{{explicit specialization of 'A' within class scope is a Microsoft extension}}
2011-08-14 11:52:19 +08:00
}
template < class U >
void f ( U p ) {
}
template < >
2011-08-15 06:30:29 +08:00
void f ( int p ) { // expected-warning{{explicit specialization of 'f' within class scope is a Microsoft extension}}
2011-08-14 11:52:19 +08:00
}
void f ( int p ) {
}
} ;
void test1 ( )
{
A a ( 3 ) ;
char * b ;
a . f ( b ) ;
a . f < int > ( 99 ) ;
a . f ( 100 ) ;
}
template < class T >
class B {
public :
template < class U >
B ( U p ) {
}
template < >
2011-08-15 06:30:29 +08:00
B ( int p ) { // expected-warning{{explicit specialization of 'B<T>' within class scope is a Microsoft extension}}
2011-08-14 11:52:19 +08:00
}
template < class U >
void f ( U p ) {
T y = 9 ;
}
template < >
2011-08-15 06:30:29 +08:00
void f ( int p ) { // expected-warning{{explicit specialization of 'f' within class scope is a Microsoft extension}}
2011-08-14 11:52:19 +08:00
T a = 3 ;
}
void f ( int p ) {
T a = 3 ;
}
} ;
void test2 ( )
{
B < char > b ( 3 ) ;
char * ptr ;
b . f ( ptr ) ;
b . f < int > ( 99 ) ;
b . f ( 100 ) ;
}
2012-06-26 01:21:05 +08:00
namespace PR12709 {
template < class T >
class TemplateClass {
void member_function ( ) {
specialized_member_template < false > ( ) ;
}
template < bool b >
void specialized_member_template ( ) { }
template < >
void specialized_member_template < false > ( ) { } // expected-warning{{explicit specialization of 'specialized_member_template' within class scope is a Microsoft extension}}
} ;
void f ( ) {
TemplateClass < int > t ;
}
}