https://gcc.gnu.org/g:06557ba12b64c57368673c46a21b14cf4e6afb50
commit r15-3740-g06557ba12b64c57368673c46a21b14cf4e6afb50 Author: Patrick Palka <ppa...@redhat.com> Date: Fri Sep 20 12:31:40 2024 -0400 c++: CWG 2273 and non-constructors Our implementation of the CWG 2273 inheritedness tiebreaker seems to be incorrectly considering all member functions introduced via using, not just constructors. This patch restricts the tiebreaker accordingly. DR 2273 gcc/cp/ChangeLog: * call.cc (joust): Restrict inheritedness tiebreaker to constructors. gcc/testsuite/ChangeLog: * g++.dg/cpp1z/using1.C: Expect ambiguity for non-constructor call. * g++.dg/overload/using5.C: Likewise. Reviewed-by: Jason Merrill <ja...@redhat.com> Diff: --- gcc/cp/call.cc | 11 ++++------- gcc/testsuite/g++.dg/cpp1z/using1.C | 8 ++++---- gcc/testsuite/g++.dg/overload/using5.C | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc index 3f753e2d2f98..6229dc452636 100644 --- a/gcc/cp/call.cc +++ b/gcc/cp/call.cc @@ -13350,13 +13350,10 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn, } } - /* F1 is a member of a class D, F2 is a member of a base class B of D, and - for all arguments the corresponding parameters of F1 and F2 have the same - type (CWG 2273/2277). */ - if (DECL_P (cand1->fn) && DECL_CLASS_SCOPE_P (cand1->fn) - && !DECL_CONV_FN_P (cand1->fn) - && DECL_P (cand2->fn) && DECL_CLASS_SCOPE_P (cand2->fn) - && !DECL_CONV_FN_P (cand2->fn)) + /* F1 is a constructor for a class D, F2 is a constructor for a base class B + of D, and for all arguments the corresponding parameters of F1 and F2 have + the same type (CWG 2273/2277). */ + if (DECL_INHERITED_CTOR (cand1->fn) || DECL_INHERITED_CTOR (cand2->fn)) { tree base1 = DECL_CONTEXT (strip_inheriting_ctors (cand1->fn)); tree base2 = DECL_CONTEXT (strip_inheriting_ctors (cand2->fn)); diff --git a/gcc/testsuite/g++.dg/cpp1z/using1.C b/gcc/testsuite/g++.dg/cpp1z/using1.C index 1ed939d45fd4..d8a045255795 100644 --- a/gcc/testsuite/g++.dg/cpp1z/using1.C +++ b/gcc/testsuite/g++.dg/cpp1z/using1.C @@ -1,5 +1,5 @@ -// Test for hiding of used base functions when all the conversion sequences are -// equivalent, needed to avoid a regression on inherited default ctors. +// Test the CWG 2273 inheritedness tiebreaker doesn't apply to +// non-constructors. struct A { @@ -17,7 +17,7 @@ struct B:A int main() { - B().f(1); // OK, derived f hides base f for single arg + B().f(1); // { dg-error "ambiguous" } B().f(1,2); // OK, base f can still be called with two args - B().g(1); // { dg-error "" } signatures differ, ambiguous + B().g(1); // { dg-error "ambiguous" } } diff --git a/gcc/testsuite/g++.dg/overload/using5.C b/gcc/testsuite/g++.dg/overload/using5.C index ad17c78a561e..0933a9f0fac3 100644 --- a/gcc/testsuite/g++.dg/overload/using5.C +++ b/gcc/testsuite/g++.dg/overload/using5.C @@ -24,5 +24,5 @@ struct C: B { int main() { C c (42); - c.f(); + c.f(); // { dg-error "ambiguous" } }