method.c (implicitly_declare_fn): Commonize code for copy ctor and assignment op.
authorNathan Sidwell <nathan@codesourcery.com>
Wed, 11 Apr 2001 08:43:16 +0000 (08:43 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 11 Apr 2001 08:43:16 +0000 (08:43 +0000)
cp:
* method.c (implicitly_declare_fn): Commonize code for copy ctor
and assignment op. Set TREE_USED for parameter.
testsuite:
* g++.old-deja/g++.other/warn6.C: New test.

From-SVN: r41243

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

index 7b5aee39e42097f93a6de10eb6466a25989be725..6a871d4d8280bf2252914c8ae6e1d78ca97719f5 100644 (file)
@@ -1,3 +1,8 @@
+2001-04-11  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * method.c (implicitly_declare_fn): Commonize code for copy ctor
+       and assignment op. Set TREE_USED for parameter.
+
 2001-04-10  Mark Mitchell  <mark@codesourcery.com>
 
        * class.c (find_final_overrider_data): Add `candidates'.
index 7c55fd8f95714d6f3e366e5056c2945ee3d7c537..2f894846a80aa30ceec7308225e12af2f061812f 100644 (file)
@@ -957,8 +957,8 @@ implicitly_declare_fn (kind, type, const_p)
   tree declspecs = NULL_TREE;
   tree fn, args = NULL_TREE;
   tree raises = empty_except_spec;
-  tree argtype;
   int retref = 0;
+  int has_parm = 0;
   tree name = constructor_name (TYPE_IDENTIFIER (type));
 
   switch (kind)
@@ -977,40 +977,33 @@ implicitly_declare_fn (kind, type, const_p)
       break;
 
     case sfk_copy_constructor:
-    {
-      struct copy_data data;
-      
-      if (const_p)
-       type = build_qualified_type (type, TYPE_QUAL_CONST);
-      argtype = build_reference_type (type);
-      args = tree_cons (NULL_TREE,
-                       build_tree_list (hash_tree_chain (argtype, NULL_TREE),
-                                        get_identifier ("_ctor_arg")),
-                       void_list_node);
-      data.name = NULL;
-      data.quals = const_p ? TYPE_QUAL_CONST : 0;
-      raises = synthesize_exception_spec (type, &locate_copy, &data);
-      break;
-    }
     case sfk_assignment_operator:
     {
       struct copy_data data;
+      tree argtype;
       
-      retref = 1;
-      declspecs = build_tree_list (NULL_TREE, type);
+      has_parm = 1;
+      data.name = NULL;
+      data.quals = 0;
+      if (kind == sfk_assignment_operator)
+        {
+          retref = 1;
+          declspecs = build_tree_list (NULL_TREE, type);
 
+          name = ansi_assopname (NOP_EXPR);
+          data.name = name;
+        }
       if (const_p)
-       type = build_qualified_type (type, TYPE_QUAL_CONST);
-
-      name = ansi_assopname (NOP_EXPR);
-
+        {
+          data.quals = TYPE_QUAL_CONST;
+          type = build_qualified_type (type, TYPE_QUAL_CONST);
+        }
+    
       argtype = build_reference_type (type);
-      args = tree_cons (NULL_TREE,
-                       build_tree_list (hash_tree_chain (argtype, NULL_TREE),
-                                        get_identifier ("_ctor_arg")),
-                       void_list_node);
-      data.name = name;
-      data.quals = const_p ? TYPE_QUAL_CONST : 0;
+      args = build_tree_list (hash_tree_chain (argtype, NULL_TREE),
+                             get_identifier ("_ctor_arg"));
+      args = tree_cons (NULL_TREE, args, void_list_node);
+      
       raises = synthesize_exception_spec (type, &locate_copy, &data);
       break;
     }
@@ -1022,10 +1015,13 @@ implicitly_declare_fn (kind, type, const_p)
 
   {
     tree declarator = make_call_declarator (name, args, NULL_TREE, raises);
+    
     if (retref)
       declarator = build_nt (ADDR_EXPR, declarator);
 
     fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE);
+    if (has_parm)
+      TREE_USED (FUNCTION_FIRST_USER_PARM (fn)) = 1;
   }
 
   my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 20000408);
index ef3667496dd465f9249f48e2c83b37856902c598..df0f05ba7f39107ddab6a384ec64d67d3db6c52c 100644 (file)
@@ -1,3 +1,7 @@
+2001-04-11  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.other/warn6.C: New test.
+
 22001-04-11  Peter Schmid  <schmid@snake.iap.physik.tu-darmstadt.de>
 
         * g++.old-deja/g++.robertl/eb42.C: Same.
diff --git a/gcc/testsuite/g++.old-deja/g++.other/warn6.C b/gcc/testsuite/g++.old-deja/g++.other/warn6.C
new file mode 100644 (file)
index 0000000..1a54b32
--- /dev/null
@@ -0,0 +1,17 @@
+// Build don't link:
+// Special g++ Options: -W -Wall
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Mar 2001 <nathan@codesourcery.com>
+
+// Bug 2139. We gave an erronous warning about an unused parm on a
+// synthesized function
+
+struct A
+{
+  virtual ~A ();
+};
+void foo (A const &a)
+{
+  A a1 = a;
+}