re PR c++/52746 (Explicit virtual destructor call replaced by direct call in template function)

PR c++/52746
	* typeck.c (lookup_destructor): Clear BASELINK_QUALIFIED_P if
	we didn't get an explicit scope.
	* pt.c (tsubst_baselink): Likewise.

From-SVN: r185961
This commit is contained in:
Jason Merrill 2012-03-29 09:20:18 -04:00 committed by Jason Merrill
parent 4141dd56b5
commit 664359178e
5 changed files with 55 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2012-03-28 Jason Merrill <jason@redhat.com>
PR c++/52746
* typeck.c (lookup_destructor): Clear BASELINK_QUALIFIED_P if
we didn't get an explicit scope.
* pt.c (tsubst_baselink): Likewise.
2012-03-22 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/52487

View File

@ -11858,6 +11858,7 @@ tsubst_baselink (tree baselink, tree object_type,
tree optype;
tree template_args = 0;
bool template_id_p = false;
bool qualified = BASELINK_QUALIFIED_P (baselink);
/* A baselink indicates a function from a base class. Both the
BASELINK_ACCESS_BINFO and the base class referenced may
@ -11906,9 +11907,12 @@ tsubst_baselink (tree baselink, tree object_type,
if (!object_type)
object_type = current_class_type;
return adjust_result_of_qualified_name_lookup (baselink,
qualifying_scope,
object_type);
if (qualified)
baselink = adjust_result_of_qualified_name_lookup (baselink,
qualifying_scope,
object_type);
return baselink;
}
/* Like tsubst_expr for a SCOPE_REF, given by QUALIFIED_ID. DONE is

View File

@ -2410,6 +2410,11 @@ lookup_destructor (tree object, tree scope, tree dtor_name)
tf_warning_or_error);
expr = (adjust_result_of_qualified_name_lookup
(expr, dtor_type, object_type));
if (scope == NULL_TREE)
/* 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 (expr) = false;
return expr;
}

View File

@ -1,3 +1,8 @@
2012-03-28 Jason Merrill <jason@redhat.com>
PR c++/52746
* g++.dg/overload/virtual2.C: New.
2012-03-28 Martin Jambor <mjambor@suse.cz>
Backported from mainline

View File

@ -0,0 +1,31 @@
// PR c++/52746
// { dg-do run }
extern "C" int printf(const char*,...);
extern "C" void abort();
bool db;
struct A
{
virtual ~A() {}
};
struct B : public A
{
virtual ~B() { db = true; }
};
template<int> void test()
{
B * b = new B;
A * a = b;
a->~A();
::operator delete(b);
}
int main()
{
test<0>();
if (!db)
abort();
}