From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10523 invoked by alias); 18 Jun 2019 13:50:35 -0000 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 Received: (qmail 10024 invoked by uid 89); 18 Jun 2019 13:50:35 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.6 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_PASS autolearn=ham version=3.3.1 spammy=digging, cp-valprint.c, UD:cp-valprint.c, cpvalprintc X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 18 Jun 2019 13:50:34 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 943A1AEAF; Tue, 18 Jun 2019 13:50:31 +0000 (UTC) Subject: Re: [PATCH] Fix crash in cp_print_value_fields To: Tom Tromey , gdb-patches@sourceware.org Cc: Tom Tromey References: <20190517201814.27951-1-tromey@adacore.com> From: Tom de Vries Message-ID: Date: Tue, 18 Jun 2019 13:50:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: <20190517201814.27951-1-tromey@adacore.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2019-06/txt/msg00331.txt.bz2 On 17-05-19 22:18, Tom Tromey wrote: > From: Tom Tromey > > PR c++/20020 concerns a crash in cp_print_value_fields. The immediate > cause is that cp_print_value_fields does not handle the case where > value_static_field fails. This is fixed in this patch by calling > cp_print_static_field from the "try" block. > > Digging a bit deeper, the error occurs because GCC does not emit a > DW_AT_const_value for a static constexpr member appearing in a > template class. I've filed a GCC bug for this. > > Tested on x86-64 Fedora 29. > > gdb/ChangeLog > 2019-05-17 Tom Tromey > > PR c++/20020: > * cp-valprint.c (cp_print_value_fields): Call > cp_print_static_field inside "try". > > gdb/testsuite/ChangeLog > 2019-05-17 Tom Tromey > > PR c++/20020: > * gdb.cp/constexpr-field.exp: New file. > * gdb.cp/constexpr-field.cc: New file. > --- > gdb/ChangeLog | 6 ++++ > gdb/cp-valprint.c | 12 ++++---- > gdb/testsuite/ChangeLog | 6 ++++ > gdb/testsuite/gdb.cp/constexpr-field.cc | 37 ++++++++++++++++++++++++ > gdb/testsuite/gdb.cp/constexpr-field.exp | 36 +++++++++++++++++++++++ > 5 files changed, 90 insertions(+), 7 deletions(-) > create mode 100644 gdb/testsuite/gdb.cp/constexpr-field.cc > create mode 100644 gdb/testsuite/gdb.cp/constexpr-field.exp > > diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c > index ff860df499a..d8d5c06fd1e 100644 > --- a/gdb/cp-valprint.c > +++ b/gdb/cp-valprint.c > @@ -329,22 +329,20 @@ cp_print_value_fields (struct type *type, struct type *real_type, > } > else if (field_is_static (&TYPE_FIELD (type, i))) > { > - struct value *v = NULL; > - > try > { > - v = value_static_field (type, i); > - } > + struct value *v = value_static_field (type, i); > > + cp_print_static_field (TYPE_FIELD_TYPE (type, i), > + v, stream, recurse + 1, > + options); > + } Here options is used ... > catch (const gdb_exception_error &ex) > { > fprintf_filtered (stream, > _(""), > ex.what ()); > } > - > - cp_print_static_field (TYPE_FIELD_TYPE (type, i), > - v, stream, recurse + 1, opts); while here opts used to be used. Is this change intentional? It's not mentioned anywhere. Thanks, - Tom > } > else if (i == vptr_fieldno && type == vptr_basetype) > {