OSDN Git Service

cp:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Apr 2001 12:47:22 +0000 (12:47 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Apr 2001 12:47:22 +0000 (12:47 +0000)
* 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

gcc/cp/ChangeLog
gcc/cp/optimize.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/warn7.C [new file with mode: 0644]

index 7dc59bf..7e49e69 100644 (file)
@@ -1,5 +1,9 @@
 2001-04-27  Nathan Sidwell  <nathan@codesourcery.com>
 
+       * optimize.c (maybe_clone_body): Copy parameter names and locations.
+
+2001-04-27  Nathan Sidwell  <nathan@codesourcery.com>
+
        * cp-tree.h (adjust_clone_args): Prototype new function.
        * class.c (adjust_clone_args): New function.
        * decl.c (start_function): Call it for in charge ctors.
index 541bdf9..ae5a1ff 100644 (file)
@@ -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);
index 1f7bb78..d04c26c 100644 (file)
@@ -1,5 +1,9 @@
 2001-04-27  Nathan Sidwell  <nathan@codesourcery.com>
 
+       * g++.old-deja/g++.other/warn7.C: New test.
+
+2001-04-27  Nathan Sidwell  <nathan@codesourcery.com>
+
        * g++.old-deja/g++.other/defarg9.C: New test.
 
 2001-04-26  Toon Moene  <toon@moene.indiv.nluug.nl>
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 (file)
index 0000000..a27756a
--- /dev/null
@@ -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 <nathan@codesourcery.com>
+
+// 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
+}