From 191b796b3cd8be21a6cc0431c9a70beff56d32a1 Mon Sep 17 00:00:00 2001 From: Nikolas Klauser Date: Fri, 28 Nov 2025 12:09:28 +0100 Subject: [PATCH] [libc++] default the allocator arguemnt for most constructor --- libcxx/include/string | 47 ++++--------------- .../make_optional_explicit.pass.cpp | 3 -- ...ptional_explicit_initializer_list.pass.cpp | 3 -- 3 files changed, 9 insertions(+), 44 deletions(-) diff --git a/libcxx/include/string b/libcxx/include/string index 2b3ba6d2d9b62..ea90be950ba11 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) + 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 && - !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 ::value, int> = 0> - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(_InputIterator __first, _InputIterator __last) { - __init(__first, __last); - } - template ::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 // constexpr optional make_optional(Args&&... args); -// GCC crashes on this file, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120577 -// XFAIL: gcc-15 - #include #include #include 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 // constexpr optional make_optional(initializer_list il, Args&&... args); -// GCC crashes on this file, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120577 -// XFAIL: gcc-15 - #include #include #include