| Message ID | 20251222121244.38935-1-ssbssa@yahoo.de |
|---|---|
| State | New |
| Headers |
Return-Path: <gdb-patches-bounces~patchwork=sourceware.org@sourceware.org> X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 3F3004BA2E26 for <patchwork@sourceware.org>; Mon, 22 Dec 2025 12:16:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3F3004BA2E26 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=yahoo.de header.i=@yahoo.de header.a=rsa-sha256 header.s=s2048 header.b=V5cPk9sS X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from sonic301-21.consmr.mail.ir2.yahoo.com (sonic301-21.consmr.mail.ir2.yahoo.com [77.238.176.98]) by sourceware.org (Postfix) with ESMTPS id 0CC7F4BA2E07 for <gdb-patches@sourceware.org>; Mon, 22 Dec 2025 12:13:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0CC7F4BA2E07 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=yahoo.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=yahoo.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0CC7F4BA2E07 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=77.238.176.98 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1766405585; cv=none; b=SFbr3zBQVWhDG2b3n3mmrzUT+d3+gyjZ5P/PcKCn2+DZhEpAxcOjz+vuOjtr1FaycFmMgZ/A65qHHKeXAKRSjxfzghyNOy4cRoAURcK6oq8elLKuF4QdoGcuMxHlvLI/dNPGsZS9hIYiUsa4YG3XuttiM7QKGnfro9IcJG21HbY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1766405585; c=relaxed/simple; bh=sTvQ+bQNbv0HtNE+j5sH00GfaGJQhVeBg/DxTxwK0dM=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=tVd/Uw7HpWkmytwKaqnU2wn3Wp+uz1M2EmjI++EuknKz0FaKr3QS3foqYOV0Q1/O9tNszIz29dDl5whddlOwyp8+MxMeSZ0yQsPDFNIWEf/3aYLx/91/ra04iyvcb0st/4cTlbUG0V8cmIAoWlfU4ZiyoL4X2ZbNim7F7xt+Nz8= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0CC7F4BA2E07 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1766405584; bh=5rzQ2V/FS1Fsify/OtcaasJjRPQeWwtRhDfxPmRuCN0=; h=From:To:Subject:Date:References:From:Subject:Reply-To; b=V5cPk9sSA9Dbv/H0u+In76TiKKp3VZOpyi0nzPG0362X9rzpF8BqCHuvhY9BFKiOl2gxshv3zdoeYRfQ/OtAt2CwWMSRrpOYVLyUii0wUlBLN99WsYSpN2xtCZ6pJ7Gfg+Cx35HaMeV/SsiEKngfig3we714e/yaJ2sAAvWno6EXL3MgJhrA18Xq4sORBPtioNoN8OfRK6bPdRg+HasOx9E0+pwYyUHfD7HBAxSo4p1QYd3ZwIZMwT7CXlBaWUzQjc8i2y5ejydC310u5An0L46nHTe4KiHheD3P5DX55uS9BhR7LJDXiyDaE1Iwdxy/Zwd4ymeAbFwzxX/DPoz2Ag== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1766405584; bh=1Xapp8JLmKhy4i5ZNNNbmC8ISy72+oc3SKEmUh4s7FN=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=NpEkxh4CtHp+F/FD8PcvUzD2dzkPIu+w3i1S2zDWfEIu8Z5yVlfQtlzG59iLw6M8qnPkaxU/JFvtaQ7WDFpueK1+69Pn3FIki4K3SE7Y6dO6+IFvVUday1YxKS2X+zuhhLUBfHjiXWkrQvD4vyyM/o4Wckvz1KZrL48Q/P+KRlQHxquvHka82n0Apl0s/uQXcrUYf47QseiKGlyurbSmqAJFOOSCAVGzKoNH7Ui3BydxEwOlK1BlsYXjQF5Td3QNq7kDNbTPiCGSemrWfLrz04qgqaHWkURcAEXLjOv4cukYNj0kmezGOLgMg8smOf4cQPlMdwuWH9tsU34SUeQotQ== X-YMail-OSG: Zqb3p8gVM1m.qp7iT6xa8O79v8OZECypoyAQRqGH7g7JwT2_wN4DJnY30y2szNV EtJFluf_tfL2z..n4zhPnyFXP1GPEOU4too.ZrTLEkbmLBH1uYwXkeT23N2LNjDd4_b6NEUPChgG vavaJXT4TeGPdI3q8w8tTcixcYtY5GpVN4lIhXCU4_SYn3On1kugLTXlu0pk4uRN9vVTyfbw0Hal vJWsp2jzo61FY.sqD90DbJxQ5Q2SKDd3ZCHOntwNJVA9HiW31_f.IJSRD79mctV9sTaud1vhRNX5 M4qcBN1.lUYQvpVaVHrXHLej4TD2DDT2abCqMu_oK6GJLh7fKN2KofpdOQAaIE5olf_uPI3YwWvB UO8ctPEGLcs7Y1pxryhp7h56L.C4kPjNooye312au8jzjsrUjzmFTAJkEi2abdQO.oHu7j_mjp7D 63k7FQQ1s_gly_LzPy0K1esLPirzFSwtcZsIaJvuA4di6oZPRXI3AowqtGIJ3AEM91NdgMw5JTAS FJMcRXw6tQj9qhDCiz76vVmA3x9QfjvcEg0bNfyA2iYgFJy4tOjHKeLHKkuNfxxnxGhc_usT9aK6 hM2TMCOwCeoWJ_IIJFX.VRbwEvM7ID813LIIv9H3o.pQxOy3gXFC79p_plNyhpe5Hdv4yQgIcQLx ECNwzfyP.xWlD4oWa00tyoNAGLZC5ZY0wQQVyYSmnAkoXNfKJwHetwW.GBS6ZjvLAcOFuxJcY4Xp NAgSx7TaB.g0ypb7ljgtbEN89urdG98E7BaoAk7sn9qTPn98ZkxqyOKgcJJNWEssMqAFBOir7NQA P9lvCp6DspUNFv9jpuwpLcf73v0ilv5eQujLwCD0ohFqaNjRY.sjV082BgX92mzADoN1z721suUC GL_yJ_2jdi0ByVKRMg1e2fuiViBTNr8f1kb16vemfF0W1H3DFdnSi9bNLHiXMZKfenh9xf40xMix PqC8ZvxZWfeYAjQBdG739V79qaxE6GdlNkFuaA5rKn2b3E57Msi31cc_xdiPtid.5ZeFLCU9ylmb uu9Z7fYWyuyUTEw0sPtFConHjNlnkp9UMKjlAZdKIFTJO4VgwNwqGAukcswkDh2DQH8Pdc8wyx6m SFWKMrhRqesio19OcKof8eJBp1Hq6bpeOOjSTUddfRaMH_M0xClCopth02RbFbpskM_EiX3gfTtL w2ZpUvSsjmocqq55raGDUT5IFTEPv5St4vRZZtMdXqxOGUefRAHofMEtmP8K5wyZilJ0fs9UtCoV g6PKVxUZsG9uBenzvFqJz6fxYytvxp2WCYm3Or8Wrl6JxchjkwWcPB93juFo8C.1UPrlGEttimUu augz2PERp5Fn3UTemMoudDiXJKzg7coexlK8lN1_jrYfk_vlCL6Nzp_9d2GSwxKpw4LjYRa8NwW0 FjRl2eL3MFQMnr9Q_Km9db88YAssrSUFpAgzaK69tzUvraUuuWymoHsZrXXZlefXj9j3LlhwsQC9 xNwHgckUkBwqBtgpFxubvf_nb..7QUI8q89riX9jn_pVazM4TzfWsyLjnv0bO2uldnldbzfLNW19 TpCrJ3PpNt_T7bmIg6sW_HGbvtNUBFlDP9cIMksRQ8be0wmJEmVYX9eltHlIVgXwLoE52t7BDw.F pZD4lMFTTVQc0oNo1swLX820Q_p8_qIrlXRTNd0zn3S.FSRgFYBqcDMkpQmbrI7hBXJZtDpwjeW2 wk5eQ8PyXXdGXTfhAees9oF2aE2ZiGtLK1OjZgepcfJAQlYqeB8HMLAVvwoFvOdUY2y9lZ0K9nNQ c3B.Luk43.kh2cnGGLl8E1.aaBIkrse8Ym7kO9osR_LIKmIHohJajU9M1ehUATbJDkjL4GNSDzqx J_amgfc5e3Oy9ZReQJ5D08ReBFlFGPBx496yYHq6yzH4pFnK67rQdKBNu9GP4QnKhgY6l8YV0ZQe knANMP.V8rVYvxKoPaGQWtpP_F3jfnU.kq0tw7QkK1owsZFtjPLjmRPDRI.rlv4Ho_Y9QfExsFgR FT8i6_QRz1gJ9LPFr4Bp8g9v3JmoDIYmizm0Jfu5LWWts.uYT1oKUBamiA5tSkofZ.i2nti_Z0.z C4RDh9.aLMdFeGnKODSHw1Do9BpcpGHPv1dqIfrNpgE1B3amNsKVJlICDAzDqFuyqGX84uZcnHBr B0TjKE6z5EuKfLePsGA6KuuMbFt9GL31Z1yJlXWboxaAgSv6ZepiocnJDefWwBtIKTf4B.yPn2IB Sze08h3wmdSXwTlJUHz98eVh80ZCvKfkeQeZM8Q-- X-Sonic-MF: <ssbssa@yahoo.de> X-Sonic-ID: 6b73bc3a-b17b-4557-b77b-dcebaf937d5e Received: from sonic.gate.mail.ne1.yahoo.com by sonic301.consmr.mail.ir2.yahoo.com with HTTP; Mon, 22 Dec 2025 12:13:04 +0000 Received: by hermes--production-ir2-7679c5bc-vtpmw (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 813e20f698496f5cd69749c64f2d901b; Mon, 22 Dec 2025 12:12:59 +0000 (UTC) From: Hannes Domani <ssbssa@yahoo.de> To: gdb-patches@sourceware.org Subject: [PATCH] Fix getting pointer-to-member for classes with virtual base classes Date: Mon, 22 Dec 2025 13:12:44 +0100 Message-ID: <20251222121244.38935-1-ssbssa@yahoo.de> X-Mailer: git-send-email 2.52.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit References: <20251222121244.38935-1-ssbssa.ref@yahoo.de> X-Spam-Status: No, score=-9.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE, SPF_PASS, TXREP, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list <gdb-patches.sourceware.org> List-Unsubscribe: <https://sourceware.org/mailman/options/gdb-patches>, <mailto:gdb-patches-request@sourceware.org?subject=unsubscribe> List-Archive: <https://sourceware.org/pipermail/gdb-patches/> List-Post: <mailto:gdb-patches@sourceware.org> List-Help: <mailto:gdb-patches-request@sourceware.org?subject=help> List-Subscribe: <https://sourceware.org/mailman/listinfo/gdb-patches>, <mailto:gdb-patches-request@sourceware.org?subject=subscribe> Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org |
| Series |
Fix getting pointer-to-member for classes with virtual base classes
|
|
Commit Message
Hannes Domani
Dec. 22, 2025, 12:12 p.m. UTC
Currently this assertion fails: print &derived::i $125 = C:/src/repos/binutils-gdb.git/gdb/gdbtypes.h:621: internal-error: loc_bitpos: Assertion `m_loc_kind == FIELD_LOC_KIND_BITPOS' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging sessionFAIL: gdb.cp/virtbase2.exp: foo::func_f: print &derived::i (GDB internal error) The comment above cp_find_class_member even mentions that only non-virtual base classes should be checked, so this adds that check. Now we get: print &derived::i $125 = 4 (gdb) PASS: gdb.cp/virtbase2.exp: foo::func_f: print &derived::i --- gdb/cp-valprint.c | 2 ++ gdb/testsuite/gdb.cp/virtbase2.exp | 1 + 2 files changed, 3 insertions(+)
Comments
>>>>> "Hannes" == Hannes Domani <ssbssa@yahoo.de> writes:
Hannes> The comment above cp_find_class_member even mentions that only non-virtual
Hannes> base classes should be checked, so this adds that check.
I don't have a problem with this patch, but I wonder if this conforms to
what C++ compilers do.
Like, does a pointer-to-member work with virtual base classes? If so
then it seems more correct to try to lift this constraint than to reject
virtual bases here.
Tom
Am Montag, 5. Januar 2026 um 18:04:03 MEZ hat Tom Tromey <tom@tromey.com> Folgendes geschrieben: > >>>>> "Hannes" == Hannes Domani <ssbssa@yahoo.de> writes: > > Hannes> The comment above cp_find_class_member even mentions that only non-virtual > Hannes> base classes should be checked, so this adds that check. > > I don't have a problem with this patch, but I wonder if this conforms to > what C++ compilers do. > > Like, does a pointer-to-member work with virtual base classes? If so > then it seems more correct to try to lift this constraint than to reject > virtual bases here. You're right, pointer-to-member with virtual base classes don't work at all. The problem starts when trying to get the member-address, in value_struct_elt_for_reference: if (BASETYPE_VIA_VIRTUAL (t, i)) base_offset = 0; else base_offset = TYPE_BASECLASS_BITPOS (t, i) / 8; Since base_offset is 0 for all virtual base classes, the resulting bitpos sum isn't really correct, so lookup_memberptr_type doesn't have enough information in this situation. But I'm not sure how we could make it work (maybe add the type of the class whose member is asked for?). Hannes
Am Dienstag, 6. Januar 2026 um 20:41:49 MEZ hat Hannes Domani <ssbssa@yahoo.de> Folgendes geschrieben: > Am Montag, 5. Januar 2026 um 18:04:03 MEZ hat Tom Tromey <tom@tromey.com> Folgendes geschrieben: > > > >>>>> "Hannes" == Hannes Domani <ssbssa@yahoo.de> writes: > > > > Hannes> The comment above cp_find_class_member even mentions that only non-virtual > > Hannes> base classes should be checked, so this adds that check. > > > > I don't have a problem with this patch, but I wonder if this conforms to > > what C++ compilers do. I forgot yesterday to actually test this with a compiler, but it looks like taking pointer-to-members with virtual base classes isn't allowed in c++: ../../../gdb/testsuite/gdb.cp/virtbase2.cc:52:26: error: pointer to member conversion via virtual base 'super' 52 | int derived::* w_ptr = &derived::w; | ^~~~~~~~~~~ ../../../gdb/testsuite/gdb.cp/virtbase2.cc:53:26: error: pointer to member conversion via virtual base 'base' 53 | int derived::* x_ptr = &derived::x; | ^~~~~~~~~~~ ../../../gdb/testsuite/gdb.cp/virtbase2.cc:54:26: error: pointer to member conversion via virtual base 'base' 54 | int derived::* i_ptr = &derived::i; | ^~~~~~~~~~~ ../../../gdb/testsuite/gdb.cp/virtbase2.cc:55:29: error: pointer to member conversion via virtual base 'base' 55 | double derived::* d_ptr = &derived::d; | ^~~~~~~~~~~ So maybe we should print a similar error in this case. Hannes
Hannes> I forgot yesterday to actually test this with a compiler, but it looks like Hannes> taking pointer-to-members with virtual base classes isn't allowed in c++: Hannes> ../../../gdb/testsuite/gdb.cp/virtbase2.cc:52:26: error: pointer to member conversion via virtual base 'super' Hannes> 52 | int derived::* w_ptr = &derived::w; Hannes> | ^~~~~~~~~~~ Hannes> ../../../gdb/testsuite/gdb.cp/virtbase2.cc:53:26: error: pointer to member conversion via virtual base 'base' Hannes> 53 | int derived::* x_ptr = &derived::x; Hannes> | ^~~~~~~~~~~ Hannes> ../../../gdb/testsuite/gdb.cp/virtbase2.cc:54:26: error: pointer to member conversion via virtual base 'base' Hannes> 54 | int derived::* i_ptr = &derived::i; Hannes> | ^~~~~~~~~~~ Hannes> ../../../gdb/testsuite/gdb.cp/virtbase2.cc:55:29: error: pointer to member conversion via virtual base 'base' Hannes> 55 | double derived::* d_ptr = &derived::d; Hannes> | ^~~~~~~~~~~ Hannes> So maybe we should print a similar error in this case. Yeah, that would make sense to me. In most cases gdb tries to follow the language. Sometimes extensions are available, when that makes sense; but in a case like this I think it doesn't, and plus which this is an obscure thing to do anyway. Tom
diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index 252072b66dd..fa373acce1d 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -667,6 +667,8 @@ cp_find_class_member (struct type **self_p, int *fieldno, for (i = 0; i < TYPE_N_BASECLASSES (self); i++) { + if (BASETYPE_VIA_VIRTUAL (self, i)) + continue; LONGEST bitpos = self->field (i).loc_bitpos (); LONGEST bitsize = 8 * self->field (i).type ()->length (); diff --git a/gdb/testsuite/gdb.cp/virtbase2.exp b/gdb/testsuite/gdb.cp/virtbase2.exp index d18312be002..1a73e31c179 100644 --- a/gdb/testsuite/gdb.cp/virtbase2.exp +++ b/gdb/testsuite/gdb.cp/virtbase2.exp @@ -113,4 +113,5 @@ with_test_prefix "foo::func_f" { test_variables_in_super {super} test_variables_in_super {foo super} test_variables_in_super {foo derived super} + gdb_test "print &derived::i" " = $decimal" }