Fix possible loss of data warnings on amd64

In T_size_size.pass, there is an explicit template argument to std::min to ask
for unsigned, to avoid type deduction errors. However, C1XX' warnings still
hate this use, because a 64 bit value (a size_t) is being passed to a function
accepting an unsigned (a 32 bit value).

Instead, change the tests to pass around std::size_t instances, and explicitly
narrow when constructing the string type under test. This also allows
removal of explicit template arguments to std::min.

llvm-svn: 302473
This commit is contained in:
Billy Robert O'Neal III 2017-05-08 21:54:53 +00:00
parent 8c401179a3
commit 362ea7329f
1 changed files with 10 additions and 8 deletions

View File

@ -27,16 +27,17 @@
template <class S, class SV> template <class S, class SV>
void void
test(SV sv, unsigned pos, unsigned n) test(SV sv, std::size_t pos, std::size_t n)
{ {
typedef typename S::traits_type T; typedef typename S::traits_type T;
typedef typename S::allocator_type A; typedef typename S::allocator_type A;
typedef typename S::size_type Size;
if (pos <= sv.size()) if (pos <= sv.size())
{ {
S s2(sv, pos, n); S s2(sv, static_cast<Size>(pos), static_cast<Size>(n));
LIBCPP_ASSERT(s2.__invariants()); LIBCPP_ASSERT(s2.__invariants());
assert(pos <= sv.size()); assert(pos <= sv.size());
unsigned rlen = std::min<unsigned>(sv.size() - pos, n); std::size_t rlen = std::min(sv.size() - pos, n);
assert(s2.size() == rlen); assert(s2.size() == rlen);
assert(T::compare(s2.data(), sv.data() + pos, rlen) == 0); assert(T::compare(s2.data(), sv.data() + pos, rlen) == 0);
assert(s2.get_allocator() == A()); assert(s2.get_allocator() == A());
@ -47,7 +48,7 @@ test(SV sv, unsigned pos, unsigned n)
{ {
try try
{ {
S s2(sv, pos, n); S s2(sv, static_cast<Size>(pos), static_cast<Size>(n));
assert(false); assert(false);
} }
catch (std::out_of_range&) catch (std::out_of_range&)
@ -60,15 +61,16 @@ test(SV sv, unsigned pos, unsigned n)
template <class S, class SV> template <class S, class SV>
void void
test(SV sv, unsigned pos, unsigned n, const typename S::allocator_type& a) test(SV sv, std::size_t pos, std::size_t n, const typename S::allocator_type& a)
{ {
typedef typename S::traits_type T; typedef typename S::traits_type T;
typedef typename S::size_type Size;
if (pos <= sv.size()) if (pos <= sv.size())
{ {
S s2(sv, pos, n, a); S s2(sv, static_cast<Size>(pos), static_cast<Size>(n), a);
LIBCPP_ASSERT(s2.__invariants()); LIBCPP_ASSERT(s2.__invariants());
assert(pos <= sv.size()); assert(pos <= sv.size());
unsigned rlen = std::min<unsigned>(sv.size() - pos, n); std::size_t rlen = std::min(sv.size() - pos, n);
assert(s2.size() == rlen); assert(s2.size() == rlen);
assert(T::compare(s2.data(), sv.data() + pos, rlen) == 0); assert(T::compare(s2.data(), sv.data() + pos, rlen) == 0);
assert(s2.get_allocator() == a); assert(s2.get_allocator() == a);
@ -79,7 +81,7 @@ test(SV sv, unsigned pos, unsigned n, const typename S::allocator_type& a)
{ {
try try
{ {
S s2(sv, pos, n, a); S s2(sv, static_cast<Size>(pos), static_cast<Size>(n), a);
assert(false); assert(false);
} }
catch (std::out_of_range&) catch (std::out_of_range&)