diff mbox series

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

Message ID 20210616212816.2226798-1-jason@redhat.com
State New
Headers show
Series [pushed] c++: static memfn from non-dependent base [PR101078] | expand

Commit Message

Jason Merrill June 16, 2021, 9:28 p.m. UTC
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


base-commit: 9e64426dae129cca5b62355ef6c5a3bd6137e830
diff mbox series

Patch

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();
+}