[libcxx-commits] [libcxx] [libc++] Default the allocator argument for most string constructors (PR #169901)
Nikolas Klauser via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Dec 10 02:50:03 PST 2025
https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/169901
>From 3b2659a34e508d0344e5ce66a6228972bb39bf44 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Fri, 28 Nov 2025 12:09:28 +0100
Subject: [PATCH] [libc++] default the allocator arguemnt for most constructor
---
libcxx/include/string | 49 ++++---------------
.../make_optional_explicit.pass.cpp | 3 --
...ptional_explicit_initializer_list.pass.cpp | 3 --
3 files changed, 10 insertions(+), 45 deletions(-)
diff --git a/libcxx/include/string b/libcxx/include/string
index 2b3ba6d2d9b62..133878fa2c941 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -1058,15 +1058,9 @@ public:
}
# endif // _LIBCPP_CXX03_LANG
- template <__enable_if_t<__is_allocator_v<_Allocator>, int> = 0>
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(const _CharT* _LIBCPP_DIAGNOSE_NULLPTR __s) {
- _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "basic_string(const char*) detected nullptr");
- __init(__s, traits_type::length(__s));
- }
-
template <__enable_if_t<__is_allocator_v<_Allocator>, int> = 0>
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
- basic_string(const _CharT* _LIBCPP_DIAGNOSE_NULLPTR __s, const _Allocator& __a)
+ basic_string(const _CharT* _LIBCPP_DIAGNOSE_NULLPTR __s, const _Allocator& __a = _Allocator())
: __alloc_(__a) {
_LIBCPP_ASSERT_NON_NULL(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
__init(__s, traits_type::length(__s));
@@ -1076,22 +1070,14 @@ public:
basic_string(nullptr_t) = delete;
# endif
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(const _CharT* __s, size_type __n)
- _LIBCPP_DIAGNOSE_NULLPTR_IF(__n != 0 && __s == nullptr, " if n is not zero") {
- _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr");
- __init(__s, __n);
- }
-
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
- basic_string(const _CharT* __s, size_type __n, const _Allocator& __a)
+ _LIBCPP_HIDE_FROM_ABI
+ _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(const _CharT* __s, size_type __n, const _Allocator& __a = _Allocator())
_LIBCPP_DIAGNOSE_NULLPTR_IF(__n != 0 && __s == nullptr, " if n is not zero")
: __alloc_(__a) {
_LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr");
__init(__s, __n);
}
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(size_type __n, _CharT __c) { __init(__n, __c); }
-
# if _LIBCPP_STD_VER >= 23
_LIBCPP_HIDE_FROM_ABI constexpr basic_string(
basic_string&& __str, size_type __pos, const _Allocator& __alloc = _Allocator())
@@ -1114,7 +1100,8 @@ public:
# endif
template <__enable_if_t<__is_allocator_v<_Allocator>, int> = 0>
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(size_type __n, _CharT __c, const _Allocator& __a)
+ _LIBCPP_HIDE_FROM_ABI
+ _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(size_type __n, _CharT __c, const _Allocator& __a = _Allocator())
: __alloc_(__a) {
__init(__n, __c);
}
@@ -1153,29 +1140,16 @@ public:
__enable_if_t<__can_be_converted_to_string_view_v<_CharT, _Traits, _Tp> &&
!is_same<__remove_cvref_t<_Tp>, basic_string>::value,
int> = 0>
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit basic_string(const _Tp& __t) {
- __self_view __sv = __t;
- __init(__sv.data(), __sv.size());
- }
-
- template <class _Tp,
- __enable_if_t<__can_be_converted_to_string_view_v<_CharT, _Traits, _Tp> &&
- !is_same<__remove_cvref_t<_Tp>, basic_string>::value,
- int> = 0>
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit basic_string(const _Tp& __t, const allocator_type& __a)
+ _LIBCPP_HIDE_FROM_ABI
+ _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit basic_string(const _Tp& __t, const allocator_type& __a = allocator_type())
: __alloc_(__a) {
__self_view __sv = __t;
__init(__sv.data(), __sv.size());
}
- template <class _InputIterator, __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0>
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(_InputIterator __first, _InputIterator __last) {
- __init(__first, __last);
- }
-
template <class _InputIterator, __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0>
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
- basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a)
+ basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type())
: __alloc_(__a) {
__init(__first, __last);
}
@@ -1194,11 +1168,8 @@ public:
# endif
# ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(initializer_list<_CharT> __il) {
- __init(__il.begin(), __il.end());
- }
-
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(initializer_list<_CharT> __il, const _Allocator& __a)
+ _LIBCPP_HIDE_FROM_ABI
+ _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(initializer_list<_CharT> __il, const _Allocator& __a = _Allocator())
: __alloc_(__a) {
__init(__il.begin(), __il.end());
}
diff --git a/libcxx/test/std/utilities/optional/optional.specalg/make_optional_explicit.pass.cpp b/libcxx/test/std/utilities/optional/optional.specalg/make_optional_explicit.pass.cpp
index 5dd1d6f0b3380..b08fce2b701e2 100644
--- a/libcxx/test/std/utilities/optional/optional.specalg/make_optional_explicit.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.specalg/make_optional_explicit.pass.cpp
@@ -12,9 +12,6 @@
// template <class T, class... Args>
// constexpr optional<T> make_optional(Args&&... args);
-// GCC crashes on this file, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120577
-// XFAIL: gcc-15
-
#include <cassert>
#include <memory>
#include <optional>
diff --git a/libcxx/test/std/utilities/optional/optional.specalg/make_optional_explicit_initializer_list.pass.cpp b/libcxx/test/std/utilities/optional/optional.specalg/make_optional_explicit_initializer_list.pass.cpp
index 5ddb229ad9268..80371d6333712 100644
--- a/libcxx/test/std/utilities/optional/optional.specalg/make_optional_explicit_initializer_list.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.specalg/make_optional_explicit_initializer_list.pass.cpp
@@ -12,9 +12,6 @@
// template <class T, class U, class... Args>
// constexpr optional<T> make_optional(initializer_list<U> il, Args&&... args);
-// GCC crashes on this file, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120577
-// XFAIL: gcc-15
-
#include <cassert>
#include <memory>
#include <optional>
More information about the libcxx-commits
mailing list