Commit 917c1602 by Jason Merrill Committed by Jason Merrill

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: r185945
parent 8187e104
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-28 Richard Guenther <rguenther@suse.de>
* typeck2.c (process_init_constructor_array): Use the proper
......
......@@ -11814,6 +11814,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
......@@ -11862,9 +11863,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
......
......@@ -2415,6 +2415,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;
}
......
2012-03-28 Jason Merrill <jason@redhat.com>
PR c++/52746
* g++.dg/overload/virtual2.C: New.
2012-03-28 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/vect7.ad[sb]: New test.
......
// 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();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment