// { dg-do assemble } // 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;// { dg-error "" "" } private - template T B::value_AC; // { dg-bogus "" "" } - // 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; // { dg-error "" "" } within this context - } }; // this is a friend struct AC { int M () { return B::value_AC; // { dg-bogus "" "" } - } }; B b; A::AA a_aa; A::AC a_ac; AC ac; int main () { a_aa.M (); a_ac.M (); ac.M (); }