LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 37407 - std::invoke fails to call noexcept marked function
Summary: std::invoke fails to call noexcept marked function
Status: RESOLVED FIXED
Alias: None
Product: libc++
Classification: Unclassified
Component: All Bugs (show other bugs)
Version: unspecified
Hardware: PC Linux
: P normal
Assignee: Eric Fiselier
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-05-10 06:15 PDT by Nicolas Lesser
Modified: 2018-05-12 05:47 PDT (History)
4 users (show)

See Also:
Fixed By Commit(s):


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Nicolas Lesser 2018-05-10 06:15:46 PDT
std::invoke wrongly takes the partial specialization for objects instead for functions for functions marked with noexcept. I'm on r331914.

#include <functional>

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 <class _Tp> 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.
Comment 1 Eric Fiselier 2018-05-10 13:00:35 PDT
It seems we don't have a proper specialization of __check_complete for noexcept function types.
Comment 2 Eric Fiselier 2018-05-12 05:47:31 PDT
Fixed in r332040 and r332066.

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.