From patchwork Sun Apr 21 12:49:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Domani X-Patchwork-Id: 88811 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 35F37385840F for ; Sun, 21 Apr 2024 12:50:49 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from sonic303-20.consmr.mail.ir2.yahoo.com (sonic303-20.consmr.mail.ir2.yahoo.com [77.238.178.201]) by sourceware.org (Postfix) with ESMTPS id DD80F3858D28 for ; Sun, 21 Apr 2024 12:50:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DD80F3858D28 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 DD80F3858D28 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=77.238.178.201 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713703827; cv=none; b=GAvFqOO4xi11CjbMzXeBD51pFJEKiTIkejfuJuG8wYFbjybjoGKFHMJfhabVXHXsMKIDyCGI8tQLfjc/n9egnakFjCWd3V4aTGZBqAefqwc0y3XJK8gUsFQzn2aS0JMkwkW5zXNfBx4zDArvhcFQxfA9ATSnBdCf7eDuMVtX6vQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713703827; c=relaxed/simple; bh=i5YfxnZgo48hmte5mexpTzX5ujX79m2t+OXUSNzhBz0=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=tnn/ZXIHk3LmHOc35Z+pQBNg6LyYgBd2hwl+1BOxI+5i4Os+AkWAZk//TYmKTQUyjx1Hw2BZSWdCPZv8R1MoWsXugdbKbySpFIDCWIp88nwUtmfhjbsUcXlL/BnSIPCKsxMvdbJ/Dmu0u2ELOp8gNAi39XJIU2+mICfSEbECY1A= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1713703823; bh=2T1EA5KM2DX8xamC1yAu6eTeQtceJGdbVvLFVJ52GOY=; h=From:To:Subject:Date:References:From:Subject:Reply-To; b=Rjpdx+Ng8kkoQ74ZICfKHrsKgX00Kw+SkuMUk3atMw44U7ekQKzP5EQqOTfG5ONlkg2DBC/UWi21Ium+xYREd90Y6UV/kl0V9HzsqGgPseUmJYiKcE131hkTzpfKyvw+9Eg5UTUgJoahdeOtSOzUd/pyn+HoFyJL6/ELA4A+wPhOPQQDSdFgyn/bgcRtLFlZKht60xCkmr3BhcOkxCcmArR1TKxspCe1Wu7BLmq3Jaq/bHeik+itVbNVfFV/lM9rwcIUXvHJ+6kaT4Xma2d0lduPWo7rN55JjIsA8QhJDcOhtXnWvFKEwWFbNKWDtnhqI026xNpa24UMK8QUIHgmEQ== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1713703823; bh=mXHxLJYquUr8BChLNnjZzy9Oem3jUjDrTx0KYUrKoNi=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=hzg1IJKlTv9C63PQIoFGugwMygBKer1GbKc8mT+QTNyo1kbytMtIT066FionJyLEfys+iOLtPGGcHMbhSuSxHQyDb5dJt8chLd5BFuvh0E5en3bxp6K0nz7QlqaqQJJRksTTjxfTKEJCN1DlIxJu48kp+axLKjD1sUvNc3z2ManeCTX+0RpJavb+ij4/oy3myyT0wjhaTPXHn7AqSEbRJd7o3zITduNCyPF+bvFH6m6ymuPGIWa+1NnVLTxh5QxtYmUmQrQ6efFIKkqq2afaTSZNvdSahBkPnilB844lGBObyjB1cDhT9bHqrhwssL+JFE8zTxiYeNXPKHGVLV7EOg== X-YMail-OSG: Oe04K.QVM1keCaKS3Ss2HPb55x_NAlCokOL7_ymgia63AOgJOB8lr4w_IrKRYyK MKBtEO_6bw7JvxS6cM28ntHNNyZUO8aDSKWpjaiEJcg0c9LU8SCSTgK4lMR4JZdyOxWHatSeSZmk 1k3FrKA4uVhhJtGOxkIdwhn9igcEBXMfzE6BO6Tp2habc5uC0.3Ztkmtvm2f7664UIDg696pGKlU DfYaf_fPTLVCgshrS0.E.YJVBFXOOJ7kxNtuwv7fdhPGtdIBlImsurAMVK9NsjqCY04DfT9trBgS Ix4KHmFoUUVi6W5.0tXtI1xKUoOvPPh4vIqLyYmLQMSAKkt0DVGSQgpdEJ4HUBdgco0t7YOV1_f4 7htSetbEiXOnwxwJu2cGIlzsQEJct4LZv2kVCBrfEkdcCrhL8HjhGINrF4uoL12CfOQ72Tr9aYpI mQOOw6VdECK_Kv9O6BWnXF0aUFQ0txPG1z5irIH74tzOhdZNr0NqnkqEsxAqRlsUmfoVu2WPf4u7 qJDSsy_BL5F5chXwipyvMEcaZ_9s71TKy1IpBYndFoYoEtLV6jilctOcyOYS2UQRKc5XJSk2l9tH qlTSBJI.z8pYSXF61Y.feS0X9jxhJYl_ffXwygljTsLB2CZ0xdWdu90s7tyk9C8fh_7FSeM746oZ Bv0NHZtvyIdIidL6SYVVB02OANOGuYktqYxQ34iZfnP8gFT9v6WSQJkKG_I0aMLjobrIqQuPM5vy z9jjb59t7H9tigXi9i4N9ngugvcg1Jc4LhA8aOJ2nA5Cw72Q23z4EU7MLX30fQBETQx4BRyPZs42 5JjxKj2EKl9r1ZxaIofYYpgg277MKatMKLgCg8Zq0GFCWWjSXwn4mYUFnTh7mwh8BN9GYhKh1PMp 2Cuvao0BsVpRgowVAjA46tQeNmGAjpvvt8Six58UYDeg3iZ0rj8v.chUXv1NfFa9nJYujdgF2PCl aLhzsSM83_Djbt71BSQb43lMFDqI_JXwk2wdIk7i7HDaEzETMHFY5R_M3Twhkq5iOuNhU6iXMait jhxi1Wh.ch6qMClSu9k_5wrcoVCTkMkaQeZaV1DLYyzjleXi4T9av8cytmV2DsaKOvPpWB0bDgi. humO0meXGw2bWcZfpcW4q40Y.h5jqa5NUfeOZKv5cIoHivAfFgcopP6GkcNmhHgf2VMVvtm2Uk8t M1rZhVnwee99eVHoX3dHg0pNLhsfoTG36C0M6rNrO9OyjhbgBKesy6hyuRARuDYQxSniaEOzLGgy zix0gXTpL5xNardeklnjUuZZuP05Oz7gf3dU4bVD1PZP3KXGiNwmmOrtb1gwHMyE1V388MbPxUQo WlDyBezLxqNzKPgCzbYyd4QyjuIiVCFH1p3c0hwjeRJNngQnt12UlmWMJdPp81g8Qtj0P6PhDMCP mP.6kRZjRqOT1EN5Ji6BVw3MoHJna8rES1rrH5fN_BKVK275KhPeQBpthZRV6d45K1geNzqUi7P6 S5xCrJjUc4MErcB1R2ObrLB3WNq7rrfz2.GCAQla7Vw6h5tT69Ru6xQsgXShJ9huYxLAb81CgjvE df0vhYeiKbD_xipdwbc8ADuvw8nF2aXFFTWBq5assIkOJj3mS0nriqMLL4dov4MTf8im44FtDUiy 0qf94gJmxNoNLl.iGuN3TltJOVkyh5a.qOprhEFR01MryvnOqkH3U7z8adAo9weWQDbvuwcLsEwD l1GB2eD.XnISKa3Zy.HOMXqOM_NN0WyRXYItEoLHFqM3GK5uacm.RAifVNcBfrZe5RU0xWzbQulQ CDSBh5yuuJ6C2vr6NsAnFXuBWkeyXFPPIcl_x9BZh2kGLJJMXDcsaOvrufIVzztC.N9A7wtW8GFT TIfN0nL0iXHUX6b0yAtEDKGh0xbJ2IRbEmeSVT_Rlxqg6xZoIs__qlpeml0LrbLiWHcl2JDyxYkt ALh9T6y6K8ZNewGTGIRxxBsf3bVLzTtXCGGolabyAett.duf10Pnwnhs2gT0pELV0PYUDeY7oxtH mLLVEQBI3AmM3_NHeDqDxqHum1ZJ.xZIwdCI6jOCPKo9ch64LIzzeZOsSx0AcC61Ap_Bf.LjtN3O 3V5lax5HHBbsShCKY9YRxPzeJqHUX4S7f1XUdKiJ.yKE1IEwcvS7ospO5hJD6fJoTR81xbh0e3Ri jYsmNTairKX2JWYQUHUTj6vWIgMaZrUQVeHP4NUSNYC3N4h2u132wWpldHS0iaw9EzBbxtxdzivm rzpoWZS5aGyJNeZrPu021Xk43ith9 X-Sonic-MF: X-Sonic-ID: b0645ed6-3c14-403c-b21f-1d27eaf7ef75 Received: from sonic.gate.mail.ne1.yahoo.com by sonic303.consmr.mail.ir2.yahoo.com with HTTP; Sun, 21 Apr 2024 12:50:23 +0000 Received: by hermes--production-ir2-7b99fc9bb6-4j82p (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 2900eca51df2b87f6ed3d316405beb1c; Sun, 21 Apr 2024 12:50:22 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH] Allow calling of user-defined function call operators Date: Sun, 21 Apr 2024 14:49:54 +0200 Message-Id: <20240421124954.3285-1-ssbssa@yahoo.de> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 X-Antivirus: Avast (VPS 240420-6, 04/20/2024), Outbound message X-Antivirus-Status: Clean References: <20240421124954.3285-1-ssbssa.ref@yahoo.de> X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, 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.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 it's not possible to call user-defined function call operators, at least not without specifying operator() directly: ``` (gdb) l 1 1 struct S { 2 int operator() (int x) { return x + 5; } 3 }; 4 5 int main () { 6 S s; 7 8 return s(23); 9 } (gdb) p s(10) Invalid data type for function to be called. (gdb) p s.operator()(10) $1 = 15 ``` This now looks if an user-defined call operator is available when trying to 'call' a struct value, and calls it instead, making this possible: ``` (gdb) p s(10) $1 = 15 ``` Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=12213 --- gdb/eval.c | 46 +++++++++++++++++++++++++++----- gdb/testsuite/gdb.cp/userdef.cc | 18 +++++++++++++ gdb/testsuite/gdb.cp/userdef.exp | 4 +++ 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/gdb/eval.c b/gdb/eval.c index 6b752e70635..e737774ca28 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -664,14 +664,34 @@ operation::evaluate_funcall (struct type *expect_type, value *callee = evaluate_with_coercion (exp, noside); struct type *type = callee->type (); - if (type->code () == TYPE_CODE_PTR) - type = type->target_type (); - for (int i = 0; i < args.size (); ++i) + + /* If the callee is a struct, there might be a user-defined function call + operator that should be used instead. */ + if (overload_resolution + && exp->language_defn->la_language == language_cplus + && check_typedef (type)->code () == TYPE_CODE_STRUCT) { - if (i < type->num_fields ()) - vals[i] = args[i]->evaluate (type->field (i).type (), exp, noside); - else + for (int i = 0; i < args.size (); ++i) vals[i] = args[i]->evaluate_with_coercion (exp, noside); + + vals.insert (vals.begin(), value_addr (callee)); + int static_memfuncp; + find_overload_match (vals, "operator()", METHOD, &vals[0], nullptr, + &callee, nullptr, &static_memfuncp, 0, noside); + if (static_memfuncp) + vals.erase (vals.begin ()); + } + else + { + if (type->code () == TYPE_CODE_PTR) + type = type->target_type (); + for (int i = 0; i < args.size (); ++i) + { + if (i < type->num_fields ()) + vals[i] = args[i]->evaluate (type->field (i).type (), exp, noside); + else + vals[i] = args[i]->evaluate_with_coercion (exp, noside); + } } return evaluate_subexp_do_call (exp, noside, callee, vals, @@ -702,6 +722,20 @@ var_value_operation::evaluate_funcall (struct type *expect_type, value *callee = evaluate_var_value (noside, std::get<0> (m_storage).block, symp); + /* If the callee is a struct, there might be a user-defined function call + operator that should be used instead. */ + if (overload_resolution + && exp->language_defn->la_language == language_cplus + && check_typedef (callee->type ())->code () == TYPE_CODE_STRUCT) + { + argvec.insert (argvec.begin(), value_addr (callee)); + int static_memfuncp; + find_overload_match (argvec, "operator()", METHOD, &argvec[0], nullptr, + &callee, nullptr, &static_memfuncp, 0, noside); + if (static_memfuncp) + argvec.erase (argvec.begin ()); + } + return evaluate_subexp_do_call (exp, noside, callee, argvec, nullptr, expect_type); } diff --git a/gdb/testsuite/gdb.cp/userdef.cc b/gdb/testsuite/gdb.cp/userdef.cc index 774191726f3..48507551079 100644 --- a/gdb/testsuite/gdb.cp/userdef.cc +++ b/gdb/testsuite/gdb.cp/userdef.cc @@ -68,6 +68,9 @@ A1 operator++(int); A1 operator--(); A1 operator--(int); +int operator()(); +int operator()(int); + }; @@ -293,6 +296,16 @@ ostream& operator<<(ostream& outs, A1 one) return (outs << endl << "x = " << one.x << endl << "y = " << one.y << endl << "-------" << endl); } +int A1::operator()() +{ + return x + y; +} + +int A1::operator()(int value) +{ + return value * (x + y); +} + class A2 { public: A2 operator+(); @@ -404,6 +417,11 @@ int main (void) ++three; cout << "preinc " << three; + val = two(); + cout << "funcall " << val << endl; + val = two(10); + cout << "funcall 2 " << val << endl; + (*c).z = 1; return 0; diff --git a/gdb/testsuite/gdb.cp/userdef.exp b/gdb/testsuite/gdb.cp/userdef.exp index e96636bef0c..667bded6b83 100644 --- a/gdb/testsuite/gdb.cp/userdef.exp +++ b/gdb/testsuite/gdb.cp/userdef.exp @@ -119,6 +119,10 @@ gdb_test "print one += 7" "\\\$\[0-9\]* = {x = 9, y = 10}" gdb_test "print two = one" "\\\$\[0-9\]* = {x = 9, y = 10}" +gdb_test "print two()" " = 19" +gdb_test "print two(10)" " = 190" +gdb_test "print (*&two)(2)" " = 38" + # Check that GDB tolerates whitespace in operator names. gdb_test "break A2::operator+" ".*Breakpoint $decimal at.*" gdb_test "break A2::operator +" ".*Breakpoint $decimal at.*"