Skip to content

Commit dd9a2f0

Browse files
authored
[libc] first_trailing_one(0) should be 0. (#130155)
Fix this minor bug. See more context at #129892.
1 parent 494bf26 commit dd9a2f0

8 files changed

+9
-10
lines changed

libc/src/__support/big_int.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,8 +1380,7 @@ first_trailing_zero(T value) {
13801380
template <typename T>
13811381
[[nodiscard]] LIBC_INLINE constexpr cpp::enable_if_t<is_big_int_v<T>, int>
13821382
first_trailing_one(T value) {
1383-
return value == cpp::numeric_limits<T>::max() ? 0
1384-
: cpp::countr_zero(value) + 1;
1383+
return value == 0 ? 0 : cpp::countr_zero(value) + 1;
13851384
}
13861385

13871386
} // namespace LIBC_NAMESPACE_DECL

libc/src/__support/math_extras.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,7 @@ 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 ? 0 : cpp::countr_zero(value) + 1;
151150
}
152151

153152
template <typename T>

libc/test/src/__support/math_extras_test.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ TYPED_TEST(LlvmLibcBitTest, FirstTrailingZero, UnsignedTypesNoBigInt) {
9191
}
9292

9393
TYPED_TEST(LlvmLibcBitTest, FirstTrailingOne, UnsignedTypesNoBigInt) {
94-
EXPECT_EQ(first_trailing_one<T>(cpp::numeric_limits<T>::max()), 0);
94+
EXPECT_EQ(first_trailing_one<T>(static_cast<T>(0)), 0);
95+
EXPECT_EQ(first_trailing_one<T>(cpp::numeric_limits<T>::max()), 1);
9596
for (int i = 0U; i != cpp::numeric_limits<T>::digits; ++i)
9697
EXPECT_EQ(first_trailing_one<T>(T(1) << i), i + 1);
9798
}

libc/test/src/stdbit/stdc_first_trailing_one_uc_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include "test/UnitTest/Test.h"
1212

1313
TEST(LlvmLibcStdcFirstTrailingOneUcTest, ALL) {
14-
EXPECT_EQ(LIBC_NAMESPACE::stdc_first_trailing_one_uc(UCHAR_MAX), 0U);
14+
EXPECT_EQ(LIBC_NAMESPACE::stdc_first_trailing_one_uc(UCHAR_MAX), 1U);
1515
}
1616

1717
TEST(LlvmLibcStdcFirstTrailingOneUcTest, OneHot) {

libc/test/src/stdbit/stdc_first_trailing_one_ui_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include "test/UnitTest/Test.h"
1212

1313
TEST(LlvmLibcStdcFirstTrailingOneUiTest, ALL) {
14-
EXPECT_EQ(LIBC_NAMESPACE::stdc_first_trailing_one_ui(UINT_MAX), 0U);
14+
EXPECT_EQ(LIBC_NAMESPACE::stdc_first_trailing_one_ui(UINT_MAX), 1U);
1515
}
1616

1717
TEST(LlvmLibcStdcFirstTrailingOneUiTest, OneHot) {

libc/test/src/stdbit/stdc_first_trailing_one_ul_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include "test/UnitTest/Test.h"
1212

1313
TEST(LlvmLibcStdcFirstTrailingOneUlTest, ALL) {
14-
EXPECT_EQ(LIBC_NAMESPACE::stdc_first_trailing_one_ul(ULONG_MAX), 0U);
14+
EXPECT_EQ(LIBC_NAMESPACE::stdc_first_trailing_one_ul(ULONG_MAX), 1U);
1515
}
1616

1717
TEST(LlvmLibcStdcFirstTrailingOneUlTest, OneHot) {

libc/test/src/stdbit/stdc_first_trailing_one_ull_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include "test/UnitTest/Test.h"
1212

1313
TEST(LlvmLibcStdcFirstTrailingOneUllTest, ALL) {
14-
EXPECT_EQ(LIBC_NAMESPACE::stdc_first_trailing_one_ull(ULLONG_MAX), 0U);
14+
EXPECT_EQ(LIBC_NAMESPACE::stdc_first_trailing_one_ull(ULLONG_MAX), 1U);
1515
}
1616

1717
TEST(LlvmLibcStdcFirstTrailingOneUllTest, OneHot) {

libc/test/src/stdbit/stdc_first_trailing_one_us_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include "test/UnitTest/Test.h"
1212

1313
TEST(LlvmLibcStdcFirstTrailingOneUsTest, ALL) {
14-
EXPECT_EQ(LIBC_NAMESPACE::stdc_first_trailing_one_us(USHRT_MAX), 0U);
14+
EXPECT_EQ(LIBC_NAMESPACE::stdc_first_trailing_one_us(USHRT_MAX), 1U);
1515
}
1616

1717
TEST(LlvmLibcStdcFirstTrailingOneUsTest, OneHot) {

0 commit comments

Comments
 (0)