Commit ffd696af by Jason Merrill Committed by Jason Merrill

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
parent 38cb4e84
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> 2002-03-17 Jason Merrill <jason@redhat.com>
PR c++/4460 PR c++/4460
......
...@@ -1879,15 +1879,16 @@ finish_struct_bits (t) ...@@ -1879,15 +1879,16 @@ finish_struct_bits (t)
} }
} }
/* If this type has a copy constructor, force its mode to be BLKmode, and /* If this type has a copy constructor or a destructor, force its mode to
force its TREE_ADDRESSABLE bit to be nonzero. This will cause it to be BLKmode, and force its TREE_ADDRESSABLE bit to be nonzero. This
be passed by invisible reference and prevent it from being returned in will cause it to be passed by invisible reference and prevent it from
a register. being returned in a register.
Also do this if the class has BLKmode but can still be returned in 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 registers, since function_cannot_inline_p won't let us inline
functions returning such a type. This affects the HP-PA. */ functions returning such a type. This affects the HP-PA. */
if (! TYPE_HAS_TRIVIAL_INIT_REF (t) if (! TYPE_HAS_TRIVIAL_INIT_REF (t)
|| TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
|| (TYPE_MODE (t) == BLKmode && ! aggregate_value_p (t) || (TYPE_MODE (t) == BLKmode && ! aggregate_value_p (t)
&& CLASSTYPE_NON_AGGREGATE (t))) && CLASSTYPE_NON_AGGREGATE (t)))
{ {
......
// 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;
}
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