This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[wwwdocs] Document PR libstdc++/68210 (LWG DR 206) changes


Some notes for /gcc-9/porting_to.html (I haven't seen this change
cause any issues in practice, but it doesn't hurt to document it).

Committed to CVS.

Index: htdocs/gcc-9/porting_to.html
===================================================================
RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-9/porting_to.html,v
retrieving revision 1.4
diff -u -r1.4 porting_to.html
--- htdocs/gcc-9/porting_to.html	17 Apr 2019 18:32:41 -0000	1.4
+++ htdocs/gcc-9/porting_to.html	13 May 2019 11:55:25 -0000
@@ -111,9 +111,51 @@
       }
   </code></pre>
 
-<!--
 <h2 id="cxx">C++ language issues</h2>
--->
+
+<h3>
+  <code>operator new(size_t, nothrow_t)</code> calls
+  <code>operator new(size_t)</code>
+</h3>
+
+<p>
+GCC 9 implements the requirement introduced in the C++ 2011 standard that
+the <code>nothrow</code> version of <code>operator new</code> calls the
+ordinary, throwing version of <code>operator new</code> (and catches any
+exception and instead returns a null pointer). 
+This was changed by <a href="https://wg21.link/lwg206";>DR 206</a> to ensure
+that the various forms of <code>operator new</code> do not become decoupled
+if a user only replaces the ordinary <code>operator new</code>.
+</p>
+
+<p>
+Code that only replaces one version of <code>operator new</code> and expects
+the other versions to be unaffected might change behaviour when using GCC 9.
+</p>
+
+<p>
+If your program uses a replacement <code>operator new(size_t, nothrow_t)</code>
+then it must also replace <code>operator new(size_t)</code> and
+<code>operator delete(void*)</code>, and ensure memory obtained from the
+<code>nothrow</code> version of <code>new</code> can be freed by the ordinary
+version of <code>operator delete</code>.
+</p>
+
+<p>
+The simplest solution is to only replace the ordinary
+<code>operator new(size_t)</code> and
+<code>operator delete(void*)</code>
+functions, and the replaced versions will be used by all of
+<code>operator new(size_t, nothrow_t)</code>,
+<code>operator new[](size_t)</code> and
+<code>operator new[](size_t, nothrow_t)</code>
+and the corresponding <code>operator delete</code> functions.
+To support types with extended alignment you may also need to replace
+<code>operator new(size_t, std::align_val_t)</code> and
+<code>operator delete(void*, std::align_val_t)</code>
+(which will then be used by the <code>nothrow</code> and array forms for
+extended alignments).
+</p>
 
 <!--
 <h2 id="fortran">Fortran language issues</h2>

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]