https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89429
--- Comment #1 from Valentin <vakevk at gmail dot com> --- Sorry, this was the wrong attachment. The proper code is: template <typename Function> void f(Function&& function) { // `0` is not special. Can be any value of any type. function(0); } // No error when this template parameter is removed. template<typename T> void g() { // Must be `auto`. f([](auto) { __func__; }); } void h() { // `int` is not special. Can be any type. g<int>(); }