1*46035553Spatrick// -*- C++ -*- 2*46035553Spatrick//===----------------------------- new ------------------------------------===// 3*46035553Spatrick// 4*46035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*46035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 6*46035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*46035553Spatrick// 8*46035553Spatrick//===----------------------------------------------------------------------===// 9*46035553Spatrick 10*46035553Spatrick#ifndef _LIBCPP_NEW 11*46035553Spatrick#define _LIBCPP_NEW 12*46035553Spatrick 13*46035553Spatrick/* 14*46035553Spatrick new synopsis 15*46035553Spatrick 16*46035553Spatricknamespace std 17*46035553Spatrick{ 18*46035553Spatrick 19*46035553Spatrickclass bad_alloc 20*46035553Spatrick : public exception 21*46035553Spatrick{ 22*46035553Spatrickpublic: 23*46035553Spatrick bad_alloc() noexcept; 24*46035553Spatrick bad_alloc(const bad_alloc&) noexcept; 25*46035553Spatrick bad_alloc& operator=(const bad_alloc&) noexcept; 26*46035553Spatrick virtual const char* what() const noexcept; 27*46035553Spatrick}; 28*46035553Spatrick 29*46035553Spatrickclass bad_array_new_length : public bad_alloc // C++14 30*46035553Spatrick{ 31*46035553Spatrickpublic: 32*46035553Spatrick bad_array_new_length() noexcept; 33*46035553Spatrick}; 34*46035553Spatrick 35*46035553Spatrickenum class align_val_t : size_t {}; // C++17 36*46035553Spatrick 37*46035553Spatrickstruct destroying_delete_t { // C++20 38*46035553Spatrick explicit destroying_delete_t() = default; 39*46035553Spatrick}; 40*46035553Spatrickinline constexpr destroying_delete_t destroying_delete{}; // C++20 41*46035553Spatrick 42*46035553Spatrickstruct nothrow_t { explicit nothrow_t() = default; }; 43*46035553Spatrickextern const nothrow_t nothrow; 44*46035553Spatricktypedef void (*new_handler)(); 45*46035553Spatricknew_handler set_new_handler(new_handler new_p) noexcept; 46*46035553Spatricknew_handler get_new_handler() noexcept; 47*46035553Spatrick 48*46035553Spatrick// 21.6.4, pointer optimization barrier 49*46035553Spatricktemplate <class T> constexpr T* launder(T* p) noexcept; // C++17 50*46035553Spatrick} // std 51*46035553Spatrick 52*46035553Spatrickvoid* operator new(std::size_t size); // replaceable, nodiscard in C++2a 53*46035553Spatrickvoid* operator new(std::size_t size, std::align_val_t alignment); // replaceable, C++17, nodiscard in C++2a 54*46035553Spatrickvoid* operator new(std::size_t size, const std::nothrow_t&) noexcept; // replaceable, nodiscard in C++2a 55*46035553Spatrickvoid* operator new(std::size_t size, std::align_val_t alignment, 56*46035553Spatrick const std::nothrow_t&) noexcept; // replaceable, C++17, nodiscard in C++2a 57*46035553Spatrickvoid operator delete(void* ptr) noexcept; // replaceable 58*46035553Spatrickvoid operator delete(void* ptr, std::size_t size) noexcept; // replaceable, C++14 59*46035553Spatrickvoid operator delete(void* ptr, std::align_val_t alignment) noexcept; // replaceable, C++17 60*46035553Spatrickvoid operator delete(void* ptr, std::size_t size, 61*46035553Spatrick std::align_val_t alignment) noexcept; // replaceable, C++17 62*46035553Spatrickvoid operator delete(void* ptr, const std::nothrow_t&) noexcept; // replaceable 63*46035553Spatrickvoid operator delete(void* ptr, std:align_val_t alignment, 64*46035553Spatrick const std::nothrow_t&) noexcept; // replaceable, C++17 65*46035553Spatrick 66*46035553Spatrickvoid* operator new[](std::size_t size); // replaceable, nodiscard in C++2a 67*46035553Spatrickvoid* operator new[](std::size_t size, 68*46035553Spatrick std::align_val_t alignment) noexcept; // replaceable, C++17, nodiscard in C++2a 69*46035553Spatrickvoid* operator new[](std::size_t size, const std::nothrow_t&) noexcept; // replaceable, nodiscard in C++2a 70*46035553Spatrickvoid* operator new[](std::size_t size, std::align_val_t alignment, 71*46035553Spatrick const std::nothrow_t&) noexcept; // replaceable, C++17, nodiscard in C++2a 72*46035553Spatrickvoid operator delete[](void* ptr) noexcept; // replaceable 73*46035553Spatrickvoid operator delete[](void* ptr, std::size_t size) noexcept; // replaceable, C++14 74*46035553Spatrickvoid operator delete[](void* ptr, 75*46035553Spatrick std::align_val_t alignment) noexcept; // replaceable, C++17 76*46035553Spatrickvoid operator delete[](void* ptr, std::size_t size, 77*46035553Spatrick std::align_val_t alignment) noexcept; // replaceable, C++17 78*46035553Spatrickvoid operator delete[](void* ptr, const std::nothrow_t&) noexcept; // replaceable 79*46035553Spatrickvoid operator delete[](void* ptr, std::align_val_t alignment, 80*46035553Spatrick const std::nothrow_t&) noexcept; // replaceable, C++17 81*46035553Spatrick 82*46035553Spatrickvoid* operator new (std::size_t size, void* ptr) noexcept; // nodiscard in C++2a 83*46035553Spatrickvoid* operator new[](std::size_t size, void* ptr) noexcept; // nodiscard in C++2a 84*46035553Spatrickvoid operator delete (void* ptr, void*) noexcept; 85*46035553Spatrickvoid operator delete[](void* ptr, void*) noexcept; 86*46035553Spatrick 87*46035553Spatrick*/ 88*46035553Spatrick 89*46035553Spatrick#include <__config> 90*46035553Spatrick#include <exception> 91*46035553Spatrick#include <type_traits> 92*46035553Spatrick#include <cstddef> 93*46035553Spatrick#include <version> 94*46035553Spatrick#ifdef _LIBCPP_NO_EXCEPTIONS 95*46035553Spatrick#include <cstdlib> 96*46035553Spatrick#endif 97*46035553Spatrick 98*46035553Spatrick#if defined(_LIBCPP_ABI_VCRUNTIME) 99*46035553Spatrick#include <new.h> 100*46035553Spatrick#endif 101*46035553Spatrick 102*46035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 103*46035553Spatrick#pragma GCC system_header 104*46035553Spatrick#endif 105*46035553Spatrick 106*46035553Spatrick#if !defined(__cpp_sized_deallocation) || __cpp_sized_deallocation < 201309L 107*46035553Spatrick#define _LIBCPP_HAS_NO_LANGUAGE_SIZED_DEALLOCATION 108*46035553Spatrick#endif 109*46035553Spatrick 110*46035553Spatrick#if !defined(_LIBCPP_BUILDING_LIBRARY) && _LIBCPP_STD_VER < 14 && \ 111*46035553Spatrick defined(_LIBCPP_HAS_NO_LANGUAGE_SIZED_DEALLOCATION) 112*46035553Spatrick# define _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION 113*46035553Spatrick#endif 114*46035553Spatrick 115*46035553Spatrick#if defined(_LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION) || \ 116*46035553Spatrick defined(_LIBCPP_HAS_NO_LANGUAGE_SIZED_DEALLOCATION) 117*46035553Spatrick# define _LIBCPP_HAS_NO_SIZED_DEALLOCATION 118*46035553Spatrick#endif 119*46035553Spatrick 120*46035553Spatrick#if !__has_builtin(__builtin_operator_new) || \ 121*46035553Spatrick __has_builtin(__builtin_operator_new) < 201802L 122*46035553Spatrick#define _LIBCPP_HAS_NO_BUILTIN_OVERLOADED_OPERATOR_NEW_DELETE 123*46035553Spatrick#endif 124*46035553Spatrick 125*46035553Spatricknamespace std // purposefully not using versioning namespace 126*46035553Spatrick{ 127*46035553Spatrick 128*46035553Spatrick#if !defined(_LIBCPP_ABI_VCRUNTIME) 129*46035553Spatrickstruct _LIBCPP_TYPE_VIS nothrow_t { explicit nothrow_t() = default; }; 130*46035553Spatrickextern _LIBCPP_FUNC_VIS const nothrow_t nothrow; 131*46035553Spatrick 132*46035553Spatrickclass _LIBCPP_EXCEPTION_ABI bad_alloc 133*46035553Spatrick : public exception 134*46035553Spatrick{ 135*46035553Spatrickpublic: 136*46035553Spatrick bad_alloc() _NOEXCEPT; 137*46035553Spatrick virtual ~bad_alloc() _NOEXCEPT; 138*46035553Spatrick virtual const char* what() const _NOEXCEPT; 139*46035553Spatrick}; 140*46035553Spatrick 141*46035553Spatrickclass _LIBCPP_EXCEPTION_ABI bad_array_new_length 142*46035553Spatrick : public bad_alloc 143*46035553Spatrick{ 144*46035553Spatrickpublic: 145*46035553Spatrick bad_array_new_length() _NOEXCEPT; 146*46035553Spatrick virtual ~bad_array_new_length() _NOEXCEPT; 147*46035553Spatrick virtual const char* what() const _NOEXCEPT; 148*46035553Spatrick}; 149*46035553Spatrick 150*46035553Spatricktypedef void (*new_handler)(); 151*46035553Spatrick_LIBCPP_FUNC_VIS new_handler set_new_handler(new_handler) _NOEXCEPT; 152*46035553Spatrick_LIBCPP_FUNC_VIS new_handler get_new_handler() _NOEXCEPT; 153*46035553Spatrick 154*46035553Spatrick#endif // !_LIBCPP_ABI_VCRUNTIME 155*46035553Spatrick 156*46035553Spatrick_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_bad_alloc(); // not in C++ spec 157*46035553Spatrick 158*46035553Spatrick#if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) && \ 159*46035553Spatrick !defined(_LIBCPP_ABI_VCRUNTIME) 160*46035553Spatrick#ifndef _LIBCPP_CXX03_LANG 161*46035553Spatrickenum class _LIBCPP_ENUM_VIS align_val_t : size_t { }; 162*46035553Spatrick#else 163*46035553Spatrickenum align_val_t { __zero = 0, __max = (size_t)-1 }; 164*46035553Spatrick#endif 165*46035553Spatrick#endif 166*46035553Spatrick 167*46035553Spatrick#if _LIBCPP_STD_VER > 17 168*46035553Spatrick// Enable the declaration even if the compiler doesn't support the language 169*46035553Spatrick// feature. 170*46035553Spatrickstruct destroying_delete_t { 171*46035553Spatrick explicit destroying_delete_t() = default; 172*46035553Spatrick}; 173*46035553Spatrick_LIBCPP_INLINE_VAR constexpr destroying_delete_t destroying_delete{}; 174*46035553Spatrick#endif // _LIBCPP_STD_VER > 17 175*46035553Spatrick 176*46035553Spatrick} // std 177*46035553Spatrick 178*46035553Spatrick#if defined(_LIBCPP_CXX03_LANG) 179*46035553Spatrick#define _THROW_BAD_ALLOC throw(std::bad_alloc) 180*46035553Spatrick#else 181*46035553Spatrick#define _THROW_BAD_ALLOC 182*46035553Spatrick#endif 183*46035553Spatrick 184*46035553Spatrick#if !defined(_LIBCPP_ABI_VCRUNTIME) 185*46035553Spatrick 186*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz) _THROW_BAD_ALLOC; 187*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _LIBCPP_NOALIAS; 188*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p) _NOEXCEPT; 189*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT; 190*46035553Spatrick#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION 191*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete(void* __p, std::size_t __sz) _NOEXCEPT; 192*46035553Spatrick#endif 193*46035553Spatrick 194*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz) _THROW_BAD_ALLOC; 195*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _LIBCPP_NOALIAS; 196*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p) _NOEXCEPT; 197*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT; 198*46035553Spatrick#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION 199*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete[](void* __p, std::size_t __sz) _NOEXCEPT; 200*46035553Spatrick#endif 201*46035553Spatrick 202*46035553Spatrick#ifndef _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION 203*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t) _THROW_BAD_ALLOC; 204*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _LIBCPP_NOALIAS; 205*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::align_val_t) _NOEXCEPT; 206*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT; 207*46035553Spatrick#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION 208*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete(void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT; 209*46035553Spatrick#endif 210*46035553Spatrick 211*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, std::align_val_t) _THROW_BAD_ALLOC; 212*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _LIBCPP_NOALIAS; 213*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::align_val_t) _NOEXCEPT; 214*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT; 215*46035553Spatrick#ifndef _LIBCPP_HAS_NO_LIBRARY_SIZED_DEALLOCATION 216*46035553Spatrick_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete[](void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT; 217*46035553Spatrick#endif 218*46035553Spatrick#endif 219*46035553Spatrick 220*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY void* operator new (std::size_t, void* __p) _NOEXCEPT {return __p;} 221*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY void* operator new[](std::size_t, void* __p) _NOEXCEPT {return __p;} 222*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY void operator delete (void*, void*) _NOEXCEPT {} 223*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY void operator delete[](void*, void*) _NOEXCEPT {} 224*46035553Spatrick 225*46035553Spatrick#endif // !_LIBCPP_ABI_VCRUNTIME 226*46035553Spatrick 227*46035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 228*46035553Spatrick 229*46035553Spatrick_LIBCPP_CONSTEXPR inline _LIBCPP_INLINE_VISIBILITY bool __is_overaligned_for_new(size_t __align) _NOEXCEPT { 230*46035553Spatrick#ifdef __STDCPP_DEFAULT_NEW_ALIGNMENT__ 231*46035553Spatrick return __align > __STDCPP_DEFAULT_NEW_ALIGNMENT__; 232*46035553Spatrick#else 233*46035553Spatrick return __align > alignment_of<max_align_t>::value; 234*46035553Spatrick#endif 235*46035553Spatrick} 236*46035553Spatrick 237*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY void *__libcpp_allocate(size_t __size, size_t __align) { 238*46035553Spatrick#ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION 239*46035553Spatrick if (__is_overaligned_for_new(__align)) { 240*46035553Spatrick const align_val_t __align_val = static_cast<align_val_t>(__align); 241*46035553Spatrick# ifdef _LIBCPP_HAS_NO_BUILTIN_OVERLOADED_OPERATOR_NEW_DELETE 242*46035553Spatrick return ::operator new(__size, __align_val); 243*46035553Spatrick# else 244*46035553Spatrick return __builtin_operator_new(__size, __align_val); 245*46035553Spatrick# endif 246*46035553Spatrick } 247*46035553Spatrick#else 248*46035553Spatrick ((void)__align); 249*46035553Spatrick#endif 250*46035553Spatrick#ifdef _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE 251*46035553Spatrick return ::operator new(__size); 252*46035553Spatrick#else 253*46035553Spatrick return __builtin_operator_new(__size); 254*46035553Spatrick#endif 255*46035553Spatrick} 256*46035553Spatrick 257*46035553Spatrickstruct _DeallocateCaller { 258*46035553Spatrick static inline _LIBCPP_INLINE_VISIBILITY 259*46035553Spatrick void __do_deallocate_handle_size_align(void *__ptr, size_t __size, size_t __align) { 260*46035553Spatrick#if defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) 261*46035553Spatrick ((void)__align); 262*46035553Spatrick return __do_deallocate_handle_size(__ptr, __size); 263*46035553Spatrick#else 264*46035553Spatrick if (__is_overaligned_for_new(__align)) { 265*46035553Spatrick const align_val_t __align_val = static_cast<align_val_t>(__align); 266*46035553Spatrick return __do_deallocate_handle_size(__ptr, __size, __align_val); 267*46035553Spatrick } else { 268*46035553Spatrick return __do_deallocate_handle_size(__ptr, __size); 269*46035553Spatrick } 270*46035553Spatrick#endif 271*46035553Spatrick } 272*46035553Spatrick 273*46035553Spatrick static inline _LIBCPP_INLINE_VISIBILITY 274*46035553Spatrick void __do_deallocate_handle_align(void *__ptr, size_t __align) { 275*46035553Spatrick#if defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) 276*46035553Spatrick ((void)__align); 277*46035553Spatrick return __do_call(__ptr); 278*46035553Spatrick#else 279*46035553Spatrick if (__is_overaligned_for_new(__align)) { 280*46035553Spatrick const align_val_t __align_val = static_cast<align_val_t>(__align); 281*46035553Spatrick return __do_call(__ptr, __align_val); 282*46035553Spatrick } else { 283*46035553Spatrick return __do_call(__ptr); 284*46035553Spatrick } 285*46035553Spatrick#endif 286*46035553Spatrick } 287*46035553Spatrick 288*46035553Spatrick private: 289*46035553Spatrick static inline void __do_deallocate_handle_size(void *__ptr, size_t __size) { 290*46035553Spatrick#ifdef _LIBCPP_HAS_NO_SIZED_DEALLOCATION 291*46035553Spatrick ((void)__size); 292*46035553Spatrick return __do_call(__ptr); 293*46035553Spatrick#else 294*46035553Spatrick return __do_call(__ptr, __size); 295*46035553Spatrick#endif 296*46035553Spatrick } 297*46035553Spatrick 298*46035553Spatrick#ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION 299*46035553Spatrick static inline void __do_deallocate_handle_size(void *__ptr, size_t __size, align_val_t __align) { 300*46035553Spatrick#ifdef _LIBCPP_HAS_NO_SIZED_DEALLOCATION 301*46035553Spatrick ((void)__size); 302*46035553Spatrick return __do_call(__ptr, __align); 303*46035553Spatrick#else 304*46035553Spatrick return __do_call(__ptr, __size, __align); 305*46035553Spatrick#endif 306*46035553Spatrick } 307*46035553Spatrick#endif 308*46035553Spatrick 309*46035553Spatrickprivate: 310*46035553Spatrick template <class _A1, class _A2> 311*46035553Spatrick static inline void __do_call(void *__ptr, _A1 __a1, _A2 __a2) { 312*46035553Spatrick#if defined(_LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE) || \ 313*46035553Spatrick defined(_LIBCPP_HAS_NO_BUILTIN_OVERLOADED_OPERATOR_NEW_DELETE) 314*46035553Spatrick return ::operator delete(__ptr, __a1, __a2); 315*46035553Spatrick#else 316*46035553Spatrick return __builtin_operator_delete(__ptr, __a1, __a2); 317*46035553Spatrick#endif 318*46035553Spatrick } 319*46035553Spatrick 320*46035553Spatrick template <class _A1> 321*46035553Spatrick static inline void __do_call(void *__ptr, _A1 __a1) { 322*46035553Spatrick#if defined(_LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE) || \ 323*46035553Spatrick defined(_LIBCPP_HAS_NO_BUILTIN_OVERLOADED_OPERATOR_NEW_DELETE) 324*46035553Spatrick return ::operator delete(__ptr, __a1); 325*46035553Spatrick#else 326*46035553Spatrick return __builtin_operator_delete(__ptr, __a1); 327*46035553Spatrick#endif 328*46035553Spatrick } 329*46035553Spatrick 330*46035553Spatrick static inline void __do_call(void *__ptr) { 331*46035553Spatrick#ifdef _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE 332*46035553Spatrick return ::operator delete(__ptr); 333*46035553Spatrick#else 334*46035553Spatrick return __builtin_operator_delete(__ptr); 335*46035553Spatrick#endif 336*46035553Spatrick } 337*46035553Spatrick}; 338*46035553Spatrick 339*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY void __libcpp_deallocate(void* __ptr, size_t __size, size_t __align) { 340*46035553Spatrick _DeallocateCaller::__do_deallocate_handle_size_align(__ptr, __size, __align); 341*46035553Spatrick} 342*46035553Spatrick 343*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY void __libcpp_deallocate_unsized(void* __ptr, size_t __align) { 344*46035553Spatrick _DeallocateCaller::__do_deallocate_handle_align(__ptr, __align); 345*46035553Spatrick} 346*46035553Spatrick 347*46035553Spatricktemplate <class _Tp> 348*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 inline 349*46035553Spatrick_LIBCPP_CONSTEXPR _Tp* __launder(_Tp* __p) _NOEXCEPT 350*46035553Spatrick{ 351*46035553Spatrick static_assert (!(is_function<_Tp>::value), "can't launder functions" ); 352*46035553Spatrick static_assert (!(is_same<void, typename remove_cv<_Tp>::type>::value), "can't launder cv-void" ); 353*46035553Spatrick#ifdef _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER 354*46035553Spatrick return __builtin_launder(__p); 355*46035553Spatrick#else 356*46035553Spatrick return __p; 357*46035553Spatrick#endif 358*46035553Spatrick} 359*46035553Spatrick 360*46035553Spatrick 361*46035553Spatrick#if _LIBCPP_STD_VER > 14 362*46035553Spatricktemplate <class _Tp> 363*46035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY 364*46035553Spatrickconstexpr _Tp* launder(_Tp* __p) noexcept 365*46035553Spatrick{ 366*46035553Spatrick return _VSTD::__launder(__p); 367*46035553Spatrick} 368*46035553Spatrick#endif 369*46035553Spatrick 370*46035553Spatrick_LIBCPP_END_NAMESPACE_STD 371*46035553Spatrick 372*46035553Spatrick#endif // _LIBCPP_NEW 373