From: Nathan Sidwell Date: Fri, 27 Apr 2001 12:47:22 +0000 (+0000) Subject: optimize.c (maybe_clone_body): Copy parameter names and locations. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=02a1a68c6acafc9d9a1af97a9eefebd9af69d477;p=gcc.git optimize.c (maybe_clone_body): Copy parameter names and locations. cp: * optimize.c (maybe_clone_body): Copy parameter names and locations. testsuite: * g++.old-deja/g++.other/warn7.C: New test. From-SVN: r41627 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7dc59bfe540..7e49e694c43 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2001-04-27 Nathan Sidwell + + * optimize.c (maybe_clone_body): Copy parameter names and locations. + 2001-04-27 Nathan Sidwell * cp-tree.h (adjust_clone_args): Prototype new function. 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1f7bb78b116..d04c26cb506 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-04-27 Nathan Sidwell + + * g++.old-deja/g++.other/warn7.C: New test. + 2001-04-27 Nathan Sidwell * g++.old-deja/g++.other/defarg9.C: New test. diff --git a/gcc/testsuite/g++.old-deja/g++.other/warn7.C b/gcc/testsuite/g++.old-deja/g++.other/warn7.C new file mode 100644 index 00000000000..a27756a1a9a --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/warn7.C @@ -0,0 +1,45 @@ +// Build don't link: +// Special g++ Options: -W -Wall +// +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 April 2001 + +// Bug 2356. Unused parameter information introduced in a ctor +// definition was not propagated to clones, leading to missed or +// unwarranted unused parameter warnings, possibly given twice. + +struct X +{ + X(int i); + void foo (int i); + +}; +void foo (int i); + +X::X(int) +{ +} +void X::foo (int) +{ +} +void foo (int) +{ +} + +struct Y +{ + Y(int); + void bar (int); + +}; +void bar (int); + +Y::Y(int i) +{ // WARNING - unused parameter +} +void Y::bar (int i) +{ // WARNING - unused parameter +} +void bar (int i) +{ // WARNING - unused parameter +}