From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7948) id 23F0E3857BBC; Thu, 7 Mar 2024 11:00:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 23F0E3857BBC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1709809208; bh=WgL5Fv9zYsk+wkfbtP9XENBTVYmmJmlnxquST4rhvsw=; h=From:To:Subject:Date:From; b=RGg4+fVMB9BnZH5ZXX/SoJnvRAtCUoJS60/MRxrYsP2HWV6NI5OGdjLLtUT5BfLdZ T/rTwOFXVEyvlp+mRhyx7fjb38+dPTe2SrtpHB2eM7X7qv07Mj6lGaEafHqoF7i3fK ksWfXgDN6ZdJEO8Nmr5l9EihPa6sj8k7OAS7Uj30= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Nathaniel Shead To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-9357] c++: Fix ICE diagnosing incomplete type of overloaded function set [PR98356] X-Act-Checkin: gcc X-Git-Author: Nathaniel Shead X-Git-Refname: refs/heads/master X-Git-Oldrev: 77772f8a3da8ea30066d2201f8148714a8e89da5 X-Git-Newrev: 940586a63586941a9f2b973491afc8a15a96c98b Message-Id: <20240307110008.23F0E3857BBC@sourceware.org> Date: Thu, 7 Mar 2024 11:00:08 +0000 (GMT) List-Id: https://gcc.gnu.org/g:940586a63586941a9f2b973491afc8a15a96c98b commit r14-9357-g940586a63586941a9f2b973491afc8a15a96c98b Author: Nathaniel Shead Date: Tue Mar 5 01:59:41 2024 +1100 c++: Fix ICE diagnosing incomplete type of overloaded function set [PR98356] In the linked PR the result of 'get_first_fn' is a USING_DECL against the template parameter, to be filled in on instantiation. But we don't actually need to get the first set of the member functions: it's enough to know that we have a (possibly overloaded) member function at all. PR c++/98356 gcc/cp/ChangeLog: * typeck2.cc (cxx_incomplete_type_diagnostic): Don't assume 'member' will be a FUNCTION_DECL (or something like it). gcc/testsuite/ChangeLog: * g++.dg/pr98356.C: New test. Signed-off-by: Nathaniel Shead Diff: --- gcc/cp/typeck2.cc | 11 +++++------ gcc/testsuite/g++.dg/pr98356.C | 9 +++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/gcc/cp/typeck2.cc b/gcc/cp/typeck2.cc index 9608bdccd8b..31198b2f9f5 100644 --- a/gcc/cp/typeck2.cc +++ b/gcc/cp/typeck2.cc @@ -350,16 +350,15 @@ cxx_incomplete_type_diagnostic (location_t loc, const_tree value, bad_member: { tree member = TREE_OPERAND (value, 1); - if (is_overloaded_fn (member)) - member = get_first_fn (member); - - if (DECL_FUNCTION_MEMBER_P (member) - && ! flag_ms_extensions) + if (is_overloaded_fn (member) && !flag_ms_extensions) { gcc_rich_location richloc (loc); /* If "member" has no arguments (other than "this"), then add a fix-it hint. */ - if (type_num_arguments (TREE_TYPE (member)) == 1) + member = MAYBE_BASELINK_FUNCTIONS (member); + if (TREE_CODE (member) == FUNCTION_DECL + && DECL_OBJECT_MEMBER_FUNCTION_P (member) + && type_num_arguments (TREE_TYPE (member)) == 1) richloc.add_fixit_insert_after ("()"); complained = emit_diagnostic (diag_kind, &richloc, 0, "invalid use of member function %qD " diff --git a/gcc/testsuite/g++.dg/pr98356.C b/gcc/testsuite/g++.dg/pr98356.C new file mode 100644 index 00000000000..acea238593b --- /dev/null +++ b/gcc/testsuite/g++.dg/pr98356.C @@ -0,0 +1,9 @@ +// PR c++/98356 +// { dg-do compile { target c++11 } } + +template