Commit 7f51ef5e by Abseil Team Committed by Copybara-Service

Fix "unsafe narrowing" warnings in absl, 1/n.

Addresses failures with the following, in some files:
-Wshorten-64-to-32
-Wimplicit-int-conversion
-Wsign-compare
-Wsign-conversion
-Wtautological-unsigned-zero-compare

(This specific CL focuses on .h and win32 .inc files.)

Bug: chromium:1292951
PiperOrigin-RevId: 463835431
Change-Id: If8e5f7f651d5cd96035e23e4623bdb08a7fedabe
parent c7e60ccf
...@@ -178,7 +178,7 @@ void SpinLock::SlowUnlock(uint32_t lock_value) { ...@@ -178,7 +178,7 @@ void SpinLock::SlowUnlock(uint32_t lock_value) {
// reserve a unitary wait time to represent that a waiter exists without our // reserve a unitary wait time to represent that a waiter exists without our
// own acquisition having been contended. // own acquisition having been contended.
if ((lock_value & kWaitTimeMask) != kSpinLockSleeper) { if ((lock_value & kWaitTimeMask) != kSpinLockSleeper) {
const uint64_t wait_cycles = DecodeWaitCycles(lock_value); const int64_t wait_cycles = DecodeWaitCycles(lock_value);
ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0); ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0);
submit_profile_data(this, wait_cycles); submit_profile_data(this, wait_cycles);
ABSL_TSAN_MUTEX_POST_DIVERT(this, 0); ABSL_TSAN_MUTEX_POST_DIVERT(this, 0);
...@@ -220,9 +220,9 @@ uint32_t SpinLock::EncodeWaitCycles(int64_t wait_start_time, ...@@ -220,9 +220,9 @@ uint32_t SpinLock::EncodeWaitCycles(int64_t wait_start_time,
return clamped; return clamped;
} }
uint64_t SpinLock::DecodeWaitCycles(uint32_t lock_value) { int64_t SpinLock::DecodeWaitCycles(uint32_t lock_value) {
// Cast to uint32_t first to ensure bits [63:32] are cleared. // Cast to uint32_t first to ensure bits [63:32] are cleared.
const uint64_t scaled_wait_time = const int64_t scaled_wait_time =
static_cast<uint32_t>(lock_value & kWaitTimeMask); static_cast<uint32_t>(lock_value & kWaitTimeMask);
return scaled_wait_time << (kProfileTimestampShift - kLockwordReservedShift); return scaled_wait_time << (kProfileTimestampShift - kLockwordReservedShift);
} }
......
...@@ -137,7 +137,7 @@ class ABSL_LOCKABLE SpinLock { ...@@ -137,7 +137,7 @@ class ABSL_LOCKABLE SpinLock {
int64_t wait_end_time); int64_t wait_end_time);
// Extract number of wait cycles in a lock value. // Extract number of wait cycles in a lock value.
static uint64_t DecodeWaitCycles(uint32_t lock_value); static int64_t DecodeWaitCycles(uint32_t lock_value);
// Provide access to protected method above. Use for testing only. // Provide access to protected method above. Use for testing only.
friend struct SpinLockTest; friend struct SpinLockTest;
......
...@@ -27,7 +27,10 @@ void ABSL_INTERNAL_C_SYMBOL(AbslInternalSpinLockDelay)( ...@@ -27,7 +27,10 @@ void ABSL_INTERNAL_C_SYMBOL(AbslInternalSpinLockDelay)(
} else if (loop == 1) { } else if (loop == 1) {
Sleep(0); Sleep(0);
} else { } else {
Sleep(absl::base_internal::SpinLockSuggestedDelayNS(loop) / 1000000); // SpinLockSuggestedDelayNS() always returns a positive integer, so this
// static_cast is safe.
Sleep(static_cast<DWORD>(
absl::base_internal::SpinLockSuggestedDelayNS(loop) / 1000000));
} }
} }
......
...@@ -119,7 +119,7 @@ class UnscaledCycleClock { ...@@ -119,7 +119,7 @@ class UnscaledCycleClock {
inline int64_t UnscaledCycleClock::Now() { inline int64_t UnscaledCycleClock::Now() {
uint64_t low, high; uint64_t low, high;
__asm__ volatile("rdtsc" : "=a"(low), "=d"(high)); __asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
return (high << 32) | low; return static_cast<int64_t>((high << 32) | low);
} }
#endif #endif
......
...@@ -48,7 +48,7 @@ struct SpinLockTest { ...@@ -48,7 +48,7 @@ struct SpinLockTest {
int64_t wait_end_time) { int64_t wait_end_time) {
return SpinLock::EncodeWaitCycles(wait_start_time, wait_end_time); return SpinLock::EncodeWaitCycles(wait_start_time, wait_end_time);
} }
static uint64_t DecodeWaitCycles(uint32_t lock_value) { static int64_t DecodeWaitCycles(uint32_t lock_value) {
return SpinLock::DecodeWaitCycles(lock_value); return SpinLock::DecodeWaitCycles(lock_value);
} }
}; };
...@@ -133,20 +133,20 @@ TEST(SpinLock, WaitCyclesEncoding) { ...@@ -133,20 +133,20 @@ TEST(SpinLock, WaitCyclesEncoding) {
// but the lower kProfileTimestampShift will be dropped. // but the lower kProfileTimestampShift will be dropped.
const int kMaxCyclesShift = const int kMaxCyclesShift =
32 - kLockwordReservedShift + kProfileTimestampShift; 32 - kLockwordReservedShift + kProfileTimestampShift;
const uint64_t kMaxCycles = (int64_t{1} << kMaxCyclesShift) - 1; const int64_t kMaxCycles = (int64_t{1} << kMaxCyclesShift) - 1;
// These bits should be zero after encoding. // These bits should be zero after encoding.
const uint32_t kLockwordReservedMask = (1 << kLockwordReservedShift) - 1; const uint32_t kLockwordReservedMask = (1 << kLockwordReservedShift) - 1;
// These bits are dropped when wait cycles are encoded. // These bits are dropped when wait cycles are encoded.
const uint64_t kProfileTimestampMask = (1 << kProfileTimestampShift) - 1; const int64_t kProfileTimestampMask = (1 << kProfileTimestampShift) - 1;
// Test a bunch of random values // Test a bunch of random values
std::default_random_engine generator; std::default_random_engine generator;
// Shift to avoid overflow below. // Shift to avoid overflow below.
std::uniform_int_distribution<uint64_t> time_distribution( std::uniform_int_distribution<int64_t> time_distribution(
0, std::numeric_limits<uint64_t>::max() >> 4); 0, std::numeric_limits<int64_t>::max() >> 3);
std::uniform_int_distribution<uint64_t> cycle_distribution(0, kMaxCycles); std::uniform_int_distribution<int64_t> cycle_distribution(0, kMaxCycles);
for (int i = 0; i < 100; i++) { for (int i = 0; i < 100; i++) {
int64_t start_time = time_distribution(generator); int64_t start_time = time_distribution(generator);
...@@ -154,7 +154,7 @@ TEST(SpinLock, WaitCyclesEncoding) { ...@@ -154,7 +154,7 @@ TEST(SpinLock, WaitCyclesEncoding) {
int64_t end_time = start_time + cycles; int64_t end_time = start_time + cycles;
uint32_t lock_value = SpinLockTest::EncodeWaitCycles(start_time, end_time); uint32_t lock_value = SpinLockTest::EncodeWaitCycles(start_time, end_time);
EXPECT_EQ(0, lock_value & kLockwordReservedMask); EXPECT_EQ(0, lock_value & kLockwordReservedMask);
uint64_t decoded = SpinLockTest::DecodeWaitCycles(lock_value); int64_t decoded = SpinLockTest::DecodeWaitCycles(lock_value);
EXPECT_EQ(0, decoded & kProfileTimestampMask); EXPECT_EQ(0, decoded & kProfileTimestampMask);
EXPECT_EQ(cycles & ~kProfileTimestampMask, decoded); EXPECT_EQ(cycles & ~kProfileTimestampMask, decoded);
} }
...@@ -178,21 +178,21 @@ TEST(SpinLock, WaitCyclesEncoding) { ...@@ -178,21 +178,21 @@ TEST(SpinLock, WaitCyclesEncoding) {
// Test clamping // Test clamping
uint32_t max_value = uint32_t max_value =
SpinLockTest::EncodeWaitCycles(start_time, start_time + kMaxCycles); SpinLockTest::EncodeWaitCycles(start_time, start_time + kMaxCycles);
uint64_t max_value_decoded = SpinLockTest::DecodeWaitCycles(max_value); int64_t max_value_decoded = SpinLockTest::DecodeWaitCycles(max_value);
uint64_t expected_max_value_decoded = kMaxCycles & ~kProfileTimestampMask; int64_t expected_max_value_decoded = kMaxCycles & ~kProfileTimestampMask;
EXPECT_EQ(expected_max_value_decoded, max_value_decoded); EXPECT_EQ(expected_max_value_decoded, max_value_decoded);
const int64_t step = (1 << kProfileTimestampShift); const int64_t step = (1 << kProfileTimestampShift);
uint32_t after_max_value = uint32_t after_max_value =
SpinLockTest::EncodeWaitCycles(start_time, start_time + kMaxCycles + step); SpinLockTest::EncodeWaitCycles(start_time, start_time + kMaxCycles + step);
uint64_t after_max_value_decoded = int64_t after_max_value_decoded =
SpinLockTest::DecodeWaitCycles(after_max_value); SpinLockTest::DecodeWaitCycles(after_max_value);
EXPECT_EQ(expected_max_value_decoded, after_max_value_decoded); EXPECT_EQ(expected_max_value_decoded, after_max_value_decoded);
uint32_t before_max_value = SpinLockTest::EncodeWaitCycles( uint32_t before_max_value = SpinLockTest::EncodeWaitCycles(
start_time, start_time + kMaxCycles - step); start_time, start_time + kMaxCycles - step);
uint64_t before_max_value_decoded = int64_t before_max_value_decoded =
SpinLockTest::DecodeWaitCycles(before_max_value); SpinLockTest::DecodeWaitCycles(before_max_value);
EXPECT_GT(expected_max_value_decoded, before_max_value_decoded); EXPECT_GT(expected_max_value_decoded, before_max_value_decoded);
} }
......
...@@ -215,21 +215,20 @@ void SetHashtablezSampleParameterInternal(int32_t rate) { ...@@ -215,21 +215,20 @@ void SetHashtablezSampleParameterInternal(int32_t rate) {
} }
} }
int32_t GetHashtablezMaxSamples() { size_t GetHashtablezMaxSamples() {
return GlobalHashtablezSampler().GetMaxSamples(); return GlobalHashtablezSampler().GetMaxSamples();
} }
void SetHashtablezMaxSamples(int32_t max) { void SetHashtablezMaxSamples(size_t max) {
SetHashtablezMaxSamplesInternal(max); SetHashtablezMaxSamplesInternal(max);
TriggerHashtablezConfigListener(); TriggerHashtablezConfigListener();
} }
void SetHashtablezMaxSamplesInternal(int32_t max) { void SetHashtablezMaxSamplesInternal(size_t max) {
if (max > 0) { if (max > 0) {
GlobalHashtablezSampler().SetMaxSamples(max); GlobalHashtablezSampler().SetMaxSamples(max);
} else { } else {
ABSL_RAW_LOG(ERROR, "Invalid hashtablez max samples: %lld", ABSL_RAW_LOG(ERROR, "Invalid hashtablez max samples: 0");
static_cast<long long>(max)); // NOLINT(runtime/int)
} }
} }
......
...@@ -281,9 +281,9 @@ void SetHashtablezSampleParameter(int32_t rate); ...@@ -281,9 +281,9 @@ void SetHashtablezSampleParameter(int32_t rate);
void SetHashtablezSampleParameterInternal(int32_t rate); void SetHashtablezSampleParameterInternal(int32_t rate);
// Sets a soft max for the number of samples that will be kept. // Sets a soft max for the number of samples that will be kept.
int32_t GetHashtablezMaxSamples(); size_t GetHashtablezMaxSamples();
void SetHashtablezMaxSamples(int32_t max); void SetHashtablezMaxSamples(size_t max);
void SetHashtablezMaxSamplesInternal(int32_t max); void SetHashtablezMaxSamplesInternal(size_t max);
// Configuration override. // Configuration override.
// This allows process-wide sampling without depending on order of // This allows process-wide sampling without depending on order of
......
...@@ -784,9 +784,9 @@ auto Storage<T, N, A>::Erase(ConstIterator<A> from, ConstIterator<A> to) ...@@ -784,9 +784,9 @@ auto Storage<T, N, A>::Erase(ConstIterator<A> from, ConstIterator<A> to)
-> Iterator<A> { -> Iterator<A> {
StorageView<A> storage_view = MakeStorageView(); StorageView<A> storage_view = MakeStorageView();
SizeType<A> erase_size = std::distance(from, to); auto erase_size = static_cast<SizeType<A>>(std::distance(from, to));
SizeType<A> erase_index = auto erase_index = static_cast<SizeType<A>>(
std::distance(ConstIterator<A>(storage_view.data), from); std::distance(ConstIterator<A>(storage_view.data), from));
SizeType<A> erase_end_index = erase_index + erase_size; SizeType<A> erase_end_index = erase_index + erase_size;
IteratorValueAdapter<A, MoveIterator<A>> move_values( IteratorValueAdapter<A, MoveIterator<A>> move_values(
......
...@@ -545,7 +545,7 @@ struct GroupSse2Impl { ...@@ -545,7 +545,7 @@ struct GroupSse2Impl {
// Returns a bitmask representing the positions of slots that match hash. // Returns a bitmask representing the positions of slots that match hash.
BitMask<uint32_t, kWidth> Match(h2_t hash) const { BitMask<uint32_t, kWidth> Match(h2_t hash) const {
auto match = _mm_set1_epi8(hash); auto match = _mm_set1_epi8(static_cast<char>(hash));
return BitMask<uint32_t, kWidth>( return BitMask<uint32_t, kWidth>(
static_cast<uint32_t>(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl)))); static_cast<uint32_t>(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl))));
} }
...@@ -557,7 +557,7 @@ struct GroupSse2Impl { ...@@ -557,7 +557,7 @@ struct GroupSse2Impl {
return NonIterableBitMask<uint32_t, kWidth>( return NonIterableBitMask<uint32_t, kWidth>(
static_cast<uint32_t>(_mm_movemask_epi8(_mm_sign_epi8(ctrl, ctrl)))); static_cast<uint32_t>(_mm_movemask_epi8(_mm_sign_epi8(ctrl, ctrl))));
#else #else
auto match = _mm_set1_epi8(static_cast<h2_t>(ctrl_t::kEmpty)); auto match = _mm_set1_epi8(static_cast<char>(ctrl_t::kEmpty));
return NonIterableBitMask<uint32_t, kWidth>( return NonIterableBitMask<uint32_t, kWidth>(
static_cast<uint32_t>(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl)))); static_cast<uint32_t>(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl))));
#endif #endif
...@@ -565,14 +565,14 @@ struct GroupSse2Impl { ...@@ -565,14 +565,14 @@ struct GroupSse2Impl {
// Returns a bitmask representing the positions of empty or deleted slots. // Returns a bitmask representing the positions of empty or deleted slots.
NonIterableBitMask<uint32_t, kWidth> MaskEmptyOrDeleted() const { NonIterableBitMask<uint32_t, kWidth> MaskEmptyOrDeleted() const {
auto special = _mm_set1_epi8(static_cast<uint8_t>(ctrl_t::kSentinel)); auto special = _mm_set1_epi8(static_cast<char>(ctrl_t::kSentinel));
return NonIterableBitMask<uint32_t, kWidth>(static_cast<uint32_t>( return NonIterableBitMask<uint32_t, kWidth>(static_cast<uint32_t>(
_mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)))); _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl))));
} }
// Returns the number of trailing empty or deleted elements in the group. // Returns the number of trailing empty or deleted elements in the group.
uint32_t CountLeadingEmptyOrDeleted() const { uint32_t CountLeadingEmptyOrDeleted() const {
auto special = _mm_set1_epi8(static_cast<uint8_t>(ctrl_t::kSentinel)); auto special = _mm_set1_epi8(static_cast<char>(ctrl_t::kSentinel));
return TrailingZeros(static_cast<uint32_t>( return TrailingZeros(static_cast<uint32_t>(
_mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)) + 1)); _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)) + 1));
} }
...@@ -635,7 +635,8 @@ struct GroupAArch64Impl { ...@@ -635,7 +635,8 @@ struct GroupAArch64Impl {
// Clang and GCC optimize countr_zero to rbit+clz without any check for 0, // Clang and GCC optimize countr_zero to rbit+clz without any check for 0,
// so we should be fine. // so we should be fine.
constexpr uint64_t bits = 0x0101010101010101ULL; constexpr uint64_t bits = 0x0101010101010101ULL;
return countr_zero((mask | ~(mask >> 7)) & bits) >> 3; return static_cast<uint32_t>(countr_zero((mask | ~(mask >> 7)) & bits) >>
3);
} }
void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const { void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const {
......
...@@ -63,11 +63,12 @@ static RtlCaptureStackBackTrace_Function* const RtlCaptureStackBackTrace_fn = ...@@ -63,11 +63,12 @@ static RtlCaptureStackBackTrace_Function* const RtlCaptureStackBackTrace_fn =
template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT> template <bool IS_STACK_FRAMES, bool IS_WITH_CONTEXT>
static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count, static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count,
const void*, int* min_dropped_frames) { const void*, int* min_dropped_frames) {
int n = 0; USHORT n = 0;
if (!RtlCaptureStackBackTrace_fn) { if (!RtlCaptureStackBackTrace_fn || skip_count < 0 || max_depth < 0) {
// can't find a stacktrace with no function to call // can't get a stacktrace with no function/invalid args
} else { } else {
n = (int)RtlCaptureStackBackTrace_fn(skip_count + 2, max_depth, result, 0); n = RtlCaptureStackBackTrace_fn(static_cast<ULONG>(skip_count) + 2,
static_cast<ULONG>(max_depth), result, 0);
} }
if (IS_STACK_FRAMES) { if (IS_STACK_FRAMES) {
// No implementation for finding out the stack frame sizes yet. // No implementation for finding out the stack frame sizes yet.
......
...@@ -65,14 +65,15 @@ bool Symbolize(const void* pc, char* out, int out_size) { ...@@ -65,14 +65,15 @@ bool Symbolize(const void* pc, char* out, int out_size) {
if (!SymFromAddr(process, reinterpret_cast<DWORD64>(pc), nullptr, symbol)) { if (!SymFromAddr(process, reinterpret_cast<DWORD64>(pc), nullptr, symbol)) {
return false; return false;
} }
strncpy(out, symbol->Name, out_size); const size_t out_size_t = static_cast<size_t>(out_size);
if (out[out_size - 1] != '\0') { strncpy(out, symbol->Name, out_size_t);
if (out[out_size_t - 1] != '\0') {
// strncpy() does not '\0' terminate when it truncates. // strncpy() does not '\0' terminate when it truncates.
static constexpr char kEllipsis[] = "..."; static constexpr char kEllipsis[] = "...";
int ellipsis_size = size_t ellipsis_size =
std::min<int>(sizeof(kEllipsis) - 1, out_size - 1); std::min(sizeof(kEllipsis) - 1, out_size_t - 1);
memcpy(out + out_size - ellipsis_size - 1, kEllipsis, ellipsis_size); memcpy(out + out_size_t - ellipsis_size - 1, kEllipsis, ellipsis_size);
out[out_size - 1] = '\0'; out[out_size_t - 1] = '\0';
} }
return true; return true;
} }
......
...@@ -77,8 +77,8 @@ class SampleRecorder { ...@@ -77,8 +77,8 @@ class SampleRecorder {
// samples that have been dropped. // samples that have been dropped.
int64_t Iterate(const std::function<void(const T& stack)>& f); int64_t Iterate(const std::function<void(const T& stack)>& f);
int32_t GetMaxSamples() const; size_t GetMaxSamples() const;
void SetMaxSamples(int32_t max); void SetMaxSamples(size_t max);
private: private:
void PushNew(T* sample); void PushNew(T* sample);
...@@ -88,7 +88,7 @@ class SampleRecorder { ...@@ -88,7 +88,7 @@ class SampleRecorder {
std::atomic<size_t> dropped_samples_; std::atomic<size_t> dropped_samples_;
std::atomic<size_t> size_estimate_; std::atomic<size_t> size_estimate_;
std::atomic<int32_t> max_samples_{1 << 20}; std::atomic<size_t> max_samples_{1 << 20};
// Intrusive lock free linked lists for tracking samples. // Intrusive lock free linked lists for tracking samples.
// //
...@@ -186,7 +186,7 @@ T* SampleRecorder<T>::PopDead(Targs... args) { ...@@ -186,7 +186,7 @@ T* SampleRecorder<T>::PopDead(Targs... args) {
template <typename T> template <typename T>
template <typename... Targs> template <typename... Targs>
T* SampleRecorder<T>::Register(Targs&&... args) { T* SampleRecorder<T>::Register(Targs&&... args) {
int64_t size = size_estimate_.fetch_add(1, std::memory_order_relaxed); size_t size = size_estimate_.fetch_add(1, std::memory_order_relaxed);
if (size > max_samples_.load(std::memory_order_relaxed)) { if (size > max_samples_.load(std::memory_order_relaxed)) {
size_estimate_.fetch_sub(1, std::memory_order_relaxed); size_estimate_.fetch_sub(1, std::memory_order_relaxed);
dropped_samples_.fetch_add(1, std::memory_order_relaxed); dropped_samples_.fetch_add(1, std::memory_order_relaxed);
...@@ -229,12 +229,12 @@ int64_t SampleRecorder<T>::Iterate( ...@@ -229,12 +229,12 @@ int64_t SampleRecorder<T>::Iterate(
} }
template <typename T> template <typename T>
void SampleRecorder<T>::SetMaxSamples(int32_t max) { void SampleRecorder<T>::SetMaxSamples(size_t max) {
max_samples_.store(max, std::memory_order_release); max_samples_.store(max, std::memory_order_release);
} }
template <typename T> template <typename T>
int32_t SampleRecorder<T>::GetMaxSamples() const { size_t SampleRecorder<T>::GetMaxSamples() const {
return max_samples_.load(std::memory_order_acquire); return max_samples_.load(std::memory_order_acquire);
} }
......
...@@ -330,8 +330,7 @@ class CordBuffer { ...@@ -330,8 +330,7 @@ class CordBuffer {
// Returns the available area of the internal SSO data // Returns the available area of the internal SSO data
absl::Span<char> short_available() { absl::Span<char> short_available() {
assert(is_short()); const size_t length = short_length();
const size_t length = (short_rep.raw_size >> 1);
return absl::Span<char>(short_rep.data + length, return absl::Span<char>(short_rep.data + length,
kInlineCapacity - length); kInlineCapacity - length);
} }
...@@ -347,7 +346,7 @@ class CordBuffer { ...@@ -347,7 +346,7 @@ class CordBuffer {
// Returns the length of the internal SSO data. // Returns the length of the internal SSO data.
size_t short_length() const { size_t short_length() const {
assert(is_short()); assert(is_short());
return short_rep.raw_size >> 1; return static_cast<size_t>(short_rep.raw_size >> 1);
} }
// Sets the length of the internal SSO data. // Sets the length of the internal SSO data.
......
...@@ -103,10 +103,9 @@ class Charmap { ...@@ -103,10 +103,9 @@ class Charmap {
constexpr Charmap(uint64_t b0, uint64_t b1, uint64_t b2, uint64_t b3) constexpr Charmap(uint64_t b0, uint64_t b1, uint64_t b2, uint64_t b3)
: m_{b0, b1, b2, b3} {} : m_{b0, b1, b2, b3} {}
static constexpr uint64_t RangeForWord(unsigned char lo, unsigned char hi, static constexpr uint64_t RangeForWord(char lo, char hi, uint64_t word) {
uint64_t word) { return OpenRangeFromZeroForWord(static_cast<unsigned char>(hi) + 1, word) &
return OpenRangeFromZeroForWord(hi + 1, word) & ~OpenRangeFromZeroForWord(static_cast<unsigned char>(lo), word);
~OpenRangeFromZeroForWord(lo, word);
} }
// All the chars in the specified word of the range [0, upper). // All the chars in the specified word of the range [0, upper).
...@@ -119,13 +118,16 @@ class Charmap { ...@@ -119,13 +118,16 @@ class Charmap {
: (~static_cast<uint64_t>(0) >> (64 - upper % 64)); : (~static_cast<uint64_t>(0) >> (64 - upper % 64));
} }
static constexpr uint64_t CharMaskForWord(unsigned char x, uint64_t word) { static constexpr uint64_t CharMaskForWord(char x, uint64_t word) {
return (x / 64 == word) ? (static_cast<uint64_t>(1) << (x % 64)) : 0; const auto unsigned_x = static_cast<unsigned char>(x);
return (unsigned_x / 64 == word)
? (static_cast<uint64_t>(1) << (unsigned_x % 64))
: 0;
} }
private: void SetChar(char c) {
void SetChar(unsigned char c) { const auto unsigned_c = static_cast<unsigned char>(c);
m_[c / 64] |= static_cast<uint64_t>(1) << (c % 64); m_[unsigned_c / 64] |= static_cast<uint64_t>(1) << (unsigned_c % 64);
} }
uint64_t m_[4]; uint64_t m_[4];
......
...@@ -570,7 +570,7 @@ class InlineData { ...@@ -570,7 +570,7 @@ class InlineData {
// Requires the current instance to hold inline data. // Requires the current instance to hold inline data.
size_t inline_size() const { size_t inline_size() const {
assert(!is_tree()); assert(!is_tree());
return tag() >> 1; return static_cast<size_t>(tag()) >> 1;
} }
// Sets the size of the inlined character data inside this instance. // Sets the size of the inlined character data inside this instance.
......
...@@ -155,10 +155,11 @@ bool ParseFormatString(string_view src, Consumer consumer) { ...@@ -155,10 +155,11 @@ bool ParseFormatString(string_view src, Consumer consumer) {
static_cast<const char*>(memchr(p, '%', static_cast<size_t>(end - p))); static_cast<const char*>(memchr(p, '%', static_cast<size_t>(end - p)));
if (!percent) { if (!percent) {
// We found the last substring. // We found the last substring.
return consumer.Append(string_view(p, end - p)); return consumer.Append(string_view(p, static_cast<size_t>(end - p)));
} }
// We found a percent, so push the text run then process the percent. // We found a percent, so push the text run then process the percent.
if (ABSL_PREDICT_FALSE(!consumer.Append(string_view(p, percent - p)))) { if (ABSL_PREDICT_FALSE(!consumer.Append(
string_view(p, static_cast<size_t>(percent - p))))) {
return false; return false;
} }
if (ABSL_PREDICT_FALSE(percent + 1 >= end)) return false; if (ABSL_PREDICT_FALSE(percent + 1 >= end)) return false;
...@@ -189,7 +190,8 @@ bool ParseFormatString(string_view src, Consumer consumer) { ...@@ -189,7 +190,8 @@ bool ParseFormatString(string_view src, Consumer consumer) {
p = ConsumeUnboundConversion(percent + 1, end, &conv, &next_arg); p = ConsumeUnboundConversion(percent + 1, end, &conv, &next_arg);
if (ABSL_PREDICT_FALSE(p == nullptr)) return false; if (ABSL_PREDICT_FALSE(p == nullptr)) return false;
if (ABSL_PREDICT_FALSE(!consumer.ConvertOne( if (ABSL_PREDICT_FALSE(!consumer.ConvertOne(
conv, string_view(percent + 1, p - (percent + 1))))) { conv, string_view(percent + 1,
static_cast<size_t>(p - (percent + 1)))))) {
return false; return false;
} }
} else { } else {
......
...@@ -125,28 +125,44 @@ class Arg { ...@@ -125,28 +125,44 @@ class Arg {
} }
Arg(short value) // NOLINT(*) Arg(short value) // NOLINT(*)
: piece_(scratch_, : piece_(scratch_,
numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} static_cast<size_t>(
numbers_internal::FastIntToBuffer(value, scratch_) -
scratch_)) {}
Arg(unsigned short value) // NOLINT(*) Arg(unsigned short value) // NOLINT(*)
: piece_(scratch_, : piece_(scratch_,
numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} static_cast<size_t>(
numbers_internal::FastIntToBuffer(value, scratch_) -
scratch_)) {}
Arg(int value) // NOLINT(runtime/explicit) Arg(int value) // NOLINT(runtime/explicit)
: piece_(scratch_, : piece_(scratch_,
numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} static_cast<size_t>(
numbers_internal::FastIntToBuffer(value, scratch_) -
scratch_)) {}
Arg(unsigned int value) // NOLINT(runtime/explicit) Arg(unsigned int value) // NOLINT(runtime/explicit)
: piece_(scratch_, : piece_(scratch_,
numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} static_cast<size_t>(
numbers_internal::FastIntToBuffer(value, scratch_) -
scratch_)) {}
Arg(long value) // NOLINT(*) Arg(long value) // NOLINT(*)
: piece_(scratch_, : piece_(scratch_,
numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} static_cast<size_t>(
numbers_internal::FastIntToBuffer(value, scratch_) -
scratch_)) {}
Arg(unsigned long value) // NOLINT(*) Arg(unsigned long value) // NOLINT(*)
: piece_(scratch_, : piece_(scratch_,
numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} static_cast<size_t>(
numbers_internal::FastIntToBuffer(value, scratch_) -
scratch_)) {}
Arg(long long value) // NOLINT(*) Arg(long long value) // NOLINT(*)
: piece_(scratch_, : piece_(scratch_,
numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} static_cast<size_t>(
numbers_internal::FastIntToBuffer(value, scratch_) -
scratch_)) {}
Arg(unsigned long long value) // NOLINT(*) Arg(unsigned long long value) // NOLINT(*)
: piece_(scratch_, : piece_(scratch_,
numbers_internal::FastIntToBuffer(value, scratch_) - scratch_) {} static_cast<size_t>(
numbers_internal::FastIntToBuffer(value, scratch_) -
scratch_)) {}
Arg(float value) // NOLINT(runtime/explicit) Arg(float value) // NOLINT(runtime/explicit)
: piece_(scratch_, numbers_internal::SixDigitsToBuffer(value, scratch_)) { : piece_(scratch_, numbers_internal::SixDigitsToBuffer(value, scratch_)) {
} }
......
...@@ -111,7 +111,8 @@ class KernelTimeout { ...@@ -111,7 +111,8 @@ class KernelTimeout {
constexpr uint64_t max_nanos = constexpr uint64_t max_nanos =
(std::numeric_limits<int64_t>::max)() - 999999u; (std::numeric_limits<int64_t>::max)() - 999999u;
uint64_t ms_from_now = uint64_t ms_from_now =
(std::min<uint64_t>(max_nanos, ns_ - now) + 999999u) / 1000000u; ((std::min)(max_nanos, static_cast<uint64_t>(ns_ - now)) + 999999u) /
1000000u;
if (ms_from_now > kInfinite) { if (ms_from_now > kInfinite) {
return kInfinite; return kInfinite;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment