[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:
parent
c40f0fe434
commit
257e483715
@ -34,6 +34,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
add_definitions("-D_DEBUG")
|
||||
endif()
|
||||
|
||||
|
||||
# Default to C++17
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
@ -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) {
|
||||
|
@ -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) {}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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.`
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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}};
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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';
|
||||
|
@ -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) {}
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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));
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
@ -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};
|
||||
|
@ -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) {
|
||||
|
@ -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<
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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]);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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)));
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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)));
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user