Skip to content

Commit afe4ff0

Browse files
committed
fix bug
1 parent f5d2996 commit afe4ff0

File tree

3 files changed

+7
-4
lines changed

3 files changed

+7
-4
lines changed

libc/src/__support/big_int.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,8 +1383,9 @@ first_trailing_zero(T value) {
13831383
template <typename T>
13841384
[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int>
13851385
first_trailing_one(T value) {
1386-
return value == cpp::numeric_limits<T>::max() ? 0
1387-
: cpp::countr_zero(value) + 1;
1386+
return (value == 0 || value == cpp::numeric_limits<T>::max())
1387+
? 0
1388+
: cpp::countr_zero(value) + 1;
13881389
}
13891390

13901391
} // namespace LIBC_NAMESPACE_DECL

libc/src/__support/math_extras.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,9 @@ first_trailing_zero(T value) {
146146
template <typename T>
147147
[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_unsigned_v<T>, int>
148148
first_trailing_one(T value) {
149-
return value == cpp::numeric_limits<T>::max() ? 0
150-
: cpp::countr_zero(value) + 1;
149+
return (value == 0 || value == cpp::numeric_limits<T>::max())
150+
? 0
151+
: cpp::countr_zero(value) + 1;
151152
}
152153

153154
template <typename T>

libc/test/src/__support/math_extras_test.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ TYPED_TEST(LlvmLibcBitTest, FirstTrailingZero, UnsignedTypesNoBigInt) {
9595
}
9696

9797
TYPED_TEST(LlvmLibcBitTest, FirstTrailingOne, UnsignedTypesNoBigInt) {
98+
EXPECT_EQ(first_trailing_one<T>(static_cast<T>(0)), 0);
9899
EXPECT_EQ(first_trailing_one<T>(cpp::numeric_limits<T>::max()), 0);
99100
for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i) {
100101
auto lhs = T(T(1) << size_t(i));

0 commit comments

Comments
 (0)