re PR c++/44535 (g++ -O[ 23] generates undefined symbol)

2010-06-28  Martin Jambor  <mjambor@suse.cz>

	PR c++/44535
	* gimple-fold.c (get_first_base_binfo_with_virtuals): New function.
	(gimple_get_relevant_ref_binfo): Use get_first_base_binfo_with_virtuals
	instead of BINFO_BASE_BINFO.

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

From-SVN: r161498
This commit is contained in:
Martin Jambor 2010-06-28 17:42:01 +02:00 committed by Martin Jambor
parent fe2ef088e0
commit 621f418948
4 changed files with 64 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2010-06-28 Martin Jambor <mjambor@suse.cz>
PR c++/44535
* gimple-fold.c (get_first_base_binfo_with_virtuals): New function.
(gimple_get_relevant_ref_binfo): Use get_first_base_binfo_with_virtuals
instead of BINFO_BASE_BINFO.
2010-06-28 Michael Matz <matz@suse.de>
PR middle-end/44592

View File

@ -1476,6 +1476,22 @@ gimple_fold_builtin (gimple stmt)
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
it is found or NULL_TREE if it is not. */
@ -1531,8 +1547,8 @@ gimple_get_relevant_ref_binfo (tree ref, tree known_binfo)
|| BINFO_N_BASE_BINFOS (binfo) == 0)
return NULL_TREE;
base_binfo = BINFO_BASE_BINFO (binfo, 0);
if (BINFO_TYPE (base_binfo) != TREE_TYPE (field))
base_binfo = get_first_base_binfo_with_virtuals (binfo);
if (base_binfo && BINFO_TYPE (base_binfo) != TREE_TYPE (field))
{
tree d_binfo;

View File

@ -1,3 +1,8 @@
2010-06-28 Martin Jambor <mjambor@suse.cz>
PR c++/44535
* g++.dg/torture/pr44535.C: New test.
2010-06-28 Michael Matz <matz@suse.de>
PR middle-end/44592

View File

@ -0,0 +1,34 @@
/* { dg-do run } */
namespace FOO {
template <typename T>
class A
{
public:
void Enum();
virtual void OnProv() = 0;
virtual ~A() { }
};
typedef A<char> B;
template<typename T>
void A<T>::Enum ()
{
OnProv ();
}
} // namespace FOO
class C {};
class D: public C, public FOO::B {
public:
void OnProv() {}
};
int main(int argc, char *argv[])
{
D x;
x.Enum();
return 0;
}