From patchwork Wed Mar 20 16:01:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Domani X-Patchwork-Id: 87413 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C38043858038 for ; Wed, 20 Mar 2024 16:02:46 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from sonic307-54.consmr.mail.ir2.yahoo.com (sonic307-54.consmr.mail.ir2.yahoo.com [87.248.110.31]) by sourceware.org (Postfix) with ESMTPS id 8C2A0385841A for ; Wed, 20 Mar 2024 16:01:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8C2A0385841A 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 8C2A0385841A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=87.248.110.31 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710950510; cv=none; b=ZUexpGbgpyNkl1Z0+L7wK1vVyWg7BP7HY0nTVDfweCiu92l4s7D5KRRiwHjmiwOIdFsrVzOAZFFwrpyh6WBbQ1XMxfcbs4PxfwTrAvKAjjEZWdQW1iy9zEytOEktNIUzzoOQI19dZC/aSxojC9ztmrsM5rfXGlGmg/JI7TfmLo0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710950510; c=relaxed/simple; bh=GaWzc0JtPgl+/sX2IyoFNacjWKlOc12rQKhg9u0Ome4=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=ZuAmY20wIR+Wy8Pw8jgrR+CqSPkfkOaLyb9CaIprG+rHtzMDa28sNtJmrZ94quNty8jNeKvKsmdLd/7qvecPr2nD4ZsCVpGgqjBMOGxlx6OuJrTtvnV6oJ6G+ktB898RE9TZfQrDUfovSyhjQ0kGzswFB0Rr5t6XwLIGcOP1yec= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1710950498; bh=5+EjZV0gu24G0P1FNlpX+zLgMEN8wpR29kuQSzOt/Zs=; h=From:To:Subject:Date:References:From:Subject:Reply-To; b=WWFpziBtIalVxCxK0/dNTqSVo/CvNiyRmOhXZbxhJEmKPHqPmgsMkhZjmi8OfANGz7/E4V436Xc9yUolLIao3va+xgFR5n04Z1bcqpOvkRQPA9jHiL0V5T61TqU3IH4QMX3KwubjDKrGSjziwtOGB+gnu9HBCQPNu0TG2CI0JMzai+mi7URyQWxn1UfE7RTm1ySv4QwEh5CtM5NUnooDo8WOK0kf6p3pcehm/w7NvEy+AkjnuyLEaDdk+Drlpfbr0RfP55lHM2SOqcUdKZBXxdw4YKUOYR4z3ngB9X0xCiPQPec94PQ6ks6KhuzUiMws52FDW9PMH+2sYo9mbCBbtg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1710950498; bh=lFFst69kwkyCJAErnvrG9y1t+cDGyG2IoFWZTA2v5tt=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=AsFNUSX/cjG85wCtNeGgIH7A75h4FsNSw35wBGEUkF+3/oyOpFZcrZr7reLc4zSUzFDQErh72dAUGKAQzaTx6WKV7NDsy8ZOe5IhoiT/78VyKNhNGZONU7AZP6e2ikyeljCZSgQ/QVlUa9KpB15Kcsv9NVNWUyAiULkS3bxiKShHQ7hfn1xSOKWB6R5maqAa/OvYx8fQNzqCW1LwbRGjSpjdnGQBgR0jI+0+dX1g2839fjtiYW1q828oKpvaPr3lfzIN6b0G4zuGvjpjIPja0CSWlqvkoZ3wLqjD5ib9ZabOu8N/uRbRc0cUPHlXjd2JBAwIjQK0SjJ5tn7fE+O4zg== X-YMail-OSG: QjFEHygVM1k49N3twmP9jkm7fbRb5vip9zUpgBp6FD4SDy.jknCh.cS0K2wejoV Rcc3RLxllfE0asUV9Kyuinw_fKAE87FOQ4vxzrhjIAZyHBSJQpoxmsLPAFj79dNqJkPjzPQi5_B_ iUppJ0y6ertWRHXiCiHsQX7frNYzr1A883zKe.w5B5uCJc4sGtrdMTeWFudHeSBTIMG89DDk5Zxk PpkJ6UmFQ9MnQ_c52om476WGo1tm8GBgAm.EK4qOv3t2trbU8PILXtrgmoh9nPH9DuXhfxpNHjjx hv.zZX5q9ShRMjukyb0TMYikmI3NyI6RapmlzIWKnnXuYI9KTeCSra4la9HPWLNCVxOjQabsYDMD D1zzfrV0RZG9FdCwI4oe0Dnmj2wVLfy6KXvv61.HA2CNgTYCleYbuf_V6srzAR0Son5O9iFxfQsN Zv5J6YpUmLgCqDg2URnB7OkZnxxfGy7_xa0yvcH2NpNUAXM0RBzCytjLXlo42IhZA80XB34RsTWa hWc9.BJOjZeNA98nmSYY_fReAbRzGNa_QxmRMzpCaTj0A8rQ0cJdMt3QX843ZPTZdSlb7HRZ6ML4 dXpWKMtQFm392zD4aDqswryjW4j7nNJxI.g8K.wGjoBWiUg2Yu7KjW1MYthxYvtNBqCOnV8jStHH aS3itmf2rqNIo4ZcPkAhYYUKLt6xNAFchCKpmLuxpHin7t55wKJWJQYFjhnpO3Wk0iZPMr6S8cRp _wNC.jUKiqWPXrKQaxa8GE.9QCPXio8muSIXKb4yOxX82Gg4ZiXlyez3cNL0Bvdbgxv.k.q60G6f y8j7pQ_znKtQ7gefaH9yyblJxy1sHP7wZS_1KunzOm7fLi9bSSU9JF9AF7EcQolmPYs1sz42pB4T _rIHbWhMe4AtcKd0D4wJA5P5D0da9ckIKejB1XzLAX0kSPCFHMoMscyg427HtFk0r_HESk3zTTIX IDWr_mGT_.tX9bCuDkVu3Fqd5an1A8GHwM_KxNSFly7KPRsThHb39PesTqq4I43EKluS4MjrjYJw 4bqY79zv2RjrOFpf.LVPT3mKsBVmzbxPJAXP878imaZMVLEFmM0yCVknExj0wuRBDINqIBdX73AV 0l8yP41.0XKCrTJLtzb7O.8v9uJ5X8sO8IfyYMz7DxB_D5tOj2UUrKHxqFRHnL00mZTz_2K5Fv7M ZIRw4lNm61G6czvG7jZgLldHEQFGv4pQLtg0FQuVhsGEU2ZYmbP_jg3Sw_QXxwcXQMW8emFdozZP _z1ohiH0xkr7OR55D0V8NQJDQ0r4H1nwgEQiv4ail7m34B2SfJmoLB1WXFbIgX4bzo11fsoM290w uDeVdeqh55iWtK3.B04YPK1PBw82N4KJHzK7Dfifyv2O6yC.LUeED30EQWqw6fBINPV1jS9H43bK SYYV7wT7FvKqHlWfhKI2qtBsTP7RC_SY0TNAXKWvsrFVuWrN23vM2v16njFoXH.s7KPmrU3kHoOV bNVV_LpUoq.LGqYIxG9aO0uuBMTRqM2FzTEiRKVKZ6bkX0WQq4YDTyqgJZ6KvbcUkArJXlWrhkw4 lof1MHo8oxfnZPk9vRaKKSnn2jj.b4pS8fuSLEySTWz98aQ7ULb0v2tJcjHhjxkxGUxkxzLE7mfq m_lYb8lH.RUl9NueceuafdvHDewnwJuwu1OMCJxHddVpiwyyeGQcRY3sQnsBOJdzr6jEQc8a.Oc_ Y.71GA1.7dxtGECzp.YARJ.jabiv4TIL1Yz6INWCk1vqpd0CYCE03QGDH1JwH90gwowTEexnkQRz OF578kfD1hSbWI856fgKVIgZxpWjP2UcKRjfY9xm.E0qZqz1KrThLbF5Gf1DORT6S91jRUfIj9tW vvdf3lLabe57M8eNvvyFg71G1rLPtClDf8Y6euC8ej.1AXP2Ajm2YU.1s5516vG2jXuj5aAPQ4yT 77Cm8o2BkptkOaxkWF3LQLiXP.2xEUD._HWLDmj7pa766P7HxgRW74.lSsz4NgucSDugsZAV9uhr Enu.036ZCINfupKun928qKtjROwpMdeJhcN2rf2YDFa3_39iqwBkJQdP_fgJUDaGpgl1QFpE9DsY QX2CWtej8HgwzAxLDn7z6IfFfgv78dsMItn.Xa5STvPgfpNCf2IqcTCcqOqVHg1xsSybH5lajyVt DDYgSUm7IOJk4MkhbSTJ_ElaohtL70ccY63zsNtTn8wXGvZQRq.Hwl61Bq0n8499EapelzCfNxL2 5o._DJQ7wfUv7GwRnmxFysl8ZKtcf X-Sonic-MF: X-Sonic-ID: 170ca294-f8d3-49de-a462-fadf4f62f1fa Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.ir2.yahoo.com with HTTP; Wed, 20 Mar 2024 16:01:38 +0000 Received: by hermes--production-ir2-7bc88bfc75-dw7mr (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID f3b1d51d935083b650534097e9241044; Wed, 20 Mar 2024 16:01:34 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH] Fix reinterpret_cast for classes with multiple inheritance Date: Wed, 20 Mar 2024 17:01:15 +0100 Message-Id: <20240320160115.94-1-ssbssa@yahoo.de> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 X-Antivirus: Avast (VPS 240320-2, 03/20/2024), Outbound message X-Antivirus-Status: Clean References: <20240320160115.94-1-ssbssa.ref@yahoo.de> X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Currently a reinterpret_cast may change the pointer value if multiple inheritance is involved: ``` (gdb) p r $1 = (Right *) 0x22f75c (gdb) p reinterpret_cast(r) $2 = (LeftRight *) 0x22f758 ``` It's because value_cast is called in this case, which automatically does up- and downcasting. Fixed by simply using the target pointer type in a copy of the original value: ``` (gdb) p r $1 = (Right *) 0x3bf87c (gdb) p reinterpret_cast(r) $2 = (LeftRight *) 0x3bf87c ``` Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=18861 --- gdb/testsuite/gdb.cp/casts.cc | 8 ++++++++ gdb/testsuite/gdb.cp/casts.exp | 10 ++++++++++ gdb/valops.c | 11 +++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/gdb/testsuite/gdb.cp/casts.cc b/gdb/testsuite/gdb.cp/casts.cc index 5c7f9dc8a1c..eacd8bc0a44 100644 --- a/gdb/testsuite/gdb.cp/casts.cc +++ b/gdb/testsuite/gdb.cp/casts.cc @@ -88,6 +88,14 @@ main (int argc, char **argv) unsigned long long gd_value = (unsigned long long) (std::uintptr_t)&gd; unsigned long long r_value = (unsigned long long) (Right *) &gd; + LeftRight *lr = &gd; + Left *l = lr; + Right *r = lr; + LeftRight *lr_l = reinterpret_cast(l); + LeftRight *lr_r = reinterpret_cast(r); + Left *l_lr = reinterpret_cast(lr); + Right *r_lr = reinterpret_cast(lr); + VirtualLeftRight *vlr = new VirtualLeftRight (); VirtualLeft *vl = vlr; VirtualRight *vr = vlr; diff --git a/gdb/testsuite/gdb.cp/casts.exp b/gdb/testsuite/gdb.cp/casts.exp index 7bfc93b1a02..ca82ab084b9 100644 --- a/gdb/testsuite/gdb.cp/casts.exp +++ b/gdb/testsuite/gdb.cp/casts.exp @@ -180,6 +180,16 @@ gdb_test "print (unsigned long long) (LeftRight *) (Right *) &gd == gd_value" \ gdb_test "print (unsigned long long) (LeftRight *) (Right *) r_value == gd_value" \ " = true" +gdb_test "print reinterpret_cast(l) == lr_l" " = true" +gdb_test "print reinterpret_cast(r) == lr_r" " = true" +gdb_test "print reinterpret_cast(lr) == l_lr" " = true" +gdb_test "print reinterpret_cast(lr) == r_lr" " = true" + +gdb_test "print &reinterpret_cast(*l) == lr_l" " = true" +gdb_test "print &reinterpret_cast(*r) == lr_r" " = true" +gdb_test "print &reinterpret_cast(*lr) == l_lr" " = true" +gdb_test "print &reinterpret_cast(*lr) == r_lr" " = true" + gdb_test "print dynamic_cast (vlr) == vlr" " = true" gdb_test "print dynamic_cast (vl) == vlr" " = true" gdb_test "print dynamic_cast (vr) == vlr" " = true" diff --git a/gdb/valops.c b/gdb/valops.c index be907440a59..0a4e57672ce 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -694,10 +694,17 @@ value_reinterpret_cast (struct type *type, struct value *arg) || (dest_code == TYPE_CODE_MEMBERPTR && arg_code == TYPE_CODE_INT) || (dest_code == TYPE_CODE_INT && arg_code == TYPE_CODE_MEMBERPTR) || (dest_code == arg_code - && (dest_code == TYPE_CODE_PTR - || dest_code == TYPE_CODE_METHODPTR + && (dest_code == TYPE_CODE_METHODPTR || dest_code == TYPE_CODE_MEMBERPTR))) result = value_cast (dest_type, arg); + else if (dest_code == TYPE_CODE_PTR && arg_code == TYPE_CODE_PTR) + { + /* Don't do any up- or downcasting. */ + result = arg->copy (); + result->deprecated_set_type (dest_type); + result->set_enclosing_type (dest_type); + result->set_pointed_to_offset (0); /* pai: chk_val */ + } else error (_("Invalid reinterpret_cast"));