// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify=expected,cxx23 %s // RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify=expected,cxx98_20 %s // RUN: %clang_cc1 -std=c++98 -fsyntax-only -verify=expected,cxx98_20 %s // RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx98_20 %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; // cxx98_20-error{{cannot initialize return object of type 'const char *' with an lvalue of type 'char'}} \ // cxx98_20-error{{cannot initialize return object of type 'const int *' with an lvalue of type 'int'}} \ // cxx23-error{{cannot initialize return object of type 'const char *' with an rvalue of type 'char'}} \ // cxx23-error{{cannot initialize return object of type 'const int *' with an rvalue 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 'operator type-parameter-0-0 *'}} 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); }