https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113191
Patrick Palka <ppalka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Summary|[10.1/11/12/13/14 |[11/12/13/14 Regression]
|Regression] Incorrect |Incorrect overload
|overload resolution when |resolution when base class
|base class function |function introduced with a
|introduced with a using |using declaration is more
|declaration is more |constrained than a function
|constrained than a function |declared in the derived
|declared in the derived |class
|class |
Target Milestone|--- |11.5
Status|UNCONFIRMED |NEW
Last reconfirmed| |2024-01-02
Known to work| |10.1.0
CC| |jason at gcc dot gnu.org,
| |ppalka at gcc dot gnu.org
Known to fail| |10.5.0, 11.4.0, 12.3.0,
| |13.2.0, 14.0
--- Comment #1 from Patrick Palka <ppalka at gcc dot gnu.org> ---
We started rejecting the first testcase since r11-1571-g57b4daf8dc4ed7.
> We do the right thing in more_specialized_fn (which is why the second
case works fine), but that doesn't apply in this case. Perhaps we
should be lifting that work from more_specialized_fn to joust?
Looking at the above commit, joust already takes care to check more_constrained
for non-template functions, and only if their function parameters match
according to cand_parms_match. But here cand_parms_match returns false due to
different implicit object parameters:
(gdb) frame
#0 cand_parms_match (c2=0x3402cc0, c1=0x3402d70) at gcc/cp/call.cc:12699
12699 if (DECL_FUNCTION_MEMBER_P (fn1)
(gdb) pct parms1
struct B *, void
(gdb) pct parms2
struct S *, void
In contrast more_specialized_fn skips over the implicit object parameter when
comparing two non-static memfns. Maybe cand_parms_match should follow suit?