------- Comment #8 from zak at transversal dot com  2006-08-18 11:21 -------
However, that patch breaks the following code, which requires *implicit*
derived-to-base conversion:

================================
struct Z {};
struct A : Z {};

Z* implicitToZ (Z*);

struct B : A
{
          static const int i = sizeof(implicitToZ((B*)0));
};
================================

Without the patch, the above compiles cleanly (as it does in 4.0.3, 4.1.1 and
Comeau). With the patch, I get:

$ g++ -c dtob.cc
dtob.cc:8: error: invalid conversion from 'B*' to 'Z*'
dtob.cc:8: error:   initializing argument 1 of 'Z* implicitToZ(Z*)'


The standard (in 4.10 [conv.ptr], paragraph 3) states that a program requiring
a derived-to-base conversion is ill-formed if the base class is inaccessible or
ambiguous; it does not mention any requirement that the derived class must be
complete.


This breaks code like this using boost::is_base_and_derived (this is cut down
from a real-world example):

================================
#include <boost/type_traits/is_base_and_derived.hpp>
#include <boost/static_assert.hpp>

struct Base { };

template< typename T >
struct A {
        BOOST_STATIC_ASSERT(( boost::is_base_and_derived< Base, T >::value ));
        struct Inner { };
};

struct Derived : Base {
        typedef A< Derived >::Inner Inner;
};
================================


-- 

zak at transversal dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |zak at transversal dot com


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

Reply via email to