diff options
author | Jason Merrill <jason@redhat.com> | 2021-06-16 16:09:59 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2021-06-16 17:28:36 -0400 |
commit | 6816a44dfe1b5fa9414490a18a4aa723b6f38f18 (patch) | |
tree | cf3fb47eb10171c34128f45e48f2731c3e57201d /gcc/cp | |
parent | cfe0a2ec26867b290eb84af00317e60f8b67455c (diff) | |
download | gcc-6816a44dfe1b5fa9414490a18a4aa723b6f38f18.zip gcc-6816a44dfe1b5fa9414490a18a4aa723b6f38f18.tar.gz gcc-6816a44dfe1b5fa9414490a18a4aa723b6f38f18.tar.bz2 |
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
PR c++/91706
gcc/cp/ChangeLog:
* pt.c (tsubst_baselink): Update binfos in non-dependent case.
gcc/testsuite/ChangeLog:
* g++.dg/template/access39.C: New test.
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/pt.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d4bb5cc..15947b2 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -16249,8 +16249,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, nullptr, complain); + } + } /* If lookup found a single function, mark it as used at this point. (If lookup found multiple functions the one selected later by |