diff options
author | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-04-27 12:47:22 +0000 |
---|---|---|
committer | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-04-27 12:47:22 +0000 |
commit | 17d36341446d10235ad7e4c66462e2c77846c005 (patch) | |
tree | 3ecd1e3881ee02b7bc81981fbffbe159cf82615e /gcc/cp/optimize.c | |
parent | a321abdb59be41dfddd43cb690be9bd0dc393caf (diff) | |
download | gcc-17d36341446d10235ad7e4c66462e2c77846c005.tar.gz |
cp:
* optimize.c (maybe_clone_body): Copy parameter names and locations.
testsuite:
* g++.old-deja/g++.other/warn7.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41627 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/optimize.c')
-rw-r--r-- | gcc/cp/optimize.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index 541bdf95fb0..ae5a1ff3c40 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -1019,6 +1019,7 @@ maybe_clone_body (fn) { inline_data id; tree clone; + int first = 1; /* We only clone constructors and destructors. */ if (!DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn) @@ -1032,7 +1033,7 @@ maybe_clone_body (fn) list. */ for (clone = TREE_CHAIN (fn); clone && DECL_CLONED_FUNCTION_P (clone); - clone = TREE_CHAIN (clone)) + clone = TREE_CHAIN (clone), first = 0) { tree parm; tree clone_parm; @@ -1053,6 +1054,30 @@ maybe_clone_body (fn) DECL_NOT_REALLY_EXTERN (clone) = DECL_NOT_REALLY_EXTERN (fn); TREE_PUBLIC (clone) = TREE_PUBLIC (fn); + /* Adjust the parameter names and locations. */ + parm = DECL_ARGUMENTS (fn); + clone_parm = DECL_ARGUMENTS (clone); + if (DECL_HAS_IN_CHARGE_PARM_P (fn)) + parm = TREE_CHAIN (parm); + if (DECL_HAS_VTT_PARM_P (fn)) + parm = TREE_CHAIN (parm); + if (DECL_HAS_VTT_PARM_P (clone)) + clone_parm = TREE_CHAIN (clone_parm); + for (; parm; + parm = TREE_CHAIN (parm), clone_parm = TREE_CHAIN (clone_parm)) + { + DECL_ABSTRACT_ORIGIN (clone_parm) = parm; + + /* The name may have changed from the declaration. */ + DECL_NAME (clone_parm) = DECL_NAME (parm); + DECL_SOURCE_FILE (clone_parm) = DECL_SOURCE_FILE (parm); + DECL_SOURCE_LINE (clone_parm) = DECL_SOURCE_LINE (parm); + + /* We should only give unused information for one clone. */ + if (!first) + TREE_USED (clone_parm) = 1; + } + /* Start processing the function. */ push_to_top_level (); start_function (NULL_TREE, clone, NULL_TREE, SF_PRE_PARSED); @@ -1115,7 +1140,6 @@ maybe_clone_body (fn) function. */ else { - DECL_ABSTRACT_ORIGIN (clone_parm) = parm; splay_tree_insert (id.decl_map, (splay_tree_key) parm, (splay_tree_value) clone_parm); |