[libcxx-commits] [libcxx] [libcxx] P2937R0: Freestanding: Remove strtok (PR #146290)

via libcxx-commits libcxx-commits at lists.llvm.org
Sun Jun 29 12:48:05 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: dywoq (dywoq)

<details>
<summary>Changes</summary>

Link to ['P2937R0: Freestanding: Remove strtok'](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2937r0.html)


---
Full diff: https://github.com/llvm/llvm-project/pull/146290.diff


3 Files Affected:

- (modified) libcxx/include/cstring (+3-1) 
- (modified) libcxx/include/version (+3) 
- (added) libcxx/test/std/cstring/freestanding/strtok_removed.fail.cpp (+14) 


``````````diff
diff --git a/libcxx/include/cstring b/libcxx/include/cstring
index 4aa14feeec280..3828b33c9ee8b 100644
--- a/libcxx/include/cstring
+++ b/libcxx/include/cstring
@@ -47,7 +47,7 @@ const char* strrchr(const char* s, int c);
 size_t strspn(const char* s1, const char* s2);
 const char* strstr(const char* s1, const char* s2);
       char* strstr(      char* s1, const char* s2);
-char* strtok(char* restrict s1, const char* restrict s2);
+char* strtok(char* restrict s1, const char* restrict s2); // not freestanding in C++
 void* memset(void* s, int c, size_t n);
 char* strerror(int errnum);
 size_t strlen(const char* s);
@@ -97,7 +97,9 @@ using ::strpbrk _LIBCPP_USING_IF_EXISTS;
 using ::strrchr _LIBCPP_USING_IF_EXISTS;
 using ::strspn _LIBCPP_USING_IF_EXISTS;
 using ::strstr _LIBCPP_USING_IF_EXISTS;
+#if __STDC_HOSTED__ == 1 || _LIBCPP_STD_VER < 26
 using ::strtok _LIBCPP_USING_IF_EXISTS;
+#endif
 using ::memset _LIBCPP_USING_IF_EXISTS;
 using ::strerror _LIBCPP_USING_IF_EXISTS;
 using ::strlen _LIBCPP_USING_IF_EXISTS;
diff --git a/libcxx/include/version b/libcxx/include/version
index 91fe48351e161..dafbafefaa2ae 100644
--- a/libcxx/include/version
+++ b/libcxx/include/version
@@ -534,6 +534,7 @@ __cpp_lib_void_t                                        201411L <type_traits>
 # define __cpp_lib_to_underlying                        202102L
 // # define __cpp_lib_tuple_like                           202207L
 # define __cpp_lib_unreachable                          202202L
+# define __cpp_lib_freestanding_cstring                 202306L
 #endif
 
 #if _LIBCPP_STD_VER >= 26
@@ -606,6 +607,8 @@ __cpp_lib_void_t                                        201411L <type_traits>
 // # define __cpp_lib_tuple_like                           202311L
 # undef  __cpp_lib_variant
 # define __cpp_lib_variant                              202306L
+# undef __cpp_lib_freestanding_cstring
+# define __cpp_lib_freestanding_cstring                 202306L
 #endif
 
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/test/std/cstring/freestanding/strtok_removed.fail.cpp b/libcxx/test/std/cstring/freestanding/strtok_removed.fail.cpp
new file mode 100644
index 0000000000000..18c5f069e9a7e
--- /dev/null
+++ b/libcxx/test/std/cstring/freestanding/strtok_removed.fail.cpp
@@ -0,0 +1,14 @@
+// UNSUPPORTED: libcpp-has-no-cstring
+// REQUIRES: freestanding
+// XFAIL: *
+
+// RUN: %clang %s -c -o /dev/null -ffreestanding --std=c++20 2>&1 | FileCheck %s
+
+#include <cstring> 
+
+int main() {
+  char s[] = "hello world";
+  char* tok = std::strtok(s, " ");
+  (void)tok;
+  return 0;
+}
\ No newline at end of file

``````````

</details>


https://github.com/llvm/llvm-project/pull/146290


More information about the libcxx-commits mailing list