c++/4884: g++ 3.0.2 problem with -fvolatile

Mark Mitchell mark@codesourcery.com
Wed Mar 27 11:16:00 GMT 2002



--On Tuesday, March 26, 2002 06:21:10 PM -0500 "Ashif S. Harji" 
<asharji@plg2.math.uwaterloo.ca> wrote:

>
> Thanks, for the prompt response.
>
> I downloaded the latest version from CVS.  Unfortunately, there is still a
> problem in the build_op_delete_call function.
>
> The compilation of the following program fails with a segault when
> -fvolatile is used but not without.  Note the addition of the constructor
> to class bar.
>
> 2>@awk[114]% more test3.cc
>
> class bar {
>   public :
>     bar() { }
>     void * operator new ( unsigned int , void * storage ) { return (void
> *)1;} };
>
> class foo {
>   public:
>     void mem ( ) {
>         new ( 0 ) bar;
>     }
> };
>

Well, that one wasn't in your original bug report. :-)

Fixed with the attached patch.  Tested on i686-pc-linux-gnu, applied
on the mainline and on the branch.

--
Mark Mitchell                   mark@codesourcery.com
CodeSourcery, LLC               http://www.codesourcery.com

2002-03-27  Mark Mitchell  <mark@codesourcery.com>

	PR c++/4884
	* call.c (build_op_delete_call): Allow for the fact the placement
	may be a COMPOUND_EXPR.
	
Index: cp/call.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/call.c,v
retrieving revision 1.307.2.4
diff -c -p -r1.307.2.4 call.c
*** call.c	2002/03/18 16:44:07	1.307.2.4
--- call.c	2002/03/27 18:38:06
*************** build_op_delete_call (code, addr, size,
*** 3623,3637 ****

    if (placement)
      {
!       /* placement is a CALL_EXPR around an ADDR_EXPR around a function. 
*/

        /* Extract the function.  */
!       argtypes = TREE_OPERAND (TREE_OPERAND (placement, 0), 0);
        /* Then the second parm type.  */
!       argtypes = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (argtypes)));
!
        /* Also the second argument.  */
!       args = TREE_CHAIN (TREE_OPERAND (placement, 1));
      }
    else
      {
--- 3623,3644 ----

    if (placement)
      {
!       tree alloc_fn;
!       tree call_expr;

+       /* Find the allocation function that is being called. */
+       call_expr = placement;
+       /* Sometimes we have a COMPOUND_EXPR, rather than a simple
+ 	 CALL_EXPR. */
+       while (TREE_CODE (call_expr) == COMPOUND_EXPR)
+ 	call_expr = TREE_OPERAND (call_expr, 1);
        /* Extract the function.  */
!       alloc_fn = get_callee_fndecl (call_expr);
!       my_friendly_assert (alloc_fn != NULL_TREE, 20020327);
        /* Then the second parm type.  */
!       argtypes = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (alloc_fn)));
        /* Also the second argument.  */
!       args = TREE_CHAIN (TREE_OPERAND (call_expr, 1));
      }
    else
      {
Index: testsuite/g++.dg/init/new2.C
===================================================================
RCS file: new2.C
diff -N new2.C
*** /dev/null	Tue May  5 13:32:27 1998
--- new2.C	Wed Mar 27 10:38:08 2002
***************
*** 0 ****
--- 1,18 ----
+ // Origin: asharji@uwaterloo.ca
+
+ // { dg-do compile }
+ // { dg-options "-fvolatile" }
+
+ class bar {
+   public :
+     bar() { }
+     void * operator new ( __SIZE_TYPE__ , void * storage )
+      { return (void *)1;}
+ };
+
+ class foo {
+   public:
+     void mem ( ) {
+         new ( 0 ) bar;
+     }
+ };



More information about the Gcc-patches mailing list