This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, PR 44535] Fix a problem with folding OBJ_TYPE_REFs
- From: Martin Jambor <mjambor at suse dot cz>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Richard Guenther <rguenther at suse dot de>, Jason Merrill <jason at redhat dot com>
- Date: Mon, 28 Jun 2010 14:32:21 +0200
- Subject: Re: [PATCH, PR 44535] Fix a problem with folding OBJ_TYPE_REFs
- References: <20100616162034.GB19794@virgil.suse.cz>
Ping. Thanks,
Martin
On Wed, Jun 16, 2010 at 06:20:34PM +0200, Martin Jambor wrote:
> Hi,
>
> as the testcase shows, my assumption that BASE_BINFOs were reordered
> in a way that if any of the had virtual functions the first one did
> too was false. I do not really remember why I thought this, I must
> have misunderstood results of some experiments I did last autumn.
>
> The following patch fixes the folding by skipping BASE_BINFOs that do
> not have virtual functions when looking for the "first" one.
>
> In addition to the request for an approval of the patch, I also have
> one question. I believe it would be quite desirable to have a sanity
> check in gimple_fold_obj_type_ref_known_binfo asserting that
> BINFO_FLAG_2 is true. In in the c++ front end this bit is referred to
> as BINFO_NEW_VTABLE_MARKED. Should I move the definition of this
> macro from gcc/cp/cp-tree.h to gcc/tree.h so that we can use it for
> the assert too? Would such a patch be accepted?
>
> As usual, I have bootstrapped and tested the patch on x86_64-linux, OK
> for trunk?
>
> Thanks,
>
> Martin
>
>
> 2010-06-16 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 file.
>
> Index: icln/gcc/gimple-fold.c
> ===================================================================
> --- icln.orig/gcc/gimple-fold.c
> +++ icln/gcc/gimple-fold.c
> @@ -1403,6 +1403,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. */
>
> @@ -1458,8 +1474,8 @@ gimple_get_relevant_ref_binfo (tree ref,
> || 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;
>
> Index: icln/gcc/testsuite/g++.dg/torture/pr44535.C
> ===================================================================
> --- /dev/null
> +++ icln/gcc/testsuite/g++.dg/torture/pr44535.C
> @@ -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;
> +}
>