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
This commit is contained in:
parent
8187e104e7
commit
917c1602aa
5 changed files with 55 additions and 3 deletions
|
@ -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-28 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
* typeck2.c (process_init_constructor_array): Use the proper
|
||||
|
|
10
gcc/cp/pt.c
10
gcc/cp/pt.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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.
|
||||
|
|
31
gcc/testsuite/g++.dg/overload/virtual2.C
Normal file
31
gcc/testsuite/g++.dg/overload/virtual2.C
Normal 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();
|
||||
}
|
Loading…
Add table
Reference in a new issue