https://gcc.gnu.org/bugzilla/show_bug.cgi?id=17314

kamilek1313 at poczta dot fm changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kamilek1313 at poczta dot fm

--- Comment #20 from kamilek1313 at poczta dot fm ---
I think the point of this issue was missed. It has nothing to do with
constructors/destructors, it can be reproduced with the following example:

class Grandparent {
protected:
    int foo = 0;
};

struct Parent : private Grandparent {
};

struct Child : public Parent {
    void bar() {foo = 1;}
};

Currently (GCC 9.2.0, also present in experimetal), the following error is
issued:

prog.cc: In member function 'void Child::bar()':
prog.cc:10:17: error: 'int Grandparent::foo' is protected within this context
   10 |     void bar() {foo = 1;}
      |                 ^~~
prog.cc:3:9: note: declared protected here
    3 |     int foo = 0;
      |         ^~~


See Wandbox: https://wandbox.org/permlink/mwF205Xm6A3xcKGy 

This error message is just wrong. Grandparent::foo is private within this
context, due to private inheritance. If it was protected, it would be
accessible by Child. Upon seeing this message, I have no clue what is wrong
(yeah, it is protected, so what?)

For comparison, clang 10 produces clear(ish) error message for the same code:

prog.cc:10:17: error: cannot cast 'Child' to its private base class
'Grandparent'
    void bar() {foo = 1;}
                ^
prog.cc:6:17: note: declared private here
struct Parent : private Grandparent {
                ^~~~~~~~~~~~~~~~~~~
prog.cc:10:17: error: 'foo' is a private member of 'Grandparent'
    void bar() {foo = 1;}
                ^
prog.cc:6:17: note: constrained by private inheritance here
struct Parent : private Grandparent {
                ^~~~~~~~~~~~~~~~~~~
prog.cc:3:9: note: member is declared here
    int foo = 0;
        ^
2 errors generated.

Reply via email to