https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86233
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Version|unknown |9.0 Keywords| |diagnostic --- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> --- Ah, the issue is that GCC ignores the error if the original declaration is in a system header: # 1 "86233.C" # 1 "inc.h" 1 # 2 "inc.h" 3 template<typename T> void f() noexcept { } # 2 "86233.C" 2 # 2 "86233.C" template<> void f<int>() { } G++ gives a pedwarn with -Wsystem-headers: 86233.C:2:17: warning: declaration of 'void f() [with T = int]' has a different exception specifier [-Wsystem-headers] 2 | template<> void f<int>() { } | ^~~~~~ In file included from 86233.C:1: inc.h:2:27: note: from previous declaration 'void f() noexcept [with T = int]' 2 | template<typename T> void f() noexcept { } | ^ But this seems wrong, because the explicit specialization that has the wrong exception spec is not in the system header. If user code defines an invalid specialization of a template defined in a system header, that should not be suppressed by default. The error is not in the system header.