| // { dg-do assemble } |
| |
| 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); // { dg-error "" } duplicate explicit instantiation |
| template int S<int>::t; |
| template int S<int>::t; // { dg-error "" } duplicate explicit instantiation |
| template class S<double>; |
| template class S<double>; // { dg-error "" } duplicate explicit instantiation |
| |
| extern template void f(double); // { dg-warning "" } extern not allowed |
| inline template class S<float>; // { dg-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> {}; |
| |
| template class S<long double>; // OK - explicit instantiation after |
| |
| template <> |
| void f(long double) {} |
| |
| template void f(long double); // OK - explicit instantiation after |
| |
| template <class T> |
| void g(T); |
| |
| template void g(int); // { dg-error "" } no definition of g. |