diff options
author | Rafael Avila de Espindola <espindola@google.com> | 2009-04-02 16:02:08 +0000 |
---|---|---|
committer | Rafael Espindola <espindola@gcc.gnu.org> | 2009-04-02 16:02:08 +0000 |
commit | dcb6e95174a4475cebc511bf8e63945c81e5a791 (patch) | |
tree | 4518680eaa0db30a8b3c1170edebd405bdea5944 /gcc | |
parent | d85478c277ad958170d473a59b1c276a508289bb (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-decl.c | 10 |
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 |