Commit 621f4189 by Martin Jambor Committed by Martin Jambor

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
parent fe2ef088
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> 2010-06-28 Michael Matz <matz@suse.de>
PR middle-end/44592 PR middle-end/44592
......
...@@ -1476,6 +1476,22 @@ gimple_fold_builtin (gimple stmt) ...@@ -1476,6 +1476,22 @@ 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. */
...@@ -1531,8 +1547,8 @@ gimple_get_relevant_ref_binfo (tree ref, tree known_binfo) ...@@ -1531,8 +1547,8 @@ 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 = BINFO_BASE_BINFO (binfo, 0); base_binfo = get_first_base_binfo_with_virtuals (binfo);
if (BINFO_TYPE (base_binfo) != TREE_TYPE (field)) if (base_binfo && BINFO_TYPE (base_binfo) != TREE_TYPE (field))
{ {
tree d_binfo; tree d_binfo;
......
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> 2010-06-28 Michael Matz <matz@suse.de>
PR middle-end/44592 PR middle-end/44592
......
/* { 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;
}
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