Skip to content

Commit 37055c7

Browse files
authored
Update libcxx and libcxxabi to LLVM 18.1.2 (#21638)
This updates libcxx and libcxxabi to LLVM 18.1.2. Due to llvm/llvm-project#65534 we need to update both at the same time. Things to note: - Disable hardening mode: LLVM 18.1.2 adds support for "Hardening Modes" to libcxx (https://libcxx.llvm.org/Hardening.html). There are four modes: none, fast, extensive and debug. Different hardening modes make different trade-offs between the amount of checking and runtime performance. We for now disable it (i.e., set it to 'none') so that we don't have any effects on the performance. We can consider enabling it when we ever get to enable the debug version of libcxx. - Disable C++20 time zone support: LLVM 18.1.2 adds C++20 time zone support (https://libcxx.llvm.org/DesignDocs/TimeZone.html) to libcxx, which requires access IANA Time Zone Database. Currently it seems it only supports Linux: https://github.com/llvm/llvm-project/blob/26a1d6601d727a96f4301d0d8647b5a42760ae0c/libcxx/src/tz.cpp#L45-L49 So this excludes the two source files from build (which is done via `CMakeLists.txt` in the upstream LLVM) and sets `_LIBCPP_HAS_NO_TIME_ZONE_DATABASE` macro in `__config_site`. In future maybe we can consider implementing this in JS. - `__cxa_init_primary_exception` support: llvm/llvm-project#65534 introduces `__cxa_init_primary_exception` and uses this in libcxx. Like several other methods like the below in `cxa_exception.cpp`, https://github.com/emscripten-core/emscripten/blob/fbdd9249e939660cb0d20f00d6bc1897c2f3905e/system/lib/libcxxabi/src/cxa_exception.cpp#L264-L269 this new function takes a pointer to a destructor, and in Wasm destructor returns a `this` pointer, which requires `ifdef __USING_WASM_EXCEPTION__` on its signature. And that it is also used in libcxx means we need to guard some code in libcxx with `ifdef __USING_WASM_EXCEPTION__` for the signature difference, and we need to build libcxx with `-D__USING_WASM_EXCEPTIONS__` when Wasm EH is used. Also we add Emscripte EH's counterpart in `cxa_exception_emscripten.cpp` too. - This version fixes long-running misbehaviors of `operator new` llvm/llvm-project#69498 seems to fix some long-running misbhaviors of `operator new`, which in emscripten we tried to fix in #11079 and #20154. So while resolving the conflicts, I effectively reverted #11079 and #20154 in `libcxx/src/stdlib_new_delete.cpp` and `libcxx/src/new.cpp`. - Add default `__assertion_handler` to `libcxx/include`: llvm/llvm-project#77883 adds a way for vendors to override how we handle assertions. If a vendor doesn't want to override it, CMake will copy the provided [default template assertion handler file](https://github.com/llvm/llvm-project/blob/26a1d6601d727a96f4301d0d8647b5a42760ae0c/libcxx/vendor/llvm/default_assertion_handler.in) to libcxx's generated include dir, which defaults to `SYSROOT/include/c++/v1`: https://github.com/llvm/llvm-project/blob/26a1d6601d727a96f4301d0d8647b5a42760ae0c/libcxx/CMakeLists.txt#L72-L73 https://github.com/llvm/llvm-project/blob/26a1d6601d727a96f4301d0d8647b5a42760ae0c/libcxx/CMakeLists.txt#L439 https://github.com/llvm/llvm-project/blob/26a1d6601d727a96f4301d0d8647b5a42760ae0c/libcxx/include/CMakeLists.txt#L1024 We don't use CMake, so this renames the provided `vendor/llvm/default_assertion_handler.in` to `__assert_handler` in our `libcxx/include` directory, which will be copied to `SYSROOT/include/c++/v1`. - Disable `__libcpp_verbose_abort directly` in code: In #20707 we decided to disable `__libcpp_verbose_abort` not to incur the code size increase that brings (it brings in `vfprintf` and its family). We disabled it in adding `#define _LIBCPP_AVAILABILITY_HAS_NO_VERBOSE_ABORT` in `__config_site`. But that `_NO_` macros are gone in LLVM 18.1.2, and changing it to `#define _LIBCPP_AVAILABILITY_HAS_VERBOSE_ABORT 0` does not work because it is overridden by this line, unless we provide our own vendor annotations: https://github.com/llvm/llvm-project/blob/38f5596feda3276a8aa64fc14e074334017088ca/libcxx/include/__availability#L138 I asked about this in llvm/llvm-project#87012 and llvm/llvm-project#71002 (comment) (and more comments below) but didn't get an actionable answer yet. So this disables `__libcpp_verbose_abort` in the code directly for now, hopefully temporarily. Each fix is described in its own commit, except for the fixes required to resolve conflicts when merging our changes, which I wasn't able to commit separately. Fixes #21603.
1 parent f07067d commit 37055c7

File tree

929 files changed

+84034
-109301
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

929 files changed

+84034
-109301
lines changed

system/lib/libcxx/include/__algorithm/any_of.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
_LIBCPP_BEGIN_NAMESPACE_STD
2020

2121
template <class _InputIterator, class _Predicate>
22-
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
22+
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
2323
any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
2424
for (; __first != __last; ++__first)
2525
if (__pred(*__first))

system/lib/libcxx/include/__algorithm/binary_search.h

+7-13
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,16 @@
2222
_LIBCPP_BEGIN_NAMESPACE_STD
2323

2424
template <class _ForwardIterator, class _Tp, class _Compare>
25-
_LIBCPP_NODISCARD_EXT inline
26-
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
27-
bool
28-
binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
29-
{
30-
__first = std::lower_bound<_ForwardIterator, _Tp, __comp_ref_type<_Compare> >(__first, __last, __value, __comp);
31-
return __first != __last && !__comp(__value, *__first);
25+
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
26+
binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) {
27+
__first = std::lower_bound<_ForwardIterator, _Tp, __comp_ref_type<_Compare> >(__first, __last, __value, __comp);
28+
return __first != __last && !__comp(__value, *__first);
3229
}
3330

3431
template <class _ForwardIterator, class _Tp>
35-
_LIBCPP_NODISCARD_EXT inline
36-
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
37-
bool
38-
binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
39-
{
40-
return std::binary_search(__first, __last, __value, __less<>());
32+
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
33+
binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
34+
return std::binary_search(__first, __last, __value, __less<>());
4135
}
4236

4337
_LIBCPP_END_NAMESPACE_STD

system/lib/libcxx/include/__algorithm/clamp.h

+14-16
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,22 @@
2020
_LIBCPP_BEGIN_NAMESPACE_STD
2121

2222
#if _LIBCPP_STD_VER >= 17
23-
template<class _Tp, class _Compare>
24-
_LIBCPP_NODISCARD_EXT inline
25-
_LIBCPP_INLINE_VISIBILITY constexpr
26-
const _Tp&
27-
clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi, _Compare __comp)
28-
{
29-
_LIBCPP_ASSERT_UNCATEGORIZED(!__comp(__hi, __lo), "Bad bounds passed to std::clamp");
30-
return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v;
31-
23+
template <class _Tp, class _Compare>
24+
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&
25+
clamp(_LIBCPP_LIFETIMEBOUND const _Tp& __v,
26+
_LIBCPP_LIFETIMEBOUND const _Tp& __lo,
27+
_LIBCPP_LIFETIMEBOUND const _Tp& __hi,
28+
_Compare __comp) {
29+
_LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(!__comp(__hi, __lo), "Bad bounds passed to std::clamp");
30+
return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v;
3231
}
3332

34-
template<class _Tp>
35-
_LIBCPP_NODISCARD_EXT inline
36-
_LIBCPP_INLINE_VISIBILITY constexpr
37-
const _Tp&
38-
clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi)
39-
{
40-
return _VSTD::clamp(__v, __lo, __hi, __less<>());
33+
template <class _Tp>
34+
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&
35+
clamp(_LIBCPP_LIFETIMEBOUND const _Tp& __v,
36+
_LIBCPP_LIFETIMEBOUND const _Tp& __lo,
37+
_LIBCPP_LIFETIMEBOUND const _Tp& __hi) {
38+
return std::clamp(__v, __lo, __hi, __less<>());
4139
}
4240
#endif
4341

system/lib/libcxx/include/__algorithm/comp.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
#include <__config>
1313
#include <__type_traits/integral_constant.h>
14-
#include <__type_traits/predicate_traits.h>
14+
#include <__type_traits/operation_traits.h>
1515

1616
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1717
# pragma GCC system_header
@@ -26,8 +26,8 @@ struct __equal_to {
2626
}
2727
};
2828

