diff mbox

C++ PATCH for c++/71748 (call to base dtor in template)

Message ID CADzB+2mwuBP057jwk+uEgSeajpB_eXL1m6enYV-_A1_Lss4aAQ@mail.gmail.com
State New
Headers show

Commit Message

Jason Merrill July 22, 2016, 11:52 p.m. UTC
On Fri, Jul 22, 2016 at 7:32 PM, Jason Merrill <jason@redhat.com> wrote:
> The fix for 52746 was incomplete; it didn't propagate the
> adjust_result_of_qualified_name_lookup handling from lookup_destructor
> to tsubst_baselink.  Fixed thus.
>
> Tested x86_64-pc-linux-gnu, applying to trunk.
commit 732dce1a04cbe7d9d6edcbb2abe6a403541a9560
Author: Jason Merrill <jason@redhat.com>
Date:   Fri Jul 22 12:57:48 2016 -0400

    	PR c++/71748 - call to base destructor in template.
    
    	PR c++/52746
    	* pt.c (tsubst_baselink): Call
    	adjust_result_of_qualified_name_lookup for unqualified
    	destructors.
diff mbox

Patch

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5e29d99..3ee53d1 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -13760,10 +13760,17 @@  tsubst_baselink (tree baselink, tree object_type,
     if (!object_type)
       object_type = current_class_type;
 
-    if (qualified)
-      baselink = adjust_result_of_qualified_name_lookup (baselink,
-							 qualifying_scope,
-							 object_type);
+    if (qualified || name == complete_dtor_identifier)
+      {
+	baselink = adjust_result_of_qualified_name_lookup (baselink,
+							   qualifying_scope,
+							   object_type);
+	if (!qualified)
+	  /* We need to call adjust_result_of_qualified_name_lookup in case the
+	     destructor names a base class, but we unset BASELINK_QUALIFIED_P
+	     so that we still get virtual function binding.  */
+	  BASELINK_QUALIFIED_P (baselink) = false;
+      }
     return baselink;
 }
 
diff --git a/gcc/testsuite/g++.dg/template/dtor10.C b/gcc/testsuite/g++.dg/template/dtor10.C
new file mode 100644
index 0000000..4307a68
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/dtor10.C
@@ -0,0 +1,23 @@ 
+// PR c++/71748
+
+struct A
+{ 
+  virtual ~A () {}
+};
+
+struct B : public A
+{ 
+  virtual ~B () {}
+};
+
+template < int > void foo ()
+{ 
+  B *b = new B;
+  b->~A ();
+}
+
+int main ()
+{ 
+  foo < 0 > ();
+  return 0;
+}