You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
std::invoke wrongly takes the partial specialization for objects instead for functions for functions marked with noexcept. I'm on r331914.
#include
void func() noexcept {}
int main() { std::invoke(func); }
Here's the full error message:
In file included from main.cpp:1:
In file included from /usr/local/bin/../include/c++/v1/functional:484:
/usr/local/bin/../include/c++/v1/type_traits:4196:19: error: invalid application of 'sizeof' to a function type
static_assert(sizeof(_Tp) > 0, Type must be complete.);
^~~~~~~~~~~
/usr/local/bin/../include/c++/v1/type_traits:4201:15: note: in instantiation of template class 'std::__1::__check_complete<void () noexcept>' requested here
: private __check_complete<_Tp>
^
/usr/local/bin/../include/c++/v1/type_traits:4494:15: note: in instantiation of template class 'std::__1::__check_complete<void (&)() noexcept>' requested here
: private __check_complete<_Fp>
^
/usr/local/bin/../include/c++/v1/type_traits:4557:9: note: in instantiation of template class 'std::__1::__invokable_r<void, void (&)() noexcept>' requested here
__invokable<_Fp, _Args...>::value,
^
/usr/local/bin/../include/c++/v1/type_traits:4566:14: note: in instantiation of template class 'std::__1::__invoke_of<void (&)() noexcept>' requested here
: public __invoke_of<_Fp, _Args...>
^
/usr/local/bin/../include/c++/v1/type_traits:4571:22: note: in instantiation of template class 'std::__1::result_of<void (&())() noexcept>' requested here
template using result_of_t = typename result_of<_Tp>::type;
^
/usr/local/bin/../include/c++/v1/functional:2346:1: note: in instantiation of template type alias 'result_of_t' requested here
result_of_t<_Fn&&(_Args&&...)>
^
main.cpp:5:14: note: while substituting deduced template arguments into function template 'invoke' [with _Fn = void (&)() noexcept, _Args = <>]
int main() { std::invoke(func); }
^
1 error generated.
The text was updated successfully, but these errors were encountered:
We no longer check for the completeness of types to invoke or similar callable traits. We probably should, but doing it correctly is super expensive, in terms of both compile time and compiler memory usage.
Extended Description
std::invoke wrongly takes the partial specialization for objects instead for functions for functions marked with noexcept. I'm on r331914.
#include
void func() noexcept {}
int main() { std::invoke(func); }
Here's the full error message:
In file included from main.cpp:1:
In file included from /usr/local/bin/../include/c++/v1/functional:484:
/usr/local/bin/../include/c++/v1/type_traits:4196:19: error: invalid application of 'sizeof' to a function type
static_assert(sizeof(_Tp) > 0, Type must be complete.);
^~~~~~~~~~~
/usr/local/bin/../include/c++/v1/type_traits:4201:15: note: in instantiation of template class 'std::__1::__check_complete<void () noexcept>' requested here
: private __check_complete<_Tp>
^
/usr/local/bin/../include/c++/v1/type_traits:4494:15: note: in instantiation of template class 'std::__1::__check_complete<void (&)() noexcept>' requested here
: private __check_complete<_Fp>
^
/usr/local/bin/../include/c++/v1/type_traits:4557:9: note: in instantiation of template class 'std::__1::__invokable_r<void, void (&)() noexcept>' requested here
__invokable<_Fp, _Args...>::value,
^
/usr/local/bin/../include/c++/v1/type_traits:4566:14: note: in instantiation of template class 'std::__1::__invoke_of<void (&)() noexcept>' requested here
: public __invoke_of<_Fp, _Args...>
^
/usr/local/bin/../include/c++/v1/type_traits:4571:22: note: in instantiation of template class 'std::__1::result_of<void (&())() noexcept>' requested here
template using result_of_t = typename result_of<_Tp>::type;
^
/usr/local/bin/../include/c++/v1/functional:2346:1: note: in instantiation of template type alias 'result_of_t' requested here
result_of_t<_Fn&&(_Args&&...)>
^
main.cpp:5:14: note: while substituting deduced template arguments into function template 'invoke' [with _Fn = void (&)() noexcept, _Args = <>]
int main() { std::invoke(func); }
^
1 error generated.
The text was updated successfully, but these errors were encountered: