101 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2template<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, destructors54template<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// PR556670template<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() { } // expected-warning{{'template' cannot be used after a declarative}}79 80// PR552781template <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// PR552894template <template <class> class T>95class X3 {96 void F();97};98 99template <template <class> class T>100void X3<T>::F() {}101