aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRafael Avila de Espindola <espindola@google.com>2009-04-02 16:02:08 +0000
committerRafael Espindola <espindola@gcc.gnu.org>2009-04-02 16:02:08 +0000
commitdcb6e95174a4475cebc511bf8e63945c81e5a791 (patch)
tree4518680eaa0db30a8b3c1170edebd405bdea5944 /gcc
parentd85478c277ad958170d473a59b1c276a508289bb (diff)
downloadgcc-dcb6e95174a4475cebc511bf8e63945c81e5a791.zip
gcc-dcb6e95174a4475cebc511bf8e63945c81e5a791.tar.gz
gcc-dcb6e95174a4475cebc511bf8e63945c81e5a791.tar.bz2
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> * c-decl.c (merge_decls): Make sure newdecl and olddecl don't share the argument list. From-SVN: r145456
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-decl.c10
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 84f4a57..8aed50f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
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
2009-02-12 Diego Novillo <dnovillo@google.com>
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 8930d93..76f7fe4 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -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