From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 689 invoked by alias); 30 Oct 2008 21:44:42 -0000 Received: (qmail 459 invoked by uid 22791); 30 Oct 2008 21:44:41 -0000 X-Spam-Check-By: sourceware.org Received: from mx2.redhat.com (HELO mx2.redhat.com) (66.187.237.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 30 Oct 2008 21:42:41 +0000 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id m9UL0vWB012025; Thu, 30 Oct 2008 17:00:57 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m9UL0tfs004275; Thu, 30 Oct 2008 17:00:56 -0400 Received: from opsy.redhat.com (vpn-12-197.rdu.redhat.com [10.11.12.197]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id m9UL0t8C000555; Thu, 30 Oct 2008 17:00:55 -0400 Received: by opsy.redhat.com (Postfix, from userid 500) id 54C663786F5; Thu, 30 Oct 2008 15:00:54 -0600 (MDT) To: Joel Brobecker Cc: gdb-patches@sourceware.org Subject: Re: RFA: fix crash in expression evaluation References: <20081030035443.GB13387@adacore.com> From: Tom Tromey Reply-To: Tom Tromey X-Attribution: Tom Date: Thu, 30 Oct 2008 21:48:00 -0000 In-Reply-To: (Tom Tromey's message of "Thu\, 30 Oct 2008 14\:07\:32 -0600") Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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-10/txt/msg00710.txt.bz2 >>>>> "Tom" == Tom Tromey writes: Tom> I'll send it through the tester. It passed. Here is the new patch. Tom 2008-10-02 Tom Tromey * value.c (coerce_array): Use check_typedef. diff --git a/gdb/testsuite/gdb.base/pointers.c b/gdb/testsuite/gdb.base/pointers.c index 85bfdc9..4ee5e78 100644 --- a/gdb/testsuite/gdb.base/pointers.c +++ b/gdb/testsuite/gdb.base/pointers.c @@ -71,6 +71,15 @@ float ** ptr_to_ptr_to_float; int y; + +typedef long k[5]; + +typedef struct { + k array_variable; +} S; + +S instance; + /* Do nothing function used for forcing some of the above variables to be referenced by the program source. If the variables are not referenced, some linkers will remove the symbol from the symbol diff --git a/gdb/testsuite/gdb.base/pointers.exp b/gdb/testsuite/gdb.base/pointers.exp index 5532140..d7d17e7 100644 --- a/gdb/testsuite/gdb.base/pointers.exp +++ b/gdb/testsuite/gdb.base/pointers.exp @@ -596,3 +596,7 @@ gdb_expect { timeout { fail "(timeout) ptype ppppppC" } } +# Regression test for a crash. + +gdb_test "p instance.array_variable + 0" \ + " = \\(long int \\*\\) 0x\[0-9a-f\]*" diff --git a/gdb/value.c b/gdb/value.c index 1fa376d..695aa33 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1728,12 +1728,21 @@ coerce_ref (struct value *arg) struct value * coerce_array (struct value *arg) { + struct type *type; + arg = coerce_ref (arg); - if (current_language->c_style_arrays - && TYPE_CODE (value_type (arg)) == TYPE_CODE_ARRAY) - arg = value_coerce_array (arg); - if (TYPE_CODE (value_type (arg)) == TYPE_CODE_FUNC) - arg = value_coerce_function (arg); + type = check_typedef (value_type (arg)); + + switch (TYPE_CODE (type)) + { + case TYPE_CODE_ARRAY: + if (current_language->c_style_arrays) + arg = value_coerce_array (arg); + break; + case TYPE_CODE_FUNC: + arg = value_coerce_function (arg); + break; + } return arg; }