// { dg-do assemble } // GROUPS passed templates template class Vector { int sz; T *v; public: Vector (int s) : sz (s) { v = new T[sz]; } ~Vector () { delete[] v; } T &operator[] (int i) { return v[i]; } int size () { return sz; } }; template// { dg-error "" } previous definition of T struct Comparator { typedef T T;// { dg-error "" } use of template type T in typedef to T static int lessthan (T &a, T &b) { return a < b; } }; template struct Sort { static void sort (Vector &);// { dg-error "" } use of bad T }; template void Sort::sort (Vector &v)// { dg-error "" } use of bad T { int n = v.size (); for (int i = 0; i < n - 1; i++) for (int j = n - 1; i < j; j--) if (Comp::lessthan (v[j], v[j - 1])) { typename Comp::T temp = v[j]; v[j] = v[j - 1]; v[j - 1] = temp; } } void f (Vector &vi) { Sort >::sort (vi); // { dg-error "'sort' is not a member of 'Sort >'" } }