// A minimal conforming implementation of std::construct_at/destroy_at, // used by some C++20 constexpr tests to avoid including all of . namespace std { typedef __SIZE_TYPE__ size_t; template struct allocator { constexpr allocator () noexcept {} constexpr T *allocate (size_t n) { return static_cast (::operator new (n * sizeof(T))); } constexpr void deallocate (T *p, size_t n) { ::operator delete (p); } }; template U __declval (int); template T __declval (long); template auto declval () noexcept -> decltype (__declval (0)); template struct remove_reference { typedef T type; }; template struct remove_reference { typedef T type; }; template struct remove_reference { typedef T type; }; template constexpr T && forward (typename std::remove_reference::type &t) noexcept { return static_cast (t); } template constexpr T && forward (typename std::remove_reference::type &&t) noexcept { return static_cast (t); } template constexpr auto construct_at (T *l, A &&... a) noexcept (noexcept (::new ((void *) 0) T (std::declval ()...))) -> decltype (::new ((void *) 0) T (std::declval ()...)) { return ::new ((void *) l) T (std::forward (a)...); } template constexpr inline void destroy_at (T *l) { l->~T (); } } #if __cpp_constexpr >= 202406L constexpr #else inline #endif void *operator new (std::size_t, void *p) noexcept { return p; } #if __cpp_constexpr >= 202406L constexpr #else inline #endif void *operator new[] (std::size_t, void *p) noexcept { return p; }