<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/61444>61444</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            "Illegal instruction" error when compiling code with std::function in clang
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          DD-L
      </td>
    </tr>
</table>

<pre>
    Hello, 
Can someone explain this?

The following code can be compiled using `gcc`/`MSVC` and the resulting program can work normally, outputting the number `1` :

```
#include <functional>
#include <iostream>
#include <string>

typedef std::function<void(int, const std::string&, int)> Fn;

void foo(int a, ...) {
    std::cout << a << std::endl;
}

int main() {
    Fn fn(foo);
    fn(1, "str", 3);
    return 0;
}
```

However, in almost all versions of clang (`<= ver 15.0.0`), the resulting program reports an "`Illegal instruction`" error. Is this considered a bug in clang?

Details:

```
* thread #1, name = 'a.out', stop reason = signal SIGILL: illegal instruction operand
 frame #0: 0x00005555555557e6 a.out`void std::__invoke_impl<void, void (*&)(int, ...), int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int>((null)=__invoke_other @ 0x00007fffffffe038, __f=0x00007fffffffe198, __args=0x00007fffffffe134, __args=0x00007fffffffe178, __args=0x00007fffffffe124)(int, ...), int&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&&) at invoke.h:61:37
   58     template<typename _Res, typename _Fn, typename... _Args>
   59       constexpr _Res
   60 __invoke_impl(__invoke_other, _Fn&& __f, _Args&&... __args)
-> 61       { return std::forward<_Fn>(__f)(std::forward<_Args>(__args)...); }
   62
 63     template<typename _Res, typename _MemFun, typename _Tp, typename... _Args>
   64       constexpr _Res
