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