19791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s 29791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregorstruct A { 39791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor template <class T> operator T*(); 49791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor}; 59791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 69791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregortemplate <class T> A::operator T*() { return 0; } 79791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregortemplate <> A::operator char*(){ return 0; } // specialization 89791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregortemplate A::operator void*(); // explicit instantiation 99791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 109791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregorint main() { 119791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor A a; 129791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor int *ip; 139791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor ip = a.operator int*(); 149791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor} 159791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 169791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor// PR5742 179791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregornamespace PR5742 { 189791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor template <class T> struct A { }; 199791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor template <class T> struct B { }; 209791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 219791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor struct S { 229791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor template <class T> operator T(); 239791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor } s; 249791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 259791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor void f() { 269791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor s.operator A<A<int> >(); 279791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor s.operator A<B<int> >(); 289791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor s.operator A<B<A<int> > >(); 299791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor } 309791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor} 319791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 329791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor// PR5762 339791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregorclass Foo { 349791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor public: 359791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor template <typename T> operator T(); 369791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 379791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor template <typename T> 389791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor T As() { 399791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor return this->operator T(); 409791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor } 419791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 429791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor template <typename T> 439791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor T As2() { 449791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor return operator T(); 459791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor } 469791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 479791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor int AsInt() { 489791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor return this->operator int(); 499791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor } 509791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor}; 519791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 529791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregortemplate float Foo::As(); 539791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregortemplate double Foo::As2(); 549791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 559791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor// Partial ordering with conversion function templates. 569791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregorstruct X0 { 579791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor template<typename T> operator T*() { 5860c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor T x = 1; 599791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor x = 17; // expected-error{{read-only variable is not assignable}} 609791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor } 619791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 629791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor template<typename T> operator T*() const; // expected-note{{explicit instantiation refers here}} 639791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 649791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor template<typename T> operator const T*() const { 659791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor T x = T(); 665fad9b8362c62e230f6603d86ec7d1747e74c737Douglas Gregor return x; // expected-error{{cannot initialize return object of type 'const char *' with an lvalue of type 'char'}} \ 675fad9b8362c62e230f6603d86ec7d1747e74c737Douglas Gregor // expected-error{{cannot initialize return object of type 'const int *' with an lvalue of type 'int'}} 689791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor } 699791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor}; 709791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 7158f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattnertemplate X0::operator const char*() const; // expected-note{{'X0::operator const char *<char>' requested here}} 7258f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattnertemplate X0::operator const int*(); // expected-note{{'X0::operator const int *<const int>' requested here}} 739791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregortemplate X0::operator float*() const; // expected-error{{explicit instantiation of undefined function template}} 749791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor 759791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregorvoid test_X0(X0 x0, const X0 &x0c) { 765fad9b8362c62e230f6603d86ec7d1747e74c737Douglas Gregor x0.operator const int*(); // expected-note{{in instantiation of function template specialization}} 779791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor x0.operator float *(); 789791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor x0c.operator const char*(); 799791bdc9b67435376f0b65686b627f5b3c6d1869Douglas Gregor} 80