https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115645
--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> --- This has started to fail since r15-1946 using size_t = decltype(sizeof(0)); void* operator new(size_t, void* p) { return p; } void* operator new[](size_t, void* p) { return p; } #define VERIFY(C) if (!(C)) throw namespace std { template<typename T> constexpr T* construct_at(T* p) { if constexpr (__is_array(T)) return ::new((void*)p) T[1](); else return ::new((void*)p) T(); } } constexpr void test_array() { int arr[1] { 99 }; std::construct_at(&arr); VERIFY( arr[0] == 0 ); union U { long long x = -1; int arr[4]; } u; auto p = std::construct_at(&u.arr); VERIFY( (*p)[0] == 0 ); } static_assert( [] { test_array(); return true; }() );