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

    <tr>
        <th>Summary</th>
        <td>
            coroutines: miscompilation when using ternary operator and co_await (use after free)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    https://godbolt.org/z/avrxq5zb9

```cpp
res ok(bool cond) {
    if (cond) {
        co_return res{co_await foo_error()};
    } else {
        co_return res{5};
    }
}

res notok(bool cond) {
    co_return cond ? res{co_await foo_error()} : res{5};
}

int main() {
    ok(false);    //ok
    ok(true);     //ok
    notok(false); //ok
    notok(true);  //crash
}
```

results in:
```bash
=================================================================
==1==ERROR: AddressSanitizer: heap-use-after-free on address 0x6070000001ae at pc 0x5555f4f0091e bp 0x7fff81013350 sp 0x7fff81013348
READ of size 1 at 0x6070000001ae thread T0
    #0 0x5555f4f0091d in notok(bool) /app/example.cpp:104:26
    #1 0x5555f4f013e5 in main /app/example.cpp:111:5
    #2 0x7f9da9a28082 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24082) (BuildId: 1878e6b475720c7c51969e69ab2d276fae6d1dee)
    #3 0x5555f4e2739d in _start (/app/output.s+0x1f39d)

0x6070000001ae is located 62 bytes inside of 72-byte region [0x607000000170,0x6070000001b8)
freed by thread T0 here:
    #0 0x5555f4efd30d in operator delete(void*) /root/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:152:3
    #1 0x5555f4f05442 in notok(bool) (.destroy) /app/example.cpp:103:5
    #2 0x5555f4f0a8f4 in std::__1::coroutine_handle<void>::destroy[abi:v160000]() const /opt/compiler-explorer/clang-trunk-20221123/bin/../include/c++/v1/__coroutine/coroutine_handle.h:84:9
    #3 0x5555f4f07554 in res_promise_type::await_transform(res)::Suspension::await_suspend(std::__1::coroutine_handle<void>) /app/example.cpp:73:22
    #4 0x5555f4f008da in notok(bool) /app/example.cpp:104:26
    #5 0x5555f4f013e5 in main /app/example.cpp:111:5
    #6 0x7f9da9a28082 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24082) (BuildId: 1878e6b475720c7c51969e69ab2d276fae6d1dee)

previously allocated by thread T0 here:
    #0 0x5555f4efcaad in operator new(unsigned long) /root/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:95:3
    #1 0x5555f4f00017 in notok(bool) /app/example.cpp:103:5
    #2 0x5555f4f013e5 in main /app/example.cpp:111:5
    #3 0x7f9da9a28082 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24082) (BuildId: 1878e6b475720c7c51969e69ab2d276fae6d1dee)

SUMMARY: AddressSanitizer: heap-use-after-free /app/example.cpp:104:26 in notok(bool)
Shadow bytes around the buggy address:
  0x606fffffff00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x606fffffff80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x607000000000: fa fa fa fa fd fd fd fd fd fd fd fd fd fa fa fa
  0x607000000080: fa fa fd fd fd fd fd fd fd fd fd fa fa fa fa fa
  0x607000000100: fd fd fd fd fd fd fd fd fd fa fa fa fa fa fd fd
=>0x607000000180: fd fd fd fd fd[fd]fd fa fa fa fa fa fa fa fa fa
  0x607000000200: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x607000000280: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x607000000300: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x607000000380: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x607000000400: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==1==ABORTING
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVWN9zozYQ_mvsF409IH4_-MG-xNeb6fU6yfWhT4xAwlYjIyqJJM5f3xVgDA5Jml4erowiB2n5tKtdfbuQSXpc7Y2p9Mxbz_AW2k7STAqzlGoHd0_wR-7V49_BU5bMnKuZs-760GlbXlXtiGIaybsZjjMpBcplSWc4QbNo004juHiBYH5yyl65TBUztSoRYMEs3JMHwg0qpEyZUlLB0_DkLLqaeYNn4R4xodnbiMHEo509_T-9MaU0b9hzhrfTaOZt39YcpNZT2lwowEuDDoSX7XPjZRutCgIWW0hv0xjSOA9mxlJG1QOhCamTkUO4l6WGcK1UrojeX1pwio2LHa2F0QhM8i5jKDtjeFf_-zYwxG1_rm9uvt1Yv68phX3Qt6Tkhj8xZcf2jFSLWrMFKQxTi0IxhmSJSCuKnMfQiZzmcglDxKAqh8EArsIvHCdxGcoqGImKoohdx_W8wEF6POLHrVY31-srJAukYXHkWrALeLNXjFD03RkcEew54wUpOHF0OpoIBaIAKsBb9kgOlWBLSwze2nV86HE4wnMHeK7HAotng_1FEBc2ch2MMHBjYEJJQnDsxNhipKngWZ5qQ5RJO0A4PlsYhf4xDtPQXwhe1o-LXVm3E_lSy2U4wxvnEfuA09oSb2ou6BdqHeTGUczCzI-CCDt5lAduEiYsTEiGKY7CgrCQupQ1B2OooddbyXDkJc2utbp1arWmytpUtVnqRgW3AMEeqO0vXMQ1EjInhlEUYpQdDbOHSnPKrGcjvLBDwDA7DlE0CzbDxyNnhj8NB7K4X8wGHgW8cwxAaCrWn9ZnscAK6jmNVbJiihipEGWCGdiI-F5yMGPdBYaS0tjdFveHRaXkXyy3t7k8VFxAyCvT-4hoUnY_acke0hbwFAYBht57MZQC38fToRkvKdNGyeOrkepNBtkJncSFb9G1sVEBLU3d9p9cKnAiL1m6JyUVsGWfGvu963b-tHawIRmH-3s3tJs_C646dofsoW1QbGU12hj2WAmpgCZgTJBytwD-Le8W2MHYdbEHw5nNENvlEjpe5qKmzMpCKDVte-9Cl6a9gg34WNnlHjSK7SF9KXoLJwqCxnQgpBT8d-CapeZYsda8JtOlRpFSF1IdwCab3myWsLO3ta4YhKcsh9K6GYUQid-1nS97L7LOw3hkgj-krZiSH6Wt4ANoK_x5aavtK8Xuuay1OCIiTkTzLlbICRmzAhxkUK2GINiVACZkuftYYkiCV3nBEt-7fP86EfxX13s_u-tv__j6dX3z53sKlTeOz8Sud0vtCZUPXfYicN6hfDZ7qGTq3e54qn0GQWZzVli0FzAnaOM472pTQPGPAnVZ1Gk1Ksig0ZdbJzMFFA-B3oZ4EcjtNPq3EO3goHK9HoLFE2CQzGx3NQH1qmZ4Yq_eblNA8QcBeR-lkfdRGvk_oNHgYCHBdsy-luJYlgzpwYxiQPOalfA-FiM4wIIDz9t6sTmQXe7uFOuogGQ2E_dv1nCdz8LvwF4cskV_ck_CDtAwUCcwH-RiSJ-Q_SJ0euoX4BPQsTCgDn0CFc_w523ZNlWppZ6upB0I0ZPQrSH53TRU4Y6FDpxOLIfHQorv9s-gCm8s1LAgat__z8sFYyGgy05Q57LqsIr4JPRZyIyI5wpZoeRCiAMVI6loS8adUF-g_C65lmWbqmHRgQwqopPQJ1kayDGgjbxnqhDy4ax43vtbKXKEklTe8QuHI9ILfSmh3kMysxn7Qv0s65EgfYDaYH1JxBiqYCehX63X2krjch_yPgpuGodMSuXZxAv3evPt5vuX3z5ffGeYs5UbhgkOvNjHc7ryaOIlZG64EWzVl50270Cc6LYMac_Fw56VsK-83KHGHHU8lzdQpKL-g48tdHqf2xQJh2leK3H5lY2bfZ0tYYmu_HleBXGta3sWt0Hixu58vwqcIsuIR0lMfEwJy5y8YIxhqCaY4_psLkjGhF4BNQMxz_mqe0_woWKJMF5SP4sCh0R-QBhOwmzmOwxKDrG0C9vvfXO1anSAJKxhUnBt9HmS6KZ-Yyd8Upu9VCtCFYcq4ZBJysp5o_Sq0fgf6CfAKQ">