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.

Tested x86_64-pc-linux-gnu, applying to trunk.

        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.
---
 gcc/cp/pt.c                              | 15 +++++++++++++--
 gcc/testsuite/g++.dg/template/access39.C | 17 +++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/template/access39.C

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index d4bb5cc5eaf..15947b2c812 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
diff --git a/gcc/testsuite/g++.dg/template/access39.C 
b/gcc/testsuite/g++.dg/template/access39.C
new file mode 100644
index 00000000000..d941555577e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/access39.C
@@ -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();
+}

base-commit: 9e64426dae129cca5b62355ef6c5a3bd6137e830
-- 
2.27.0

Reply via email to