public inbox for gcc-cvs-wwwdocs@sourceware.org
help / color / mirror / Atom feed
From: Jonathan Wakely <redi@sourceware.org>
To: gcc-cvs-wwwdocs@gcc.gnu.org
Subject: gcc-wwwdocs branch master updated. 7c5925997a1a6fef98e29c7a4ed946924ec23df8
Date: Thu,  2 Mar 2023 20:55:47 +0000 (GMT)	[thread overview]
Message-ID: <20230302205547.ACD0D3858D33@sourceware.org> (raw)

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gcc-wwwdocs".

The branch, master has been updated
       via  7c5925997a1a6fef98e29c7a4ed946924ec23df8 (commit)
      from  20a280fdead95b9a6e9071a6d167dac76cba616a (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 7c5925997a1a6fef98e29c7a4ed946924ec23df8
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Mar 2 20:54:46 2023 +0000

    Document allocator_traits<A>::rebind_alloc assertion with GCC 13

diff --git a/htdocs/gcc-13/porting_to.html b/htdocs/gcc-13/porting_to.html
index 5cbeefb6..f0ccef69 100644
--- a/htdocs/gcc-13/porting_to.html
+++ b/htdocs/gcc-13/porting_to.html
@@ -144,5 +144,65 @@ done in the i387 floating point stack or are spilled from it.
 The <code>-fexcess-precision=fast</code> option can be used to request the
 previous behavior.
 
+<h3 id="alloc-rebind">allocator_traits&lt;A&gt;::rebind_alloc&lt;A::value_type&gt; must be A</h3>
+
+<p>
+GCC 13 now checks that allocators used with the standard library
+can be "rebound" to allocate memory for a different type,
+as required by the allocator requirements in the C++ standard.
+If an allocator type <tt>Alloc&lt;T&gt;</tt>
+cannot be correctly rebound to another type <tt>Alloc&lt;U&gt;</tt>,
+you will get an error like this:
+</p>
+
+<pre>
+.../bits/alloc_traits.h:70:31: error: static assertion failed: allocator_traits&lt;A&gt;::rebind_alloc&lt;A::value_type&gt; must be A
+</pre>
+
+<p>
+The assertion checks that rebinding an allocator to its own value type is a
+no-op, which will be true if its <tt>rebind</tt> member is defined correctly.
+If rebinding it to its own value type produces a different type,
+then the allocator cannot be used with the standard library.
+</p>
+
+<p>
+The most common cause of this error is an allocator type <tt>Alloc&lt;T&gt;</tt>
+that derives from <tt>std::allocator&lt;T&gt;</tt> but does not provide its own
+<tt>rebind</tt> member. When the standard library attempts to rebind the
+allocator using <tt>Alloc&lt;T&gt;::rebind&lt;U&gt;</tt> it finds the
+<tt>std::allocator&lt;T&gt;::rebind&lt;U&gt;</tt> member from the base class,
+and the result is <tt>std::allocator&lt;U&gt;</tt> instead of
+<tt>Alloc&lt;U&gt;</tt>.
+</p>
+
+<p>
+The solution is to provide a correct <tt>rebind</tt> member as shown below.
+A converting constructor must also be provided, so that that an
+<tt>Alloc&lt;U&gt;</tt> can be constructed from an <tt>Alloc&lt;T&gt;</tt>,
+and vice versa:
+</p>
+<pre><code>
+template&lt;class T&gt;
+class Alloc
+{
+  Alloc();
+  <b>
+  template&lt;class U&gt; Alloc(const Alloc&lt;U&gt;);
+
+  template&lt;class U&gt; struct rebind { using other = Alloc&lt;U&gt;; };
+  </b>
+  // ...
+};
+</code></pre>
+
+<p>
+Since C++20, there is no <tt>rebind</tt> member in <tt>std::allocator</tt>,
+so deriving your own allocator types from <tt>std::allocator</tt> is simpler
+and doesn't require the derived allocator to provide its own <tt>rebind</tt>.
+For compatibility with previous C++ standards, the member should still be
+provided. The converting constructor is still required even in C++20.
+</p>
+
 </body>
 </html>

-----------------------------------------------------------------------

Summary of changes:
 htdocs/gcc-13/porting_to.html | 60 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)


hooks/post-receive
-- 
gcc-wwwdocs

                 reply	other threads:[~2023-03-02 20:55 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230302205547.ACD0D3858D33@sourceware.org \
    --to=redi@sourceware.org \
    --cc=gcc-cvs-wwwdocs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).