On Fri, Jul 22, 2016 at 7:32 PM, Jason Merrill <ja...@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 <ja...@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 --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; +}