<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">