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
This commit is contained in:
parent
31bc8a984f
commit
d79ca2074f
@ -8,6 +8,12 @@
|
||||
|
||||
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
|
||||
visibility just because the type is dependent.
|
||||
|
||||
|
@ -745,19 +745,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),
|
||||
|
@ -291,7 +291,8 @@ build_base_path (enum tree_code code,
|
||||
target_type = code == PLUS_EXPR ? BINFO_TYPE (binfo) : BINFO_TYPE (d_binfo);
|
||||
|
||||
/* 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? */
|
||||
if (want_pointer && !nonnull)
|
||||
|
12
gcc/testsuite/g++.dg/expr/cast9.C
Normal file
12
gcc/testsuite/g++.dg/expr/cast9.C
Normal file
@ -0,0 +1,12 @@
|
||||
// PR c++/27177
|
||||
|
||||
struct Z {};
|
||||
struct A : Z {};
|
||||
|
||||
Z* implicitToZ (Z*);
|
||||
|
||||
struct B : A
|
||||
{
|
||||
static const int i = sizeof(implicitToZ((B*)0));
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user