re PR c++/27177 (ICE in build_simple_base_path, at cp/class.c:474)

PR c++/27177
	* call.c (standard_conversion): Require that the derived type be
	complete when performing a derived-to-base conversion.
	PR c++/27177
	* g++.dg/expr/cast7.C: New test.

From-SVN: r114448
This commit is contained in:
Mark Mitchell 2006-06-06 21:38:54 +00:00 committed by Mark Mitchell
parent 6edf8a5229
commit b6ca28e64b
4 changed files with 37 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2006-06-06 Mark Mitchell <mark@codesourcery.com>
PR c++/27177
* call.c (standard_conversion): Require that the derived type be
complete when performing a derived-to-base conversion.
2006-06-04 Mark Mitchell <mark@codesourcery.com>
PR c++/27819

View file

@ -727,7 +727,19 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
that necessitates this conversion is ill-formed.
Therefore, we use DERIVED_FROM_P, and do not check
access or uniqueness. */
&& DERIVED_FROM_P (TREE_TYPE (to), TREE_TYPE (from)))
&& DERIVED_FROM_P (TREE_TYPE (to), TREE_TYPE (from))
/* If FROM is not yet complete, then we must be parsing
the body of a class. We know what's derived from
what, but we can't actually perform a
derived-to-base conversion. For example, in:
struct D : public B {
static const int i = sizeof((B*)(D*)0);
};
the D*-to-B* conversion is a reinterpret_cast, not a
static_cast. */
&& COMPLETE_TYPE_P (TREE_TYPE (from)))
{
from =
cp_build_qualified_type (TREE_TYPE (to),

View file

@ -1,3 +1,8 @@
2006-06-06 Mark Mitchell <mark@codesourcery.com>
PR c++/27177
* g++.dg/expr/cast7.C: New test.
2006-06-06 Janis Johnson <janis187@us.ibm.com>
* lib/gcc-dg.exp (gcc-dg-test-1): Detect and report ICE.

View file

@ -0,0 +1,13 @@
// PR c++/27177
struct X {};
struct Y : virtual X {};
struct Z : virtual X {};
struct A : Y, Z {};
struct B : A
{
static const int i = sizeof((Z*)(B*)0);
};