Clang Project

clang_source_code/test/SemaTemplate/ms-function-specialization-class-scope.cpp
1// RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify %s
2// RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify %s
3
4// expected-no-diagnostics
5class A {
6public:
7  template<class U> A(U p) {}
8  template<> A(int p) {}
9
10  template<class U> void f(U p) {}
11
12  template<> void f(int p) {}
13
14  void f(int p) {}
15};
16
17void test1() {
18  A a(3);
19  char *b;
20  a.f(b);
21  a.f<int>(99);
22  a.f(100);
23}
24
25template<class T> class B {
26public:
27  template<class U> B(U p) {}
28  template<> B(int p) {}
29
30  template<class U> void f(U p) { T y = 9; }
31
32  template<> void f(int p) {
33    T a = 3;
34  }
35
36  void f(int p) { T a = 3; }
37};
38
39void test2() {
40  B<char> b(3);
41  char *ptr;
42  b.f(ptr);
43  b.f<int>(99);
44  b.f(100);
45}
46
47namespace PR12709 {
48  template<class T> class TemplateClass {
49    void member_function() { specialized_member_template<false>(); }
50
51    template<bool b> void specialized_member_template() {}
52
53    template<> void specialized_member_template<false>() {}
54  };
55
56  void f() { TemplateClass<int> t; }
57}
58
59namespace Duplicates {
60  template<typename T> struct A {
61    template<typename U> void f();
62    template<> void f<int>() {}
63    template<> void f<T>() {}
64  };
65
66  // FIXME: We should diagnose the duplicate explicit specialization definitions
67  // here.
68  template struct A<int>;
69}
70
71namespace PR28082 {
72struct S {
73  template <int>
74  int f(int = 0);
75  template <>
76  int f<0>(int);
77};
78}
79