From: Jason Merrill Date: Mon, 28 Jan 2008 16:18:56 +0000 (-0500) Subject: re PR c++/27177 (ICE in build_simple_base_path, at cp/class.c:474) X-Git-Tag: releases/gcc-4.2.3~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c5a67b3b8b737ec10268224d233fb26eb01ccfff;p=thirdparty%2Fgcc.git re PR c++/27177 (ICE in build_simple_base_path, at cp/class.c:474) PR c++/27177 * class.c (build_base_path): Fix previous change. PR c++/27177 * class.c (build_base_path): Don't mess with virtual access if skip_evaluation. * call.c (standard_conversion): Don't check whether source type is complete. From-SVN: r131905 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fa2127a50654..f850ad63bf8a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2008-01-27 Jason Merrill + + PR c++/27177 + * class.c (build_base_path): Fix previous change. + + PR c++/27177 + * class.c (build_base_path): Don't mess with virtual access if + skip_evaluation. + * call.c (standard_conversion): Don't check whether source type + is complete. + 2008-01-23 Jason Merrill PR bootstrap/34944 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 244cab1c1f34..12274332fee6 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -724,19 +724,7 @@ 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)) - /* 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))) + && DERIVED_FROM_P (TREE_TYPE (to), TREE_TYPE (from))) { from = cp_build_qualified_type (TREE_TYPE (to), diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 878f03166a0c..00b2e3a131b4 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -293,6 +293,11 @@ build_base_path (enum tree_code code, /* Do we need to look in the vtable for the real offset? */ virtual_access = (v_binfo && fixed_type_p <= 0); + /* Don't bother with the calculations inside sizeof; they'll ICE if the + source type is incomplete and the pointer value doesn't matter. */ + if (skip_evaluation) + return build_nop (build_pointer_type (target_type), expr); + /* Do we need to check for a null pointer? */ if (want_pointer && !nonnull) {