public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
From: Ian Lance Taylor <ian@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org
Subject: [gcc/devel/gccgo] libstdc++: Make byte-sized std::fill_n a constant expression (PR 94933)
Date: Sun, 12 Jul 2020 17:45:48 +0000 (GMT)	[thread overview]
Message-ID: <20200712174548.B62A33938C06@sourceware.org> (raw)

https://gcc.gnu.org/g:22b6b5d6cfb76deb68ca5bc0bcae8b4245df946d

commit 22b6b5d6cfb76deb68ca5bc0bcae8b4245df946d
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Sun May 3 12:46:15 2020 +0100

    libstdc++: Make byte-sized std::fill_n a constant expression (PR 94933)
    
    The overload for byte types uses memset and isn't constexpr. This adds
    the specifier and uses std::is_constant_evaluated() to provide a
    compile-time alternative.
    
            PR libstdc++/94933
            * include/bits/stl_algobase.h (__fill_a1): Make overload for byte types
            usable in constant expressions.
            * testsuite/25_algorithms/fill_n/constexpr.cc: Test with bytes and
            non-scalars.

Diff:
---
 libstdc++-v3/ChangeLog                             |  8 ++++++
 libstdc++-v3/include/bits/stl_algobase.h           |  9 ++++++
 .../testsuite/25_algorithms/fill_n/constexpr.cc    | 32 +++++++++++++++++++++-
 3 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 1bf10811c3b..7f11117365e 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2020-05-03  Jonathan Wakely  <jwakely@redhat.com>
+
+	PR libstdc++/94933
+	* include/bits/stl_algobase.h (__fill_a1): Make overload for byte types
+	usable in constant expressions.
+	* testsuite/25_algorithms/fill_n/constexpr.cc: Test with bytes and
+	non-scalars.
+
 2020-05-01  Jonathan Wakely  <jwakely@redhat.com>
 
 	PR libstdc++/94901
diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
index a7e92d4b473..bed61fd9d00 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -875,11 +875,20 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
 
   // Specialization: for char types we can use memset.
   template<typename _Tp>
+    _GLIBCXX20_CONSTEXPR
     inline typename
     __gnu_cxx::__enable_if<__is_byte<_Tp>::__value, void>::__type
     __fill_a1(_Tp* __first, _Tp* __last, const _Tp& __c)
     {
       const _Tp __tmp = __c;
+#if __cpp_lib_is_constant_evaluated
+      if (std::is_constant_evaluated())
+	{
+	  for (; __first != __last; ++__first)
+	    *__first = __tmp;
+	  return;
+	}
+#endif
       if (const size_t __len = __last - __first)
 	__builtin_memset(__first, static_cast<unsigned char>(__tmp), __len);
     }
diff --git a/libstdc++-v3/testsuite/25_algorithms/fill_n/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/fill_n/constexpr.cc
index c18b6c99eda..17c9aa5a8d7 100644
--- a/libstdc++-v3/testsuite/25_algorithms/fill_n/constexpr.cc
+++ b/libstdc++-v3/testsuite/25_algorithms/fill_n/constexpr.cc
@@ -28,7 +28,37 @@ test()
 
   const auto outd = std::fill_n(ma0.begin(), 6, 77);
 
-  return outd == ma0.begin() + 6;
+  return outd == ma0.begin() + 6 && ma0[5] == 77 && ma0[6] == 0;
 }
 
 static_assert(test());
+
+constexpr bool
+test_byte()
+{
+  // PR libstdc++/94933
+  std::array<char, 12> ma0{};
+
+  const auto outd = std::fill_n(ma0.begin(), 6, 77);
+
+  return outd == ma0.begin() + 6 && ma0[5] == 77 && ma0[6] == 0;
+}
+
+static_assert( test_byte() );
+
+struct S
+{
+  int i = 0;
+};
+
+constexpr bool
+test_nonscalar()
+{
+  std::array<S, 12> ma0{};
+
+  const auto outd = std::fill_n(ma0.begin(), 6, S{77});
+
+  return outd == ma0.begin() + 6 && ma0[5].i == 77 && ma0[6].i == 0;
+}
+
+static_assert( test_nonscalar() );


                 reply	other threads:[~2020-07-12 17:45 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=20200712174548.B62A33938C06@sourceware.org \
    --to=ian@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    --cc=libstdc++-cvs@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).