From: Jason Merrill <jason@redhat.com>
To: gcc-patches List <gcc-patches@gcc.gnu.org>
Cc: Ville Voutilainen <ville.voutilainen@gmail.com>
Subject: C++ PATCH for c++/88136, -Wdeprecated-copy too noisy
Date: Thu, 06 Dec 2018 21:12:00 -0000 [thread overview]
Message-ID: <CADzB+2nxjBAaig10w3-1sZEvAZpTMgWFPeSpF8EWknyzzx_x-Q@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 593 bytes --]
-Wdeprecated-copy does find some real bugs, but it also complains
about a lot of reasonable code for which the implicitly declared copy
ctor/op= are fine oven though the class has a user-defined destructor:
this situation is only problematic if the destructor releases
resources held in one of the non-static data members.
So, this patch reins it in somewhat: first by moving from -Wall to
-Wextra, and then also only complaining if the other copy op is
user-declared. The old behavior can be explicitly requested with
-Wdeprecated-copy-dtor.
Tested x86_64-pc-linux-gnu, applying to trunk.
[-- Attachment #2: 88136.diff --]
[-- Type: text/x-patch, Size: 6843 bytes --]
commit c37377416dcbf21c6b9f6c7b83fd8f9587b0a517
Author: Jason Merrill <jason@redhat.com>
Date: Wed Nov 21 18:04:02 2018 -0500
PR c++/88136 - -Wdeprecated-copy false positives
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.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 3b6912ea1cc..98c1a748329 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -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
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 6f88a1013d6..07ff1c84f96 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -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.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 111a123bb34..886abeaa3f9 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -6272,7 +6272,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);
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 57261511a90..9c175f85cf6 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -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)
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 79abdaebe86..44e6ef379ed 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -5275,18 +5275,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
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 936dad42122..fd023e20053 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -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
diff --git a/gcc/testsuite/g++.dg/cpp0x/depr-copy1.C b/gcc/testsuite/g++.dg/cpp0x/depr-copy1.C
index d33c6dc667d..bbb81303925 100644
--- a/gcc/testsuite/g++.dg/cpp0x/depr-copy1.C
+++ b/gcc/testsuite/g++.dg/cpp0x/depr-copy1.C
@@ -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
{
next reply other threads:[~2018-12-06 21:12 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-06 21:12 Jason Merrill [this message]
2018-12-08 16:46 ` Ville Voutilainen
2018-12-08 16:58 ` Jakub Jelinek
2018-12-08 17:17 ` Ville Voutilainen
2018-12-08 17:53 ` Jason Merrill
2018-12-08 18:05 ` Ville Voutilainen
2018-12-08 18:33 ` Ville Voutilainen
2018-12-12 14:52 ` Jason Merrill
2018-12-12 15:30 ` Ville Voutilainen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CADzB+2nxjBAaig10w3-1sZEvAZpTMgWFPeSpF8EWknyzzx_x-Q@mail.gmail.com \
--to=jason@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=ville.voutilainen@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).