From 8bb1dbbf7544eaac3afab8d1f91b71f383dab903 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Mon, 22 Jul 2013 21:08:00 +0000 Subject: [PATCH] =?utf8?q?Fix=20a=20bug=20in=20std::fill=5Fn=20where=20mem?= =?utf8?q?set=20would=20end=20up=20being=20called=20in=20cases=20when=20it?= =?utf8?q?=20shouldn=E2=80=99t.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed by Howard. llvm-svn: 186875 --- libcxx/include/algorithm | 4 +- .../alg.fill/fill_n.pass.cpp | 53 ++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm index 703a9b3..19d016f 100644 --- a/libcxx/include/algorithm +++ b/libcxx/include/algorithm @@ -2011,8 +2011,8 @@ fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_) { return _VSTD::__fill_n(__first, __n, __value_, integral_constant::value && - is_trivially_copy_assignable<_Tp>::value && - sizeof(_Tp) == 1>()); + is_trivially_assignable::type, _Tp>::value && + sizeof(typename remove_pointer<_OutputIterator>::type) == 1>()); } // fill diff --git a/libcxx/test/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp b/libcxx/test/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp index b9be7c0..68bea69 100644 --- a/libcxx/test/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp +++ b/libcxx/test/algorithms/alg.modifying.operations/alg.fill/fill_n.pass.cpp @@ -45,6 +45,55 @@ test_int() assert(ia[3] == 1); } +void +test_int_array() +{ + const unsigned n = 4; + int ia[n] = {0}; + assert(std::fill_n(ia, n, static_cast(1)) == std::next(ia, n)); + assert(ia[0] == 1); + assert(ia[1] == 1); + assert(ia[2] == 1); + assert(ia[3] == 1); +} + +struct source { + source() : i(0) { } + + operator int() const { return i++; } + mutable int i; +}; + +void +test_int_array_struct_source() +{ + const unsigned n = 4; + int ia[n] = {0}; + assert(std::fill_n(ia, n, source()) == std::next(ia, n)); + assert(ia[0] == 0); + assert(ia[1] == 1); + assert(ia[2] == 2); + assert(ia[3] == 3); +} + +struct test1 { + test1() : c(0) { } + test1(char c) : c(c + 1) { } + char c; +}; + +void +test_struct_array() +{ + const unsigned n = 4; + test1 test1a[n] = {0}; + assert(std::fill_n(test1a, n, static_cast(10)) == std::next(test1a, n)); + assert(test1a[0].c == 11); + assert(test1a[1].c == 11); + assert(test1a[2].c == 11); + assert(test1a[3].c == 11); +} + int main() { test_char >(); @@ -56,4 +105,8 @@ int main() test_int >(); test_int >(); test_int(); + + test_int_array(); + test_int_array_struct_source(); + test_struct_array(); } -- 2.7.4