OSDN Git Service

PR c++/3948 -- C++ ABI change, followup to 2001-12-18 patch.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Mar 2002 11:24:24 +0000 (11:24 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Mar 2002 11:24:24 +0000 (11:24 +0000)
        * class.c (finish_struct_bits): Also set TREE_ADDRESSABLE for a
        type with a nontrivial destructor.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50959 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/g++.dg/init/byval1.C [new file with mode: 0644]

index d27a93b..8fc4c80 100644 (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
index 8923916..1c0c526 100644 (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)))
     {
diff --git a/gcc/testsuite/g++.dg/init/byval1.C b/gcc/testsuite/g++.dg/init/byval1.C
new file mode 100644 (file)
index 0000000..86c6e46
--- /dev/null
@@ -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;
+}