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

    <tr>
        <th>Summary</th>
        <td>
            Clang hangs forever building under -O1
        </td>
    </tr>

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

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

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

<pre>
    ToT Clang hangs when building under -O1.

```
clang++ test.i -fno-exceptions -O1 -c -emit-llvm
```

The reproducer, `test.i`:

```c++
class MockDevice;
struct sp {
  MockDevice operator*();
};
void memset(void *__dest, int __ch, unsigned __len) {
  long __trans_tmp_1 = __builtin_object_size(__dest, 0);
 __builtin___memset_chk(__dest, __ch, __len, __trans_tmp_1);
}
template <class>
class function;
template <class _Rp, class... _ArgTypes>
class function<_Rp(_ArgTypes...)> {
 public:
  template <class _Fp>
  function operator=(_Fp);
};
template <typename T>
struct hidl_vec {
  hidl_vec() : mSize() { memset(mPad, 0, 0); }
 hidl_vec(hidl_vec &other) { *this = other; }
  hidl_vec &operator=(hidl_vec &other) {
    copyFrom(other, other.mSize);
 return *this;
  }
  T &operator[](unsigned index) { return mBuffer[index]; }
  T* mBuffer;
  unsigned mSize;
  unsigned mPad[];
  template <typename Array>
  void copyFrom(Array &data, unsigned size) {
    mSize = size;
    if (mSize) mBuffer = new T();
    for (int i = 0; i < size; ++i) mBuffer[i] = data[i];
 }
};
struct Capabilities {
  struct OperandPerformance {
    int a, b, c;
  };
  hidl_vec<OperandPerformance> operandPerformance;
};
template <typename>
class Action;
template <typename R, typename... Args>
class Action<R(Args...)> {
  using F = R();
 public:
  template <typename G>
  Action(G fun) {
    fun_ = fun;
  }
  function<F> fun_;
};
struct OnCallSpec {
 OnCallSpec WillByDefault(Action<void()>);
};
struct MockSpec {
 OnCallSpec InternalDefaultActionSetAt();
};
struct MockDevice {
 MockSpec gmock_getCapabilities();
};
sp createMockDevice_mockDevice;
MockDevice createMockDevice() {
 Capabilities getCapabilities_ret;
  (*createMockDevice_mockDevice)
 .gmock_getCapabilities()
      .InternalDefaultActionSetAt()
 .WillByDefault(getCapabilities_ret);
  return *createMockDevice_mockDevice;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVk2P4jgT_jXmYhEFBxo45JCGYfQeXs2oG2mPVnAqibcTO7IdZthfv7Lz5dDQO1KLTuKqp576dKVa80IAxGjzijbHRdqaUqr4Q4ritrjI7Baf5RkfqlQUuExFofGvEgS-tLzKuChwKzJQePljFaDwiMKk_30J-z_3yqw6Iq-IvGID2gQcL3Mhl_CbQWO4FNoi4CXDS6i5WVbVtX4I1P2eS8AKGiWzloFC5IDRS9jhWskoeUiFdQRGRlrj_0v2cYQrZ4Ci_kAb1TKDdYPRtv-EPTksG1CpkQqRBJEdIvtRE22P4_NV8gzXUGswiOzcGyIJpRloY_lyYTClrLTPrXAZyDClFQhE9r7lSooCU2pUKjQ1dUNXGEVHTKlNgOGCysvfwAzV_B9AZDdZCH1qnjylHS3Kyo-ZwkCnZ3GYW7131D0YqJsqNYBRdHABRdE3P7x5K5jN7qj5SQHTt8baci9BEGCaqOJ8a-A51MGp7EbBIAgcuW9e2Jr2UnE2FgLGDwyfmtEEHuGn9EZHa-TUPMuwj2huDYi0BnweIfsyKnlW0SswP6XDt658MIoSXL936euTP1VO_TPN-myOKcVj_H2oyRJ5kaa0bdFhIZKYkmtXNt3BDALPFGfeP4McNDFmsrmdlKwR2fUCh85G0HvklaAC0yox0Jm--1zOMxJuICGyGxuEiwx-D371ePVrm-dghbvTzfHOvzMiySg1WR1BO6aPDmzsOw7T6cO0J0qlN6-aXL97sXHn1rUsNems5bu2vYuqY-TypefUMOY5tlXRB3dwy8kK-GV9nY0kq5JLZXXsxOFOMLQBso-HAR93k5F7kDaeaHN0Co519z4hjxH2m6Kv-kPapBdeccNB-671xz9sgkX2E1QuVZ0KBnP_LVUXposbDXelEn1upOjwGdIOBPng6x-28t34SZ7PsbEK3izb4c3OskQV92NswDm8ubIoHk4v3Gp7s55c8N_uU_rlbBvJfPfKsTdKdt_tnPtUbnkrqDNlDx-2pTd8T5aq1XgYySHB4pBW1Xszm3vex794Vb3ejpCnbWWn3BgV2ziDv9-eTd7eiL2Tn5v4nzCgRFr1RjoL72AS88Wt7SH3t_2EPZorask-aAHGr_KvQBvMFKQGJlhaf947PKP34tPF0HOZ9dcdE6rA-Fm0uslXBMi-lw2-8mysFoyD_4xtj3ef5kdMZ8NquiL-JGLTBBo2vEUWR9k-2qcLiFdbEm53YRSGizJmZLuJNuvdNnwh2zXZbvZ5uCIRy_Zks14xtuAxCck63K7IKoxW6zCAF9jnl_UqZCS7QBaidQh1yqvArqaBVMWCa91CvN-9rMJFlV6g0m6FJqRfdondplVs5ZeXttBoHVZcGz0hGG4qiP3VOpcKrqAebNeLVlVxaUyjbeeTEyKngpuyvQTMXjEntzF3_5aNknYnROTkOGpETh3Na0z-DQAA__9AxYk9">