PR c++/3948 -- C++ ABI change, followup to 2001-12-18 patch.

* class.c (finish_struct_bits): Also set TREE_ADDRESSABLE for a
        type with a nontrivial destructor.

From-SVN: r50959
This commit is contained in:
Jason Merrill 2002-03-18 06:24:24 -05:00 committed by Jason Merrill
parent 38cb4e8407
commit ffd696af84
3 changed files with 42 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2002-03-18 Jason Merrill <jason@redhat.com>
PR c++/3948 -- C++ ABI change, followup to 2001-12-18 patch.
* class.c (finish_struct_bits): Also set TREE_ADDRESSABLE for a
type with a nontrivial destructor.
2002-03-17 Jason Merrill <jason@redhat.com>
PR c++/4460

View File

@ -1879,15 +1879,16 @@ finish_struct_bits (t)
}
}
/* If this type has a copy constructor, force its mode to be BLKmode, and
force its TREE_ADDRESSABLE bit to be nonzero. This will cause it to
be passed by invisible reference and prevent it from being returned in
a register.
/* If this type has a copy constructor or a destructor, force its mode to
be BLKmode, and force its TREE_ADDRESSABLE bit to be nonzero. This
will cause it to be passed by invisible reference and prevent it from
being returned in a register.
Also do this if the class has BLKmode but can still be returned in
registers, since function_cannot_inline_p won't let us inline
functions returning such a type. This affects the HP-PA. */
if (! TYPE_HAS_TRIVIAL_INIT_REF (t)
|| TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
|| (TYPE_MODE (t) == BLKmode && ! aggregate_value_p (t)
&& CLASSTYPE_NON_AGGREGATE (t)))
{

View File

@ -0,0 +1,31 @@
// PR c++/3948
// Test that the destructor call for a value parameter gets the
// right address.
// { dg-do run }
void *p[2];
int i;
int r;
struct C
{
int m;
C() { p[i++] = this; }
~C() { if (p[--i] != this) r = 1; }
};
void Foo (C c)
{
p[i++] = &c;
}
int main ()
{
C c;
Foo (c);
return r;
}