Commit b85020cb by Martin Jambor Committed by Martin Jambor

re PR tree-optimization/45875 (ice in gimple_fold_obj_type_ref_known_binfo with -O2)

2010-11-02  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/45875
	* gimple-fold.c (get_first_base_binfo_with_virtuals): Removed.
	(gimple_get_relevant_ref_binfo): Detect primary bases according to
	their field offset.

	* testsuite/g++.dg/torture/pr45875.C: New test.

From-SVN: r166190
parent 181e5ea4
2010-11-02 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/45875
* gimple-fold.c (get_first_base_binfo_with_virtuals): Removed.
(gimple_get_relevant_ref_binfo): Detect primary bases according to
their field offset.
2010-11-02 Ian Lance Taylor <iant@google.com> 2010-11-02 Ian Lance Taylor <iant@google.com>
* configure.ac: Remove elf_getshdrstrndx test. Don't substitute * configure.ac: Remove elf_getshdrstrndx test. Don't substitute
...@@ -1360,22 +1360,6 @@ gimple_fold_builtin (gimple stmt) ...@@ -1360,22 +1360,6 @@ gimple_fold_builtin (gimple stmt)
return result; return result;
} }
/* Return the first of the base binfos of BINFO that has virtual functions. */
static tree
get_first_base_binfo_with_virtuals (tree binfo)
{
int i;
tree base_binfo;
for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
if (BINFO_VIRTUALS (base_binfo))
return base_binfo;
return NULL_TREE;
}
/* Search for a base binfo of BINFO that corresponds to TYPE and return it if /* Search for a base binfo of BINFO that corresponds to TYPE and return it if
it is found or NULL_TREE if it is not. */ it is found or NULL_TREE if it is not. */
...@@ -1413,7 +1397,7 @@ gimple_get_relevant_ref_binfo (tree ref, tree known_binfo) ...@@ -1413,7 +1397,7 @@ gimple_get_relevant_ref_binfo (tree ref, tree known_binfo)
if (TREE_CODE (ref) == COMPONENT_REF) if (TREE_CODE (ref) == COMPONENT_REF)
{ {
tree par_type; tree par_type;
tree binfo, base_binfo; tree binfo;
tree field = TREE_OPERAND (ref, 1); tree field = TREE_OPERAND (ref, 1);
if (!DECL_ARTIFICIAL (field)) if (!DECL_ARTIFICIAL (field))
...@@ -1431,14 +1415,15 @@ gimple_get_relevant_ref_binfo (tree ref, tree known_binfo) ...@@ -1431,14 +1415,15 @@ gimple_get_relevant_ref_binfo (tree ref, tree known_binfo)
|| BINFO_N_BASE_BINFOS (binfo) == 0) || BINFO_N_BASE_BINFOS (binfo) == 0)
return NULL_TREE; return NULL_TREE;
base_binfo = get_first_base_binfo_with_virtuals (binfo); /* Offset 0 indicates the primary base, whose vtable contents are
if (base_binfo && BINFO_TYPE (base_binfo) != TREE_TYPE (field)) represented in the binfo for the derived class. */
if (int_bit_position (field) != 0)
{ {
tree d_binfo; tree d_binfo;
/* Get descendant binfo. */
d_binfo = gimple_get_relevant_ref_binfo (TREE_OPERAND (ref, 0), d_binfo = gimple_get_relevant_ref_binfo (TREE_OPERAND (ref, 0),
known_binfo); known_binfo);
/* Get descendant binfo. */
if (!d_binfo) if (!d_binfo)
return NULL_TREE; return NULL_TREE;
return get_base_binfo_for_type (d_binfo, TREE_TYPE (field)); return get_base_binfo_for_type (d_binfo, TREE_TYPE (field));
......
2010-11-02 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/45875
* g++.dg/torture/pr45875.C: New test.
2010-11-02 Richard Guenther <rguenther@suse.de> 2010-11-02 Richard Guenther <rguenther@suse.de>
PR testsuite/46249 PR testsuite/46249
......
// { dg-do compile }
struct c1 {};
struct c10 : c1
{
virtual void foo ();
};
struct c11 : c10, c1 // // { dg-warning "" }
{
virtual void f6 ();
};
struct c28 : virtual c11
{
void f6 ();
};
void check_c28 ()
{
c28 obj;
c11 *ptr = &obj;
ptr->f6 ();
}
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