public inbox for libstdc++@gcc.gnu.org
 help / color / mirror / Atom feed
From: Patrick Palka <ppalka@redhat.com>
To: Patrick Palka <ppalka@redhat.com>
Cc: gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org
Subject: Re: [PATCH] libstdc++: Fix the default constructor of ranges::__detail::__box
Date: Thu, 29 Oct 2020 19:48:18 -0400 (EDT)	[thread overview]
Message-ID: <5b86a40-d458-26cc-4f5e-9191185eefab@idea> (raw)
In-Reply-To: <20201029231146.2538093-1-ppalka@redhat.com>

On Thu, 29 Oct 2020, Patrick Palka wrote:

> The class template semiregular-box<T> of [range.semi.wrap] is specified
> to value-initialize the underlying object whenever its type is default-
> initializable.  Our primary template for __detail::__box respects this
> requirement, but the recently added partial specialization (for types
> which are already semiregular) does not.
> 
> This patch fixes this issue, and additionally makes the in place
> constructor explicit (as in the primary template).
> 
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk?
> 
> libstdc++-v3/ChangeLog:
> 
> 	* include/std/ranges (__detail::__box): For the partial
> 	specialization for types that are already semiregular,
> 	make the default constructor value-initialize the underlying
> 	object instead of default-initializing it.  Make the
> 	corresponding in place constructor explicit.
> 	* testsuite/std/ranges/detail/semiregular_box.cc: New test.
> ---
>  libstdc++-v3/include/std/ranges               |  4 +--
>  .../std/ranges/detail/semiregular_box.cc      | 33 +++++++++++++++++++
>  2 files changed, 35 insertions(+), 2 deletions(-)
>  create mode 100644 libstdc++-v3/testsuite/std/ranges/detail/semiregular_box.cc
> 
> diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
> index df02b03cada..59aac326309 100644
> --- a/libstdc++-v3/include/std/ranges
> +++ b/libstdc++-v3/include/std/ranges
> @@ -141,7 +141,7 @@ namespace ranges
>        struct __box<_Tp>
>        {
>        private:
> -	[[no_unique_address]] _Tp _M_value;
> +	[[no_unique_address]] _Tp _M_value = {};

It would be more consistent with the rest of the header to do = _Tp()
instead:

Tested on x86_64-pc-linux-gnu.

-- >8 --

---
 libstdc++-v3/include/std/ranges               |  4 +--
 .../std/ranges/detail/semiregular_box.cc      | 33 +++++++++++++++++++
 2 files changed, 35 insertions(+), 2 deletions(-)
 create mode 100644 libstdc++-v3/testsuite/std/ranges/detail/semiregular_box.cc

diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index df02b03cada..579280d16fb 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -141,7 +141,7 @@ namespace ranges
       struct __box<_Tp>
       {
       private:
-	[[no_unique_address]] _Tp _M_value;
+	[[no_unique_address]] _Tp _M_value = _Tp();
 
       public:
 	__box() = default;
@@ -160,7 +160,7 @@ namespace ranges
 
 	template<typename... _Args>
 	  requires constructible_from<_Tp, _Args...>
-	  constexpr
+	  constexpr explicit
 	  __box(in_place_t, _Args&&... __args)
 	  noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
 	  : _M_value{std::forward<_Args>(__args)...}
diff --git a/libstdc++-v3/testsuite/std/ranges/detail/semiregular_box.cc b/libstdc++-v3/testsuite/std/ranges/detail/semiregular_box.cc
new file mode 100644
index 00000000000..2a909d6ae50
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/ranges/detail/semiregular_box.cc
@@ -0,0 +1,33 @@
+// Copyright (C) 2020 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <ranges>
+
+using std::ranges::__detail::__box;
+
+constexpr bool
+test01()
+{
+  // Verify the default constructor value-initializes the underlying object.
+  __box<int> x;
+  __glibcxx_assert(*x == 0);
+  return true;
+}
+static_assert(test01());
-- 
2.29.0.rc0


  reply	other threads:[~2020-10-29 23:48 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-29 23:11 Patrick Palka
2020-10-29 23:48 ` Patrick Palka [this message]
2020-10-30 10:33   ` Jonathan Wakely

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=5b86a40-d458-26cc-4f5e-9191185eefab@idea \
    --to=ppalka@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=libstdc++@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).