From dcb6e95174a4475cebc511bf8e63945c81e5a791 Mon Sep 17 00:00:00 2001 From: Rafael Avila de Espindola Date: Thu, 2 Apr 2009 16:02:08 +0000 Subject: [PATCH] c-decl.c (merge_decls): Make sure newdecl and olddecl don't share the argument list. 2009-04-02 Rafael Avila de Espindola * c-decl.c (merge_decls): Make sure newdecl and olddecl don't share the argument list. From-SVN: r145456 --- gcc/ChangeLog | 5 +++++ gcc/c-decl.c | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 84f4a5707ac9..8aed50f1a077 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-04-02 Rafael Avila de Espindola + + * c-decl.c (merge_decls): Make sure newdecl and olddecl don't + share the argument list. + 2009-04-02 Rafael Avila de Espindola Merge diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 8930d93c0cda..76f7fe482f5b 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 -- 2.47.3