[libc-commits] [libc] [libc][wctype] Implement public iswdigit (PR #181635)
via libc-commits
libc-commits at lists.llvm.org
Mon Feb 16 04:05:48 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-risc-v
Author: Marcell Leleszi (mleleszi)
<details>
<summary>Changes</summary>
https://github.com/llvm/llvm-project/issues/175003
Create public function and entrypoints for iswdigit and add UTF8 test to iswalpha test. On CI there is no UTF8 build currently, so that test case will only run locally, but [wctype_utils_test.cpp](https://github.com/llvm/llvm-project/blob/main/libc/test/src/__support/wctype_utils_test.cpp) is written in a way that both ASCII and UTF8 tests run regardless of the build config.
---
Full diff: https://github.com/llvm/llvm-project/pull/181635.diff
13 Files Affected:
- (modified) libc/config/baremetal/arm/entrypoints.txt (+1)
- (modified) libc/config/baremetal/riscv/entrypoints.txt (+1)
- (modified) libc/config/darwin/aarch64/entrypoints.txt (+1)
- (modified) libc/config/linux/aarch64/entrypoints.txt (+1)
- (modified) libc/config/linux/arm/entrypoints.txt (+1)
- (modified) libc/config/linux/riscv/entrypoints.txt (+1)
- (modified) libc/config/linux/x86_64/entrypoints.txt (+1)
- (modified) libc/src/wctype/CMakeLists.txt (+10)
- (added) libc/src/wctype/iswdigit.cpp (+21)
- (added) libc/src/wctype/iswdigit.h (+21)
- (modified) libc/test/src/wctype/CMakeLists.txt (+12)
- (modified) libc/test/src/wctype/iswalpha_test.cpp (+10-33)
- (added) libc/test/src/wctype/iswdigit_test.cpp (+23)
``````````diff
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index f7ef4ea09f5b6..7b850fcf1aaf4 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -299,6 +299,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
# internal entrypoints
libc.startup.baremetal.init
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index 3fc71280f5163..4189bb93e63f6 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -296,6 +296,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
# internal entrypoints
libc.startup.baremetal.init
diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index 3909417f9730d..be3a3ae255ec6 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -102,6 +102,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
)
if(LLVM_LIBC_FULL_BUILD)
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 970c825bbfc96..5fe0250f7bb1e 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -369,6 +369,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
# sys/uio.h entrypoints
libc.src.sys.uio.writev
diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt
index f04ac40145d3a..5e9be8d147891 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -194,6 +194,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
)
if(LLVM_LIBC_FULL_BUILD)
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 7baf4de9d8a5b..a62e9f3660085 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -373,6 +373,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
# sys/uio.h entrypoints
libc.src.sys.uio.writev
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 9399b284fa2da..110e3fc90af2b 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -415,6 +415,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
# sys/uio.h entrypoints
libc.src.sys.uio.writev
diff --git a/libc/src/wctype/CMakeLists.txt b/libc/src/wctype/CMakeLists.txt
index 3ac5eaef8ed8b..dc6282fac883f 100644
--- a/libc/src/wctype/CMakeLists.txt
+++ b/libc/src/wctype/CMakeLists.txt
@@ -7,3 +7,13 @@ add_entrypoint_object(
DEPENDS
libc.src.__support.wctype_utils
)
+
+add_entrypoint_object(
+ iswdigit
+ SRCS
+ iswdigit.cpp
+ HDRS
+ iswdigit.h
+ DEPENDS
+ libc.src.__support.wctype_utils
+)
diff --git a/libc/src/wctype/iswdigit.cpp b/libc/src/wctype/iswdigit.cpp
new file mode 100644
index 0000000000000..f2e1eb3b9d4d5
--- /dev/null
+++ b/libc/src/wctype/iswdigit.cpp
@@ -0,0 +1,21 @@
+//===-- Implementation of iswdigit ----------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/wctype/iswdigit.h"
+#include "src/__support/common.h"
+#include "src/__support/wctype_utils.h"
+
+#include "hdr/types/wint_t.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(int, iswdigit, (wint_t c)) {
+ return internal::isdigit(static_cast<wchar_t>(c));
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/wctype/iswdigit.h b/libc/src/wctype/iswdigit.h
new file mode 100644
index 0000000000000..58f1d44173cb5
--- /dev/null
+++ b/libc/src/wctype/iswdigit.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for iswdigit ----------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_WCTYPE_ISWDIGIT_H
+#define LLVM_LIBC_SRC_WCTYPE_ISWDIGIT_H
+
+#include "hdr/types/wint_t.h"
+#include "src/__support/common.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+int iswdigit(wint_t c);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_WCTYPE_ISWDIGIT_H
diff --git a/libc/test/src/wctype/CMakeLists.txt b/libc/test/src/wctype/CMakeLists.txt
index 5459cdb4a9b71..5d46b1a61bbef 100644
--- a/libc/test/src/wctype/CMakeLists.txt
+++ b/libc/test/src/wctype/CMakeLists.txt
@@ -8,4 +8,16 @@ add_libc_test(
iswalpha_test.cpp
DEPENDS
libc.src.wctype.iswalpha
+ libc.src.__support.wctype_utils
+)
+
+add_libc_test(
+ iswdigit_test
+ SUITE
+ libc_wctype_unittests
+ SRCS
+ iswdigit_test.cpp
+ DEPENDS
+ libc.src.wctype.iswdigit
+ libc.src.__support.wctype_utils
)
diff --git a/libc/test/src/wctype/iswalpha_test.cpp b/libc/test/src/wctype/iswalpha_test.cpp
index a82c0057c1807..261e6fe53790a 100644
--- a/libc/test/src/wctype/iswalpha_test.cpp
+++ b/libc/test/src/wctype/iswalpha_test.cpp
@@ -7,10 +7,14 @@
//===----------------------------------------------------------------------===//
#include "src/__support/CPP/span.h"
+#include "src/__support/wctype_utils.h"
#include "src/wctype/iswalpha.h"
#include "test/UnitTest/Test.h"
+// Simple tests, already properly tested in
+// libc/test/src/__support/wctype_utils_test.cpp and
+// libc/test/src/__support/wctype/wctype_classification_utils_test.cpp
TEST(LlvmLibciswalpha, SimpleTest) {
EXPECT_NE(LIBC_NAMESPACE::iswalpha('a'), 0);
EXPECT_NE(LIBC_NAMESPACE::iswalpha('B'), 0);
@@ -20,37 +24,10 @@ TEST(LlvmLibciswalpha, SimpleTest) {
EXPECT_EQ(LIBC_NAMESPACE::iswalpha('?'), 0);
EXPECT_EQ(LIBC_NAMESPACE::iswalpha('\0'), 0);
EXPECT_EQ(LIBC_NAMESPACE::iswalpha(-1), 0);
-}
-
-// TODO: once iswalpha supports more than just ascii-range characters add a
-// proper test.
-
-// namespace {
-
-// // TODO: Merge the wctype tests using this framework.
-// constexpr char WALPHA_ARRAY[] = {
-// 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
-// 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
-// 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
-// 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
-// };
-// bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
-// for (size_t i = 0; i < arr.size(); ++i)
-// if (static_cast<int>(arr[i]) == ch)
-// return true;
-// return false;
-// }
-
-// } // namespace
-
-// TEST(LlvmLibciswalpha, DefaultLocale) {
-// // Loops through all characters, verifying that letters return
-// // true and everything else returns false.
-// for (int ch = -255; ch < 255; ++ch) {
-// if (in_span(ch, WALPHA_ARRAY))
-// EXPECT_TRUE(LIBC_NAMESPACE::iswalpha(ch));
-// else
-// EXPECT_FALSE(LIBC_NAMESPACE::iswalpha(ch));
-// }
-// }
+#if LIBC_CONF_WCTYPE_MODE == LIBC_WCTYPE_MODE_UTF8
+ EXPECT_NE(LIBC_NAMESPACE::iswalpha(L'á'), 0);
+#else
+ EXPECT_EQ(LIBC_NAMESPACE::iswalpha(L'á'), 0);
+#endif
+}
diff --git a/libc/test/src/wctype/iswdigit_test.cpp b/libc/test/src/wctype/iswdigit_test.cpp
new file mode 100644
index 0000000000000..d529f527e3591
--- /dev/null
+++ b/libc/test/src/wctype/iswdigit_test.cpp
@@ -0,0 +1,23 @@
+//===-- Unittests for iswdigit --------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/CPP/span.h"
+#include "src/wctype/iswdigit.h"
+
+#include "test/UnitTest/Test.h"
+
+// Simple tests, already properly tested in
+// libc/test/src/__support/wctype_utils_test.cpp
+TEST(LlvmLibciswdigit, SimpleTest) {
+ EXPECT_NE(LIBC_NAMESPACE::iswdigit(L'1'), 0);
+ EXPECT_NE(LIBC_NAMESPACE::iswdigit(L'2'), 0);
+ EXPECT_NE(LIBC_NAMESPACE::iswdigit(L'0'), 0);
+
+ EXPECT_EQ(LIBC_NAMESPACE::iswdigit(L'a'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::iswdigit(L'é'), 0);
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/181635
More information about the libc-commits
mailing list