]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Fix injected-class-name lookup with multiple bases [PR122509]
authorEgas Ribeiro <egas.g.ribeiro@gmail.com>
Sat, 13 Dec 2025 20:06:09 +0000 (20:06 +0000)
committerJason Merrill <jason@redhat.com>
Fri, 19 Dec 2025 11:13:44 +0000 (18:13 +0700)
commitd19b95ca96f2e10732007d9cd59e6430df8d0b2a
tree0d005c4fcf5ec472a60e3bad260ea08ec932c6be
parent7044071f07d763444247e32f9db25d7a658b7f9e
c++: Fix injected-class-name lookup with multiple bases [PR122509]

When looking up an unqualified injected-class-name in a member access
expression (e.g., D().v<int>), cp_parser_lookup_name calls lookup_member
with protect=0, causing it to return NULL on ambiguity instead of the
candidate list. This prevented the existing DR 176 logic in
maybe_get_template_decl_from_type_decl from resolving the ambiguity.

Per DR 176, if all ambiguous candidates are instantiations of the same
class template and the name is followed by a template-argument-list,
the reference is to the template itself and is not ambiguous.

Fix by using protect=2 to return the ambiguous candidate list.

PR c++/122509

gcc/cp/ChangeLog:

* parser.cc (cp_parser_lookup_name): Use protect=2 instead of
protect=0 when calling lookup_member.

gcc/testsuite/ChangeLog:

* g++.dg/tc1/dr176-2.C: New test.

Signed-off-by: Egas Ribeiro <egas.g.ribeiro@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/parser.cc
gcc/testsuite/g++.dg/tc1/dr176-2.C [new file with mode: 0644]