p1.cpp revision a5728872c7702ddd09537c95bc3cbd20e1f2fb09
1// RUN: %clang_cc1 -fsyntax-only -verify %s
2template<typename T, typename U> // expected-note{{previous template}}
3class X0 {
4public:
5  typedef int size_type;
6
7  X0(int);
8  ~X0();
9
10  void f0(const T&, const U&);
11
12  T& operator[](int i) const;
13
14  void f1(size_type) const;
15  void f2(size_type) const;
16  void f3(size_type) const;
17  void f4() ;
18
19  operator T*() const;
20
21  T value;
22};
23
24template<typename T, typename U>
25void X0<T, U>::f0(const T&, const U&) { // expected-note{{previous definition}}
26}
27
28template<class X, class Y>
29X& X0<X, Y>::operator[](int i) const {
30  (void)i;
31  return value;
32}
33
34template<class X, class Y>
35void X0<X, Y>::f1(int) const { }
36
37template<class X, class Y>
38void X0<X, Y>::f2(size_type) const { }
39
40template<class X, class Y, class Z> // expected-error{{too many template parameters}}
41void X0<X, Y>::f3(size_type) const {
42}
43
44template<class X, class Y>
45void X0<Y, X>::f4() { } // expected-error{{does not refer}}
46
47// FIXME: error message should probably say, "redefinition of 'X0<T, U>::f0'"
48// rather than just "redefinition of 'f0'"
49template<typename T, typename U>
50void X0<T, U>::f0(const T&, const U&) { // expected-error{{redefinition}}
51}
52
53// Test out-of-line constructors, destructors
54template<typename T, typename U>
55X0<T, U>::X0(int x) : value(x) { }
56
57template<typename T, typename U>
58X0<T, U>::~X0() { }
59
60// Test out-of-line conversion functions.
61template<typename T, typename U>
62X0<T, U>::operator T*() const {
63  return &value;
64}
65
66namespace N { template <class X> class A {void a();}; }
67namespace N { template <class X> void A<X>::a() {} }
68
69// PR5566
70template<typename T>
71struct X1 {
72  template<typename U>
73  struct B { void f(); };
74};
75
76template<typename T>
77template<typename U>
78void X1<T>::template B<U>::f() { }
79
80// PR5527
81template <template <class> class T>
82class X2 {
83  template <class F>
84  class Bar {
85    void Func();
86  };
87};
88
89template <template <class> class T>
90template <class F>
91void X2<T>::Bar<F>::Func() {}
92
93// PR5528
94template <template <class> class T>
95class X3 {
96  void F();
97};
98
99template <template <class> class T>
100void X3<T>::F() {}
101