From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd36.google.com (mail-io1-xd36.google.com [IPv6:2607:f8b0:4864:20::d36]) by sourceware.org (Postfix) with ESMTPS id 1699B3858D39 for ; Tue, 18 Oct 2022 17:53:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1699B3858D39 Received: by mail-io1-xd36.google.com with SMTP id d142so12392991iof.7 for ; Tue, 18 Oct 2022 10:53:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=bfAGOU9duf8mixXzbVI8PTB5VHNmEdc54bXnGyF1JSo=; b=7CHK6QFCBEPE+5GeGM0n++sH4laICgB0+5YSUnyQ8AIqO3jHxm1hSz+DRikVX5d+Dp DmKaxr9/jJ8s14Df44dhLtbuTtwEnbvLRA1insN2vQH0eHgLkVozD4NtduhlNtDe+hrx Z9SWFQvmwCpaAuR8T76OSeqUGeWXp1U4FQHlmF5Llhqt2PxPXNqN1PQ847pE9II1bEt9 ePUIhBkOZUZ277gT2wlUHcmLXa0JmAn/5+7v4ICjtEhhvCEdgvOYxqmC1q6LsH/6peKa Cout3U04vxyUV5QRnP/t2aLFOzf8GrZthwKpm67vn4h7Ue+cf3r9R6Khbm3oFAhI0f0s JGiw== X-Gm-Message-State: ACrzQf2g9C8HjUWKoH/ObDGa92sv0zk+Iczd3B8Oxi8AJPwVWWr+h4Ye bzALLs0mBN8im4G2bNzb9trGHrLR53nXuQ== X-Google-Smtp-Source: AMsMyM6K2Or0FtfNVY2DFUlDpe4ARST2V1jwmrxhqTizSgfse4jp1EdcjnD1inUvXdOGXaKx9l2loA== X-Received: by 2002:a05:6602:2d41:b0:6bc:d62d:4124 with SMTP id d1-20020a0566022d4100b006bcd62d4124mr2425288iow.142.1666115594072; Tue, 18 Oct 2022 10:53:14 -0700 (PDT) Received: from localhost.localdomain (71-211-181-169.hlrn.qwest.net. [71.211.181.169]) by smtp.gmail.com with ESMTPSA id t5-20020a92d145000000b002faf6559e90sm1183926ilg.51.2022.10.18.10.53.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Oct 2022 10:53:13 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Fix regression in pointer-to-member printing Date: Tue, 18 Oct 2022 11:53:04 -0600 Message-Id: <20221018175304.3158312-1-tromey@adacore.com> X-Mailer: git-send-email 2.34.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Oct 2022 17:53:16 -0000 PR c++/29243 points out that "info func" on a certain C++ executable will cause an infinite loop in gdb. I tracked this down to a bug introduced by commit 6b5a7bc76 ("Handle member pointers directly in generic_value_print"). Before this commit, the C++ code to print a member pointer would wind up calling value_print_scalar_formatted; but afterward it simply calls generic_value_print and gets into a loop. This patch restores the previous behavior and adds a regression test. --- gdb/testsuite/gdb.cp/member-ptr.cc | 8 ++++++++ gdb/testsuite/gdb.cp/member-ptr.exp | 4 ++++ gdb/valprint.c | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gdb/testsuite/gdb.cp/member-ptr.cc b/gdb/testsuite/gdb.cp/member-ptr.cc index 22ffcc58d39..a563d2e6af3 100644 --- a/gdb/testsuite/gdb.cp/member-ptr.cc +++ b/gdb/testsuite/gdb.cp/member-ptr.cc @@ -142,6 +142,11 @@ int Diamond::vget_base () return this->Left::x + 2000; } +struct Container +{ + PMI member; +}; + int func (int x) { @@ -205,6 +210,9 @@ int main () null_pmi = NULL; null_pmf = NULL; + Container contain; + contain.member = &A::j; + pmi = NULL; /* Breakpoint 1 here. */ (diamond.*diamond_pfunc_ptr) (20); diff --git a/gdb/testsuite/gdb.cp/member-ptr.exp b/gdb/testsuite/gdb.cp/member-ptr.exp index 110497b893b..5b91bcb493a 100644 --- a/gdb/testsuite/gdb.cp/member-ptr.exp +++ b/gdb/testsuite/gdb.cp/member-ptr.exp @@ -628,3 +628,7 @@ gdb_test "print null_pmi = 0" "$vhn = NULL" gdb_test "print null_pmf" "$vhn = NULL" gdb_test "print null_pmf = &A::foo" "$vhn = \\(int \\(A::\\*\\)\\(A \\*( const)?, int\\)\\) $hex " gdb_test "print null_pmf = 0" "$vhn = NULL" + +# Print with a format, bypassing the direct call to the scalar +# printer. See PR c++/29243. +gdb_test "print/x contain" " = {member = $hex}" diff --git a/gdb/valprint.c b/gdb/valprint.c index f079f31fa7b..585af69cb27 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -879,7 +879,7 @@ generic_value_print_memberptr cp_print_class_member (valaddr, type, stream, "&"); } else - generic_value_print (val, stream, recurse, options, decorations); + value_print_scalar_formatted (val, options, 0, stream); } /* See valprint.h. */ -- 2.34.3