c++: static memfn from non-dependent base [PR101078]

After my patch for PR91706, or before that with the qualified call,
tsubst_baselink returned a BASELINK with BASELINK_BINFO indicating a base of
a still-dependent derived class.  We need to look up the relevant base binfo
in the substituted class.

	PR c++/101078

gcc/cp/ChangeLog:

	* pt.c (tsubst_baselink): Update binfos in non-dependent case.

gcc/testsuite/ChangeLog:

	* g++.dg/template/access39.C: New test.
This commit is contained in:
Jason Merrill 2021-06-16 16:09:59 -04:00
parent 950a97a503
commit 5b98dd6703
2 changed files with 30 additions and 2 deletions

View File

@ -15460,8 +15460,19 @@ tsubst_baselink (tree baselink, tree object_type,
fns = BASELINK_FUNCTIONS (baselink);
}
else
/* We're going to overwrite pieces below, make a duplicate. */
baselink = copy_node (baselink);
{
/* We're going to overwrite pieces below, make a duplicate. */
baselink = copy_node (baselink);
if (qualifying_scope != BINFO_TYPE (BASELINK_ACCESS_BINFO (baselink)))
{
/* The decl we found was from non-dependent scope, but we still need
to update the binfos for the instantiated qualifying_scope. */
BASELINK_ACCESS_BINFO (baselink) = TYPE_BINFO (qualifying_scope);
BASELINK_BINFO (baselink) = lookup_base (qualifying_scope, binfo_type,
ba_unique, NULL, complain);
}
}
/* If lookup found a single function, mark it as used at this point.
(If lookup found multiple functions the one selected later by

View File

@ -0,0 +1,17 @@
// PR c++/101078
struct A {
static void f();
};
template<class>
struct B : private A {
struct C {
void g() { f(); }
void g2() { B::f(); }
};
};
int main() {
B<int>::C().g();
}