From 3e7be494f84e51d5f4245d6f39e380a500f226a6 Mon Sep 17 00:00:00 2001
From: "A. Jiang" <de34@live.cn>
Date: Sun, 13 Apr 2025 11:23:13 +0800
Subject: [PATCH] [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.
---
 .../string_append/initializer_list.pass.cpp   |  2 +-
 .../string_assign/string.pass.cpp             |  2 +-
 libcxx/test/support/nasty_string.h            | 31 +++++--------------
 3 files changed, 9 insertions(+), 26 deletions(-)

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 f1f5828bfe21..d494cd0435b9 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 8b310630bf07..edd3913fa01f 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 fa4c1b676431..c2968f52e3a0 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