]> gcc.gnu.org Git - gcc.git/commit
libstdc++: Fix incorrect use of memset in ranges::fill_n (PR 94017)
authorPatrick Palka <ppalka@redhat.com>
Tue, 3 Mar 2020 21:16:05 +0000 (16:16 -0500)
committerPatrick Palka <ppalka@redhat.com>
Wed, 4 Mar 2020 03:46:39 +0000 (22:46 -0500)
commit712b182a8bc2d7510d7a2fbede43bf134c539f25
tree92ab96c69c5f708552c8c4fbc2d2198d13941a19
parent144dfc68d0c0f5b99a0cd0a14b211f82afed88c6
libstdc++: Fix incorrect use of memset in ranges::fill_n (PR 94017)

When deciding whether to perform the memset optimization in ranges::fill_n, we
were crucially neglecting to check that the output pointer's value type is a
byte type.  This patch adds such a check to the problematic condition in
ranges::fill_n.

At the same time, this patch relaxes the overly conservative
__is_byte<_Tp>::__value check that requires the fill type be a byte type.  It's
overly conservative because it means we won't enable the memset optimization in
the following example

  char c[100];
  ranges::fill(c, 37);

because the fill type is deduced to be int here.  Rather than requiring that the
fill type be a byte type, it seems safe to just require the fill type be an
integral type, which is what this patch does.

libstdc++-v3/ChangeLog:

PR libstdc++/94017
* include/bits/ranges_algobase.h (__fill_n_fn::operator()): Refine
condition for when to use memset, making sure to additionally check that
the output pointer's value type is a non-volatile byte type.  Instead of
requiring that the fill type is a byte type, just require that it's an
integral type.
* testsuite/20_util/specialized_algorithms/uninitialized_fill/94017.cc:
New test.
* testsuite/20_util/specialized_algorithms/uninitialized_fill_n/94017.cc:
New test.
* testsuite/25_algorithms/fill/94013.cc: Uncomment part that was blocked
by PR 94017.
* testsuite/25_algorithms/fill/94017.cc: New test.
* testsuite/25_algorithms/fill_n/94017.cc: New test.
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/ranges_algobase.h
libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_fill/94017.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_fill_n/94017.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/fill/94013.cc
libstdc++-v3/testsuite/25_algorithms/fill/94017.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/fill_n/94017.cc [new file with mode: 0644]
This page took 0.059969 seconds and 6 git commands to generate.