https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55722
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2019-10-23 Ever confirmed|0 |1 --- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- The diagnostics have changed since GCC 8, so that the ONLY_ONE case no longer stops after the failed static_assert (which seems like a regression to me): 55722.cc: In instantiation of ‘struct __assert_callable<std::integral_constant<bool, false> >’: 55722.cc:54:41: required from ‘void call(_Callable&&, _Args&& ...) [with _Callable = void (&)(int&); _Args = {}]’ 55722.cc:62:9: required from here 55722.cc:28:19: error: static assertion failed: Invalid arguments for callable type static_assert(_Callable::value, "Invalid arguments for callable type"); ^~~~~~~~~ 55722.cc: In instantiation of ‘decltype (__check_callable<_Callable, _Args ...>(0)) __bind_simple(_Callable&&, _Args&& ...) [with _Callable = void (&)(int&); _Args = {}; decltype (__check_callable<_Callable, _Args ...>(0)) = __assert_callable<std::integral_constant<bool, false> >]’: 55722.cc:54:41: required from ‘void call(_Callable&&, _Args&& ...) [with _Callable = void (&)(int&); _Args = {}]’ 55722.cc:62:9: required from here 55722.cc:47:96: error: could not convert ‘_Bind_simple<void (*())(int&)>((* & std::forward<void (&)(int&)>((* & __callable))))’ from ‘__bindexpr_type’ {aka ‘_Bind_simple<void (*())(int&)>’} to ‘__assert_callable<std::integral_constant<bool, false> >’ return __bindexpr_type( std::forward<_Callable>(__callable), std::forward<_Args>(__args)...); ^ When there's a second call the static_assert is only given once, but the "could not convert" is given twice. So the bug is still present (either the static_assert should stop compilation, or should produce a diagnostic message every time it fails).