// { dg-do compile } // Copyright (C) 2003 Free Software Foundation // Contributed by Kriang Lerdsuwanakij // Member function of class template as friend // Erroneous case: mismatch during specialization template struct A { template void f(U); void g(); void h(); void i(int); template void j(); }; class C { int ii; // { dg-error "private" } template template friend void A::f(V); template friend void A::g(); template friend void A::h(); template friend void A::i(int); template template friend void A::j(); }; template struct A { void f(int); template void g(); int h(); void i(char); template void j(); }; template void A::f(int) { C c; c.ii = 0; // { dg-error "context" } } template template void A::g() { C c; c.ii = 0; // { dg-error "context" } } template int A::h() { C c; c.ii = 0; // { dg-error "context" } } template void A::i(char) { C c; c.ii = 0; // { dg-error "context" } } template template void A::j() { C c; c.ii = 0; // { dg-error "context" } } template <> struct A { void f(int); template void g(); int h(); void i(char); template void j(); }; void A::f(int) { C c; c.ii = 0; // { dg-error "context" } } template void A::g() { C c; c.ii = 0; // { dg-error "context" } } template <> void A::g() { C c; c.ii = 0; // { dg-error "context" } } int A::h() { C c; c.ii = 0; // { dg-error "context" } } void A::i(char) { C c; c.ii = 0; // { dg-error "context" } } template void A::j() { C c; c.ii = 0; // { dg-error "context" } } template <> void A::j<0>() { C c; c.ii = 0; // { dg-error "context" } } int main() { A a1; a1.f(0); // { dg-message "required" } a1.g(); // { dg-message "required" } a1.g(); // { dg-message "required" } a1.h(); // { dg-message "required" } a1.i('a'); // { dg-message "required" } a1.j<1>(); // { dg-message "required" } A a2; a2.f(0); a2.g(); // { dg-message "required" } a2.g(); a2.h(); a2.i('a'); a2.j<1>(); // { dg-message "required" } a2.j<0>(); }