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]

Re: [C++ PATCH] Fix bug 827


Jason Merrill wrote:

> > +           return expr;
> 
> We still need to build a NOP_EXPR around it.
Yes, of course.

Built & tested on i686-pc-linux-gnu.

This one ok?

I'll remove g++.mike/pmf5.C from the testsuite, if this goes in.

nathan
-- 
Dr Nathan Sidwell   ::   http://www.codesourcery.com   ::   CodeSourcery LLC
         'But that's a lie.' - 'Yes it is. What's your point?'
nathan@codesourcery.com : http://www.cs.bris.ac.uk/~nathan/ : nathan@acm.org
2000-12-05  Nathan Sidwell  <nathan@codesourcery.com>

	* typeck.c (get_delta_difference): If via a virtual base,
	return zero.
	* cvt.c (cp_convert_to_pointer): If via a virtual base, do no
	adjustment.

Index: cp/typeck.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/typeck.c,v
retrieving revision 1.324
diff -c -3 -p -r1.324 typeck.c
*** typeck.c	2000/12/04 16:36:04	1.324
--- typeck.c	2000/12/05 10:52:44
*************** get_delta_difference (from, to, force)
*** 5936,5966 ****
        virt_binfo = binfo_from_vbase (binfo);
        
        if (virt_binfo)
!         cp_warning ("pointer to member cast via virtual base `%T' of `%T' will only work for objects of dynamic type `%T'",
! 	            BINFO_TYPE (virt_binfo),
! 	            BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)), from);
        delta = BINFO_OFFSET (binfo);
        delta = cp_convert (ptrdiff_type_node, delta);
!       
!       return cp_build_binary_op (MINUS_EXPR,
  				 integer_zero_node,
  				 delta);
      }
  
    virt_binfo = binfo_from_vbase (binfo);
    if (virt_binfo)
      {
        if (force)
!         cp_warning ("pointer to member cast via virtual base `%T' of `%T' will only work for objects of dynamic type `%T'",
                      BINFO_TYPE (virt_binfo),
!                     BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)), to);
        else
  	cp_error ("pointer to member conversion via virtual base `%T' of `%T'",
  		  BINFO_TYPE (virt_binfo),
                    BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
      }
  
!   return BINFO_OFFSET (binfo);
  }
  
  /* Return a constructor for the pointer-to-member-function TYPE using
--- 5936,5974 ----
        virt_binfo = binfo_from_vbase (binfo);
        
        if (virt_binfo)
!         {
!           /* This is a reinterpret cast, we choose to do nothing. */
!           cp_warning ("pointer to member cast via virtual base `%T' of `%T'",
! 	              BINFO_TYPE (virt_binfo),
! 	              BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
!           return delta;
!         }
        delta = BINFO_OFFSET (binfo);
        delta = cp_convert (ptrdiff_type_node, delta);
!       delta = cp_build_binary_op (MINUS_EXPR,
  				 integer_zero_node,
  				 delta);
+ 
+       return delta;
      }
  
    virt_binfo = binfo_from_vbase (binfo);
    if (virt_binfo)
      {
+       /* This is a reinterpret cast, we choose to do nothing. */
        if (force)
!         cp_warning ("pointer to member cast via virtual base `%T' of `%T'",
                      BINFO_TYPE (virt_binfo),
!                     BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
        else
  	cp_error ("pointer to member conversion via virtual base `%T' of `%T'",
  		  BINFO_TYPE (virt_binfo),
                    BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
+       return delta;
      }
+   delta = BINFO_OFFSET (binfo);
  
!   return cp_convert (ptrdiff_type_node, delta);
  }
  
  /* Return a constructor for the pointer-to-member-function TYPE using
Index: cp/cvt.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/cvt.c,v
retrieving revision 1.90
diff -c -3 -p -r1.90 cvt.c
*** cvt.c	2000/11/27 10:55:30	1.90
--- cvt.c	2000/12/05 10:52:46
*************** cp_convert_to_pointer (type, expr, force
*** 209,218 ****
            if (virt_binfo)
  	    {
  	      if (force)
! 	        cp_warning ("pointer to member cast via virtual base `%T' of `%T' will only work for objects of dynamic type `%T'",
  	                    BINFO_TYPE (virt_binfo),
!                             BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)),
!                             code == MINUS_EXPR ? b2 : b1);
                else
                  {
  	          cp_error ("pointer to member cast via virtual base `%T' of `%T'",
--- 209,217 ----
            if (virt_binfo)
  	    {
  	      if (force)
! 	        cp_warning ("pointer to member cast via virtual base `%T' of `%T'",
  	                    BINFO_TYPE (virt_binfo),
!                             BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
                else
                  {
  	          cp_error ("pointer to member cast via virtual base `%T' of `%T'",
*************** cp_convert_to_pointer (type, expr, force
*** 220,232 ****
                              BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
  	          return error_mark_node;
  	        }
  	    }
  	      
  	  if (TREE_CODE (expr) == PTRMEM_CST)
  	    expr = cplus_expand_constant (expr);
  
! 	  if (binfo && ! TREE_VIA_VIRTUAL (binfo))
! 	    expr = size_binop (code, convert (sizetype,expr),
  			       BINFO_OFFSET (binfo));
  	}
        else if (TYPE_PTRMEMFUNC_P (type))
--- 219,234 ----
                              BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
  	          return error_mark_node;
  	        }
+ 	      /* This is a reinterpret cast, whose result is unspecified.
+ 	         We choose to do nothing.  */
+ 	      return build1 (NOP_EXPR, type, expr);
  	    }
  	      
  	  if (TREE_CODE (expr) == PTRMEM_CST)
  	    expr = cplus_expand_constant (expr);
  
! 	  if (binfo)
! 	    expr = size_binop (code, convert (sizetype, expr),
  			       BINFO_OFFSET (binfo));
  	}
        else if (TYPE_PTRMEMFUNC_P (type))

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