From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9361 invoked by alias); 27 Mar 2002 19:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 9302 invoked by uid 71); 27 Mar 2002 19:26:01 -0000 Date: Wed, 27 Mar 2002 11:26:00 -0000 Message-ID: <20020327192601.9298.qmail@sources.redhat.com> To: mmitchel@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Mark Mitchell Subject: Re: c++/4884: g++ 3.0.2 problem with -fvolatile Reply-To: Mark Mitchell X-SW-Source: 2002-03/txt/msg01042.txt.bz2 List-Id: The following reply was made to PR c++/4884; it has been noted by GNATS. From: Mark Mitchell To: "Ashif S. Harji" , "mmitchel@gcc.gnu.org" , "asharji@uwaterloo.ca" , "gcc-bugs@gcc.gnu.org" , "gcc-prs@gcc.gnu.org" , "pabuhr@uwaterloo.ca" , "gcc-gnats@gcc.gnu.org" Cc: gcc-patches@gcc.gnu.org Subject: Re: c++/4884: g++ 3.0.2 problem with -fvolatile Date: Wed, 27 Mar 2002 11:14:35 -0800 --On Tuesday, March 26, 2002 06:21:10 PM -0500 "Ashif S. Harji" 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 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; + } + };