[libcxx-commits] [libcxx] [libc++][C++03] Cherry-pick #130573 (PR #198734)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Wed May 20 02:17:53 PDT 2026


https://github.com/philnik777 created https://github.com/llvm/llvm-project/pull/198734

None

>From 3bba02f9092fdc8e9f9a106b901d307e60a4a260 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Wed, 20 May 2026 11:17:28 +0200
Subject: [PATCH] [libc++][C++03] Cherry-pick #130573

---
 libcxx/include/__cxx03/__iterator/aliasing_iterator.h    | 6 ++++--
 libcxx/include/__cxx03/__type_traits/is_char_like_type.h | 6 ++++--
 libcxx/include/__cxx03/string                            | 7 +++++--
 libcxx/include/__cxx03/string_view                       | 8 ++++++--
 libcxx/test/std/strings/basic.string/char.bad.verify.cpp | 2 --
 5 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/libcxx/include/__cxx03/__iterator/aliasing_iterator.h b/libcxx/include/__cxx03/__iterator/aliasing_iterator.h
index 93da1d28ef094..50eba9aea27ff 100644
--- a/libcxx/include/__cxx03/__iterator/aliasing_iterator.h
+++ b/libcxx/include/__cxx03/__iterator/aliasing_iterator.h
@@ -12,7 +12,8 @@
 #include <__cxx03/__config>
 #include <__cxx03/__iterator/iterator_traits.h>
 #include <__cxx03/__memory/pointer_traits.h>
-#include <__cxx03/__type_traits/is_trivial.h>
+#include <__cxx03/__type_traits/is_trivially_constructible.h>
+#include <__cxx03/__type_traits/is_trivially_copyable.h>
 #include <__cxx03/cstddef>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -44,7 +45,8 @@ struct __aliasing_iterator_wrapper {
     using reference         = value_type&;
     using pointer           = value_type*;
 
-    static_assert(is_trivial<value_type>::value);
+    static_assert(is_trivially_default_constructible<value_type>::value);
+    static_assert(is_trivially_copyable<value_type>::value);
     static_assert(sizeof(__base_value_type) == sizeof(value_type));
 
     _LIBCPP_HIDE_FROM_ABI __iterator() = default;
diff --git a/libcxx/include/__cxx03/__type_traits/is_char_like_type.h b/libcxx/include/__cxx03/__type_traits/is_char_like_type.h
index e252b6ad18879..e032c2eecb8be 100644
--- a/libcxx/include/__cxx03/__type_traits/is_char_like_type.h
+++ b/libcxx/include/__cxx03/__type_traits/is_char_like_type.h
@@ -12,7 +12,8 @@
 #include <__cxx03/__config>
 #include <__cxx03/__type_traits/conjunction.h>
 #include <__cxx03/__type_traits/is_standard_layout.h>
-#include <__cxx03/__type_traits/is_trivial.h>
+#include <__cxx03/__type_traits/is_trivially_constructible.h>
+#include <__cxx03/__type_traits/is_trivially_copyable.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
@@ -21,7 +22,8 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _CharT>
-using _IsCharLikeType = _And<is_standard_layout<_CharT>, is_trivial<_CharT> >;
+using _IsCharLikeType _LIBCPP_NODEBUG =
+    _And<is_standard_layout<_CharT>, is_trivially_default_constructible<_CharT>, is_trivially_copyable<_CharT> >;
 
 _LIBCPP_END_NAMESPACE_STD
 
diff --git a/libcxx/include/__cxx03/string b/libcxx/include/__cxx03/string
index 6c43fca08f109..a919a59e55d57 100644
--- a/libcxx/include/__cxx03/string
+++ b/libcxx/include/__cxx03/string
@@ -620,7 +620,8 @@ basic_string<char32_t> operator""s( const char32_t *str, size_t len );
 #include <__cxx03/__type_traits/is_nothrow_constructible.h>
 #include <__cxx03/__type_traits/is_same.h>
 #include <__cxx03/__type_traits/is_standard_layout.h>
-#include <__cxx03/__type_traits/is_trivial.h>
+#include <__cxx03/__type_traits/is_trivially_constructible.h>
+#include <__cxx03/__type_traits/is_trivially_copyable.h>
 #include <__cxx03/__type_traits/is_trivially_relocatable.h>
 #include <__cxx03/__type_traits/noexcept_move_assign_container.h>
 #include <__cxx03/__type_traits/remove_cvref.h>
@@ -778,7 +779,9 @@ public:
 
   static_assert(!is_array<value_type>::value, "Character type of basic_string must not be an array");
   static_assert(is_standard_layout<value_type>::value, "Character type of basic_string must be standard-layout");
-  static_assert(is_trivial<value_type>::value, "Character type of basic_string must be trivial");
+  static_assert(is_trivially_default_constructible<value_type>::value,
+                "Character type of basic_string must be trivially default constructible");
+  static_assert(is_trivially_copyable<value_type>::value, "Character type of basic_string must be trivially copyable");
   static_assert(is_same<_CharT, typename traits_type::char_type>::value,
                 "traits_type::char_type must be the same type as CharT");
   static_assert(is_same<typename allocator_type::value_type, value_type>::value,
diff --git a/libcxx/include/__cxx03/string_view b/libcxx/include/__cxx03/string_view
index da9003b635bb9..9da0acff3c0d4 100644
--- a/libcxx/include/__cxx03/string_view
+++ b/libcxx/include/__cxx03/string_view
@@ -222,7 +222,8 @@ namespace std {
 #include <__cxx03/__type_traits/is_convertible.h>
 #include <__cxx03/__type_traits/is_same.h>
 #include <__cxx03/__type_traits/is_standard_layout.h>
-#include <__cxx03/__type_traits/is_trivial.h>
+#include <__cxx03/__type_traits/is_trivially_constructible.h>
+#include <__cxx03/__type_traits/is_trivially_copyable.h>
 #include <__cxx03/__type_traits/remove_cvref.h>
 #include <__cxx03/__type_traits/remove_reference.h>
 #include <__cxx03/__type_traits/type_identity.h>
@@ -282,7 +283,10 @@ public:
 
   static_assert(!is_array<value_type>::value, "Character type of basic_string_view must not be an array");
   static_assert(is_standard_layout<value_type>::value, "Character type of basic_string_view must be standard-layout");
-  static_assert(is_trivial<value_type>::value, "Character type of basic_string_view must be trivial");
+  static_assert(is_trivially_default_constructible<value_type>::value,
+                "Character type of basic_string_view must be trivially default constructible");
+  static_assert(is_trivially_copyable<value_type>::value,
+                "Character type of basic_string_view must be trivially copyable");
   static_assert(is_same<_CharT, typename traits_type::char_type>::value,
                 "traits_type::char_type must be the same type as CharT");
 
diff --git a/libcxx/test/std/strings/basic.string/char.bad.verify.cpp b/libcxx/test/std/strings/basic.string/char.bad.verify.cpp
index e8305e310ee18..8411b22e019c2 100644
--- a/libcxx/test/std/strings/basic.string/char.bad.verify.cpp
+++ b/libcxx/test/std/strings/basic.string/char.bad.verify.cpp
@@ -6,8 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-// XFAIL: FROZEN-CXX03-HEADERS-FIXME
-
 // <string>
 //   ... manipulating sequences of any non-array trivial standard-layout types.
 



More information about the libcxx-commits mailing list