c.opt (Wnoexcept-type): New.
authorJason Merrill <jason@redhat.com>
Sat, 4 Mar 2017 19:21:38 +0000 (14:21 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 4 Mar 2017 19:21:38 +0000 (14:21 -0500)
* 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
gcc/c-family/c.opt
gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/doc/invoke.texi
gcc/testsuite/g++.dg/cpp1z/noexcept-type11a.C [new file with mode: 0644]

index d80844558f382ca57f187f8b384f6cde2d1c6ca0..451cf387eca3e1cdb661f4eba040cf68e1be39ac 100644 (file)
@@ -1,3 +1,7 @@
+2017-03-03  Jason Merrill  <jason@redhat.com>
+
+       * c.opt (Wnoexcept-type): New.
+
 2017-03-02  Richard Biener  <rguenther@suse.de>
 
        PR c/79756
index cf459ab4427e2894183b1d0c3a02f43fbfa5dd81..78fea61ef2a0f7aeca539418e098f3bf4b84b97f 100644 (file)
@@ -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.
index b99a7746fb06b936ad266993337ca6206a2496a2..b5587fdfab375d623409962ebf4dd2745d8427cd 100644 (file)
@@ -1,5 +1,8 @@
 2017-03-03  Jason Merrill  <jason@redhat.com>
 
+       * 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.
index 8b30f42b2f983392982bc1e027777dec56ab69b6..6f7e21c28a8c11771b0567d7acfc0b4049854671 100644 (file)
@@ -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);
index 68174a14b762101af062c83b1a385f32f344929d..15eb0e0289ae47182550abe98c46033d29ebedac 100644 (file)
@@ -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 <class T> void f(T t) @{ t(); @};
+void g() noexcept;
+void h() @{ f(g); @} // in C++14 calls f<void(*)()>, in C++1z calls f<void(*)()noexcept>
+@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 (file)
index 0000000..f5028d2
--- /dev/null
@@ -0,0 +1,3 @@
+// { dg-options "-Wall -Wno-noexcept-type -std=c++14" }
+
+void f(int(*)() noexcept) { }