Commit d79ca207 by Jason Merrill Committed by Jason Merrill

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

        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: r131855
parent 31bc8a98
...@@ -8,6 +8,12 @@ ...@@ -8,6 +8,12 @@
2008-01-25 Jason Merrill <jason@redhat.com> 2008-01-25 Jason Merrill <jason@redhat.com>
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.
* decl2.c (is_late_template_attribute): Don't defer attribute * decl2.c (is_late_template_attribute): Don't defer attribute
visibility just because the type is dependent. visibility just because the type is dependent.
......
...@@ -745,19 +745,7 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, ...@@ -745,19 +745,7 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
that necessitates this conversion is ill-formed. that necessitates this conversion is ill-formed.
Therefore, we use DERIVED_FROM_P, and do not check Therefore, we use DERIVED_FROM_P, and do not check
access or uniqueness. */ 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 = from =
cp_build_qualified_type (TREE_TYPE (to), cp_build_qualified_type (TREE_TYPE (to),
......
...@@ -291,7 +291,8 @@ build_base_path (enum tree_code code, ...@@ -291,7 +291,8 @@ build_base_path (enum tree_code code,
target_type = code == PLUS_EXPR ? BINFO_TYPE (binfo) : BINFO_TYPE (d_binfo); target_type = code == PLUS_EXPR ? BINFO_TYPE (binfo) : BINFO_TYPE (d_binfo);
/* Do we need to look in the vtable for the real offset? */ /* Do we need to look in the vtable for the real offset? */
virtual_access = (v_binfo && fixed_type_p <= 0); /* Don't bother inside sizeof; the source type might not be complete. */
virtual_access = (v_binfo && fixed_type_p <= 0) && !skip_evaluation;
/* Do we need to check for a null pointer? */ /* Do we need to check for a null pointer? */
if (want_pointer && !nonnull) if (want_pointer && !nonnull)
......
// PR c++/27177
struct Z {};
struct A : Z {};
Z* implicitToZ (Z*);
struct B : A
{
static const int i = sizeof(implicitToZ((B*)0));
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment