]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: hidden friend access [DR1699]
authorJason Merrill <jason@redhat.com>
Sat, 19 Mar 2022 02:52:32 +0000 (22:52 -0400)
committerJason Merrill <jason@redhat.com>
Sun, 15 May 2022 16:43:30 +0000 (12:43 -0400)
commit4df735e01e319997841574f353d2aa076a0335c2
tree5d8ff6e326d0233e450a1e59d7ecc30404424fa1
parent87e1f023aae945aedd7ea046e06b4f52318913f7
c++: hidden friend access [DR1699]

It has come up several times that Clang considers hidden friends of a class
to be sufficiently memberly to be covered by a friend declaration naming the
class.  This is somewhat unclear in the standard: [class.friend] says
"Declaring a class to be a friend implies that private and protected members
of the class granting friendship can be named in the base-specifiers and
member declarations of the befriended class."

A hidden friend is a syntactic member-declaration, but is it a "member
declaration"?  CWG was ambivalent, and referred the question to EWG as a
design choice.  But recently Patrick mentioned that the current G++ choice
not to treat it as a "member declaration" was making his library work
significantly more cumbersome, so let's go ahead and vote the other way.

This means that the testcases for 100502 and 58993 are now accepted.

DR1699
PR c++/100502
PR c++/58993

gcc/cp/ChangeLog:

* friend.cc (is_friend): Hidden friends count as members.
* search.cc (friend_accessible_p): Likewise.

gcc/testsuite/ChangeLog:

* g++.dg/template/access37.C: Now OK.
* g++.dg/template/friend69.C: Now OK.
* g++.dg/lookup/friend23.C: New test.
gcc/cp/friend.cc
gcc/cp/search.cc
gcc/testsuite/g++.dg/lookup/friend23.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/access37.C
gcc/testsuite/g++.dg/template/friend69.C