]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: inherited CTAD fixes [PR116276]
authorPatrick Palka <ppalka@redhat.com>
Sat, 10 Aug 2024 01:15:25 +0000 (21:15 -0400)
committerPatrick Palka <ppalka@redhat.com>
Sat, 10 Aug 2024 01:15:25 +0000 (21:15 -0400)
commit8cc67b520968ca9a13fd96896522aa66e39a99e2
tree9e37bbf8d78bc0b57f6cd2cbb14dbc122ae8fdd9
parent70da0ca1239faefa6dec0494a85e998eae34beff
c++: inherited CTAD fixes [PR116276]

This implements the overlooked inherited vs non-inherited guide
tiebreaker from P2582R1.  This requires tracking inherited-ness of a
guide, for which it seems natural to reuse the lang_decl_fn::context
field which for a constructor tracks its inherited-ness.

This patch also works around CLASSTYPE_CONSTRUCTORS not reliably
returning all inherited constructors (due to some using-decl handling
quirks in in push_class_level_binding) by iterating over TYPE_FIELDS
instead.

This patch also makes us recognize another written form of inherited
constructor, 'using Base<T>::Base::Base' whose USING_DECL_SCOPE is a
TYPENAME_TYPE.

PR c++/116276

gcc/cp/ChangeLog:

* call.cc (joust): Implement P2582R1 inherited vs non-inherited
guide tiebreaker.
* cp-tree.h (lang_decl_fn::context): Document usage in
deduction_guide_p FUNCTION_DECLs.
(inherited_guide_p): Declare.
* pt.cc (inherited_guide_p): Define.
(set_inherited_guide_context): Define.
(alias_ctad_tweaks): Use set_inherited_guide_context.
(inherited_ctad_tweaks): Recognize some inherited constructors
whose scope is a TYPENAME_TYPE.
(ctor_deduction_guides_for): For C++23 inherited CTAD, iterate
over TYPE_FIELDS instead of CLASSTYPE_CONSTRUCTORS to recognize
all inherited constructors.

gcc/testsuite/ChangeLog:

* g++.dg/cpp23/class-deduction-inherited4.C: Remove an xfail.
* g++.dg/cpp23/class-deduction-inherited5.C: New test.
* g++.dg/cpp23/class-deduction-inherited6.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/call.cc
gcc/cp/cp-tree.h
gcc/cp/pt.cc
gcc/testsuite/g++.dg/cpp23/class-deduction-inherited4.C
gcc/testsuite/g++.dg/cpp23/class-deduction-inherited5.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp23/class-deduction-inherited6.C [new file with mode: 0644]