// { dg-do compile } // Origin: Giovanni Bajo // DR166: Friend declarations of template-ids namespace N { template void f(T); void g(); namespace M { class A { friend void f(int); // N::f static int x; // { dg-error "private" } }; class B { template friend void f(T); // M::f static int x; // { dg-error "private" } }; class C { friend void g(); // M::g static int x; // { dg-error "private" } }; template void f(T) // will be instantiated as f { M::A::x = 0; // { dg-error "within this context" } M::B::x = 0; } template <> void f(int) { M::A::x = 0; } // { dg-error "within this context" } template <> void f(double ) { M::B::x = 0; M::f(0); // { dg-message "required" } } void g(void) { M::C::x = 0; } } template void f(T) // will be instantiated as f { M::A::x = 0; // { dg-error "within this context" } M::B::x = 0; // { dg-error "within this context" } } template <> void f(int ) { N::f(0); // { dg-message "required" } M::A::x = 0; M::B::x = 0; // { dg-error "within this context" } } template <> void f(char ) { M::A::x = 0; } // { dg-error "within this context" } void g(void) { M::C::x = 0; } // { dg-error "within this context" } }