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

    <tr>
        <th>Summary</th>
        <td>
            Memory allocated via `__builtin_operator_new` never starts its lifetime
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:frontend,
            constexpr
      </td>
    </tr>

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

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

<pre>
    This code should work:
```c++
namespace std {
  using size_t = decltype(sizeof(0));
  template<typename T> struct allocator {
 constexpr T *allocate(size_t N) {
      return (T*)::operator new(sizeof(T) * N);
    }
    constexpr void deallocate(void *p) {
 ::operator delete(p); // both-note {{std::allocator<...>::deallocate' used to delete pointer to object allocated with 'new'}}
    }
 };
}

constexpr int arrayAlloc() {
  int *F = std::allocator<int>().allocate(2);
  F[0] = 10;
  F[1] = 13;
  int Res = F[1] + F[0];
  std::allocator<int>().deallocate(F);
  return Res;
}
static_assert(arrayAlloc() == 23);
```
https://godbolt.org/z/a57f4vvMf

But the assignment to `F[0]` is currently diagnosed:
```
<source>:23:15: error: static assertion expression is not an integral constant expression
   23 | static_assert(arrayAlloc() == 23);
      | ^~~~~~~~~~~~~~~~~~
<source>:17:8: note: assignment to object outside its lifetime is not allowed in a constant expression
   17 |   F[0] = 10;
 |   ~~~~~^~~~
<source>:23:15: note: in call to 'arrayAlloc()'
   23 | static_assert(arrayAlloc() == 23);
      | ^~~~~~~~~~~~
```

(I used `::operator new` in the sample to please GCC, but using `__builtin_operator_new` has the same problem.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VU2PozgQ_TWVS2kiYgdIDhxI0lntYfYw6ntkoJJ417GRXaS357C_fWXIB0m3eqSVFiHAVXb5vVflQoWgD5aogHQF6WaiOj46X3ClqCHvJ5Vr3ovXow5Yu4YwHF1nGnxz_i-QJSQbSErIkuGuQazi3VutOlFoVU0YuEHIL2bELmh7wKB_0o4R5AYbqg2_twRiEa1uD2KRgFjGW96WMZ1ao5hAruPkGB5fQb5gYN_VjMoYVyt2frRX7Wxg-rv1-IogysuU60Y7xj9ALMfY4uWJO28RxOIVRNmDKEGWriXfh7f0Nkb62ocQZR9rhBcR8s19cIdydrrBhkZgeguIsn1E87RvQ4b66e2wEYLYgthi5fj4zTqmfmm-CtwMK2-KgFxPp1OQL4N9vHeOXaAG2V3CY-u0ZfLR4qo_6S4sNfim-Ygg8l6BPNIbM7wP4tdViJt1eN5l0JZRea_eyxgfxOIpFdEPotz2JfIpJ205cupXTkdyisdEbCFdJZBu-kCz5Mkzu3nkyBM3_0Ghd9xnidUt2Gjur7E9JHv7iO5SbT8ofJQssGJd71QI5BnE4qNcchMRCjmOeTuOw_DI3IYIsK-Wg2sqZ3jq_AHE9ieIrUrz_fx8_r4fp2nVMfKRcOgOJ7IcCwKy5MY_SzD2hM57smzesdHqYF2g5mNbuAzlOrjO1zTUoZAgy1kKskTyPmpW4sAXB77aWYyFQiHETx3QOkZlY27o4JUZjpSyPJp2q0YhEfI1_jcFhz4Q10P68s_z9SmdWQ6yXEQS8STG96N0l7PkOg66IdQc0Og9sT7RjZox7o0a1BbVl9xmeY_ti8oe3APansGvUnAFrS3Wypg-2SJ_Vise-v9V4M8LZ3iKxe9Dr4qOjx051qPtazaoU2soUmgNqUD423oNYo1Vx5d_D2TJbld12rC2u2uU3SXKUYVrGMLWu8rQaTppCtks5VJNqJjlIs0Wy1xmk2Ox3O-FSKsk38_3C6qSrMoWszSpZZXPZ00yn-hCJGKeLJM8yWapzKaJypTIl0KJTO2VmME8oZPSZmrM-RTP5USH0FExS_IsW0yMqsiE_u8sRG2UPYAs995ZJtuAECDW0XFtq9GSbia-iNG-Vd0hwDwxOnC4x2fNhorvdHL-fdTdz1p9rYylM_mYcc_hoYInnTfFU5_RfOyqae1OILZx58vrW-tdPAkgtj3NAGJ7YXouxL8BAAD__xBZiIk">