// RUN: clang-cc -fsyntax-only -verify %s template // expected-note{{previous template}} class X0 { public: typedef int size_type; X0(int); ~X0(); void f0(const T&, const U&); T& operator[](int i) const; void f1(size_type) const; void f2(size_type) const; void f3(size_type) const; void f4() ; operator T*() const; T value; }; template void X0::f0(const T&, const U&) { // expected-note{{previous definition}} } template X& X0::operator[](int i) const { (void)i; return value; } template void X0::f1(int) const { } template void X0::f2(size_type) const { } template // expected-error{{too many template parameters}} void X0::f3(size_type) const { } template void X0::f4() { } // expected-error{{does not refer}} // FIXME: error message should probably say, "redefinition of 'X0::f0'" // rather than just "redefinition of 'f0'" template void X0::f0(const T&, const U&) { // expected-error{{redefinition}} } // Test out-of-line constructors, destructors template X0::X0(int x) : value(x) { } template X0::~X0() { } // Test out-of-line conversion functions. template X0::operator T*() const { return &value; } namespace N { template class A {void a();}; } namespace N { template void A::a() {} }