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

           Summary: Misleading error message when a conversion is invalid
                    while calling a protected base constructor
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: trivial
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: dib...@ieee.org


Provided with this code:

class base {
protected:
   base( int * ) {}
};
struct derived : base {
   derived( const int * p ) : base( p ) {}
};

The compiler correctly detects that there is an error as using p as argument to
the constructor of base will break const-correctness. The error report
identifies that condition, but it also adds a misleading first error:

error.cpp: In constructor ‘derived::derived(const int*)’:
error.cpp:5: error: ‘base::base(int*)’ is protected
error.cpp:10: error: within this context
error.cpp:10: error: invalid conversion from ‘const int*’ to ‘int*’
error.cpp:10: error:   initializing argument 1 of ‘base::base(int*)’

Clearly base::base(int*) is protected, but it is accessible from the context of
the constructor derived::derived(const int*), and the first 3 lines should not
be part of the error message.

This can be reproduced with the default g++ in ubuntu/linaro, and also with g++
4.0.3 (I don't know the exact compiler flags used, but I believe the error to
be independent of compiler flags, if it is not, I can find out the exact flags
used).

g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

Reply via email to