This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, PR 44535] Fix a problem with folding OBJ_TYPE_REFs


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;
> +}
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]