mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
fe2ef088e0
commit
621f418948
|
@ -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>
|
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)
|
||||||
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)
|
||||||
|| 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;
|
||||||
|
|
||||||
|
|
|
@ -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>
|
2010-06-28 Michael Matz <matz@suse.de>
|
||||||
|
|
||||||
PR middle-end/44592
|
PR middle-end/44592
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue