]> git.feebdaed.xyz Git - 0xmirror/gcc.git/commit
c++: Fix member-like friend detection for non-template classes [PR122550]
authorEgas Ribeiro <egas.g.ribeiro@gmail.com>
Fri, 19 Dec 2025 21:34:55 +0000 (21:34 +0000)
committerPatrick Palka <ppalka@redhat.com>
Tue, 23 Dec 2025 14:13:10 +0000 (09:13 -0500)
commit3f09320bf65312a2f442aca514a35a382a6521f1
tree3ad40d3590b4a96ed54265e48ae70951684bd9f3
parent61eb73a6396fd63b02f208e4288f694c849e9428
c++: Fix member-like friend detection for non-template classes [PR122550]

member_like_constrained_friend_p was incorrectly returning true for
constrained friend function templates declared in non-template classes,
causing them to be treated as distinct from their forward declarations.
This led to ambiguity errors at call sites.

Per [temp.friend]/9, a constrained friend is only "member-like" (and thus
declares a different function) in two cases:
1. Non-template friends with constraints (must be in a templated class)
2. Template friends whose constraints depend on outer template parameters

In both cases, the enclosing class scope must be templated. The fix adds
a check for CLASSTYPE_IMPLICIT_INSTANTIATION to ensure the friend's
context is actually a class template, not a plain class or explicit
specialization.

PR c++/122550

gcc/cp/ChangeLog:

* decl.cc (member_like_constrained_friend_p): Check that the
friend's enclosing class is an implicit instantiation.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/concepts-friend18.C: New test.
* g++.dg/cpp2a/concepts-friend18a.C: New test.

Signed-off-by: Egas Ribeiro <egas.g.ribeiro@gmail.com>
Reviewed-by: Patrick Palka <ppalka@redhat.com>
gcc/cp/decl.cc
gcc/testsuite/g++.dg/cpp2a/concepts-friend18.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/concepts-friend18a.C [new file with mode: 0644]