From 108154ff26b048cc4c3a0e35c7778a653f6ac184 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sat, 4 Mar 2017 14:21:38 -0500 Subject: [PATCH] c.opt (Wnoexcept-type): New. * c.opt (Wnoexcept-type): New. gcc/cp/ * mangle.c (mangle_decl): Check -Wnoexcept-type instead of -Wc++1z-compat. From-SVN: r245894 --- gcc/c-family/ChangeLog | 4 ++++ gcc/c-family/c.opt | 4 ++++ gcc/cp/ChangeLog | 3 +++ gcc/cp/mangle.c | 2 +- gcc/doc/invoke.texi | 16 +++++++++++++++- gcc/testsuite/g++.dg/cpp1z/noexcept-type11a.C | 3 +++ 6 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/noexcept-type11a.C diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index d80844558f3..451cf387eca 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,7 @@ +2017-03-03 Jason Merrill + + * c.opt (Wnoexcept-type): New. + 2017-03-02 Richard Biener PR c/79756 diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index cf459ab4427..78fea61ef2a 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -780,6 +780,10 @@ Wnoexcept C++ ObjC++ Var(warn_noexcept) Warning Warn when a noexcept expression evaluates to false even though the expression can't actually throw. +Wnoexcept-type +C++ ObjC++ Warning Var(warn_noexcept_type) LangEnabledBy(C++ ObjC++,Wabi || Wc++1z-compat) +Warn if C++1z noexcept function type will change the mangled name of a symbol. + Wnon-template-friend C++ ObjC++ Var(warn_nontemplate_friend) Init(1) Warning Warn when non-templatized friend functions are declared within a template. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b99a7746fb0..b5587fdfab3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2017-03-03 Jason Merrill + * mangle.c (mangle_decl): Check -Wnoexcept-type instead of + -Wc++1z-compat. + Core issues 2273 and 2277 * call.c (joust): Adjust using-declaration tiebreaker to handle the intermediate base case. diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 8b30f42b2f9..6f7e21c28a8 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -3856,7 +3856,7 @@ mangle_decl (const tree decl) if (G.need_cxx1z_warning && (TREE_PUBLIC (decl) || DECL_REALLY_EXTERN (decl))) - warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wc__1z_compat, + warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wnoexcept_type, "mangled name for %qD will change in C++17 because the " "exception specification is part of a function type", decl); diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 68174a14b76..15eb0e0289a 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -215,7 +215,7 @@ in the following sections. -Wabi=@var{n} -Wabi-tag -Wconversion-null -Wctor-dtor-privacy @gol -Wdelete-non-virtual-dtor -Wliteral-suffix -Wmultiple-inheritance @gol -Wnamespaces -Wnarrowing @gol --Wnoexcept -Wnon-virtual-dtor -Wreorder -Wregister @gol +-Wnoexcept -Wnoexcept-type -Wnon-virtual-dtor -Wreorder -Wregister @gol -Weffc++ -Wstrict-null-sentinel -Wtemplates @gol -Wno-non-template-friend -Wold-style-cast @gol -Woverloaded-virtual -Wno-pmf-conversions @gol @@ -2897,6 +2897,20 @@ to a function that does not have a non-throwing exception specification (i.e. @code{throw()} or @code{noexcept}) but is known by the compiler to never throw an exception. +@item -Wnoexcept @r{(C++ and Objective-C++ only)} +@opindex Wnoexcept-type +@opindex Wno-noexcept-type +Warn if the C++1z feature making @code{noexcept} part of a function +type changes the mangled name of a symbol relative to C++14. Enabled +by @option{-Wabi} and @option{-Wc++1z-compat}. + +@smallexample +template void f(T t) @{ t(); @}; +void g() noexcept; +void h() @{ f(g); @} // in C++14 calls f, in C++1z calls f +@end smallexample + + @item -Wnon-virtual-dtor @r{(C++ and Objective-C++ only)} @opindex Wnon-virtual-dtor @opindex Wno-non-virtual-dtor diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type11a.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type11a.C new file mode 100644 index 00000000000..f5028d2f9a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type11a.C @@ -0,0 +1,3 @@ +// { dg-options "-Wall -Wno-noexcept-type -std=c++14" } + +void f(int(*)() noexcept) { } -- 2.30.2