// RUN: %clang_cc1 -fsyntax-only -verify %s struct A { template <class T> operator T*(); }; template <class T> 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 <class T> struct A { }; template <class T> struct B { }; struct S { template <class T> operator T(); } s; void f() { s.operator A<A<int> >(); s.operator A<B<int> >(); s.operator A<B<A<int> > >(); } } // PR5762 class Foo { public: template <typename T> operator T(); template <typename T> T As() { return this->operator T(); } template <typename T> 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<typename T> 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<typename T> operator T*() const; // expected-note{{explicit instantiation refers here}} template<typename T> 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 *<char>' requested here}} template X0::operator const int*(); // expected-note{{'X0::operator const int *<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 <class U> struct X { void foo(U){} template <class T> void foo(T){} template <class T> void bar(T){} void bar(U){} }; template void X<int>::foo(int); template void X<int>::bar(int); } |