// { dg-do assemble } struct A { void f() {} template <class U> void f() {} }; template <class T> struct B { void f() {} template <class U> void f() {} }; template struct B<int>; struct C { template <class U> void f() {} // { dg-error "with" } redeclaration template <class U> void f() {} // { dg-error "overloaded" } redeclaration }; template <class T, class U> struct D { void f(T); void f(U); }; template struct D<int, double>; template <class T, class U> struct D2 { void f(T); // { dg-error "with" } redeclaration void f(U); // { dg-error "overloaded" } redeclaration }; template struct D2<int, int>; struct E { void f(); // { dg-error "with" } redeclaration void f(); // { dg-error "overloaded" } redeclaration };