From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2164 invoked by alias); 27 Feb 2008 18:43:18 -0000 Received: (qmail 2155 invoked by uid 22791); 27 Feb 2008 18:43:17 -0000 X-Spam-Check-By: sourceware.org Received: from bluesmobile.specifix.com (HELO bluesmobile.specifix.com) (216.129.118.140) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 27 Feb 2008 18:42:59 +0000 Received: from [127.0.0.1] (bluesmobile.specifix.com [216.129.118.140]) by bluesmobile.specifix.com (Postfix) with ESMTP id 30B743BFCD; Wed, 27 Feb 2008 10:42:58 -0800 (PST) Subject: Re: [patch] fix for c++/2416 From: Michael Snyder To: Aleksandar Ristovski Cc: gdb-patches@sourceware.org In-Reply-To: <47C5A5EE.6070107@qnx.com> References: <47C5A5EE.6070107@qnx.com> Content-Type: text/plain Date: Wed, 27 Feb 2008 19:30:00 -0000 Message-Id: <1204137777.19253.418.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Evolution 2.10.3 (2.10.3-7.fc7) Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-02/txt/msg00442.txt.bz2 On Wed, 2008-02-27 at 13:03 -0500, Aleksandar Ristovski wrote: > Hello, > > As described in the bug report 2416, the problem is with casting to a reference. > The attached patch should fix this. > > Testing on head, no change in pass rate encountered (probably suggesting there > is no test case for this - sample code in the bug report should be a good > starting point). I don't understand the change in unpack_long. You want to treat structs and unions as longs? Is this related to the reference-to-reference change? > 2008-02-27 Aleksandar Ristovski > > * eval.c (evaluate_subexp_standard): UNOP_CAST use > value_cast_pointers when casting reference to reference. Print > error when reference/non-reference mix. > * value.c (value_as_address): Call coerce_array only on arrays. > (unpack_long): Cover C++ cases TYPE_CODE_STRUCT and UNION. > > > plain text document attachment (casting.diff) > Index: gdb/eval.c > =================================================================== > RCS file: /cvs/src/src/gdb/eval.c,v > retrieving revision 1.80 > diff -u -p -r1.80 eval.c > --- gdb/eval.c 4 Feb 2008 00:23:04 -0000 1.80 > +++ gdb/eval.c 27 Feb 2008 17:01:03 -0000 > @@ -1985,8 +1985,18 @@ evaluate_subexp_standard (struct type *e > arg1 = evaluate_subexp (type, exp, pos, noside); > if (noside == EVAL_SKIP) > goto nosideret; > - if (type != value_type (arg1)) > - arg1 = value_cast (type, arg1); > + if (type != value_type (arg1)) > + { > + if (TYPE_CODE (value_type (arg1)) == TYPE_CODE_REF > + && TYPE_CODE (type) == TYPE_CODE_REF) > + arg1 = value_cast_pointers (type, arg1); > + else if (TYPE_CODE (value_type (arg1)) != TYPE_CODE_REF > + && TYPE_CODE (type) != TYPE_CODE_REF) > + arg1 = value_cast (type, arg1); > + else /* We can not do much here. */ > + error (_("Attempt to cast to reference type from non-reference "\ > + "type or vice versa.")); > + } > return arg1; > > case UNOP_MEMVAL: > Index: gdb/value.c > =================================================================== > RCS file: /cvs/src/src/gdb/value.c,v > retrieving revision 1.57 > diff -u -p -r1.57 value.c > --- gdb/value.c 18 Jan 2008 17:07:40 -0000 1.57 > +++ gdb/value.c 27 Feb 2008 17:01:03 -0000 > @@ -1039,7 +1039,8 @@ value_as_address (struct value *val) > || TYPE_CODE (value_type (val)) == TYPE_CODE_METHOD) > return VALUE_ADDRESS (val); > > - val = coerce_array (val); > + if (TYPE_CODE (value_type (val)) == TYPE_CODE_ARRAY) > + val = coerce_array (val); > > /* Some architectures (e.g. Harvard), map instruction and data > addresses onto a single large unified address space. For > @@ -1120,6 +1121,8 @@ unpack_long (struct type *type, const gd > case TYPE_CODE_CHAR: > case TYPE_CODE_RANGE: > case TYPE_CODE_MEMBERPTR: > + case TYPE_CODE_STRUCT: > + case TYPE_CODE_UNION: > if (nosign) > return extract_unsigned_integer (valaddr, len); > else