29-
template <class _Lhs, class _Rhs>
30-
struct __is_trivial_equality_predicate<__equal_to, _Lhs, _Rhs> : true_type {};
29+
template <class _Tp, class _Up>
30+
struct __desugars_to<__equal_tag, __equal_to, _Tp, _Up> : true_type {};
3131

3232
// The definition is required because __less is part of the ABI, but it's empty
3333
// because all comparisons should be transparent.

system/lib/libcxx/include/__algorithm/comp_ref_type.h

+29-40
Original file line numberDiff line numberDiff line change
@@ -20,52 +20,41 @@
2020
_LIBCPP_BEGIN_NAMESPACE_STD
2121

2222
template <class _Compare>
23-
struct __debug_less
24-
{
25-
_Compare &__comp_;
26-
_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI __debug_less(_Compare& __c) : __comp_(__c) {}
23+
struct __debug_less {
24+
_Compare& __comp_;
25+
_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI __debug_less(_Compare& __c) : __comp_(__c) {}
2726

28-
template <class _Tp, class _Up>
29-
_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI
30-
bool operator()(const _Tp& __x, const _Up& __y)
31-
{
32-
bool __r = __comp_(__x, __y);
33-
if (__r)
34-
__do_compare_assert(0, __y, __x);
35-
return __r;
36-
}
27+
template <class _Tp, class _Up>
28+
_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool operator()(const _Tp& __x, const _Up& __y) {
29+
bool __r = __comp_(__x, __y);
30+
if (__r)
31+
__do_compare_assert(0, __y, __x);
32+
return __r;
33+
}
3734

38-
template <class _Tp, class _Up>
39-
_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI
40-
bool operator()(_Tp& __x, _Up& __y)
41-
{
42-
bool __r = __comp_(__x, __y);
43-
if (__r)
44-
__do_compare_assert(0, __y, __x);
45-
return __r;
46-
}
35+
template <class _Tp, class _Up>
36+
_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool operator()(_Tp& __x, _Up& __y) {
37+
bool __r = __comp_(__x, __y);
38+
if (__r)
39+
__do_compare_assert(0, __y, __x);
40+
return __r;
41+
}
4742

48-
template <class _LHS, class _RHS>
49-
_LIBCPP_CONSTEXPR_SINCE_CXX14
50-
inline _LIBCPP_INLINE_VISIBILITY
51-
decltype((void)std::declval<_Compare&>()(
52-
std::declval<_LHS &>(), std::declval<_RHS &>()))
53-
__do_compare_assert(int, _LHS & __l, _RHS & __r) {
54-
_LIBCPP_ASSERT_UNCATEGORIZED(!__comp_(__l, __r),
55-
"Comparator does not induce a strict weak ordering");
56-
(void)__l;
57-
(void)__r;
58-
}
43+
template <class _LHS, class _RHS>
44+
_LIBCPP_CONSTEXPR_SINCE_CXX14 inline _LIBCPP_HIDE_FROM_ABI decltype((void)std::declval<_Compare&>()(
45+
std::declval<_LHS&>(), std::declval<_RHS&>()))
46+
__do_compare_assert(int, _LHS& __l, _RHS& __r) {
47+
_LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(!__comp_(__l, __r), "Comparator does not induce a strict weak ordering");
48+
(void)__l;
49+
(void)__r;
50+
}
5951

60-
template <class _LHS, class _RHS>
61-
_LIBCPP_CONSTEXPR_SINCE_CXX14
62-
inline _LIBCPP_INLINE_VISIBILITY
63-
void __do_compare_assert(long, _LHS &, _RHS &) {}
52+
template <class _LHS, class _RHS>
53+
_LIBCPP_CONSTEXPR_SINCE_CXX14 inline _LIBCPP_HIDE_FROM_ABI void __do_compare_assert(long, _LHS&, _RHS&) {}
6454
};
6555

66-
// Pass the comparator by lvalue reference. Or in debug mode, using a
67-
// debugging wrapper that stores a reference.
68-
#if _LIBCPP_ENABLE_DEBUG_MODE
56+
// Pass the comparator by lvalue reference. Or in the debug mode, using a debugging wrapper that stores a reference.
57+
#if _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_DEBUG
6958
template <class _Comp>
7059
using __comp_ref_type = __debug_less<_Comp>;
7160
#else

system/lib/libcxx/include/__algorithm/copy.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ struct __copy_loop {
5151

5252
_OutIter& __result_;
5353

54-
_LIBCPP_HIDE_FROM_ABI _CopySegment(_OutIter& __result) : __result_(__result) {}
54+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit _CopySegment(_OutIter& __result)
55+
: __result_(__result) {}
5556

56-
_LIBCPP_HIDE_FROM_ABI void
57+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void
5758
operator()(typename _Traits::__local_iterator __lfirst, typename _Traits::__local_iterator __llast) {
5859
__result_ = std::__copy<_AlgPolicy>(__lfirst, __llast, std::move(__result_)).second;
5960
}
@@ -112,7 +113,7 @@ __copy(_InIter __first, _Sent __last, _OutIter __result) {
112113
}
113114

114115
template <class _InputIterator, class _OutputIterator>
115-
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator
116+
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator
116117
copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) {
117118
return std::__copy<_ClassicAlgPolicy>(__first, __last, __result).second;
118119
}

system/lib/libcxx/include/__algorithm/copy_backward.h

+6-10
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,7 @@ struct __copy_backward_loop {
108108

109109
struct __copy_backward_trivial {
110110
// At this point, the iterators have been unwrapped so any `contiguous_iterator` has been unwrapped to a pointer.
111-
template <class _In, class _Out,
112-
__enable_if_t<__can_lower_copy_assignment_to_memmove<_In, _Out>::value, int> = 0>
111+
template <class _In, class _Out, __enable_if_t<__can_lower_copy_assignment_to_memmove<_In, _Out>::value, int> = 0>
113112
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*>
114113
operator()(_In* __first, _In* __last, _Out* __result) const {
115114
return std::__copy_backward_trivial_impl(__first, __last, __result);
@@ -124,16 +123,13 @@ __copy_backward(_BidirectionalIterator1 __first, _Sentinel __last, _Bidirectiona
124123
}
125124

126125
template <class _BidirectionalIterator1, class _BidirectionalIterator2>
127-
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
128-
_BidirectionalIterator2
129-
copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
130-
_BidirectionalIterator2 __result)
131-
{
126+
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _BidirectionalIterator2
127+
copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, _BidirectionalIterator2 __result) {
132128
static_assert(std::is_copy_constructible<_BidirectionalIterator1>::value &&
133-
std::is_copy_constructible<_BidirectionalIterator1>::value, "Iterators must be copy constructible.");
129+
std::is_copy_constructible<_BidirectionalIterator1>::value,
130+
"Iterators must be copy constructible.");
134131

135-
return std::__copy_backward<_ClassicAlgPolicy>(
136-
std::move(__first), std::move(__last), std::move(__result)).second;
132+
return std::__copy_backward<_ClassicAlgPolicy>(std::move(__first), std::move(__last), std::move(__result)).second;
137133
}
138134

139135
_LIBCPP_END_NAMESPACE_STD

system/lib/libcxx/include/__algorithm/copy_if.h

+9-14
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,16 @@
1717

1818
_LIBCPP_BEGIN_NAMESPACE_STD
1919

20-
template<class _InputIterator, class _OutputIterator, class _Predicate>
21-
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
22-
_OutputIterator
23-
copy_if(_InputIterator __first, _InputIterator __last,
24-
_OutputIterator __result, _Predicate __pred)
25-
{
26-
for (; __first != __last; ++__first)
27-
{
28-
if (__pred(*__first))
29-
{
30-
*__result = *__first;
31-
++__result;
32-
}
20+
template <class _InputIterator, class _OutputIterator, class _Predicate>
21+
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator
22+
copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred) {
23+
for (; __first != __last; ++__first) {
24+
if (__pred(*__first)) {
25+
*__result = *__first;
26+
++__result;
3327
}
34-
return __result;
28+
}
29+
return __result;
3530
}
3631

3732
_LIBCPP_END_NAMESPACE_STD

system/lib/libcxx/include/__algorithm/copy_move_common.h

+16-14
Original file line numberDiff line numberDiff line change
@@ -31,29 +31,29 @@
3131
# pragma GCC system_header
3232
#endif
3333

34+
_LIBCPP_PUSH_MACROS
35+
#include <__undef_macros>
36+
3437
_LIBCPP_BEGIN_NAMESPACE_STD
3538

3639
// Type traits.
3740

3841
template <class _From, class _To>
3942
struct __can_lower_copy_assignment_to_memmove {
4043
static const bool value =
41-
// If the types are always bitcastable, it's valid to do a bitwise copy between them.
42-
__is_always_bitcastable<_From, _To>::value &&
43-
// Reject conversions that wouldn't be performed by the regular built-in assignment (e.g. between arrays).
44-
is_trivially_assignable<_To&, const _From&>::value &&
45-
// `memmove` doesn't accept `volatile` pointers, make sure the optimization SFINAEs away in that case.
46-
!is_volatile<_From>::value &&
47-
!is_volatile<_To>::value;
44+
// If the types are always bitcastable, it's valid to do a bitwise copy between them.
45+
__is_always_bitcastable<_From, _To>::value &&
46+
// Reject conversions that wouldn't be performed by the regular built-in assignment (e.g. between arrays).
47+
is_trivially_assignable<_To&, const _From&>::value &&
48+
// `memmove` doesn't accept `volatile` pointers, make sure the optimization SFINAEs away in that case.
49+
!is_volatile<_From>::value && !is_volatile<_To>::value;
4850
};
4951

5052
template <class _From, class _To>
5153
struct __can_lower_move_assignment_to_memmove {
5254
static const bool value =
53-
__is_always_bitcastable<_From, _To>::value &&
54-
is_trivially_assignable<_To&, _From&&>::value &&
55-
!is_volatile<_From>::value &&
56-
!is_volatile<_To>::value;
55+
__is_always_bitcastable<_From, _To>::value && is_trivially_assignable<_To&, _From&&>::value &&
56+
!is_volatile<_From>::value && !is_volatile<_To>::value;
5757
};
5858

5959
// `memmove` algorithms implementation.
@@ -95,8 +95,8 @@ struct __can_rewrap<_InIter,
9595
_Sent,
9696
_OutIter,
9797
// Note that sentinels are always copy-constructible.
98-
__enable_if_t< is_copy_constructible<_InIter>::value &&
99-
is_copy_constructible<_OutIter>::value > > : true_type {};
98+
__enable_if_t< is_copy_constructible<_InIter>::value && is_copy_constructible<_OutIter>::value > >
99+
: true_type {};
100100

101101
template <class _Algorithm,
102102
class _InIter,
@@ -108,7 +108,7 @@ __unwrap_and_dispatch(_InIter __first, _Sent __last, _OutIter __out_first) {
108108
auto __range = std::__unwrap_range(__first, std::move(__last));
109109
auto __result = _Algorithm()(std::move(__range.first), std::move(__range.second), std::__unwrap_iter(__out_first));
110110
return std::make_pair(std::__rewrap_range<_Sent>(std::move(__first), std::move(__result.first)),
111-
std::__rewrap_iter(std::move(__out_first), std::move(__result.second)));
111+
std::__rewrap_iter(std::move(__out_first), std::move(__result.second)));
112112
}
113113

114114
template <class _Algorithm,
@@ -135,4 +135,6 @@ __dispatch_copy_or_move(_InIter __first, _Sent __last, _OutIter __out_first) {
135135

136136
_LIBCPP_END_NAMESPACE_STD
137137

138+
_LIBCPP_POP_MACROS
139+
138140
#endif // _LIBCPP___ALGORITHM_COPY_MOVE_COMMON_H

0 commit comments

Comments
 (0)