(lldb) bt
* thread #1, name = 'a.out', stop reason = signal SIGILL: illegal instruction operand
  * frame #0: 0x00005555555557e6 a.out`void std::__invoke_impl<void, void (*&)(int, ...), int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int>((null)=__invoke_other @ 0x00007fffffffe038, __f=0x00007fffffffe198, __args=0x00007fffffffe134, __args=0x00007fffffffe178, __args=0x00007fffffffe124)(int, ...), int&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&&) at invoke.h:61:37
    frame #1: 0x000055555555574c a.out`std::enable_if<__and_<std::is_void<void>, std::__is_invocable<void (*&)(int, ...), int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int> >::value, void>::type std::__invoke_r<void, void (__fn=0x00007fffffffe198, __args=0x00007fffffffe134, __args=0x00007fffffffe178, __args=0x00007fffffffe124)(int, ...), int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int>(void (*&)(int, ...), int&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&&) at invoke.h:154:7
    frame #2: 0x00005555555555fc a.out`std::_Function_handler<void (int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int), void (*)(int, ...)>::_M_invoke(__functor=0x00007fffffffe198, __args=0x00007fffffffe134, __args=0x00007fffffffe178, __args=0x00007fffffffe124) at std_function.h:290:9
    frame #3: 0x000055555555547d a.out`std::function<void (int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)>::operator(this=0x00007fffffffe198, __args=1, __args=0x00007fffffffe178, __args=3)(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) const at std_function.h:590:9
    frame #4: 0x00005555555552cc a.out`main at 1.cpp:13:5
    frame #5: 0x00007ffff7a86d90 libc.so.6`__libc_start_call_main(main=(a.out`main at 1.cpp:11), argc=1, argv=0x00007fffffffe2d8) at libc_start_call_main.h:58:16
    frame #6: 0x00007ffff7a86e40 libc.so.6`__libc_start_main_impl(main=(a.out`main at 1.cpp:11), argc=1, argv=0x00007fffffffe2d8, init=0x00007ffff7ffd040, fini=<unavailable>, rtld_fini=<unavailable>, stack_end=0x00007fffffffe2c8) at libc-start.c:392:3
    frame #7: 0x0000555555555175 a.out`_start + 37
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWEtv4zgS_jX0hYhAkbIeBx8cu70ToPuyM9irQEmUzW2KFEjKSf_7RVGSH4k6vQMsNhlgjG7ZYhXr9X3FSMWdk0ctxAatH9F6v-KDPxm72e8fvq4q0_zY_CaUMojuMCJ7RLY7rrEznTBaYPHSKy419ifpEDuMCuP1j5PArVHKPEt9xLVpBK65xpXAtel6qUSDBwcilJJjXaOUIHpAKfn2-792KCWY6wb7k8BWuEF5UOytOVreBTPPxn7H2tiOK_UDYjOD7wcf9GCXHrpKWLAdgzHEtrexgbPx33hLmdS1GhqBEdu1g669NJorxL4sKUjjvBW8-4nYeSv18SoMV_-jF41osfMNxMK2sxfEdmcjG0RzqT0kUhvt_FVvskZTkAWVArEv-KARe7x1AEZwa8xoCHNQj6II0QKjbNLEGF8N12bwEC5iO8znHxep0I26esj2t67AfselRjR_Y_6gcQuCEElxsQCisB4HHlHqvEWUwg17rWeFH6zGZMH9K9jC9TfzLM7CjuXBXHXGecyVwmdhnTTaYdPiWnFgGs1hM6S6BzGO1xGJgkFagIFlvlnRG-sd5hoiRyl5UkocucJSO2-HEUawQbGw1tgIP7nQEQFL2QgrGsxxNRwhwhDKq17ZC8-lcr9i6Rb7kxW8wYiyUEjNO6DcHiOa8cgMHtEM1p03PbaCO6ODGBqcK_z70z-evn5FbIvl2wyw6YXlupmAaG2wTRkBffJCCCHr-ZOJFI_-UhKId-FNWUp9Nt9FKbteXbi9w0ErEGYbuFxcCT-y9ELv3a2x-uUljsebijtZl3Nz7eoTt3fKsFB6y6V3s5h9udPgSpmae2Ovcgz_Q8fddBhsyxHN9aBUIOf-kpXxJzhVEjJVJGvHjyAsh-1l2SK2fyWLi0nG7dEtiFnyrjh7fzdN3qtmOuX10TWdAikw93isZXRCbJtCICy7NP86hxMAe9H1inuB2A4OzkDz8p_ChR69LBz07X0URbjchhp9udor8PgJ8YiX3o52ZnlK8D1jaX6PdSg9OIL4A7ywENyEpeB1hIYWo9kHyD-NJ8coe5xPtOvZb-wztw1iOzAd6BYsA4xLSnNWoDa5mmBmj_hyOkI6dPqZsj9Rx2-iOwz6fu2P_pe1TZN3aotorlRTAeKV_4jzC4O7vw-xvw-x__8hdqVdvES7pL7Q7uZxi1dKlLKFdi-5bsrwIDlJpSsDBScmvoq-LKUL0NZgY1L669AUlsc9Z64GMffZZRXOoIXWtAt9WZat_lzM_QwFRjT_7xnxyVstXieIbZdajS602rpdaLXyML15lSeuGyXsTcd8EsxGPO5Ae4vY3B_lt6klxgaA5MDBB3QBYOV8U86vtgExWsDf3mIBMbaAWJI1bxF79ar8uYCaYQhPH7CD5uMw5FcAxH-m3uyOAR-f9jSlWAJ8_VPAkwXAaX1t0Y7DC7zHcVT3PTQ7MGS9YGh9NRQqlvE8bQqClazqyJkoRSkpS7grnefWlzVXqpxGFuGL7RHNf-o3njqQ22M9I8Xt8fwWJ9rkE_GXvI31yMFkupBGupCGSN5JA2zOryn_-zQAW-nvhVnbNiQhIGylluCQ7QbNz1yq8WkjMMh61ZTvKTjP6--l0M2C7_q2hA8h06iGJ6oCznS2ULhsgUhxtr4QaSwXRvQRz49ll1nKqtmwpmAFX4lNnGZ5wVgcx6vThsRZWxQ0pqLgeZKJLKlIJhhJqEgbwthKbiihjLA4JTTOWRy1bRavKxqvWUKqomIoIaLjUkVKnbvI2ONKOjeITRonSbJSvBLKhSErpVo84yBElKL1fmU3sOehGo4OJURJ593VipdeiQ2idGnuNA-d8PNJ6Gm0ehm4Pkt_ejtyvEyhVoNVm5P3fZg80QOih6P0p6GKatMheoAIpq-H3pp_i9ojeghxO0QPIa__BAAA__9t0YZy">