c-decl.c (merge_decls): Make sure newdecl and olddecl don't share the argument list.
authorRafael Avila de Espindola <espindola@google.com>
Thu, 2 Apr 2009 16:02:08 +0000 (16:02 +0000)
committerRafael Espindola <espindola@gcc.gnu.org>
Thu, 2 Apr 2009 16:02:08 +0000 (16:02 +0000)
2009-04-02  Rafael Avila de Espindola  <espindola@google.com>

* c-decl.c (merge_decls): Make sure newdecl and olddecl don't
share the argument list.

From-SVN: r145456

gcc/ChangeLog
gcc/c-decl.c

index 84f4a5707ac9f687ee41eb99c0975e544963cbc9..8aed50f1a077eae32cc6610a24c7d25e60e3f9c4 100644 (file)
@@ -1,3 +1,8 @@
+2009-04-02  Rafael Avila de Espindola  <espindola@google.com>
+
+       * c-decl.c (merge_decls): Make sure newdecl and olddecl don't
+       share the argument list.
+
 2009-04-02  Rafael Avila de Espindola  <espindola@google.com>
 
        Merge
index 8930d93c0cda2d3745624d7309205bb655da36f6..76f7fe482f5b977266903d5ba8cf3f2a2b27cb3a 100644 (file)
@@ -1853,12 +1853,15 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
       /* Also preserve various other info from the definition.  */
       if (!new_is_definition)
        {
+         tree t;
          DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
          DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
          DECL_STRUCT_FUNCTION (newdecl) = DECL_STRUCT_FUNCTION (olddecl);
          DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl);
          gimple_set_body (newdecl, gimple_body (olddecl));
-         DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
+         DECL_ARGUMENTS (newdecl) = copy_list (DECL_ARGUMENTS (olddecl));
+         for (t = DECL_ARGUMENTS (newdecl); t ; t = TREE_CHAIN (t))
+           DECL_CONTEXT (t) = newdecl;
 
          /* See if we've got a function to instantiate from.  */
          if (DECL_SAVED_TREE (olddecl))
@@ -1880,6 +1883,9 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
   {
     unsigned olddecl_uid = DECL_UID (olddecl);
     tree olddecl_context = DECL_CONTEXT (olddecl);
+    tree olddecl_arguments = NULL;
+    if (TREE_CODE (olddecl) == FUNCTION_DECL)
+      olddecl_arguments = DECL_ARGUMENTS (olddecl);
 
     memcpy ((char *) olddecl + sizeof (struct tree_common),
            (char *) newdecl + sizeof (struct tree_common),
@@ -1910,6 +1916,8 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
       }
     DECL_UID (olddecl) = olddecl_uid;
     DECL_CONTEXT (olddecl) = olddecl_context;
+    if (TREE_CODE (olddecl) == FUNCTION_DECL)
+      DECL_ARGUMENTS (olddecl) = olddecl_arguments;
   }
 
   /* If OLDDECL had its DECL_RTL instantiated, re-invoke make_decl_rtl