http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45770

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |INVALID

--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> 2010-09-26 
19:36:39 UTC ---
(In reply to comment #4)
> 
> class A
> {
> 
> friend class B;
> 
> public:
>   A(int i) { a = i; }
> 
> protected:
>   A(int i, int j) { a = i ^ j; }
> 
> private:
>   A() { a = 0; }
>   int a;
> 
> };
> 
> class B : private A // making protected will allow local variables A below
> {
> 
> public:
>   B(int i) : A () { a = i >> 1; b = i & 1; }

B is a friend of A so can call the private constructor.

> private:
>   bool b;
> 
> };
> 
> class C : public B
> {
> 
> public:
>   C() : B(4) { ::A foo(3); } // functions of B may have local variables ::A
>                              // but not A

A(int) is public, so it can be called

> };            
> 
> class D : public A
> {
>   friend class D;

What is this supposed to do?

> 
>   D(int i, int j) : A(i,j) 

A(int, int) is protected, so D can call it on its base sub-object

>   { 
>     A d(i,j); // friend class D of class D has no inherited rights here
>               // note that friends do not have inherited objects in general

The object 'd' is not a sub-object of D, so there is no access to that
constructor from D's member functions.

>   }  
> };  
> 
> main () { A bar(3); } // main may have local variables A

That constructor is public, so of course it can.

Your example is not valid C++, that's not a problem with GCC.

Reply via email to