diff options
Diffstat (limited to 'PATCHES/0020-gcc-9-deprecated-copy_false_positives.patch')
-rw-r--r-- | PATCHES/0020-gcc-9-deprecated-copy_false_positives.patch | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/PATCHES/0020-gcc-9-deprecated-copy_false_positives.patch b/PATCHES/0020-gcc-9-deprecated-copy_false_positives.patch new file mode 100644 index 0000000..a597200 --- /dev/null +++ b/PATCHES/0020-gcc-9-deprecated-copy_false_positives.patch @@ -0,0 +1,166 @@ +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 + { + |