Test case: class Foo { struct Bar { }; friend class F; }; class F #ifdef BUG : public Foo::Bar #endif { void Fn() { Foo::Bar b; } }; Using "g++ (GCC) 4.9.0 20130730 (experimental)", the test compiles (clearly Foo::Bar is accessible to F::Fn()), but fails with -DBUG: t.cc:2:10: error: ‘struct Foo::Bar’ is private struct Bar { }; ^ t.cc:8:17: error: within this context : public Foo::Bar ^
Copied from bug 14281: [class.friend]/2 in the C++ 1998 Standard, which says: "Also, because the base-clause of the friend class is not part of its member declarations, the base-clause of the friend class cannot access the names of the private and protected members from the class granting friendship." So this is invalid code unless this changed for C++11 or C++14.
Quoting Richard Smith: The standard used to say this was invalid and now says it's valid, per DR372. This is a g++ bug, at least in C++11 mode and probably also in C++98 mode (things aren't really clear-cut for issues that were resolved post-C++03, but this seems like a clear case of a DR to me). See llvm.org/PR16774 and http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#372
Dup of bug 58054 then. *** This bug has been marked as a duplicate of bug 58054 ***