}
}
- /* 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));
-// 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
{
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" }
}