|  | // RUN: %clang_cc1 -fsyntax-only -verify %s | 
|  | template<typename T> | 
|  | class X { | 
|  | public: | 
|  | void f(T x); // expected-error{{argument may not have 'void' type}} | 
|  | void g(T*); | 
|  |  | 
|  | static int h(T, T); // expected-error {{argument may not have 'void' type}} | 
|  | }; | 
|  |  | 
|  | int identity(int x) { return x; } | 
|  |  | 
|  | void test(X<int> *xi, int *ip, X<int(int)> *xf) { | 
|  | xi->f(17); | 
|  | xi->g(ip); | 
|  | xf->f(&identity); | 
|  | xf->g(identity); | 
|  | X<int>::h(17, 25); | 
|  | X<int(int)>::h(identity, &identity); | 
|  | } | 
|  |  | 
|  | void test_bad() { | 
|  | X<void> xv; // expected-note{{in instantiation of template class 'X<void>' requested here}} | 
|  | } | 
|  |  | 
|  | template<typename T, typename U> | 
|  | class Overloading { | 
|  | public: | 
|  | int& f(T, T); // expected-note{{previous declaration is here}} | 
|  | float& f(T, U); // expected-error{{functions that differ only in their return type cannot be overloaded}} | 
|  | }; | 
|  |  | 
|  | void test_ovl(Overloading<int, long> *oil, int i, long l) { | 
|  | int &ir = oil->f(i, i); | 
|  | float &fr = oil->f(i, l); | 
|  | } | 
|  |  | 
|  | void test_ovl_bad() { | 
|  | Overloading<float, float> off; // expected-note{{in instantiation of template class 'Overloading<float, float>' requested here}} | 
|  | } | 
|  |  | 
|  | template<typename T> | 
|  | class HasDestructor { | 
|  | public: | 
|  | virtual ~HasDestructor() = 0; | 
|  | }; | 
|  |  | 
|  | int i = sizeof(HasDestructor<int>); // FIXME: forces instantiation, but | 
|  | // the code below should probably instantiate by itself. | 
|  | int abstract_destructor[__is_abstract(HasDestructor<int>)? 1 : -1]; | 
|  |  | 
|  |  | 
|  | template<typename T> | 
|  | class Constructors { | 
|  | public: | 
|  | Constructors(const T&); | 
|  | Constructors(const Constructors &other); | 
|  | }; | 
|  |  | 
|  | void test_constructors() { | 
|  | Constructors<int> ci1(17); | 
|  | Constructors<int> ci2 = ci1; | 
|  | } | 
|  |  | 
|  |  | 
|  | template<typename T> | 
|  | struct ConvertsTo { | 
|  | operator T(); | 
|  | }; | 
|  |  | 
|  | void test_converts_to(ConvertsTo<int> ci, ConvertsTo<int *> cip) { | 
|  | int i = ci; | 
|  | int *ip = cip; | 
|  | } | 
|  |  | 
|  | // PR4660 | 
|  | template<class T> struct A0 { operator T*(); }; | 
|  | template<class T> struct A1; | 
|  |  | 
|  | int *a(A0<int> &x0, A1<int> &x1) { | 
|  | int *y0 = x0; | 
|  | int *y1 = x1; // expected-error{{no viable conversion}} | 
|  | } | 
|  |  | 
|  | struct X0Base { | 
|  | int &f(); | 
|  | int& g(int); | 
|  | static double &g(double); | 
|  | }; | 
|  |  | 
|  | template<typename T> | 
|  | struct X0 : X0Base { | 
|  | }; | 
|  |  | 
|  | template<typename U> | 
|  | struct X1 : X0<U> { | 
|  | int &f2() { | 
|  | return X0Base::f(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | void test_X1(X1<int> x1i) { | 
|  | int &ir = x1i.f2(); | 
|  | } | 
|  |  | 
|  | template<typename U> | 
|  | struct X2 : X0Base, U { | 
|  | int &f2() { return X0Base::f(); } | 
|  | }; | 
|  |  | 
|  | template<typename T> | 
|  | struct X3 { | 
|  | void test(T x) { | 
|  | double& d1 = X0Base::g(x); | 
|  | } | 
|  | }; | 
|  |  | 
|  |  | 
|  | template struct X3<double>; | 
|  |  | 
|  | // Don't try to instantiate this, it's invalid. | 
|  | namespace test1 { | 
|  | template <class T> class A {}; | 
|  | template <class T> class B { | 
|  | void foo(A<test1::Undeclared> &a) // expected-error {{no member named 'Undeclared' in namespace 'test1'}} | 
|  | {} | 
|  | }; | 
|  | template class B<int>; | 
|  | } | 
|  |  | 
|  | namespace PR6947 { | 
|  | template< class T > | 
|  | struct X { | 
|  | int f0( ) | 
|  | { | 
|  | typedef void ( X::*impl_fun_ptr )( ); | 
|  | impl_fun_ptr pImpl = &X::template | 
|  | f0_impl1<int>; | 
|  | } | 
|  | private: | 
|  | int f1() { | 
|  | } | 
|  | template< class Processor> | 
|  | void f0_impl1( ) | 
|  | { | 
|  | } | 
|  | }; | 
|  |  | 
|  | char g0() { | 
|  | X<int> pc; | 
|  | pc.f0(); | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | namespace PR7022 { | 
|  | template <typename > | 
|  | struct X1 | 
|  | { | 
|  | typedef int state_t( ); | 
|  | state_t g ; | 
|  | }; | 
|  |  | 
|  | template <  typename U = X1<int> > struct X2 | 
|  | { | 
|  | X2( U = U()) | 
|  | { | 
|  | } | 
|  | }; | 
|  |  | 
|  | void m(void) | 
|  | { | 
|  | typedef X2<> X2_type; | 
|  | X2_type c; | 
|  | } | 
|  |  | 
|  | } |