| // Build don't link: |
| |
| template <class T> |
| void f(T) {} |
| |
| template <class T> |
| struct S { |
| static T t; |
| }; |
| |
| template <class T> |
| T S<T>::t; |
| |
| template void f(int); |
| template void f(int); // ERROR - duplicate explicit instantiation |
| template int S<int>::t; |
| template int S<int>::t; // ERROR - duplicate explicit instantiation |
| template class S<double>; |
| template class S<double>; // ERROR - duplicate explicit instantiation |
| |
| extern template void f(double); // WARNING - extern not allowed |
| inline template class S<float>; // WARNING - inline not allowed |
| |
| template <class T> |
| struct S<T*> {}; |
| |
| template class S<void*>; // OK - explicit instantiation of partial |
| // specialization |
| |
| template <> |
| struct S<long double> {}; // ERROR - explicit specialization |
| |
| template class S<long double>; // ERROR - explicit instantiation after |
| |
| template <> |
| void f(long double) {} // ERROR - explicit specialization |
| |
| template void f(long double); // ERROR - explicit instantiation after |
| |
| template <class T> |
| void g(T); |
| |
| template void g(int); // ERROR - no definition of g. |