c++: alias with same name as base fn [PR91706]
commitf07edb5d7f3e77218ec846a9382f7c1d23e67b71
authorJason Merrill <jason@redhat.com>
Fri, 16 Apr 2021 15:13:40 +0000 (16 11:13 -0400)
committerJason Merrill <jason@redhat.com>
Tue, 8 Jun 2021 03:55:04 +0000 (7 23:55 -0400)
treeda1e0a78879e276c05375527a16e59507fa64c1f
parent715614ec3ec5390293e508bb190335d28db1fa8b
c++: alias with same name as base fn [PR91706]

This is a bit complex.  Looking up c<T> in the definition of D::c finds
C::c, OK.  Looking up c in the definition of E finds D::c, OK.  Since the
alias is not dependent, we strip it from the template argument, leaving

using E = A<decltype(c<T>())>;

where 'c' still refers to C::c.  But instantiating E looks up 'c' again and
finds D::c, which isn't a function, and sadness ensues.

I think the bug here is looking up 'c' in D at instantiation time; the
declaration we found before is not dependent.  This seems to happen because
baselink_for_fns gets BASELINK_BINFO wrong; it is supposed to be the base
where lookup found the functions, C in this case.

gcc/cp/ChangeLog:

PR c++/91706
* semantics.c (baselink_for_fns): Fix BASELINK_BINFO.

gcc/testsuite/ChangeLog:

PR c++/91706
* g++.dg/template/lookup17.C: New test.
gcc/cp/semantics.c
gcc/testsuite/g++.dg/template/lookup17.C [new file with mode: 0644]