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

    <tr>
        <th>Summary</th>
        <td>
            Clang miscompilation producing double destroy coro local variable
        </td>
    </tr>

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

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

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

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

```cpp

struct inplace_generator_promise {
  using handle_type = std::coroutine_handle<inplace_generator_promise>;

  handle_type get_return_object() noexcept {
    return handle_type::from_promise(*this);
  }

  std::suspend_always yield_value(int) noexcept {
    return {};
  }

  static constexpr std::suspend_never initial_suspend() noexcept {
    return {};
  }

  std::suspend_always final_suspend() const noexcept {
 return {};
  }
  static constexpr void return_void() noexcept {
 }
  [[noreturn]] static void unhandled_exception() {
    throw;
 }
};

struct inplace_generator {
  using promise_type = inplace_generator_promise;
  using handle_type = std::coroutine_handle<promise_type>;

  handle_type handle;

 inplace_generator(std::coroutine_handle<promise_type> handle) noexcept : handle(handle) {
  }

  ~inplace_generator() {
 handle.destroy();
  }
};

struct dctor {
  dctor() {
 std::cout << "CREATED\n";
  }
  dctor(dctor&&) = delete;
  void operator=(dctor&&) = delete;
  ~dctor() {
    std::cout << "DELETED\n";
  }
};
inplace_generator starter(){
// double destroyed, firstly after throw, second in handle.destroy(), must not be destroyed in handle.destroy after it
    dctor d; 
    co_yield {};
 throw 0;
}

[[gnu::noinline]] void bug_reproducer() {
 starter().handle.resume();
}

```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVk2PozgQ_TXmYk0EJpDmwCEJyWX2tNo7MnaFeNfYtD8ykz3Mb1_xkYQ09MdqpKhpGfu9V1WvClNrRa0AcpTsUFIE1LuzNvk_ICutgkrza352rrUo3iJyRORYa15p6Vba1Igc_0Xk-P319XtEXy8pCgsUbse_aTj8WNtO160znjksVCspg7IGBYY6bcrW6EZYwGizG3Zi7K1QNT5TxSWU7toCRnGBreOdmHjLtNHeCQXlsAXF-3dhUXxA8W4qBD8B1-BKA84bVerqb2AOkRdEMqw0_GTQuqksjIedU4BB0cno5s7YAWzdWVhEsjs3xmhTPMu4x2O9bUHxksof9GrxVYDk5YVK32EJ5T7V061tio-5qBMMM62sg5-tmZMruIDBQgknqCzH1a8k4yvky4GehJpR9QqXCD9lWwjyogUfD5bd_--HM0Hp-2Gn9HAOJQVKiht0D-jVUH9eDjBCqxH4KT3ubPSPh9BHVibyP26NeUuMFnv0xAe-_41umtJ81kC3Q89bZroQefkfjDfUp2LF2_vyy-P9JEcz4_1akvF8aABacbDO6OvwetHL71WNszeV6hdmPJPgfRfLHsV7jAjZ_3nY_nUoULJXiJBlX98Qx2fa_7K-ihwkuGmxe4fqdow2Lr547NeyaozfFV4c_jh8LHyasrm3raPGwUh5Zxw-NZhrX0nAY1WAI7LHJ2Gsk1dMTw7M2F1kjy0wrTgWarmUZI8b308Uh6sJ4vzACCzcI_ahthzFO_xYZLrsJ_RsFPWScPiwybMdh7lSKz-kU2mhpFAwDpi-bpWvSwOt0dwzWPLQJGWrUb0B6xt4Y9y31LdvcsDzmGdxRgPIow1Js_U6itLgnPN0s04Jg9OabU7hJkzCLIqBVXHKEoiqTSByEpJ1mJEoellHSbpiLIUoe0kJhHxzyiK0DqGhQq6kvDTdJSEQ1nrIozBL1iSQtAJp-8sGIUxSVXeuSYrA5N2Bb5WvLVqHUlhnHxBOOAn5vtuOG2GZblohaTdx8ZClbrI9mwV30wVLzajEF2oErSQE3si3txnhzr5aMd0gcuz4xse31ujhGnDs9VtEjmMIl5z8FwAA___Xs8ZL">