aboutsummaryrefslogtreecommitdiff
path: root/test/SemaTemplate/ms-function-specialization-class-scope.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaTemplate/ms-function-specialization-class-scope.cpp')
-rw-r--r--test/SemaTemplate/ms-function-specialization-class-scope.cpp124
1 files changed, 54 insertions, 70 deletions
diff --git a/test/SemaTemplate/ms-function-specialization-class-scope.cpp b/test/SemaTemplate/ms-function-specialization-class-scope.cpp
index 9efb02ce5f51..5da00837cc09 100644
--- a/test/SemaTemplate/ms-function-specialization-class-scope.cpp
+++ b/test/SemaTemplate/ms-function-specialization-class-scope.cpp
@@ -1,93 +1,77 @@
// 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{{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{{explicit specialization of 'f' within class scope is a Microsoft extension}}
- }
-
- void f(int p) {
- }
+ 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);
+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;
+ }
-template <class T>
-class B {
-public:
- template <class U>
- B(U p) {
- }
- template <>
- B(int p) { // expected-warning{{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{{explicit specialization of 'f' within class scope is a Microsoft extension}}
- T a = 3;
- }
-
- void f(int p) {
- 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);
+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<class T>
-class TemplateClass {
- void member_function() {
- specialized_member_template<false>();
- }
+ template<bool b> void specialized_member_template() {}
- 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}}
-};
+ 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;
+ 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>;
}