xref: /openbsd/gnu/llvm/libcxx/include/new (revision 46035553)
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