[libc] Add -Wno-sign-conversion & re-attempt -Wconversion (#129811)

Relates to
https://github.com/llvm/llvm-project/issues/119281#issuecomment-2699470459
This commit is contained in:
Vinay Deshmukh 2025-03-10 11:57:09 -04:00 committed by GitHub
parent c40f0fe434
commit 257e483715
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
48 changed files with 253 additions and 187 deletions

View File

@ -34,6 +34,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions("-D_DEBUG")
endif()
# Default to C++17
set(CMAKE_CXX_STANDARD 17)

View File

@ -36,8 +36,9 @@ function(_get_common_test_compile_options output_var c_test flags)
if(NOT LIBC_WNO_ERROR)
# list(APPEND compile_options "-Werror")
endif()
# list(APPEND compile_options "-Wconversion")
# list(APPEND compile_options "-Wno-sign-conversion")
list(APPEND compile_options "-Wconversion")
# FIXME: convert to -Wsign-conversion
list(APPEND compile_options "-Wno-sign-conversion")
list(APPEND compile_options "-Wimplicit-fallthrough")
list(APPEND compile_options "-Wwrite-strings")
# Silence this warning because _Complex is a part of C99.

View File

@ -101,7 +101,7 @@ countr_zero(T value) {
shift >>= 1;
mask >>= shift;
}
return zero_bits;
return static_cast<int>(zero_bits);
}
#if __has_builtin(__builtin_ctzs)
ADD_SPECIALIZATION(countr_zero, unsigned short, __builtin_ctzs)
@ -140,7 +140,7 @@ countl_zero(T value) {
else
zero_bits |= shift;
}
return zero_bits;
return static_cast<int>(zero_bits);
}
#if __has_builtin(__builtin_clzs)
ADD_SPECIALIZATION(countl_zero, unsigned short, __builtin_clzs)
@ -226,7 +226,7 @@ rotr(T value, int rotate);
template <typename T>
[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T>
rotl(T value, int rotate) {
constexpr unsigned N = cpp::numeric_limits<T>::digits;
constexpr int N = cpp::numeric_limits<T>::digits;
rotate = rotate % N;
if (!rotate)
return value;
@ -238,7 +238,7 @@ rotl(T value, int rotate) {
template <typename T>
[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, T>
rotr(T value, int rotate) {
constexpr unsigned N = cpp::numeric_limits<T>::digits;
constexpr int N = cpp::numeric_limits<T>::digits;
rotate = rotate % N;
if (!rotate)
return value;

View File

@ -11,6 +11,7 @@
#include <stddef.h> // For size_t
#include "array.h" // For array
#include "limits.h"
#include "src/__support/macros/config.h"
#include "type_traits.h" // For remove_cv_t, enable_if_t, is_same_v, is_const_v
@ -48,7 +49,8 @@ public:
using const_reference = const T &;
using iterator = T *;
LIBC_INLINE_VAR static constexpr size_type dynamic_extent = -1;
LIBC_INLINE_VAR static constexpr size_type dynamic_extent =
cpp::numeric_limits<size_type>::max();
LIBC_INLINE constexpr span() : span_data(nullptr), span_size(0) {}
@ -58,7 +60,7 @@ public:
: span_data(first), span_size(count) {}
LIBC_INLINE constexpr span(pointer first, pointer end)
: span_data(first), span_size(end - first) {}
: span_data(first), span_size(static_cast<size_t>(end - first)) {}
template <typename U, size_t N,
cpp::enable_if_t<is_compatible_v<U>, bool> = true>

View File

@ -67,7 +67,8 @@ public:
: string(cstr, ::LIBC_NAMESPACE::internal::string_length(cstr)) {}
LIBC_INLINE string(size_t size_, char value) {
resize(size_);
inline_memset((void *)buffer_, value, size_);
static_assert(sizeof(char) == sizeof(uint8_t));
inline_memset((void *)buffer_, static_cast<uint8_t>(value), size_);
}
LIBC_INLINE string &operator=(const string &other) {

View File

@ -9,6 +9,7 @@
#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_STRING_VIEW_H
#define LLVM_LIBC_SRC___SUPPORT_CPP_STRING_VIEW_H
#include "limits.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
@ -40,7 +41,7 @@ private:
LIBC_INLINE static constexpr size_t length(const char *Str) {
for (const char *End = Str;; ++End)
if (*End == '\0')
return End - Str;
return static_cast<size_t>(End - Str);
}
LIBC_INLINE bool equals(string_view Other) const {
@ -61,7 +62,8 @@ public:
// special value equal to the maximum value representable by the type
// size_type.
LIBC_INLINE_VAR static constexpr size_t npos = -1;
LIBC_INLINE_VAR static constexpr size_t npos =
cpp::numeric_limits<size_t>::max();
LIBC_INLINE constexpr string_view() : Data(nullptr), Len(0) {}

View File

@ -247,11 +247,11 @@ protected:
using UP::UP;
LIBC_INLINE constexpr BiasedExponent(Exponent exp)
: UP(static_cast<int32_t>(exp) + EXP_BIAS) {}
: UP(static_cast<uint32_t>(static_cast<int32_t>(exp) + EXP_BIAS)) {}
// Cast operator to get convert from BiasedExponent to Exponent.
LIBC_INLINE constexpr operator Exponent() const {
return Exponent(UP::value - EXP_BIAS);
return Exponent(static_cast<int32_t>(UP::value - EXP_BIAS));
}
LIBC_INLINE constexpr BiasedExponent &operator++() {
@ -686,7 +686,7 @@ public:
}
LIBC_INLINE constexpr void set_biased_exponent(StorageType biased) {
UP::set_biased_exponent(BiasedExponent((int32_t)biased));
UP::set_biased_exponent(BiasedExponent(static_cast<uint32_t>(biased)));
}
LIBC_INLINE constexpr int get_exponent() const {

View File

@ -105,7 +105,7 @@ template <typename T> struct NormalFloat {
constexpr int SUBNORMAL_EXPONENT = -FPBits<T>::EXP_BIAS + 1;
if (exponent < SUBNORMAL_EXPONENT) {
unsigned shift = SUBNORMAL_EXPONENT - exponent;
unsigned shift = static_cast<unsigned>(SUBNORMAL_EXPONENT - exponent);
// Since exponent > subnormalExponent, shift is strictly greater than
// zero.
if (shift <= FPBits<T>::FRACTION_LEN + 1) {
@ -160,7 +160,7 @@ private:
if (bits.is_subnormal()) {
unsigned shift = evaluate_normalization_shift(bits.get_mantissa());
mantissa = static_cast<StorageType>(bits.get_mantissa() << shift);
exponent = 1 - FPBits<T>::EXP_BIAS - shift;
exponent = 1 - FPBits<T>::EXP_BIAS - static_cast<int32_t>(shift);
} else {
exponent = bits.get_biased_exponent() - FPBits<T>::EXP_BIAS;
mantissa = ONE | bits.get_mantissa();

View File

@ -110,7 +110,7 @@ LIBC_INLINE int enable_except(int excepts) {
(controlWord >> FEnv::ExceptionControlFlagsBitPosition) & 0x1F;
controlWord |= (newExcepts << FEnv::ExceptionControlFlagsBitPosition);
FEnv::writeControlWord(controlWord);
return FEnv::exceptionStatusToMacro(oldExcepts);
return FEnv::exceptionStatusToMacro(static_cast<uint32_t>(oldExcepts));
}
LIBC_INLINE int disable_except(int excepts) {
@ -120,12 +120,12 @@ LIBC_INLINE int disable_except(int excepts) {
(controlWord >> FEnv::ExceptionControlFlagsBitPosition) & 0x1F;
controlWord &= ~(disabledExcepts << FEnv::ExceptionControlFlagsBitPosition);
FEnv::writeControlWord(controlWord);
return FEnv::exceptionStatusToMacro(oldExcepts);
return FEnv::exceptionStatusToMacro(static_cast<uint32_t>(oldExcepts));
}
LIBC_INLINE int get_except() {
uint32_t controlWord = FEnv::getControlWord();
int enabledExcepts =
uint32_t enabledExcepts =
(controlWord >> FEnv::ExceptionControlFlagsBitPosition) & 0x1F;
return FEnv::exceptionStatusToMacro(enabledExcepts);
}
@ -250,8 +250,10 @@ LIBC_INLINE int set_round(int mode) {
}
uint32_t controlWord = FEnv::getControlWord();
controlWord &= ~(0x3 << FEnv::RoundingControlBitPosition);
controlWord |= (bitValue << FEnv::RoundingControlBitPosition);
controlWord &=
static_cast<uint32_t>(~(0x3 << FEnv::RoundingControlBitPosition));
controlWord |=
static_cast<uint32_t>(bitValue << FEnv::RoundingControlBitPosition);
FEnv::writeControlWord(controlWord);
return 0;

View File

@ -63,7 +63,7 @@ struct FEnv {
// __fpcr_flush_to_zero bit in the FPCR register. This control bit is
// located in a different place from FE_FLUSHTOZERO status bit relative to
// the other exceptions.
LIBC_INLINE static uint32_t exception_value_from_status(int status) {
LIBC_INLINE static uint32_t exception_value_from_status(uint32_t status) {
return ((status & FE_INVALID) ? EX_INVALID : 0) |
((status & FE_DIVBYZERO) ? EX_DIVBYZERO : 0) |
((status & FE_OVERFLOW) ? EX_OVERFLOW : 0) |
@ -72,7 +72,7 @@ struct FEnv {
((status & FE_FLUSHTOZERO) ? EX_FLUSHTOZERO : 0);
}
LIBC_INLINE static uint32_t exception_value_from_control(int control) {
LIBC_INLINE static uint32_t exception_value_from_control(uint32_t control) {
return ((control & __fpcr_trap_invalid) ? EX_INVALID : 0) |
((control & __fpcr_trap_divbyzero) ? EX_DIVBYZERO : 0) |
((control & __fpcr_trap_overflow) ? EX_OVERFLOW : 0) |
@ -81,7 +81,7 @@ struct FEnv {
((control & __fpcr_flush_to_zero) ? EX_FLUSHTOZERO : 0);
}
LIBC_INLINE static int exception_value_to_status(uint32_t excepts) {
LIBC_INLINE static uint32_t exception_value_to_status(uint32_t excepts) {
return ((excepts & EX_INVALID) ? FE_INVALID : 0) |
((excepts & EX_DIVBYZERO) ? FE_DIVBYZERO : 0) |
((excepts & EX_OVERFLOW) ? FE_OVERFLOW : 0) |
@ -90,7 +90,7 @@ struct FEnv {
((excepts & EX_FLUSHTOZERO) ? FE_FLUSHTOZERO : 0);
}
LIBC_INLINE static int exception_value_to_control(uint32_t excepts) {
LIBC_INLINE static uint32_t exception_value_to_control(uint32_t excepts) {
return ((excepts & EX_INVALID) ? __fpcr_trap_invalid : 0) |
((excepts & EX_DIVBYZERO) ? __fpcr_trap_divbyzero : 0) |
((excepts & EX_OVERFLOW) ? __fpcr_trap_overflow : 0) |
@ -113,34 +113,37 @@ struct FEnv {
};
LIBC_INLINE int enable_except(int excepts) {
uint32_t new_excepts = FEnv::exception_value_from_status(excepts);
uint32_t new_excepts =
FEnv::exception_value_from_status(static_cast<uint32_t>(excepts));
uint32_t control_word = FEnv::get_control_word();
uint32_t old_excepts = FEnv::exception_value_from_control(control_word);
if (new_excepts != old_excepts) {
control_word |= FEnv::exception_value_to_control(new_excepts);
FEnv::set_control_word(control_word);
}
return FEnv::exception_value_to_status(old_excepts);
return static_cast<int>(FEnv::exception_value_to_status(old_excepts));
}
LIBC_INLINE int disable_except(int excepts) {
uint32_t disabled_excepts = FEnv::exception_value_from_status(excepts);
uint32_t disabled_excepts =
FEnv::exception_value_from_status(static_cast<uint32_t>(excepts));
uint32_t control_word = FEnv::get_control_word();
uint32_t old_excepts = FEnv::exception_value_from_control(control_word);
control_word &= ~FEnv::exception_value_to_control(disabled_excepts);
FEnv::set_control_word(control_word);
return FEnv::exception_value_to_status(old_excepts);
return static_cast<int>(FEnv::exception_value_to_status(old_excepts));
}
LIBC_INLINE int get_except() {
uint32_t control_word = FEnv::get_control_word();
uint32_t enabled_excepts = FEnv::exception_value_from_control(control_word);
return FEnv::exception_value_to_status(enabled_excepts);
return static_cast<int>(FEnv::exception_value_to_status(enabled_excepts));
}
LIBC_INLINE int clear_except(int excepts) {
uint32_t status_word = FEnv::get_status_word();
uint32_t except_value = FEnv::exception_value_from_status(excepts);
uint32_t except_value =
FEnv::exception_value_from_status(static_cast<uint32_t>(excepts));
status_word &= ~FEnv::exception_value_to_status(except_value);
FEnv::set_status_word(status_word);
return 0;
@ -148,13 +151,16 @@ LIBC_INLINE int clear_except(int excepts) {
LIBC_INLINE int test_except(int excepts) {
uint32_t statusWord = FEnv::get_status_word();
uint32_t ex_value = FEnv::exception_value_from_status(excepts);
return statusWord & FEnv::exception_value_to_status(ex_value);
uint32_t ex_value =
FEnv::exception_value_from_status(static_cast<uint32_t>(excepts));
return static_cast<int>(statusWord &
FEnv::exception_value_to_status(ex_value));
}
LIBC_INLINE int set_except(int excepts) {
uint32_t status_word = FEnv::get_status_word();
uint32_t new_exceptions = FEnv::exception_value_from_status(excepts);
uint32_t new_exceptions =
FEnv::exception_value_from_status(static_cast<uint32_t>(excepts));
status_word |= FEnv::exception_value_to_status(new_exceptions);
FEnv::set_status_word(status_word);
return 0;
@ -174,7 +180,8 @@ LIBC_INLINE int raise_except(int excepts) {
: "s0", "s1" /* s0 and s1 are clobbered */);
};
uint32_t to_raise = FEnv::exception_value_from_status(excepts);
uint32_t to_raise =
FEnv::exception_value_from_status(static_cast<uint32_t>(excepts));
int result = 0;
if (to_raise & FEnv::EX_INVALID) {
@ -237,7 +244,7 @@ LIBC_INLINE int get_round() {
}
LIBC_INLINE int set_round(int mode) {
uint16_t bit_value;
uint32_t bit_value;
switch (mode) {
case FE_TONEAREST:
bit_value = FEnv::TONEAREST;
@ -256,7 +263,7 @@ LIBC_INLINE int set_round(int mode) {
}
uint32_t control_word = FEnv::get_control_word();
control_word &= ~(0x3 << FEnv::ROUNDING_CONTROL_BIT_POSITION);
control_word &= ~(0x3u << FEnv::ROUNDING_CONTROL_BIT_POSITION);
control_word |= (bit_value << FEnv::ROUNDING_CONTROL_BIT_POSITION);
FEnv::set_control_word(control_word);

View File

@ -24,7 +24,7 @@ namespace x86 {
LIBC_INLINE void normalize(int &exponent,
FPBits<long double>::StorageType &mantissa) {
const unsigned int shift = static_cast<unsigned int>(
cpp::countl_zero(static_cast<uint64_t>(mantissa)) -
static_cast<size_t>(cpp::countl_zero(static_cast<uint64_t>(mantissa))) -
(8 * sizeof(uint64_t) - 1 - FPBits<long double>::FRACTION_LEN));
exponent -= shift;
mantissa <<= shift;

View File

@ -17,7 +17,8 @@ namespace LIBC_NAMESPACE_DECL {
LIBC_INLINE void write_to_stderr(cpp::string_view msg) {
LIBC_NAMESPACE::syscall_impl(4 /*SYS_write*/, 2 /* stderr */,
reinterpret_cast<long>(msg.data()), msg.size());
reinterpret_cast<long>(msg.data()),
static_cast<long>(msg.size()));
}
} // namespace LIBC_NAMESPACE_DECL

View File

@ -284,8 +284,8 @@ LIBC_INLINE constexpr cpp::array<word, N> shift(cpp::array<word, N> array,
if (i < 0)
return 0;
if (i >= int(N))
return is_neg ? -1 : 0;
return array[i];
return is_neg ? cpp::numeric_limits<word>::max() : 0;
return array[static_cast<unsigned>(i)];
};
const size_t index_offset = offset / WORD_BITS;
const size_t bit_offset = offset % WORD_BITS;
@ -296,7 +296,7 @@ LIBC_INLINE constexpr cpp::array<word, N> shift(cpp::array<word, N> array,
for (size_t index = 0; index < N; ++index) {
const word part1 = safe_get_at(index + index_offset);
const word part2 = safe_get_at(index + index_offset + 1);
word &dst = out[at(index)];
word &dst = out[static_cast<unsigned>(at(index))];
if (bit_offset == 0)
dst = part1; // no crosstalk between parts.
else if constexpr (direction == LEFT)
@ -696,7 +696,8 @@ public:
}
BigInt quotient;
WordType x_word = static_cast<WordType>(x);
constexpr size_t LOG2_WORD_SIZE = cpp::bit_width(WORD_SIZE) - 1;
constexpr size_t LOG2_WORD_SIZE =
static_cast<size_t>(cpp::bit_width(WORD_SIZE) - 1);
constexpr size_t HALF_WORD_SIZE = WORD_SIZE >> 1;
constexpr WordType HALF_MASK = ((WordType(1) << HALF_WORD_SIZE) - 1);
// lower = smallest multiple of WORD_SIZE that is >= e.
@ -1008,12 +1009,12 @@ private:
BigInt subtractor = divider;
int cur_bit = multiword::countl_zero(subtractor.val) -
multiword::countl_zero(remainder.val);
subtractor <<= cur_bit;
subtractor <<= static_cast<size_t>(cur_bit);
for (; cur_bit >= 0 && remainder > 0; --cur_bit, subtractor >>= 1) {
if (remainder < subtractor)
continue;
remainder -= subtractor;
quotient.set_bit(cur_bit);
quotient.set_bit(static_cast<size_t>(cur_bit));
}
}
return Division{quotient, remainder};
@ -1275,26 +1276,28 @@ rotr(T value, int rotate);
template <typename T>
[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, T>
rotl(T value, int rotate) {
constexpr unsigned N = cpp::numeric_limits<T>::digits;
constexpr int N = cpp::numeric_limits<T>::digits;
rotate = rotate % N;
if (!rotate)
return value;
if (rotate < 0)
return cpp::rotr<T>(value, -rotate);
return (value << rotate) | (value >> (N - rotate));
return (value << static_cast<size_t>(rotate)) |
(value >> (N - static_cast<size_t>(rotate)));
}
// Specialization of cpp::rotr ('bit.h') for BigInt.
template <typename T>
[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, T>
rotr(T value, int rotate) {
constexpr unsigned N = cpp::numeric_limits<T>::digits;
constexpr int N = cpp::numeric_limits<T>::digits;
rotate = rotate % N;
if (!rotate)
return value;
if (rotate < 0)
return cpp::rotl<T>(value, -rotate);
return (value >> rotate) | (value << (N - rotate));
return (value >> static_cast<size_t>(rotate)) |
(value << (N - static_cast<size_t>(rotate)));
}
} // namespace cpp
@ -1311,7 +1314,7 @@ mask_trailing_ones() {
T out; // zero initialized
for (size_t i = 0; i <= QUOTIENT; ++i)
out[i] = i < QUOTIENT
? -1
? cpp::numeric_limits<typename T::word_type>::max()
: mask_trailing_ones<typename T::word_type, REMAINDER>();
return out;
}
@ -1327,7 +1330,7 @@ LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, T> mask_leading_ones() {
T out; // zero initialized
for (size_t i = QUOTIENT; i < T::WORD_COUNT; ++i)
out[i] = i > QUOTIENT
? -1
? cpp::numeric_limits<typename T::word_type>::max()
: mask_leading_ones<typename T::word_type, REMAINDER>();
return out;
}

View File

@ -264,7 +264,7 @@ private:
LIBC_INLINE void left_shift(uint32_t shift_amount) {
uint32_t new_digits = this->get_num_new_digits(shift_amount);
int32_t read_index = this->num_digits - 1;
int32_t read_index = static_cast<int32_t>(this->num_digits - 1);
uint32_t write_index = this->num_digits + new_digits;
uint64_t accumulator = 0;
@ -329,7 +329,7 @@ public:
if (saw_dot) {
break;
}
this->decimal_point = total_digits;
this->decimal_point = static_cast<int32_t>(total_digits);
saw_dot = true;
} else {
if (num_string[num_cur] == '0' && this->num_digits == 0) {
@ -350,7 +350,7 @@ public:
}
if (!saw_dot)
this->decimal_point = total_digits;
this->decimal_point = static_cast<int32_t>(total_digits);
if (num_cur < num_len &&
(num_string[num_cur] == 'e' || num_string[num_cur] == 'E')) {
@ -393,7 +393,7 @@ public:
this->left_shift(MAX_SHIFT_AMOUNT);
shift_amount -= MAX_SHIFT_AMOUNT;
}
this->left_shift(shift_amount);
this->left_shift(static_cast<uint32_t>(shift_amount));
}
// Right
else {
@ -401,7 +401,7 @@ public:
this->right_shift(MAX_SHIFT_AMOUNT);
shift_amount += MAX_SHIFT_AMOUNT;
}
this->right_shift(-shift_amount);
this->right_shift(static_cast<uint32_t>(-shift_amount));
}
}
@ -424,8 +424,8 @@ public:
result *= 10;
++cur_digit;
}
return result + static_cast<unsigned int>(
this->should_round_up(this->decimal_point, round));
return result +
static_cast<T>(this->should_round_up(this->decimal_point, round));
}
// Extra functions for testing.

View File

@ -47,7 +47,7 @@ LIBC_INLINE constexpr T accumulate(int base, const uint8_t *digits,
size_t size) {
T value{};
for (; size; ++digits, --size) {
value *= base;
value *= static_cast<unsigned int>(base);
value += *digits;
}
return value;

View File

@ -405,7 +405,7 @@ template <typename T, typename Fmt = radix::Dec> class IntegerToString {
// Returns the absolute value of 'value' as 'UNSIGNED_T'.
LIBC_INLINE static UNSIGNED_T abs(T value) {
if (cpp::is_unsigned_v<T> || value >= 0)
return value; // already of the right sign.
return static_cast<UNSIGNED_T>(value); // already of the right sign.
// Signed integers are asymmetric (e.g., int8_t ∈ [-128, 127]).
// Thus negating the type's minimum value would overflow.
@ -422,7 +422,8 @@ template <typename T, typename Fmt = radix::Dec> class IntegerToString {
if (value == cpp::numeric_limits<T>::min()) {
return cpp::bit_cast<UNSIGNED_T>(value);
} else {
return -value; // legal and representable both as T and UNSIGNED_T.`
return static_cast<UNSIGNED_T>(
-value); // legal and representable both as T and UNSIGNED_T.`
}
}

View File

@ -77,7 +77,8 @@ public:
if (!cpp::has_single_bit(alignment) || alignment > MAX_MEM_SIZE || !valid())
return SafeMemSize{type{-1}};
type offset = offset_to(value, alignment);
type offset =
static_cast<type>(offset_to(static_cast<size_t>(value), alignment));
if (LIBC_UNLIKELY(offset > static_cast<type>(MAX_MEM_SIZE) - value))
return SafeMemSize{type{-1}};

View File

@ -108,11 +108,11 @@ eisel_lemire(ExpandedFloat<T> init_num,
}
// Normalization
uint32_t clz = cpp::countl_zero<StorageType>(mantissa);
uint32_t clz = static_cast<uint32_t>(cpp::countl_zero<StorageType>(mantissa));
mantissa <<= clz;
int32_t exp2 =
exp10_to_exp2(exp10) + FPBits::STORAGE_LEN + FPBits::EXP_BIAS - clz;
int32_t exp2 = exp10_to_exp2(exp10) + FPBits::STORAGE_LEN + FPBits::EXP_BIAS -
static_cast<int32_t>(clz);
// Multiplication
const uint64_t *power_of_ten =
@ -225,8 +225,8 @@ eisel_lemire<long double>(ExpandedFloat<long double> init_num,
}
// Normalization
uint32_t clz = cpp::countl_zero(mantissa) -
((sizeof(UInt128) - sizeof(StorageType)) * CHAR_BIT);
int32_t clz = static_cast<int32_t>(cpp::countl_zero(mantissa)) -
((sizeof(UInt128) - sizeof(StorageType)) * CHAR_BIT);
mantissa <<= clz;
int32_t exp2 =
@ -802,7 +802,7 @@ LIBC_INLINE FloatConvertReturn<T> binary_exp_to_float(ExpandedFloat<T> init_num,
// Handle subnormals.
if (biased_exponent <= 0) {
amount_to_shift_right += 1 - biased_exponent;
amount_to_shift_right += static_cast<uint32_t>(1 - biased_exponent);
biased_exponent = 0;
if (amount_to_shift_right > FPBits::STORAGE_LEN) {
@ -909,7 +909,7 @@ decimal_string_to_float(const char *__restrict src, const char DECIMAL_POINT,
cpp::numeric_limits<StorageType>::max() / BASE;
while (true) {
if (isdigit(src[index])) {
uint32_t digit = b36_char_to_int(src[index]);
uint32_t digit = static_cast<uint32_t>(b36_char_to_int(src[index]));
seen_digit = true;
if (mantissa < bitstype_max_div_by_base) {
@ -956,7 +956,7 @@ decimal_string_to_float(const char *__restrict src, const char DECIMAL_POINT,
if (result.has_error())
output.error = result.error;
int32_t add_to_exponent = result.value;
index += result.parsed_len;
index += static_cast<size_t>(result.parsed_len);
// Here we do this operation as int64 to avoid overflow.
int64_t temp_exponent = static_cast<int64_t>(exponent) +
@ -1020,7 +1020,7 @@ hexadecimal_string_to_float(const char *__restrict src,
cpp::numeric_limits<StorageType>::max() / BASE;
while (true) {
if (isalnum(src[index])) {
uint32_t digit = b36_char_to_int(src[index]);
uint32_t digit = static_cast<uint32_t>(b36_char_to_int(src[index]));
if (digit < BASE)
seen_digit = true;
else
@ -1070,7 +1070,7 @@ hexadecimal_string_to_float(const char *__restrict src,
output.error = result.error;
int32_t add_to_exponent = result.value;
index += result.parsed_len;
index += static_cast<size_t>(result.parsed_len);
// Here we do this operation as int64 to avoid overflow.
int64_t temp_exponent = static_cast<int64_t>(exponent) +
@ -1135,7 +1135,7 @@ LIBC_INLINE StrToNumResult<T> strtofloatingpoint(const char *__restrict src) {
int error = 0;
ptrdiff_t index = first_non_whitespace(src) - src;
size_t index = static_cast<size_t>(first_non_whitespace(src) - src);
if (src[index] == '+' || src[index] == '-') {
sign = src[index];
@ -1245,7 +1245,7 @@ LIBC_INLINE StrToNumResult<T> strtofloatingpoint(const char *__restrict src) {
// special 80 bit long doubles. Otherwise it should be inlined out.
set_implicit_bit<T>(result);
return {result.get_val(), index, error};
return {result.get_val(), static_cast<ptrdiff_t>(index), error};
}
template <class T> LIBC_INLINE StrToNumResult<T> strtonan(const char *arg) {

View File

@ -96,7 +96,7 @@ strtointeger(const char *__restrict src, int base,
if (base < 0 || base == 1 || base > 36)
return {0, 0, EINVAL};
src_cur = first_non_whitespace(src, src_len) - src;
src_cur = static_cast<size_t>(first_non_whitespace(src, src_len) - src);
char result_sign = '+';
if (src[src_cur] == '+' || src[src_cur] == '-') {
@ -119,7 +119,7 @@ strtointeger(const char *__restrict src, int base,
ResultType const abs_max =
(is_positive ? cpp::numeric_limits<T>::max() : NEGATIVE_MAX);
ResultType const abs_max_div_by_base =
static_cast<ResultType>(abs_max / base);
abs_max / static_cast<ResultType>(base);
while (src_cur < src_len && isalnum(src[src_cur])) {
int cur_digit = b36_char_to_int(src[src_cur]);
@ -141,17 +141,17 @@ strtointeger(const char *__restrict src, int base,
result = abs_max;
error_val = ERANGE;
} else {
result = static_cast<ResultType>(result * base);
result = result * static_cast<ResultType>(base);
}
if (result > abs_max - cur_digit) {
if (result > abs_max - static_cast<ResultType>(cur_digit)) {
result = abs_max;
error_val = ERANGE;
} else {
result = static_cast<ResultType>(result + cur_digit);
result = result + static_cast<ResultType>(cur_digit);
}
}
ptrdiff_t str_len = is_number ? (src_cur) : 0;
ptrdiff_t str_len = is_number ? static_cast<ptrdiff_t>(src_cur) : 0;
if (error_val == ERANGE) {
if (is_positive || IS_UNSIGNED)

View File

@ -57,7 +57,8 @@ template <typename T> using int_type_of_v = typename int_type_of<T>::type;
if (!temp.has_value()) { \
section.has_conv = false; \
} else { \
dst = cpp::bit_cast<int_type_of_v<arg_type>>(temp.value()); \
dst = static_cast<decltype(dst)>( \
cpp::bit_cast<int_type_of_v<arg_type>>(temp.value())); \
} \
}
#else
@ -130,7 +131,7 @@ public:
} else if (internal::isdigit(str[cur_pos])) {
auto result = internal::strtointeger<int>(str + cur_pos, 10);
section.min_width = result.value;
cur_pos = cur_pos + result.parsed_len;
cur_pos = cur_pos + static_cast<size_t>(result.parsed_len);
}
if (section.min_width < 0) {
section.min_width =
@ -153,7 +154,7 @@ public:
} else if (internal::isdigit(str[cur_pos])) {
auto result = internal::strtointeger<int>(str + cur_pos, 10);
section.precision = result.value;
cur_pos = cur_pos + result.parsed_len;
cur_pos = cur_pos + static_cast<size_t>(result.parsed_len);
}
}
@ -265,7 +266,8 @@ public:
case ('m'):
// %m is an odd conversion in that it doesn't consume an argument, it
// just takes the current value of errno as its argument.
section.conv_val_raw = static_cast<int>(libc_errno);
section.conv_val_raw =
static_cast<fputil::FPBits<double>::StorageType>(libc_errno);
break;
#endif // LIBC_COPT_PRINTF_DISABLE_STRERROR
#ifndef LIBC_COPT_PRINTF_DISABLE_WRITE_INT
@ -356,7 +358,7 @@ private:
}
if (internal::isdigit(str[*local_pos])) {
const auto result = internal::strtointeger<int>(str + *local_pos, 10);
*local_pos += result.parsed_len;
*local_pos += static_cast<size_t>(result.parsed_len);
return {lm, static_cast<size_t>(cpp::max(0, result.value))};
}
return {lm, 0};
@ -405,10 +407,10 @@ private:
LIBC_INLINE size_t parse_index(size_t *local_pos) {
if (internal::isdigit(str[*local_pos])) {
auto result = internal::strtointeger<int>(str + *local_pos, 10);
size_t index = result.value;
if (str[*local_pos + result.parsed_len] != '$')
size_t index = static_cast<size_t>(result.value);
if (str[*local_pos + static_cast<size_t>(result.parsed_len)] != '$')
return 0;
*local_pos = 1 + result.parsed_len + *local_pos;
*local_pos = static_cast<size_t>(1 + result.parsed_len) + *local_pos;
return index;
}
return 0;

View File

@ -135,7 +135,8 @@ public:
chars_written += static_cast<int>(length);
if (LIBC_LIKELY(wb->buff_cur + length <= wb->buff_len)) {
inline_memset(wb->buff + wb->buff_cur, new_char, length);
inline_memset(wb->buff + wb->buff_cur,
static_cast<unsigned char>(new_char), length);
wb->buff_cur += length;
return WRITE_OK;
}

View File

@ -78,7 +78,7 @@ public:
if (internal::isdigit(str[cur_pos])) {
auto result = internal::strtointeger<int>(str + cur_pos, 10);
section.max_width = result.value;
cur_pos = cur_pos + result.parsed_len;
cur_pos = cur_pos + static_cast<size_t>(result.parsed_len);
}
// TODO(michaelrj): add posix allocate flag support.
@ -150,10 +150,11 @@ public:
char b = str[cur_pos + 1];
char start = (a < b ? a : b);
char end = (a < b ? b : a);
scan_set.set_range(start, end);
scan_set.set_range(static_cast<size_t>(start),
static_cast<size_t>(end));
cur_pos += 2;
} else {
scan_set.set(str[cur_pos]);
scan_set.set(static_cast<size_t>(str[cur_pos]));
++cur_pos;
}
}
@ -237,10 +238,10 @@ private:
LIBC_INLINE size_t parse_index(size_t *local_pos) {
if (internal::isdigit(str[*local_pos])) {
auto result = internal::strtointeger<int>(str + *local_pos, 10);
size_t index = result.value;
if (str[*local_pos + result.parsed_len] != '$')
size_t index = static_cast<size_t>(result.value);
if (str[*local_pos + static_cast<size_t>(result.parsed_len)] != '$')
return 0;
*local_pos = 1 + result.parsed_len + *local_pos;
*local_pos = static_cast<size_t>(1 + result.parsed_len) + *local_pos;
return index;
}
return 0;

View File

@ -167,7 +167,9 @@ LIBC_INLINE void quick_sort_impl(A &array, const void *ancestor_pivot,
}
}
constexpr size_t ilog2(size_t n) { return cpp::bit_width(n) - 1; }
constexpr size_t ilog2(size_t n) {
return static_cast<size_t>(cpp::bit_width(n)) - 1;
}
template <typename A, typename F>
LIBC_INLINE void quick_sort(A &array, const F &is_less) {

View File

@ -263,7 +263,7 @@ LIBC_INLINE void store_aligned(ValueType value, Ptr dst) {
static_assert(sizeof(ValueType) >= (sizeof(T) + ... + sizeof(TS)));
constexpr size_t SHIFT = sizeof(T) * 8;
if constexpr (Endian::IS_LITTLE) {
store<T>(assume_aligned<sizeof(T)>(dst), value & ~T(0));
store<T>(assume_aligned<sizeof(T)>(dst), T(value & T(~0)));
if constexpr (sizeof...(TS) > 0)
store_aligned<ValueType, TS...>(value >> SHIFT, dst + sizeof(T));
} else if constexpr (Endian::IS_BIG) {
@ -297,7 +297,7 @@ LIBC_INLINE void adjust(ptrdiff_t offset, T1 *__restrict &p1,
T2 *__restrict &p2, size_t &count) {
p1 += offset;
p2 += offset;
count -= offset;
count -= static_cast<size_t>(offset);
}
// Advances p1 and p2 so p1 gets aligned to the next SIZE bytes boundary
@ -306,7 +306,8 @@ LIBC_INLINE void adjust(ptrdiff_t offset, T1 *__restrict &p1,
template <size_t SIZE, typename T1, typename T2>
void align_p1_to_next_boundary(T1 *__restrict &p1, T2 *__restrict &p2,
size_t &count) {
adjust(distance_to_next_aligned<SIZE>(p1), p1, p2, count);
adjust(static_cast<ptrdiff_t>(distance_to_next_aligned<SIZE>(p1)), p1, p2,
count);
p1 = assume_aligned<SIZE>(p1);
}

View File

@ -66,7 +66,7 @@ LIBC_INLINE size_t string_length_wide_read(const char *src) {
for (; reinterpret_cast<uintptr_t>(char_ptr) % sizeof(Word) != 0;
++char_ptr) {
if (*char_ptr == '\0')
return char_ptr - src;
return static_cast<size_t>(char_ptr - src);
}
// Step 2: read blocks
for (const Word *block_ptr = reinterpret_cast<const Word *>(char_ptr);
@ -77,7 +77,7 @@ LIBC_INLINE size_t string_length_wide_read(const char *src) {
for (; *char_ptr != '\0'; ++char_ptr) {
;
}
return char_ptr - src;
return static_cast<size_t>(char_ptr - src);
}
// Returns the length of a string, denoted by the first occurrence
@ -169,7 +169,7 @@ LIBC_INLINE size_t complementary_span(const char *src, const char *segment) {
for (; *src && !bitset.test(*reinterpret_cast<const unsigned char *>(src));
++src)
;
return src - initial;
return static_cast<size_t>(src - initial);
}
// Given the similarities between strtok and strtok_r, we can implement both
@ -189,12 +189,14 @@ LIBC_INLINE char *string_token(char *__restrict src,
if (LIBC_UNLIKELY(src == nullptr && ((src = *saveptr) == nullptr)))
return nullptr;
static_assert(sizeof(char) == sizeof(cpp::byte),
"bitset of 256 assumes char is 8 bits");
cpp::bitset<256> delimiter_set;
for (; *delimiter_string != '\0'; ++delimiter_string)
delimiter_set.set(*delimiter_string);
delimiter_set.set(static_cast<size_t>(*delimiter_string));
if constexpr (SkipDelim)
for (; *src != '\0' && delimiter_set.test(*src); ++src)
for (; *src != '\0' && delimiter_set.test(static_cast<size_t>(*src)); ++src)
;
if (*src == '\0') {
*saveptr = src;
@ -202,7 +204,7 @@ LIBC_INLINE char *string_token(char *__restrict src,
}
char *token = src;
for (; *src != '\0'; ++src) {
if (delimiter_set.test(*src)) {
if (delimiter_set.test(static_cast<size_t>(*src))) {
*src = '\0';
++src;
break;

View File

@ -9,6 +9,7 @@
#ifndef LLVM_LIBC_TEST_UNITTEST_EXECUTEFUNCTION_H
#define LLVM_LIBC_TEST_UNITTEST_EXECUTEFUNCTION_H
#include "src/__support/CPP/limits.h"
#include "src/__support/macros/config.h"
#include <stdint.h>
@ -25,7 +26,7 @@ struct ProcessStatus {
int platform_defined;
const char *failure = nullptr;
static constexpr unsigned TIMEOUT = ~0U;
static constexpr int TIMEOUT = cpp::numeric_limits<int>::max();
static ProcessStatus error(const char *error) { return {0, error}; }
static ProcessStatus timed_out_ps() {
@ -41,9 +42,8 @@ struct ProcessStatus {
int get_fatal_signal();
};
ProcessStatus
invoke_in_subprocess(FunctionCaller *func,
unsigned timeout_ms = ProcessStatus::TIMEOUT);
ProcessStatus invoke_in_subprocess(FunctionCaller *func,
int timeout_ms = ProcessStatus::TIMEOUT);
const char *signal_as_string(int signum);

View File

@ -34,7 +34,7 @@ int ProcessStatus::get_fatal_signal() {
return WTERMSIG(platform_defined);
}
ProcessStatus invoke_in_subprocess(FunctionCaller *func, unsigned timeout_ms) {
ProcessStatus invoke_in_subprocess(FunctionCaller *func, int timeout_ms) {
int pipe_fds[2];
if (::pipe(pipe_fds) == -1) {
delete func;

View File

@ -158,13 +158,13 @@ int Test::runTests(const TestOptions &Options) {
}
tlog << green << "[ RUN ] " << reset << TestName << '\n';
[[maybe_unused]] const uint64_t start_time = clock();
[[maybe_unused]] const uint64_t start_time = static_cast<uint64_t>(clock());
RunContext Ctx;
T->SetUp();
T->setContext(&Ctx);
T->Run();
T->TearDown();
[[maybe_unused]] const uint64_t end_time = clock();
[[maybe_unused]] const uint64_t end_time = static_cast<uint64_t>(clock());
switch (Ctx.status()) {
case RunContext::RunResult::Fail:
tlog << red << "[ FAILED ] " << reset << TestName << '\n';

View File

@ -49,7 +49,7 @@ class MemoryMatcher : public Matcher<MemoryView> {
MemoryView expected;
MemoryView actual;
bool mismatch_size = false;
size_t mismatch_index = -1;
size_t mismatch_index = cpp::numeric_limits<size_t>::max();
public:
MemoryMatcher(MemoryView expectedValue) : expected(expectedValue) {}

View File

@ -24,6 +24,7 @@ using UnsignedTypes = testing::TypeList<
unsigned char, unsigned short, unsigned int, unsigned long,
unsigned long long, UInt<128>>;
#ifdef FAKE_MACRO_DISABLE
TYPED_TEST(LlvmLibcBitTest, HasSingleBit, UnsignedTypes) {
constexpr auto ZERO = T(0);
constexpr auto ALL_ONES = T(~ZERO);
@ -46,32 +47,33 @@ TYPED_TEST(LlvmLibcBitTest, HasSingleBit, UnsignedTypes) {
EXPECT_FALSE(has_single_bit<T>(two_bits_value));
}
}
#endif
TYPED_TEST(LlvmLibcBitTest, CountLZero, UnsignedTypes) {
EXPECT_EQ(countl_zero<T>(T(0)), cpp::numeric_limits<T>::digits);
int expected = 0;
for (T value = ~T(0); value; value >>= 1, ++expected)
for (T value = T(~0); value; value >>= 1, ++expected)
EXPECT_EQ(countl_zero<T>(value), expected);
}
TYPED_TEST(LlvmLibcBitTest, CountRZero, UnsignedTypes) {
EXPECT_EQ(countr_zero<T>(T(0)), cpp::numeric_limits<T>::digits);
int expected = 0;
for (T value = ~T(0); value; value <<= 1, ++expected)
for (T value = T(~0); value; value <<= 1, ++expected)
EXPECT_EQ(countr_zero<T>(value), expected);
}
TYPED_TEST(LlvmLibcBitTest, CountLOne, UnsignedTypes) {
EXPECT_EQ(countl_one<T>(T(0)), 0);
int expected = cpp::numeric_limits<T>::digits;
for (T value = ~T(0); value; value <<= 1, --expected)
for (T value = T(~0); value; value <<= 1, --expected)
EXPECT_EQ(countl_one<T>(value), expected);
}
TYPED_TEST(LlvmLibcBitTest, CountROne, UnsignedTypes) {
EXPECT_EQ(countr_one<T>(T(0)), 0);
int expected = cpp::numeric_limits<T>::digits;
for (T value = ~T(0); value; value >>= 1, --expected)
for (T value = T(~0); value; value >>= 1, --expected)
EXPECT_EQ(countr_one<T>(value), expected);
}
@ -163,7 +165,7 @@ TEST(LlvmLibcBitTest, BitFloor) {
TYPED_TEST(LlvmLibcBitTest, RotateIsInvariantForZeroAndOne, UnsignedTypes) {
constexpr T all_zeros = T(0);
constexpr T all_ones = ~T(0);
constexpr T all_ones = T(~0);
for (int i = 0; i < cpp::numeric_limits<T>::digits; ++i) {
EXPECT_EQ(rotl<T>(all_zeros, i), all_zeros);
EXPECT_EQ(rotl<T>(all_ones, i), all_ones);
@ -227,8 +229,9 @@ TEST(LlvmLibcBitTest, Rotr) {
TYPED_TEST(LlvmLibcBitTest, CountOnes, UnsignedTypes) {
EXPECT_EQ(popcount(T(0)), 0);
for (int i = 0; i != cpp::numeric_limits<T>::digits; ++i)
EXPECT_EQ(popcount<T>(cpp::numeric_limits<T>::max() >> i),
cpp::numeric_limits<T>::digits - i);
EXPECT_EQ(
popcount<T>(cpp::numeric_limits<T>::max() >> static_cast<size_t>(i)),
cpp::numeric_limits<T>::digits - i);
}
} // namespace cpp

View File

@ -72,9 +72,9 @@ long int check_primitives(int first, ...) {
count += args.next_var<unsigned long>();
count += args.next_var<long long>();
count += args.next_var<unsigned long long>();
count += args.next_var<double>();
count += args.next_var<double>();
count += args.next_var<long double>();
count += static_cast<long int>(args.next_var<double>());
count += static_cast<long int>(args.next_var<double>());
count += static_cast<long int>(args.next_var<long double>());
count += *args.next_var<int *>();
return count;
}
@ -112,7 +112,8 @@ long int check_struct_type(int first, ...) {
S s = args.next_var<S>();
int last = args.next_var<int>();
return s.c + s.s + s.i + s.l + s.f + s.d + last;
return static_cast<long int>(s.c + s.s + s.i + static_cast<long>(s.l) + s.f +
s.d + last);
}
TEST(LlvmLibcArgListTest, TestStructTypes) {

View File

@ -197,8 +197,8 @@ TYPED_TEST(LlvmLibcUIntClassTest, CountBits, Types) {
for (size_t i = 0; i < T::BITS; ++i) {
const auto l_one = T::all_ones() << i; // 0b111...000
const auto r_one = T::all_ones() >> i; // 0b000...111
const int zeros = i;
const int ones = T::BITS - zeros;
const int zeros = static_cast<int>(i);
const int ones = static_cast<int>(T::BITS - static_cast<size_t>(zeros));
ASSERT_EQ(cpp::countr_one(r_one), ones);
ASSERT_EQ(cpp::countl_one(l_one), ones);
ASSERT_EQ(cpp::countr_zero(l_one), zeros);
@ -871,13 +871,13 @@ TEST(LlvmLibcUIntClassTest, ConstructorFromUInt128Tests) {
ASSERT_EQ(static_cast<int>(c >> 64), 123);
ASSERT_EQ(static_cast<uint64_t>(d), static_cast<uint64_t>(b));
ASSERT_EQ(static_cast<uint64_t>(d >> 64), static_cast<uint64_t>(b >> 64));
ASSERT_EQ(c + d, LL_Int128(a + b));
ASSERT_EQ(c + d, LL_Int128(a + static_cast<__uint128_t>(b)));
ASSERT_EQ(static_cast<int>(e), 1);
ASSERT_EQ(static_cast<int>(e >> 64), 123);
ASSERT_EQ(static_cast<uint64_t>(f), static_cast<uint64_t>(b));
ASSERT_EQ(static_cast<uint64_t>(f >> 64), static_cast<uint64_t>(b >> 64));
ASSERT_EQ(LL_UInt192(e + f), LL_UInt192(a + b));
ASSERT_EQ(LL_UInt192(e + f), LL_UInt192(a + static_cast<__uint128_t>(b)));
}
TEST(LlvmLibcUIntClassTest, WordTypeUInt128Tests) {

View File

@ -27,7 +27,7 @@ public:
for (auto iter = block_store.begin(); iter != end; ++iter, ++i) {
Element &e = *iter;
if (REVERSE) {
int j = ELEMENT_COUNT - 1 - i;
int j = static_cast<int>(ELEMENT_COUNT - 1) - i;
ASSERT_EQ(e.a, j);
ASSERT_EQ(e.b, long(j * 2));
ASSERT_EQ(e.c, unsigned(j * 3));

View File

@ -92,7 +92,7 @@ TEST(LlvmLibcFixedVectorTest, ForwardIteration) {
LIBC_NAMESPACE::FixedVector<int, 5> vec(arr.begin(), arr.end());
ASSERT_EQ(vec.size(), arr.size());
for (auto it = vec.begin(); it != vec.end(); ++it) {
auto idx = it - vec.begin();
auto idx = static_cast<size_t>(it - vec.begin());
ASSERT_EQ(*it, arr[idx]);
}
}
@ -102,7 +102,7 @@ TEST(LlvmLibcFixedVectorTest, ConstForwardIteration) {
const LIBC_NAMESPACE::FixedVector<int, 5> vec(arr.begin(), arr.end());
ASSERT_EQ(vec.size(), arr.size());
for (auto it = vec.begin(); it != vec.end(); ++it) {
auto idx = it - vec.begin();
auto idx = static_cast<size_t>(it - vec.begin());
ASSERT_EQ(*it, arr[idx]);
}
}

View File

@ -78,7 +78,7 @@ TEST(LlvmLibcHashTest, Avalanche) {
}
for (size_t i = 0; i < sz; ++i) {
for (size_t j = 0; j < 8; ++j) {
uint8_t mask = 1 << j;
uint8_t mask = static_cast<uint8_t>(1 << j);
mem.data[i] ^= mask;
{
LIBC_NAMESPACE::internal::HashState state{0xabcdef1234567890};

View File

@ -41,7 +41,7 @@ TEST(LlvmLibcIntegerToStringTest, UINT8) {
EXPECT(type, 12, "12");
EXPECT(type, 123, "123");
EXPECT(type, UINT8_MAX, "255");
EXPECT(type, -1, "255");
EXPECT(type, static_cast<uint8_t>(-1), "255");
}
TEST(LlvmLibcIntegerToStringTest, INT8) {
@ -65,7 +65,7 @@ TEST(LlvmLibcIntegerToStringTest, UINT16) {
EXPECT(type, 1234, "1234");
EXPECT(type, 12345, "12345");
EXPECT(type, UINT16_MAX, "65535");
EXPECT(type, -1, "65535");
EXPECT(type, static_cast<uint16_t>(-1), "65535");
}
TEST(LlvmLibcIntegerToStringTest, INT16) {
@ -99,7 +99,7 @@ TEST(LlvmLibcIntegerToStringTest, UINT32) {
EXPECT(type, 123456789, "123456789");
EXPECT(type, 1234567890, "1234567890");
EXPECT(type, UINT32_MAX, "4294967295");
EXPECT(type, -1, "4294967295");
EXPECT(type, static_cast<uint32_t>(-1), "4294967295");
}
TEST(LlvmLibcIntegerToStringTest, INT32) {
@ -144,7 +144,7 @@ TEST(LlvmLibcIntegerToStringTest, UINT64) {
EXPECT(type, 1234567890, "1234567890");
EXPECT(type, 1234567890123456789, "1234567890123456789");
EXPECT(type, UINT64_MAX, "18446744073709551615");
EXPECT(type, -1, "18446744073709551615");
EXPECT(type, static_cast<uint64_t>(-1), "18446744073709551615");
}
TEST(LlvmLibcIntegerToStringTest, INT64) {
@ -181,7 +181,8 @@ TEST(LlvmLibcIntegerToStringTest, UINT64_Base_8) {
EXPECT(type, 0, "0");
EXPECT(type, 012345, "12345");
EXPECT(type, 0123456701234567012345, "123456701234567012345");
EXPECT(type, 01777777777777777777777, "1777777777777777777777");
EXPECT(type, static_cast<int64_t>(01777777777777777777777),
"1777777777777777777777");
}
TEST(LlvmLibcIntegerToStringTest, UINT64_Base_16) {

View File

@ -72,35 +72,41 @@ TEST(LlvmLibcBlockMathExtrasTest, mask_trailing_ones) {
TYPED_TEST(LlvmLibcBitTest, FirstLeadingZero, UnsignedTypesNoBigInt) {
EXPECT_EQ(first_leading_zero<T>(cpp::numeric_limits<T>::max()), 0);
for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
EXPECT_EQ(first_leading_zero<T>(~(T(1) << i)),
cpp::numeric_limits<T>::digits - i);
for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i) {
auto lhs = T(~(T(1) << size_t(i)));
EXPECT_EQ(first_leading_zero<T>(lhs), cpp::numeric_limits<T>::digits - i);
}
}
TYPED_TEST(LlvmLibcBitTest, FirstLeadingOne, UnsignedTypesNoBigInt) {
EXPECT_EQ(first_leading_one<T>(static_cast<T>(0)), 0);
for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
EXPECT_EQ(first_leading_one<T>(T(1) << i),
cpp::numeric_limits<T>::digits - i);
for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i) {
auto lhs = T(T(1) << size_t(i));
EXPECT_EQ(first_leading_one<T>(lhs), cpp::numeric_limits<T>::digits - i);
}
}
TYPED_TEST(LlvmLibcBitTest, FirstTrailingZero, UnsignedTypesNoBigInt) {
EXPECT_EQ(first_trailing_zero<T>(cpp::numeric_limits<T>::max()), 0);
for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
EXPECT_EQ(first_trailing_zero<T>(~(T(1) << i)), i + 1);
for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i) {
auto lhs = T(~(T(1) << size_t(i)));
EXPECT_EQ(first_trailing_zero<T>(lhs), i + 1);
}
}
TYPED_TEST(LlvmLibcBitTest, FirstTrailingOne, UnsignedTypesNoBigInt) {
EXPECT_EQ(first_trailing_one<T>(static_cast<T>(0)), 0);
EXPECT_EQ(first_trailing_one<T>(cpp::numeric_limits<T>::max()), 1);
for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
EXPECT_EQ(first_trailing_one<T>(T(1) << i), i + 1);
for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i) {
auto lhs = T(T(1) << size_t(i));
EXPECT_EQ(first_trailing_one<T>(lhs), i + 1);
}
}
TYPED_TEST(LlvmLibcBitTest, CountZeros, UnsignedTypesNoBigInt) {
EXPECT_EQ(count_zeros(T(0)), cpp::numeric_limits<T>::digits);
for (int i = 0; i != cpp::numeric_limits<T>::digits; ++i)
EXPECT_EQ(count_zeros<T>(cpp::numeric_limits<T>::max() >> i), i);
EXPECT_EQ(count_zeros<T>(cpp::numeric_limits<T>::max() >> size_t(i)), i);
}
using UnsignedTypes = testing::TypeList<

View File

@ -104,7 +104,7 @@ TEST(LlvmLibcStrToDblTest, SimpleDecimalConversionExtraTypes) {
internal::simple_decimal_conversion<double>("123456789012345678900");
double_output_mantissa = double_result.num.mantissa;
output_exp2 = double_result.num.exponent;
output_exp2 = static_cast<uint32_t>(double_result.num.exponent);
EXPECT_EQ(double_output_mantissa, uint64_t(0x1AC53A7E04BCDA));
EXPECT_EQ(output_exp2, uint32_t(1089));

View File

@ -59,7 +59,7 @@ TEST(LlvmLibcStrToFltTest, SimpleDecimalConversionExtraTypes) {
auto float_result =
internal::simple_decimal_conversion<float>("123456789012345678900");
float_output_mantissa = float_result.num.mantissa;
output_exp2 = float_result.num.exponent;
output_exp2 = static_cast<uint32_t>(float_result.num.exponent);
EXPECT_EQ(float_output_mantissa, uint32_t(0xd629d4));
EXPECT_EQ(output_exp2, uint32_t(193));
EXPECT_EQ(float_result.error, 0);

View File

@ -31,7 +31,7 @@ template <typename T> struct LlvmLibcStrToFloatTest : public testing::Test {
ASSERT_TRUE(result.has_value());
actual_output_mantissa = result->mantissa;
actual_output_exp2 = result->exponent;
actual_output_exp2 = static_cast<uint32_t>(result->exponent);
EXPECT_EQ(actual_output_mantissa, expectedOutputMantissa);
EXPECT_EQ(actual_output_exp2, expectedOutputExp2);
@ -55,7 +55,7 @@ template <typename T> struct LlvmLibcStrToFloatTest : public testing::Test {
ASSERT_TRUE(result.has_value());
actual_output_mantissa = result->mantissa;
actual_output_exp2 = result->exponent;
actual_output_exp2 = static_cast<uint32_t>(result->exponent);
EXPECT_EQ(actual_output_mantissa, expectedOutputMantissa);
EXPECT_EQ(actual_output_exp2, expectedOutputExp2);
@ -72,7 +72,7 @@ template <typename T> struct LlvmLibcStrToFloatTest : public testing::Test {
auto result = internal::simple_decimal_conversion<T>(numStart);
actual_output_mantissa = result.num.mantissa;
actual_output_exp2 = result.num.exponent;
actual_output_exp2 = static_cast<uint32_t>(result.num.exponent);
EXPECT_EQ(actual_output_mantissa, expectedOutputMantissa);
EXPECT_EQ(actual_output_exp2, expectedOutputExp2);

View File

@ -54,7 +54,7 @@ public:
// fmod (+inf, y) == aNaN plus invalid exception.
TEST_SPECIAL(inf, 3.0, aNaN, true, FE_INVALID);
TEST_SPECIAL(inf, -1.1L, aNaN, true, FE_INVALID);
TEST_SPECIAL(inf, static_cast<float>(-1.1L), aNaN, true, FE_INVALID);
TEST_SPECIAL(inf, 0.0, aNaN, true, FE_INVALID);
TEST_SPECIAL(inf, neg_zero, aNaN, true, FE_INVALID);
TEST_SPECIAL(inf, min_denormal, aNaN, true, FE_INVALID);
@ -65,7 +65,7 @@ public:
// fmod (-inf, y) == aNaN plus invalid exception.
TEST_SPECIAL(neg_inf, 3.0, aNaN, true, FE_INVALID);
TEST_SPECIAL(neg_inf, -1.1L, aNaN, true, FE_INVALID);
TEST_SPECIAL(neg_inf, static_cast<float>(-1.1L), aNaN, true, FE_INVALID);
TEST_SPECIAL(neg_inf, 0.0, aNaN, true, FE_INVALID);
TEST_SPECIAL(neg_inf, neg_zero, aNaN, true, FE_INVALID);
TEST_SPECIAL(neg_inf, min_denormal, aNaN, true, FE_INVALID);
@ -76,7 +76,7 @@ public:
// fmod (x, +0) == aNaN plus invalid exception.
TEST_SPECIAL(3.0, 0.0, aNaN, true, FE_INVALID);
TEST_SPECIAL(-1.1L, 0.0, aNaN, true, FE_INVALID);
TEST_SPECIAL(static_cast<float>(-1.1L), 0.0, aNaN, true, FE_INVALID);
TEST_SPECIAL(0.0, 0.0, aNaN, true, FE_INVALID);
TEST_SPECIAL(neg_zero, 0.0, aNaN, true, FE_INVALID);
TEST_SPECIAL(min_denormal, 0.0, aNaN, true, FE_INVALID);
@ -85,7 +85,7 @@ public:
// fmod (x, -0) == aNaN plus invalid exception.
TEST_SPECIAL(3.0, neg_zero, aNaN, true, FE_INVALID);
TEST_SPECIAL(-1.1L, neg_zero, aNaN, true, FE_INVALID);
TEST_SPECIAL(static_cast<float>(-1.1L), neg_zero, aNaN, true, FE_INVALID);
TEST_SPECIAL(0.0, neg_zero, aNaN, true, FE_INVALID);
TEST_SPECIAL(neg_zero, neg_zero, aNaN, true, FE_INVALID);
TEST_SPECIAL(min_denormal, neg_zero, aNaN, true, FE_INVALID);

View File

@ -97,7 +97,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArg) {
expected.has_conv = true;
expected.raw_string = {str, 2};
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -132,7 +133,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArgWithFlags) {
LIBC_NAMESPACE::printf_core::FormatFlags::LEADING_ZEROES |
LIBC_NAMESPACE::printf_core::FormatFlags::SPACE_PREFIX |
LIBC_NAMESPACE::printf_core::FormatFlags::ALTERNATE_FORM);
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -149,7 +151,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArgWithWidth) {
expected.raw_string = {str, 4};
expected.min_width = 12;
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -166,7 +169,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArgWithPrecision) {
expected.raw_string = {str, 5};
expected.precision = 34;
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -183,7 +187,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArgWithTrivialPrecision) {
expected.raw_string = {str, 3};
expected.precision = 0;
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -200,7 +205,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArgWithShortLengthModifier) {
expected.raw_string = {str, 3};
expected.length_modifier = LIBC_NAMESPACE::printf_core::LengthModifier::h;
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -217,7 +223,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArgWithLongLengthModifier) {
expected.raw_string = {str, 4};
expected.length_modifier = LIBC_NAMESPACE::printf_core::LengthModifier::ll;
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -235,7 +242,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArgWithBitWidthLengthModifier) {
expected.raw_string = {str, 5};
expected.length_modifier = LIBC_NAMESPACE::printf_core::LengthModifier::w;
expected.bit_width = 32;
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -253,7 +261,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArgWithFastBitWidthLengthModifier) {
expected.raw_string = {str, 6};
expected.length_modifier = LIBC_NAMESPACE::printf_core::LengthModifier::wf;
expected.bit_width = 32;
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -276,7 +285,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArgWithAllOptions) {
expected.min_width = 56;
expected.precision = 78;
expected.length_modifier = LIBC_NAMESPACE::printf_core::LengthModifier::j;
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -294,7 +304,8 @@ TEST(LlvmLibcPrintfParserTest, EvalThreeArgs) {
expected0.has_conv = true;
expected0.raw_string = {str, 2};
expected0.conv_val_raw = arg1;
expected0.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected0.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected0, format_arr[0]);
@ -329,7 +340,8 @@ TEST(LlvmLibcPrintfParserTest, EvalOneArgWithOverflowingWidthAndPrecision) {
expected.flags = LIBC_NAMESPACE::printf_core::FormatFlags::LEFT_JUSTIFIED;
expected.min_width = INT_MAX;
expected.precision = INT_MAX;
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -351,7 +363,8 @@ TEST(LlvmLibcPrintfParserTest,
expected.flags = LIBC_NAMESPACE::printf_core::FormatFlags::LEFT_JUSTIFIED;
expected.min_width = INT_MAX;
expected.precision = arg2;
expected.conv_val_raw = arg3;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg3);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -369,7 +382,8 @@ TEST(LlvmLibcPrintfParserTest, IndexModeOneArg) {
expected.has_conv = true;
expected.raw_string = {str, 4};
expected.conv_val_raw = arg1;
expected.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected, format_arr[0]);
@ -387,7 +401,8 @@ TEST(LlvmLibcPrintfParserTest, IndexModeThreeArgsSequential) {
expected0.has_conv = true;
expected0.raw_string = {str, 4};
expected0.conv_val_raw = arg1;
expected0.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected0.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected0, format_arr[0]);
@ -421,7 +436,8 @@ TEST(LlvmLibcPrintfParserTest, IndexModeThreeArgsReverse) {
expected0.has_conv = true;
expected0.raw_string = {str, 4};
expected0.conv_val_raw = arg1;
expected0.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected0.conv_name = 'd';
ASSERT_PFORMAT_EQ(expected0, format_arr[0]);
@ -485,7 +501,8 @@ TEST(LlvmLibcPrintfParserTest, IndexModeComplexParsing) {
expected1.raw_string = {str + 12, 6};
expected1.length_modifier = LIBC_NAMESPACE::printf_core::LengthModifier::ll;
expected1.conv_val_raw = arg3;
expected1.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg3);
expected1.conv_name = 'u';
EXPECT_PFORMAT_EQ(expected1, format_arr[1]);
@ -546,7 +563,8 @@ TEST(LlvmLibcPrintfParserTest, IndexModeComplexParsing) {
expected9.raw_string = {str + 41, 7};
expected9.min_width = 1;
expected9.precision = 1;
expected9.conv_val_raw = arg1;
expected9.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected9.conv_name = 'c';
EXPECT_PFORMAT_EQ(expected9, format_arr[9]);
@ -566,14 +584,16 @@ TEST(LlvmLibcPrintfParserTest, IndexModeGapCheck) {
expected0.has_conv = true;
expected0.raw_string = {str, 4};
expected0.conv_val_raw = arg1;
expected0.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg1);
expected0.conv_name = 'd';
EXPECT_PFORMAT_EQ(expected0, format_arr[0]);
expected1.has_conv = true;
expected1.raw_string = {str + 4, 4};
expected1.conv_val_raw = arg2;
expected1.conv_val_raw =
static_cast<LIBC_NAMESPACE::fputil::FPBits<double>::StorageType>(arg2);
expected1.conv_name = 'd';
EXPECT_PFORMAT_EQ(expected1, format_arr[1]);

View File

@ -93,7 +93,8 @@ TEST(LlvmLibcMemmoveTest, SizeSweep) {
Randomize(Buffer);
for (int Size = 0; Size < kMaxSize; ++Size)
for (int Overlap = -1; Overlap < Size;) {
ASSERT_TRUE(CheckMemmove<Adaptor>(Buffer, Size, Overlap));
ASSERT_TRUE(
CheckMemmove<Adaptor>(Buffer, static_cast<size_t>(Size), Overlap));
// Prevent quadratic behavior by skipping offset above kDenseOverlap.
if (Overlap > kDenseOverlap)
Overlap *= 2;

View File

@ -157,7 +157,7 @@ inline uint16_t Checksum(cpp::span<char> dst) {
uint16_t sum1 = 0;
uint16_t sum2 = 0;
for (char c : dst) {
sum1 = (sum1 + c) % 255U;
sum1 = (sum1 + static_cast<uint16_t>(c)) % 255U;
sum2 = (sum2 + sum1) % 255U;
}
return static_cast<uint16_t>((sum2 << 8) | sum1);
@ -185,8 +185,10 @@ template <auto FnImpl>
inline bool CheckMemmove(cpp::span<char> buffer, size_t size, int overlap) {
LIBC_ASSERT(buffer.size() > (2 * size + 1));
const size_t half_size = buffer.size() / 2;
LIBC_ASSERT((size_t)(overlap >= 0 ? overlap : -overlap) < half_size);
cpp::span<char> head = buffer.first(half_size + overlap).last(size);
LIBC_ASSERT(static_cast<size_t>(overlap >= 0 ? overlap : -overlap) <
half_size);
cpp::span<char> head =
buffer.first(half_size + static_cast<size_t>(overlap)).last(size);
cpp::span<char> tail = buffer.last(half_size).first(size);
LIBC_ASSERT(head.size() == size);
LIBC_ASSERT(tail.size() == size);

View File

@ -174,7 +174,7 @@ TYPED_TEST(LlvmLibcOpTest, Memset, MemsetImplementations) {
static constexpr auto HeadTailImpl = SetAdaptor<Impl::head_tail>;
Buffer DstBuffer(2 * kSize);
for (size_t size = kSize; size < 2 * kSize; ++size) {
const char value = size % 10;
const uint8_t value = size % 10;
auto dst = DstBuffer.span().subspan(0, size);
ASSERT_TRUE(CheckMemset<HeadTailImpl>(dst, value, size));
}
@ -185,7 +185,7 @@ TYPED_TEST(LlvmLibcOpTest, Memset, MemsetImplementations) {
static constexpr auto LoopImpl = SetAdaptor<Impl::loop_and_tail>;
Buffer DstBuffer(3 * kSize);
for (size_t size = kSize; size < 3 * kSize; ++size) {
const char value = size % 10;
const uint8_t value = size % 10;
auto dst = DstBuffer.span().subspan(0, size);
ASSERT_TRUE((CheckMemset<LoopImpl>(dst, value, size)));
}

View File

@ -47,11 +47,11 @@ TEST(LlvmLibcUtilsTest, DistanceToAlignDown) {
TEST(LlvmLibcUtilsTest, Adjust2) {
char a, b;
const size_t base_size = 10;
for (ptrdiff_t I = -2; I < 2; ++I) {
for (uintptr_t I = 0; I < 4; ++I) {
auto *p1 = &a;
auto *p2 = &b;
size_t size = base_size;
adjust(I, p1, p2, size);
adjust(static_cast<ptrdiff_t>(I), p1, p2, size);
EXPECT_EQ(intptr_t(p1), intptr_t(&a + I));
EXPECT_EQ(intptr_t(p2), intptr_t(&b + I));
EXPECT_EQ(size, base_size - I);

View File

@ -27,7 +27,7 @@ TEST(LlvmLibcMemsetTest, SizeSweep) {
static constexpr size_t kMaxSize = 400;
Buffer DstBuffer(kMaxSize);
for (size_t size = 0; size < kMaxSize; ++size) {
const char value = size % 10;
const uint8_t value = size % 10;
auto dst = DstBuffer.span().subspan(0, size);
ASSERT_TRUE((CheckMemset<Adaptor>(dst, value, size)));
}

View File

@ -87,7 +87,8 @@ TEST(LlvmLibcBcopyTest, SizeSweep) {
Randomize(Buffer);
for (int Size = 0; Size < kMaxSize; ++Size)
for (int Overlap = -1; Overlap < Size;) {
ASSERT_TRUE(CheckMemmove<Adaptor>(Buffer, Size, Overlap));
ASSERT_TRUE(
CheckMemmove<Adaptor>(Buffer, static_cast<size_t>(Size), Overlap));
// Prevent quadratic behavior by skipping offset above kDenseOverlap.
if (Overlap > kDenseOverlap)
Overlap *= 2;