| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify %s
- // RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify %s
- class A {
- public:
- template<class U> A(U p) {}
- template<> A(int p) {
- // expected-warning@-1 {{explicit specialization of 'A' within class scope is a Microsoft extension}}
- }
- template<class U> void f(U p) {}
- template<> void f(int p) {
- // expected-warning@-1 {{explicit specialization of 'f' within class scope is a Microsoft extension}}
- }
- 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<> B(int p) {
- // expected-warning@-1 {{explicit specialization of 'B<T>' within class scope is a Microsoft extension}}
- }
- template<class U> void f(U p) { T y = 9; }
- template<> void f(int p) {
- // expected-warning@-1 {{explicit specialization of 'f' within class scope is a Microsoft extension}}
- 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);
- }
- 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@-1 {{explicit specialization of 'specialized_member_template' within class scope is a Microsoft extension}}
- }
- };
- void f() { TemplateClass<int> t; }
- }
- namespace Duplicates {
- template<typename T> struct A {
- template<typename U> void f();
- template<> void f<int>() {} // expected-warning {{Microsoft extension}}
- template<> void f<T>() {} // expected-warning {{Microsoft extension}}
- };
- // FIXME: We should diagnose the duplicate explicit specialization definitions
- // here.
- template struct A<int>;
- }
|