From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1888) id C421A3858422; Sat, 3 Jun 2023 13:27:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C421A3858422 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1685798844; bh=LqsYgU5y/jtm+O+bZcInJ4eUXPtlVJEOBgLNOPjc5Vo=; h=From:To:Subject:Date:From; b=MtHzEB9ZsA6PELcMJ3148cqOh2gaFMeIyRrPFNEFkfJFP9JHOGKD31utg0F9QfGPU cNFv4bAoIrEcAZ9OoT8eIiU/Re+EyYafFaHHHfqqrxo/rIsSi/HMlNiQzS5y/TgffV DnIXQKIaSZmbmqGjzXBF/lr1jIT2p9ZFXrz5CzWg= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Patrick Palka To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-1519] c++: is_specialization_of_friend confusion [PR109923] X-Act-Checkin: gcc X-Git-Author: Patrick Palka X-Git-Refname: refs/heads/master X-Git-Oldrev: 23bee8508816297a9b2ab81a96aa0c79ac88ceba X-Git-Newrev: 38af81df6aac11d49f9378d1c628ccc3c815c3ff Message-Id: <20230603132724.C421A3858422@sourceware.org> Date: Sat, 3 Jun 2023 13:27:24 +0000 (GMT) List-Id: https://gcc.gnu.org/g:38af81df6aac11d49f9378d1c628ccc3c815c3ff commit r14-1519-g38af81df6aac11d49f9378d1c628ccc3c815c3ff Author: Patrick Palka Date: Sat Jun 3 09:26:43 2023 -0400 c++: is_specialization_of_friend confusion [PR109923] The check for a non-template member function of a class template in is_specialization_of_friend is overbroad, and accidentally holds for a non-template hidden friend too, which for the testcase below causes the predicate to bogusly return true for decl = void non_templ_friend(A, A) friend_decl = void non_templ_friend(A, A) This patch refines the check appropriately. PR c++/109923 gcc/cp/ChangeLog: * pt.cc (is_specialization_of_friend): Fix overbroad check for a non-template member function of a class template. gcc/testsuite/ChangeLog: * g++.dg/template/friend79.C: New test. Diff: --- gcc/cp/pt.cc | 1 + gcc/testsuite/g++.dg/template/friend79.C | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index dae3815f62a..6b20c58ce66 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -1319,6 +1319,7 @@ is_specialization_of_friend (tree decl, tree friend_decl) of a template class, we want to check if DECL is a specialization if this. */ if (TREE_CODE (friend_decl) == FUNCTION_DECL + && DECL_CLASS_SCOPE_P (friend_decl) && DECL_TEMPLATE_INFO (friend_decl) && !DECL_USE_TEMPLATE (friend_decl)) { diff --git a/gcc/testsuite/g++.dg/template/friend79.C b/gcc/testsuite/g++.dg/template/friend79.C new file mode 100644 index 00000000000..7603adf5bea --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend79.C @@ -0,0 +1,20 @@ +// PR c++/109923 + +template +struct A { +private: + int x; + +public: + A() : x(0) { } + + friend void non_templ_friend(A val, A weird) { + val.x++; // always works + weird.x++; // { dg-error "private" } should only work when T=void + } +}; + +int main() { + non_templ_friend(A(), A()); // { dg-bogus "" } + non_templ_friend(A(), A()); // { dg-message "required from here" } +}