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

    <tr>
        <th>Summary</th>
        <td>
            ABI issue in i686 mingw + libstdc++ when using std::optional
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          gbaraldi
      </td>
    </tr>
</table>

<pre>
    In summary, `std::optional` when compiled from clang is returned from a function using `edx` and `eax`, while gcc and msvc expect the selector bit to be on the stack.

The setup is a bit annoying because one needs a clang + libstdc++ 32 bit mingw toolchain. But once one has that it's simple to see the difference.

```cpp
#include <optional>

std::optional<const char *> foo(int a){
    if (a)
        return std::nullopt;
 return std::optional<const char *>("a");

```

clang assembly:
```assembly
Disassembly of section .text:

64f01400 <__Z3fooi>:
64f01400: 31 d2                         xorl    %edx, %edx
64f01402: 83 7c 24 04 00                cmpl    $0x0, 0x4(%esp)
64f01407: 0f 94 c2                      sete    %dl
64f0140a: b8 00 40 f0 64                movl    $0x64f04000, %eax       # imm = 0x64F04000
64f0140f: c3                            retl
```

gcc assembly:
```assembly

Disassembly of section .text:

651414e0 <__Z3fooi>:
651414e0: 8b 54 24 08                   movl    0x8(%esp), %edx
651414e4: 8b 44 24 04                   movl    0x4(%esp), %eax
651414e8: 85 d2                         testl   %edx, %edx
651414ea: 74 0c                         je      0x651414f8 <__Z3fooi+0x18>
651414ec: c6 40 04 00                   movb    $0x0, 0x4(%eax)
651414f0: c3                            retl
651414f1: 8d b4 26 00 00 00 00          leal    (%esi,%eiz), %esi
651414f8: c7 00 44 40 14 65             movl    $0x65144044, (%eax)     # imm = 0x65144044
651414fe: c6 40 04 01                   movb    $0x1, 0x4(%eax)
65141502: c3                            retl
```

note the `sete %dl`  vs the `movb $0x0, 0x4(%eax) `


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVk1v6ygU_TVkc_UiDPgjiyya9lV6-1nN5gnj64Q3GCyD23R-_Qhw0iRtOvM0VhTbwDn361yM9F7vLeKWlDtSPq3kHA5u2u5bOUnT6VXrurftDwt-HgY5vRH2CKSiPnSEPxD-4MagnZWGVBReD2hBuWHUBjvoJzeAMtLuQXuYMMyTPQ1L6GerIhJmr-0-UmJ3jCTSdulNxrdo7fWgDcJeqTQ1-BcFeBxRBQgHBI8GVXATtDpAcNAiOJtnglR_rQl9IvQh__-R1od5jA7JhJDWurfoQItKzj6CESxiFxdk5wnbgdGtD50ibBffOEvYQdv9KwTnjDpIbdewmwM4qzLJQXoIBxlAB8JqD14Po8HookdMDna673FCq_DKyxh2-qlxXEYY11aZuUMg_PGccf79EvaxIvxROesDqIOcgLAHwr9D7xxhjbYBJGEbUu8yGABA90BYk4bPY_HKlYMzv52NcWMg_IS9XfCVA4Q1hDFJGIt2ThSkfoKb4C9Dy3WQ3uPQmrdo5HrteSYNP2l_GgDXg8ess3XAY3jHpv9K9LQQlMa0_vz5J--d09FJfjNP-APwAjoG966jm0y8E1ZGHccmyU-XPCzyNBxqBUwAFUDpLY8axoVH0GOSPz2KlLQS_XiuzUJYR0Law0aAuuObx4CLY525AssIbpvohKDQU6jELXhwL-_eRJiglJ6Ck8dlFWEc9DAA4U8Qlz3nZZe2-mhL8bvpyzIzX2gg9f9_VMDv66AsRCHwvg6W-VS_FkqR6td8EsUpY_TYXFXtVhCZUCyEQiyC-IpQfEYorwmbRFh-pdSAPpj7Ss08SRu1AKru8vzCfKfHjOmbq-yxHT0WzXmPWnhV0kEVBfep_HPALdzpAHl874BslP6OsBZMkZLUQSuAVdGJ8-98GZSL8HPKNWGP8UH_fZF7r69oU-5VnfpJxAgLAVX5aTFzP5WFEFSITPceH8DHnjotvbSH17ks_i2Xxde5LPP29L-a1LqQP23xhBA3nrzrVBTgxZ8mklN3qws3lKtuy7sN38gVbouasrJgtahXh63AqqRFpapNRYu2FxtRY9dx5FQVVdHSld4yynjB4gZeMFavW8EVaxQrK6HohrdEUBykNmtjXoa1m_Yr7f2M27oURbEyskXj06mIMYuvkCbjh6t8Wk3biPnWzntPBDXaB__OEnQwuH3Y_cgQ0BZ01VTLeeHjcSIdm_Ix6MM3dDVPZnsIYfRxnD0T9rzX4TC3a-UGwp6j0eX2bZzcL1SBsOdk1xP2nEL5JwAA__8sIpYx">