[libcxx-commits] [libcxx] 3e7be49 - [libc++][test] Test `nasty_string` in C++20 (#135338)

via libcxx-commits libcxx-commits at lists.llvm.org
Sat Apr 12 20:23:16 PDT 2025


Author: A. Jiang
Date: 2025-04-13T11:23:13+08:00
New Revision: 3e7be494f84e51d5f4245d6f39e380a500f226a6

URL: https://github.com/llvm/llvm-project/commit/3e7be494f84e51d5f4245d6f39e380a500f226a6
DIFF: https://github.com/llvm/llvm-project/commit/3e7be494f84e51d5f4245d6f39e380a500f226a6.diff

LOG: [libc++][test] Test `nasty_string` in C++20 (#135338)

It seems that we can only rely on C++20 features and make `nasty_string`
also tested for MSVC STL.

Added: 
    

Modified: 
    libcxx/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp
    libcxx/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp
    libcxx/test/support/nasty_string.h

Removed: 
    


################################################################################
diff  --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp
index f1f5828bfe21d..d494cd0435b96 100644
--- a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp
+++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp
@@ -43,7 +43,7 @@ TEST_CONSTEXPR_CXX20 bool test() {
 
   test<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();
   test<std::basic_string<char, std::char_traits<char>, safe_allocator<char>>>();
-#ifndef TEST_HAS_NO_NASTY_STRING
+#if TEST_STD_VER >= 20
   test<nasty_string>();
 #endif
 

diff  --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp
index 8b310630bf07a..edd3913fa01f6 100644
--- a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp
+++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp
@@ -74,7 +74,7 @@ TEST_CONSTEXPR_CXX20 bool test() {
   test_assign<std::u16string>();
   test_assign<std::u32string>();
 #endif
-#ifndef TEST_HAS_NO_NASTY_STRING
+#if TEST_STD_VER >= 20
   test_assign<nasty_string>();
 #endif
 

diff  --git a/libcxx/test/support/nasty_string.h b/libcxx/test/support/nasty_string.h
index fa4c1b6764314..c2968f52e3a00 100644
--- a/libcxx/test/support/nasty_string.h
+++ b/libcxx/test/support/nasty_string.h
@@ -23,21 +23,7 @@
 // library uses the provided `CharTraits` instead of using operations on
 // the value_type directly.
 
-
-// When using the code during constant evaluation it relies on
-//   P2647R1 Permitting static constexpr variables in constexpr functions
-// This is a C++23 feature, which is not supported by all compilers yet.
-// * GCC >= 13
-// * Clang >= 16
-// * MSVC no support yet
-//
-// TODO After there is proper compiler support use TEST_STD_VER >= 23 instead
-// of this macro in the tests.
-#if TEST_STD_VER < 23 || __cpp_constexpr < 202211L
-#  define TEST_HAS_NO_NASTY_STRING
-#endif
-
-#ifndef TEST_HAS_NO_NASTY_STRING
+#if TEST_STD_VER >= 20
 // Make sure the char-like operations in strings do not depend on the char-like type.
 struct nasty_char {
   template <typename T>
@@ -165,10 +151,8 @@ struct ToNastyChar {
 template <std::size_t N>
 ToNastyChar(const char (&)[N]) -> ToNastyChar<N>;
 
-template <ToNastyChar t>
-constexpr auto to_nasty_char() {
-  return t;
-}
+template <ToNastyChar Str>
+inline constexpr auto static_nasty_text = Str;
 
 // A macro like MAKE_CSTRING
 //
@@ -178,13 +162,12 @@ constexpr auto to_nasty_char() {
 #  define CONVERT_TO_CSTRING(CHAR, STR)                                                                                \
     []<class CharT> {                                                                                                  \
       if constexpr (std::is_same_v<CharT, nasty_char>) {                                                               \
-        static constexpr auto result = to_nasty_char<STR>();                                                           \
-        return result.text;                                                                                            \
+        return static_nasty_text<STR>.text;                                                                            \
       } else                                                                                                           \
         return MAKE_CSTRING(CharT, STR);                                                                               \
     }.template operator()<CHAR>() /* */
-#else                             // TEST_HAS_NO_NASTY_STRING
+#else                             // TEST_STD_VER >= 20
 #  define CONVERT_TO_CSTRING(CharT, STR) MAKE_CSTRING(CharT, STR)
-#endif                            // TEST_HAS_NO_NASTY_STRING
+#endif // TEST_STD_VER >= 20
 
-#endif                            // TEST_SUPPORT_NASTY_STRING_H
+#endif // TEST_SUPPORT_NASTY_STRING_H


        


More information about the libcxx-commits mailing list