[libcxx-commits] [libcxx] f86570c - [libc++] Avoid triggering warnings for implicit conversion
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Jul 23 07:53:27 PDT 2021
Author: Louis Dionne
Date: 2021-07-23T10:53:10-04:00
New Revision: f86570cd52419562b4c528c6e8a05ced00450c16
URL: https://github.com/llvm/llvm-project/commit/f86570cd52419562b4c528c6e8a05ced00450c16
DIFF: https://github.com/llvm/llvm-project/commit/f86570cd52419562b4c528c6e8a05ced00450c16.diff
LOG: [libc++] Avoid triggering warnings for implicit conversion
This started as fixing a typo in a ADDITIONAL_COMPILE_FLAGS directive
which turned out to uncover a few places where we warned about signedness
changes.
As a fly-by fix, this updates the various __advance overloads
for style consistency.
Differential Revision: https://reviews.llvm.org/D106372
Added:
Modified:
libcxx/include/__functional/hash.h
libcxx/include/__iterator/advance.h
libcxx/include/tuple
libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp
Removed:
################################################################################
diff --git a/libcxx/include/__functional/hash.h b/libcxx/include/__functional/hash.h
index eb715e4b9c890..ebcbbad133875 100644
--- a/libcxx/include/__functional/hash.h
+++ b/libcxx/include/__functional/hash.h
@@ -75,10 +75,10 @@ __murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len)
switch (__len)
{
case 3:
- __h ^= __data[2] << 16;
+ __h ^= static_cast<_Size>(__data[2] << 16);
_LIBCPP_FALLTHROUGH();
case 2:
- __h ^= __data[1] << 8;
+ __h ^= static_cast<_Size>(__data[1] << 8);
_LIBCPP_FALLTHROUGH();
case 1:
__h ^= __data[0];
@@ -140,9 +140,9 @@ struct __murmur2_or_cityhash<_Size, 64>
return __hash_len_16(__len + (__a << 3), __b);
}
if (__len > 0) {
- const unsigned char __a = __s[0];
- const unsigned char __b = __s[__len >> 1];
- const unsigned char __c = __s[__len - 1];
+ const unsigned char __a = static_cast<unsigned char>(__s[0]);
+ const unsigned char __b = static_cast<unsigned char>(__s[__len >> 1]);
+ const unsigned char __c = static_cast<unsigned char>(__s[__len - 1]);
const uint32_t __y = static_cast<uint32_t>(__a) +
(static_cast<uint32_t>(__b) << 8);
const uint32_t __z = __len + (static_cast<uint32_t>(__c) << 2);
diff --git a/libcxx/include/__iterator/advance.h b/libcxx/include/__iterator/advance.h
index 48180b27f5875..b0a9b684511db 100644
--- a/libcxx/include/__iterator/advance.h
+++ b/libcxx/include/__iterator/advance.h
@@ -32,15 +32,15 @@ _LIBCPP_PUSH_MACROS
_LIBCPP_BEGIN_NAMESPACE_STD
template <class _InputIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 void
-__advance(_InputIter& __i, typename iterator_traits<_InputIter>::
diff erence_type __n, input_iterator_tag) {
+_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX14
+void __advance(_InputIter& __i, typename iterator_traits<_InputIter>::
diff erence_type __n, input_iterator_tag) {
for (; __n > 0; --__n)
++__i;
}
template <class _BiDirIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 void
-__advance(_BiDirIter& __i, typename iterator_traits<_BiDirIter>::
diff erence_type __n, bidirectional_iterator_tag) {
+_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX14
+void __advance(_BiDirIter& __i, typename iterator_traits<_BiDirIter>::
diff erence_type __n, bidirectional_iterator_tag) {
if (__n >= 0)
for (; __n > 0; --__n)
++__i;
@@ -50,17 +50,19 @@ __advance(_BiDirIter& __i, typename iterator_traits<_BiDirIter>::
diff erence_type
}
template <class _RandIter>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 void
-__advance(_RandIter& __i, typename iterator_traits<_RandIter>::
diff erence_type __n, random_access_iterator_tag) {
+_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX14
+void __advance(_RandIter& __i, typename iterator_traits<_RandIter>::
diff erence_type __n, random_access_iterator_tag) {
__i += __n;
}
template <
class _InputIter, class _Distance,
- class = typename enable_if<is_integral<decltype(_VSTD::__convert_to_integral(declval<_Distance>()))>::value>::type>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 void advance(_InputIter& __i, _Distance __orig_n) {
- typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize;
- _IntegralSize __n = __orig_n;
+ class _IntegralDistance = decltype(_VSTD::__convert_to_integral(declval<_Distance>())),
+ class = _EnableIf<is_integral<_IntegralDistance>::value> >
+_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX14
+void advance(_InputIter& __i, _Distance __orig_n) {
+ typedef typename iterator_traits<_InputIter>::
diff erence_type _Difference;
+ _Difference __n = static_cast<_Difference>(_VSTD::__convert_to_integral(__orig_n));
_LIBCPP_ASSERT(__n >= 0 || __is_cpp17_bidirectional_iterator<_InputIter>::value,
"Attempt to advance(it, n) with negative n on a non-bidirectional iterator");
_VSTD::__advance(__i, __n, typename iterator_traits<_InputIter>::iterator_category());
diff --git a/libcxx/include/tuple b/libcxx/include/tuple
index 032ac861d22ff..e1019ef999d5b 100644
--- a/libcxx/include/tuple
+++ b/libcxx/include/tuple
@@ -1165,7 +1165,7 @@ get(const tuple<_Tp...>&& __t) _NOEXCEPT
namespace __find_detail {
-static constexpr size_t __not_found = -1;
+static constexpr size_t __not_found = static_cast<size_t>(-1);
static constexpr size_t __ambiguous = __not_found - 1;
inline _LIBCPP_INLINE_VISIBILITY
diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp
index 6a0688baa7791..8c89472e9f03e 100644
--- a/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp
+++ b/libcxx/test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp
@@ -20,7 +20,7 @@
// constexpr void advance(Iter& i, Distance n);
// Make sure we catch forced conversions to the
diff erence_type if they happen.
-// ADDITIONAL_COMPILER_FLAGS: -Wsign-conversion
+// ADDITIONAL_COMPILE_FLAGS: -Wsign-conversion
#include <iterator>
#include <cassert>
@@ -42,21 +42,37 @@ void check_advance(It it, Distance n, It result)
TEST_CONSTEXPR_CXX17 bool tests()
{
const char* s = "1234567890";
- typedef std::iterator_traits<const char*>::
diff erence_type Distance;
- check_advance<Distance>(cpp17_input_iterator<const char*>(s), 10, cpp17_input_iterator<const char*>(s+10));
- check_advance<Distance>(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10));
- check_advance<Distance>(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10));
- check_advance<Distance>(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s));
- check_advance<Distance>(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
- check_advance<Distance>(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s));
- check_advance<Distance>(s+5, 5, s+10);
- check_advance<Distance>(s+5, -5, s);
+
+ // Check with iterator_traits::
diff erence_type
+ {
+ typedef std::iterator_traits<const char*>::
diff erence_type Distance;
+ check_advance<Distance>(cpp17_input_iterator<const char*>(s), 10, cpp17_input_iterator<const char*>(s+10));
+ check_advance<Distance>(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10));
+ check_advance<Distance>(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10));
+ check_advance<Distance>(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s));
+ check_advance<Distance>(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
+ check_advance<Distance>(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s));
+ check_advance<Distance>(s+5, 5, s+10);
+ check_advance<Distance>(s+5, -5, s);
+ }
// Also check with other distance types
- check_advance<std::size_t>(cpp17_input_iterator<const char*>(s), 10u, cpp17_input_iterator<const char*>(s+10));
- check_advance<std::size_t>(forward_iterator<const char*>(s), 10u, forward_iterator<const char*>(s+10));
- check_advance<std::size_t>(bidirectional_iterator<const char*>(s), 10u, bidirectional_iterator<const char*>(s+10));
- check_advance<std::size_t>(random_access_iterator<const char*>(s), 10u, random_access_iterator<const char*>(s+10));
+ {
+ typedef int Distance;
+ check_advance<Distance>(cpp17_input_iterator<const char*>(s), 10, cpp17_input_iterator<const char*>(s+10));
+ check_advance<Distance>(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10));
+ check_advance<Distance>(bidirectional_iterator<const char*>(s), 10, bidirectional_iterator<const char*>(s+10));
+ check_advance<Distance>(random_access_iterator<const char*>(s), 10, random_access_iterator<const char*>(s+10));
+ }
+
+ // Check with unsigned distance types to catch signedness-change issues
+ {
+ typedef std::size_t Distance;
+ check_advance<Distance>(cpp17_input_iterator<const char*>(s), 10u, cpp17_input_iterator<const char*>(s+10));
+ check_advance<Distance>(forward_iterator<const char*>(s), 10u, forward_iterator<const char*>(s+10));
+ check_advance<Distance>(bidirectional_iterator<const char*>(s), 10u, bidirectional_iterator<const char*>(s+10));
+ check_advance<Distance>(random_access_iterator<const char*>(s), 10u, random_access_iterator<const char*>(s+10));
+ }
return true;
}
More information about the libcxx-commits
mailing list