explicit-instantiation.cpp revision b1622a1fd7b7f4ab8d00d0183d17c90ad25c14e3
1// RUN: %clang_cc1 -fsyntax-only -verify %s 2 3template void *; // expected-error{{expected unqualified-id}} 4 5template typedef void f0; // expected-error{{explicit instantiation of typedef}} 6 7int v0; // expected-note{{refers here}} 8template int v0; // expected-error{{does not refer}} 9 10template<typename T> 11struct X0 { 12 static T value; 13 14 T f0(T x) { 15 return x + 1; // expected-error{{invalid operands}} 16 } 17 T* f0(T*, T*) { return T(); } 18 19 template<typename U> 20 T f0(T, U) { return T(); } 21}; 22 23template<typename T> 24T X0<T>::value; // expected-error{{no matching constructor}} 25 26template int X0<int>::value; 27 28struct NotDefaultConstructible { // expected-note{{candidate is the implicit copy constructor}} 29 NotDefaultConstructible(int); // expected-note{{candidate constructor}} 30}; 31 32template NotDefaultConstructible X0<NotDefaultConstructible>::value; // expected-note{{instantiation}} 33 34template int X0<int>::f0(int); 35template int* X0<int>::f0(int*, int*); 36template int X0<int>::f0(int, float); 37 38template int X0<int>::f0(int) const; // expected-error{{does not refer}} 39template int* X0<int>::f0(int*, float*); // expected-error{{does not refer}} 40 41struct X1 { }; 42typedef int X1::*MemPtr; 43 44template MemPtr X0<MemPtr>::f0(MemPtr); // expected-note{{requested here}} 45 46struct X2 { 47 int f0(int); // expected-note{{refers here}} 48 49 template<typename T> T f1(T) { return T(); } 50 template<typename T> T* f1(T*) { return 0; } 51 52 template<typename T, typename U> void f2(T, U*) { } // expected-note{{candidate}} 53 template<typename T, typename U> void f2(T*, U) { } // expected-note{{candidate}} 54}; 55 56template int X2::f0(int); // expected-error{{not an instantiation}} 57 58template int *X2::f1(int *); // okay 59 60template void X2::f2(int *, int *); // expected-error{{ambiguous}} 61 62 63template<typename T> void print_type() { } 64 65template void print_type<int>(); 66template void print_type<float>(); 67 68template<typename T> void print_type(T*) { } 69 70template void print_type(int*); 71template void print_type<int>(float*); // expected-error{{does not refer}} 72 73void print_type(double*); 74template void print_type<double>(double*); 75 76// PR5069 77template<int I> void foo0 (int (&)[I + 1]) { } 78template void foo0<2> (int (&)[3]); 79