c++/4884: g++ 3.0.2 problem with -fvolatile
Mark Mitchell
mark@codesourcery.com
Wed Mar 27 12: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-bugs
mailing list