// Build don't link: // Make sure we make the right unqualified class a friend // See PR c++/4403 template struct A { struct AA; struct AC; }; template class B :public A { friend struct B::AA; // OK, this has an implicit typename // as if it is 'friend struct typename B::AA' // (I think there's a defect report // about that) friend struct AC; // this makes ::AC a friend *not* A::AC private: // only our friends can get out values static T valueA_AA; static T valueA_AC; static T value_AC; }; template T B::valueA_AA; template T B::valueA_AC;// ERROR - private - XFAIL *-*-* template T B::value_AC; // gets bogus error - XFAIL *-*-* // this one is a friend template struct A::AA { int M () { return B::valueA_AA; } }; // this is not a friend template struct A::AC { T M () { return B::valueA_AC; // ERROR - within this context - XFAIL *-*-* } }; // this is a friend struct AC { int M () { return B::value_AC; // gets bogus error - XFAIL *-*-* } }; B b; A::AA a_aa; A::AC a_ac; AC ac; int main () { a_aa.M (); a_ac.M (); ac.M (); }