1    	// The -*- C++ -*- dynamic memory management header.
2    	
3    	// Copyright (C) 1994-2017 Free Software Foundation, Inc.
4    	
5    	// This file is part of GCC.
6    	//
7    	// GCC is free software; you can redistribute it and/or modify
8    	// it under the terms of the GNU General Public License as published by
9    	// the Free Software Foundation; either version 3, or (at your option)
10   	// any later version.
11   	// 
12   	// GCC is distributed in the hope that it will be useful,
13   	// but WITHOUT ANY WARRANTY; without even the implied warranty of
14   	// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   	// GNU General Public License for more details.
16   	// 
17   	// Under Section 7 of GPL version 3, you are granted additional
18   	// permissions described in the GCC Runtime Library Exception, version
19   	// 3.1, as published by the Free Software Foundation.
20   	
21   	// You should have received a copy of the GNU General Public License and
22   	// a copy of the GCC Runtime Library Exception along with this program;
23   	// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24   	// <http://www.gnu.org/licenses/>.
25   	
26   	/** @file new
27   	 *  This is a Standard C++ Library header.
28   	 *
29   	 *  The header @c new defines several functions to manage dynamic memory and
30   	 *  handling memory allocation errors; see
31   	 *  http://gcc.gnu.org/onlinedocs/libstdc++/18_support/howto.html#4 for more.
32   	 */
33   	
34   	#ifndef _NEW
35   	#define _NEW
36   	
37   	#pragma GCC system_header
38   	
39   	#include <bits/c++config.h>
40   	#include <exception>
41   	
42   	#pragma GCC visibility push(default)
43   	
44   	extern "C++" {
45   	
46   	namespace std 
47   	{
48   	  /**
49   	   *  @brief  Exception possibly thrown by @c new.
50   	   *  @ingroup exceptions
51   	   *
52   	   *  @c bad_alloc (or classes derived from it) is used to report allocation
53   	   *  errors from the throwing forms of @c new.  */
54   	  class bad_alloc : public exception 
55   	  {
56   	  public:
57   	    bad_alloc() throw() { }
58   	
59   	    // This declaration is not useless:
60   	    // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
61   	    virtual ~bad_alloc() throw();
62   	
63   	    // See comment in eh_exception.cc.
64   	    virtual const char* what() const throw();
65   	  };
66   	
67   	#if __cplusplus >= 201103L
68   	  class bad_array_new_length : public bad_alloc
69   	  {
70   	  public:
71   	    bad_array_new_length() throw() { };
72   	
73   	    // This declaration is not useless:
74   	    // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
75   	    virtual ~bad_array_new_length() throw();
76   	
77   	    // See comment in eh_exception.cc.
78   	    virtual const char* what() const throw();
79   	  };
80   	#endif
81   	
82   	#if __cpp_aligned_new
83   	  enum class align_val_t: size_t {};
84   	#endif
85   	
86   	  struct nothrow_t
87   	  {
88   	#if __cplusplus >= 201103L
89   	    explicit nothrow_t() = default;
90   	#endif
91   	  };
92   	
93   	  extern const nothrow_t nothrow;
94   	
95   	  /** If you write your own error handler to be called by @c new, it must
96   	   *  be of this type.  */
97   	  typedef void (*new_handler)();
98   	
99   	  /// Takes a replacement handler as the argument, returns the
100  	  /// previous handler.
101  	  new_handler set_new_handler(new_handler) throw();
102  	
103  	#if __cplusplus >= 201103L
104  	  /// Return the current new handler.
105  	  new_handler get_new_handler() noexcept;
106  	#endif
107  	} // namespace std
108  	
109  	//@{
110  	/** These are replaceable signatures:
111  	 *  - normal single new and delete (no arguments, throw @c bad_alloc on error)
112  	 *  - normal array new and delete (same)
113  	 *  - @c nothrow single new and delete (take a @c nothrow argument, return
114  	 *    @c NULL on error)
115  	 *  - @c nothrow array new and delete (same)
116  	 *
117  	 *  Placement new and delete signatures (take a memory address argument,
118  	 *  does nothing) may not be replaced by a user's program.
119  	*/
120  	void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc)
121  	  __attribute__((__externally_visible__));
122  	void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc)
123  	  __attribute__((__externally_visible__));
124  	void operator delete(void*) _GLIBCXX_USE_NOEXCEPT
125  	  __attribute__((__externally_visible__));
126  	void operator delete[](void*) _GLIBCXX_USE_NOEXCEPT
127  	  __attribute__((__externally_visible__));
128  	#if __cpp_sized_deallocation
129  	void operator delete(void*, std::size_t) _GLIBCXX_USE_NOEXCEPT
130  	  __attribute__((__externally_visible__));
131  	void operator delete[](void*, std::size_t) _GLIBCXX_USE_NOEXCEPT
132  	  __attribute__((__externally_visible__));
133  	#endif
134  	void* operator new(std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
135  	  __attribute__((__externally_visible__));
136  	void* operator new[](std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
137  	  __attribute__((__externally_visible__));
138  	void operator delete(void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
139  	  __attribute__((__externally_visible__));
140  	void operator delete[](void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
141  	  __attribute__((__externally_visible__));
142  	#if __cpp_aligned_new
143  	void* operator new(std::size_t, std::align_val_t)
144  	  __attribute__((__externally_visible__));
145  	void* operator new(std::size_t, std::align_val_t, const std::nothrow_t&)
146  	  _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
147  	void operator delete(void*, std::align_val_t)
148  	  _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
149  	void operator delete(void*, std::align_val_t, const std::nothrow_t&)
150  	  _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
151  	void* operator new[](std::size_t, std::align_val_t)
152  	  __attribute__((__externally_visible__));
153  	void* operator new[](std::size_t, std::align_val_t, const std::nothrow_t&)
154  	  _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
155  	void operator delete[](void*, std::align_val_t)
156  	  _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
157  	void operator delete[](void*, std::align_val_t, const std::nothrow_t&)
158  	  _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
159  	#if __cpp_sized_deallocation
160  	void operator delete(void*, std::size_t, std::align_val_t)
161  	  _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
162  	void operator delete[](void*, std::size_t, std::align_val_t)
163  	  _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__));
164  	#endif // __cpp_sized_deallocation
165  	#endif // __cpp_aligned_new
166  	
167  	// Default placement versions of operator new.
168  	inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
169  	{ return __p; }
170  	inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
171  	{ return __p; }
172  	
173  	// Default placement versions of operator delete.
174  	inline void operator delete  (void*, void*) _GLIBCXX_USE_NOEXCEPT { }
175  	inline void operator delete[](void*, void*) _GLIBCXX_USE_NOEXCEPT { }
176  	//@}
177  	} // extern "C++"
178  	
179  	#if __cplusplus > 201402L
180  	#if __GNUC__ >= 7
181  	#  define _GLIBCXX_HAVE_BUILTIN_LAUNDER 1
182  	#elif defined __has_builtin
183  	// For non-GNU compilers:
184  	# if __has_builtin(__builtin_launder)
185  	#  define _GLIBCXX_HAVE_BUILTIN_LAUNDER 1
186  	# endif
187  	#endif
188  	
189  	#ifdef _GLIBCXX_HAVE_BUILTIN_LAUNDER
190  	namespace std
191  	{
192  	#define __cpp_lib_launder 201606
193  	  /// Pointer optimization barrier [ptr.launder]
194  	  template<typename _Tp>
195  	    constexpr _Tp*
196  	    launder(_Tp* __p) noexcept
197  	    { return __builtin_launder(__p); }
198  	
199  	  // The program is ill-formed if T is a function type or
200  	  // (possibly cv-qualified) void.
201  	
202  	  template<typename _Ret, typename... _Args _GLIBCXX_NOEXCEPT_PARM>
203  	    void launder(_Ret (*)(_Args...) _GLIBCXX_NOEXCEPT_QUAL) = delete;
204  	  template<typename _Ret, typename... _Args _GLIBCXX_NOEXCEPT_PARM>
205  	    void launder(_Ret (*)(_Args......) _GLIBCXX_NOEXCEPT_QUAL) = delete;
206  	
207  	  void launder(void*) = delete;
208  	  void launder(const void*) = delete;
209  	  void launder(volatile void*) = delete;
210  	  void launder(const volatile void*) = delete;
211  	}
212  	#endif // _GLIBCXX_HAVE_BUILTIN_LAUNDER
213  	#undef _GLIBCXX_HAVE_BUILTIN_LAUNDER
214  	#endif // C++17
215  	
216  	#pragma GCC visibility pop
217  	
218  	#endif
219