PR c++/88136 - -Wdeprecated-copy false positives
authorJason Merrill <jason@redhat.com>
Thu, 6 Dec 2018 21:17:08 +0000 (16:17 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 6 Dec 2018 21:17:08 +0000 (16:17 -0500)
Deprecating the copy operations because the class has a user-provided
destructor turns out to have too many false positives; this patch adjusts
-Wdeprecated-copy to only deprecate if the other copy operation is
user-provided.  To get the earlier behavior, people can explicitly request
it with -Wdeprecated-copy-dtor.

gcc/c-family/
* c.opt (Wdeprecated-copy-dtor): New.
(Wdeprecated-copy): Move to -Wextra.
gcc/cp/
* class.c (classtype_has_depr_implicit_copy): Rename from
classtype_has_user_copy_or_dtor.
* method.c (lazily_declare_fn): Adjust.
* decl2.c (cp_warn_deprecated_use): Refer to -Wdeprecated-copy-dtor
if deprecation is due to a destructor.

From-SVN: r266867

gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/method.c
gcc/doc/invoke.texi
gcc/testsuite/g++.dg/cpp0x/depr-copy1.C

index 890b014449d81959859bb99960f8aa36f67a907b..7015aeec693330e71d41b826a29efcd8ad7efb92 100644 (file)
@@ -1,3 +1,9 @@
+2018-12-06  Jason Merrill  <jason@redhat.com>
+
+       PR c++/88136 - -Wdeprecated-copy false positives
+       * c.opt (Wdeprecated-copy-dtor): New.
+       (Wdeprecated-copy): Move to -Wextra.
+
 2018-11-29  Martin Sebor  <msebor@redhat.com>
 
        PR c/88172
index 6f88a1013d6f67b6d709896cd87c7760cdecc04e..07ff1c84f9644ad250f13cb855bfd414cc9ba1b6 100644 (file)
@@ -481,7 +481,12 @@ C C++ ObjC ObjC++ CPP(cpp_warn_deprecated) CppReason(CPP_W_DEPRECATED) Var(warn_
 Warn if a deprecated compiler feature, class, method, or field is used.
 
 Wdeprecated-copy
-C++ ObjC++ Var(warn_deprecated_copy) Warning LangEnabledBy(C++ ObjC++, Wall)
+C++ ObjC++ Var(warn_deprecated_copy) Warning LangEnabledBy(C++ ObjC++, Wextra)
+Mark implicitly-declared copy operations as deprecated if the class has a
+user-provided copy operation.
+
+Wdeprecated-copy-dtor
+C++ ObjC++ Var(warn_deprecated_copy, 2) Warning
 Mark implicitly-declared copy operations as deprecated if the class has a
 user-provided copy operation or destructor.
 
index 1a3e73e40c6dcb2793d773db9781a602b5081fb5..601ca78a147ce01b53781eb372619151c147ac9e 100644 (file)
@@ -1,3 +1,12 @@
+2018-12-06  Jason Merrill  <jason@redhat.com>
+
+       PR c++/88136 - -Wdeprecated-copy false positives
+       * class.c (classtype_has_depr_implicit_copy): Rename from
+       classtype_has_user_copy_or_dtor.
+       * method.c (lazily_declare_fn): Adjust.
+       * decl2.c (cp_warn_deprecated_use): Refer to -Wdeprecated-copy-dtor
+       if deprecation is due to a destructor.
+
 2018-12-06  Marek Polacek  <polacek@redhat.com>
 
        PR c++/88373 - wrong parse error with ~.
index 57261511a9001c8a72b5afe688b1520e7d078664..9c175f85cf655c43f97b64022ed2bc4fb05c909e 100644 (file)
@@ -5233,7 +5233,7 @@ classtype_has_non_deleted_move_ctor (tree t)
    operator, or destructor, returns that function.  Otherwise, null.  */
 
 tree
-classtype_has_user_copy_or_dtor (tree t)
+classtype_has_depr_implicit_copy (tree t)
 {
   if (!CLASSTYPE_LAZY_COPY_CTOR (t))
     for (ovl_iterator iter (CLASSTYPE_CONSTRUCTORS (t)); iter; ++iter)
index 636e53aa3919a73cd27b81339a9b5238850e33e3..3645965d7f348687b72cdf6b4181a9ab7ea12740 100644 (file)
@@ -6273,7 +6273,7 @@ extern bool type_has_constexpr_default_constructor (tree);
 extern bool type_has_virtual_destructor                (tree);
 extern bool classtype_has_move_assign_or_move_ctor_p (tree, bool user_declared);
 extern bool classtype_has_non_deleted_move_ctor (tree);
-extern tree classtype_has_user_copy_or_dtor    (tree);
+extern tree classtype_has_depr_implicit_copy   (tree);
 extern bool type_build_ctor_call               (tree);
 extern bool type_build_dtor_call               (tree);
 extern void explain_non_literal_class          (tree);
index f996a277dae15f70f40de4a5a645b77cbad65f68..15b0393f756c08b56422c3d270f68962333a8759 100644 (file)
@@ -5298,18 +5298,23 @@ cp_warn_deprecated_use (tree decl, tsubst_flags_t complain)
       && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
       && copy_fn_p (decl))
     {
-      auto_diagnostic_group d;
-      /* Don't warn about system library classes (c++/86342).  */
-      if (!DECL_IN_SYSTEM_HEADER (decl))
-       warned = warning (OPT_Wdeprecated_copy,
-                         "implicitly-declared %qD is deprecated", decl);
-      if (warned)
+      if (warn_deprecated_copy
+         /* Don't warn about system library classes (c++/86342).  */
+         && (!DECL_IN_SYSTEM_HEADER (decl)
+             || global_dc->dc_warn_system_headers))
        {
+         auto_diagnostic_group d;
          tree ctx = DECL_CONTEXT (decl);
-         tree other = classtype_has_user_copy_or_dtor (ctx);
-         inform (DECL_SOURCE_LOCATION (other),
-                 "because %qT has user-provided %qD",
-                 ctx, other);
+         tree other = classtype_has_depr_implicit_copy (ctx);
+         int opt = (DECL_DESTRUCTOR_P (other)
+                    ? OPT_Wdeprecated_copy_dtor
+                    : OPT_Wdeprecated_copy);
+         warned = warning (opt, "implicitly-declared %qD is deprecated",
+                           decl);
+         if (warned)
+           inform (DECL_SOURCE_LOCATION (other),
+                   "because %qT has user-provided %qD",
+                   ctx, other);
        }
     }
   else
index 936dad42122900c7ff1a6dfd8aecb60b706a90b2..fd023e200538bddf1fc96938c9746a23b6ea36b6 100644 (file)
@@ -2380,7 +2380,7 @@ lazily_declare_fn (special_function_kind sfk, tree type)
     {
       if (classtype_has_move_assign_or_move_ctor_p (type, true))
        DECL_DELETED_FN (fn) = true;
-      else if (classtype_has_user_copy_or_dtor (type))
+      else if (classtype_has_depr_implicit_copy (type))
        /* The implicit definition of a copy constructor as defaulted is
           deprecated if the class has a user-declared copy assignment operator
           or a user-declared destructor. The implicit definition of a copy
index 3b6912ea1cca52a981376a5a256d02cb00aabef7..98c1a748329df7795919465a00601ba40f20954f 100644 (file)
@@ -228,7 +228,8 @@ in the following sections.
 -fvisibility-ms-compat @gol
 -fext-numeric-literals @gol
 -Wabi=@var{n}  -Wabi-tag  -Wconversion-null  -Wctor-dtor-privacy @gol
--Wdelete-non-virtual-dtor  -Wdeprecated-copy  -Wliteral-suffix @gol
+-Wdelete-non-virtual-dtor  -Wdeprecated-copy  -Wdeprecated-copy-dtor @gol
+-Wliteral-suffix @gol
 -Wmultiple-inheritance  -Wno-init-list-lifetime @gol
 -Wnamespaces  -Wnarrowing @gol
 -Wpessimizing-move  -Wredundant-move @gol
@@ -3000,8 +3001,10 @@ by @option{-Wall}.
 @opindex Wno-deprecated-copy
 Warn that the implicit declaration of a copy constructor or copy
 assignment operator is deprecated if the class has a user-provided
-copy constructor, copy assignment operator, or destructor, in C++11
-and up.  This warning is enabled by @option{-Wall}.
+copy constructor or copy assignment operator, in C++11 and up.  This
+warning is enabled by @option{-Wextra}.  With
+@option{-Wdeprecated-copy-dtor}, also deprecate if the class has a
+user-provided destructor.
 
 @item -Wno-init-list-lifetime @r{(C++ and Objective-C++ only)}
 @opindex Winit-list-lifetime
@@ -4407,6 +4410,7 @@ name is still supported, but the newer name is more descriptive.)
 
 @gccoptlist{-Wclobbered  @gol
 -Wcast-function-type  @gol
+-Wdeprecated-copy @r{(C++ only)} @gol
 -Wempty-body  @gol
 -Wignored-qualifiers @gol
 -Wimplicit-fallthrough=3 @gol
index d33c6dc667db8e9b1d7a30afc57a3093eb967ca6..bbb8130392532d5a4e513cb0a2e5f007405e68c2 100644 (file)
@@ -6,7 +6,7 @@
    of this International Standard, these implicit definitions could become
    deleted (11.4).  */
 
-// { dg-additional-options -Wdeprecated-copy }
+// { dg-additional-options -Wdeprecated-copy-dtor }
 
 struct X
 {