re PR tree-optimization/16115 (double-destruction problem with argument passing via...
authorJason Merrill <jason@redhat.com>
Thu, 24 Jun 2004 20:07:23 +0000 (16:07 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 24 Jun 2004 20:07:23 +0000 (16:07 -0400)
        PR c++/16115
        * decl.c (grokparms): Give the PARM_DECL reference type if the
        parameter is passed by invisible reference.

From-SVN: r83609

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

index 678e0cac13a056e013dc65c1e4189709daca1dde..fee6c9a122340f64ad660e6c92dbbd01d41d0e57 100644 (file)
@@ -1,3 +1,9 @@
+2004-06-24  Jason Merrill  <jason@redhat.com>
+
+       PR c++/16115
+       * decl.c (grokparms): Give the PARM_DECL reference type if the
+       parameter is passed by invisible reference.
+
 2004-06-24  Andreas Schwab  <schwab@suse.de>
 
        * cp-tree.h (enum cp_storage_class): Remove trailing comma.
index e986cb7aa7c9b82e1c48471a39e5e67e93ea3b8c..2798440816f068c76304e4a29fac6ee3fcbcf269 100644 (file)
@@ -8224,6 +8224,13 @@ grokparms (cp_parameter_declarator *first_parm, tree *parms)
 
       if (type != error_mark_node)
        {
+         /* If this type is passed by invisible reference, make the PARM_DECL
+            reflect that so that alias analysis knows that the actual object
+            is external to the function.  */
+         if (TREE_ADDRESSABLE (type))
+           decl = build_decl (PARM_DECL, DECL_NAME (decl),
+                              build_reference_type (type));
+
          /* Top-level qualifiers on the parameters are
             ignored for function types.  */
          type = cp_build_qualified_type (type, 0);
@@ -8258,7 +8265,7 @@ grokparms (cp_parameter_declarator *first_parm, tree *parms)
            }
 
          if (!any_error && init)
-           init = check_default_argument (decl, init);
+           init = check_default_argument (type, init);
          else
            init = NULL_TREE;
        }
diff --git a/gcc/testsuite/g++.dg/init/call1.C b/gcc/testsuite/g++.dg/init/call1.C
new file mode 100644 (file)
index 0000000..15b700f
--- /dev/null
@@ -0,0 +1,35 @@
+// Bug c++/16115
+// { dg-do run }
+
+extern "C" void abort(); 
+int count = 0; 
+struct T { 
+    T() { count++; } 
+    T(const T&) { count++; } 
+    ~T() { if (count==0) abort(); --count; } 
+}; 
+struct auto_ptr { 
+    T* p; 
+    auto_ptr(T* __p) : p(__p) { } 
+    ~auto_ptr() { delete p; } 
+    T* release() { 
+      T* t = p; 
+      p = 0; 
+      return t; 
+    } 
+}; 
+void destroy (auto_ptr a) { 
+  delete a.release(); 
+} 
+int main () 
+{ 
+  destroy (new T); 
+}