// RUN: %clang_cc1 -fsyntax-only -verify %s struct A { template operator T*(); }; template A::operator T*() { return 0; } template <> A::operator char*(){ return 0; } // specialization template A::operator void*(); // explicit instantiation int main() { A a; int *ip; ip = a.operator int*(); } // PR5742 namespace PR5742 { template struct A { }; template struct B { }; struct S { template operator T(); } s; void f() { s.operator A >(); s.operator A >(); s.operator A > >(); } } // PR5762 class Foo { public: template operator T(); template T As() { return this->operator T(); } template T As2() { return operator T(); } int AsInt() { return this->operator int(); } }; template float Foo::As(); template double Foo::As2(); // Partial ordering with conversion function templates. struct X0 { template operator T*() { T x = 1; // expected-note{{variable 'x' declared const here}} x = 17; // expected-error{{cannot assign to variable 'x' with const-qualified type 'const int'}} } template operator T*() const; // expected-note{{explicit instantiation refers here}} template operator const T*() const { T x = T(); return x; // expected-error{{cannot initialize return object of type 'const char *' with an lvalue of type 'char'}} \ // expected-error{{cannot initialize return object of type 'const int *' with an lvalue of type 'int'}} } }; template X0::operator const char*() const; // expected-note{{'X0::operator const char *' requested here}} template X0::operator const int*(); // expected-note{{'X0::operator const int *' requested here}} template X0::operator float*() const; // expected-error{{explicit instantiation of undefined function template}} void test_X0(X0 x0, const X0 &x0c) { x0.operator const int*(); // expected-note{{in instantiation of function template specialization}} x0.operator float *(); x0c.operator const char*(); } namespace PR14211 { template struct X { void foo(U){} template void foo(T){} template void bar(T){} void bar(U){} }; template void X::foo(int); template void X::bar(int); }