diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index 29b693b4550921..71c30e73b5ba78 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -384,7 +384,6 @@ set(files __memory/ranges_uninitialized_algorithms.h __memory/raw_storage_iterator.h __memory/shared_ptr.h - __memory/swap_allocator.h __memory/temporary_buffer.h __memory/uninitialized_algorithms.h __memory/unique_ptr.h diff --git a/libcxx/include/__hash_table b/libcxx/include/__hash_table index 959ef7fe7d83c1..6123a310ad636a 100644 --- a/libcxx/include/__hash_table +++ b/libcxx/include/__hash_table @@ -18,7 +18,6 @@ #include <__debug> #include <__functional/hash.h> #include <__iterator/iterator_traits.h> -#include <__memory/swap_allocator.h> #include <__utility/swap.h> #include #include diff --git a/libcxx/include/__memory/swap_allocator.h b/libcxx/include/__memory/swap_allocator.h deleted file mode 100644 index 64970fa9e2f407..00000000000000 --- a/libcxx/include/__memory/swap_allocator.h +++ /dev/null @@ -1,53 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___MEMORY_SWAP_ALLOCATOR_H -#define _LIBCPP___MEMORY_SWAP_ALLOCATOR_H - -#include <__config> -#include <__memory/allocator_traits.h> -#include <__type_traits/integral_constant.h> -#include <__utility/swap.h> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -_LIBCPP_BEGIN_NAMESPACE_STD - -template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 void __swap_allocator(_Alloc& __a1, _Alloc& __a2, true_type) -#if _LIBCPP_STD_VER > 11 - _NOEXCEPT -#else - _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) -#endif -{ - using _VSTD::swap; - swap(__a1, __a2); -} - -template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 void -__swap_allocator(_Alloc&, _Alloc&, false_type) _NOEXCEPT {} - -template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 void __swap_allocator(_Alloc& __a1, _Alloc& __a2) -#if _LIBCPP_STD_VER > 11 - _NOEXCEPT -#else - _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) -#endif -{ - _VSTD::__swap_allocator( - __a1, __a2, integral_constant::propagate_on_container_swap::value>()); -} - -_LIBCPP_END_NAMESPACE_STD - -#endif // _LIBCPP___MEMORY_SWAP_ALLOCATOR_H diff --git a/libcxx/include/__memory/uninitialized_algorithms.h b/libcxx/include/__memory/uninitialized_algorithms.h index 8b8fef1aa5971b..3a8560f080c696 100644 --- a/libcxx/include/__memory/uninitialized_algorithms.h +++ b/libcxx/include/__memory/uninitialized_algorithms.h @@ -10,17 +10,12 @@ #ifndef _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H #define _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H -#include <__algorithm/copy.h> -#include <__algorithm/move.h> #include <__config> #include <__iterator/iterator_traits.h> -#include <__iterator/reverse_iterator.h> #include <__memory/addressof.h> #include <__memory/allocator_traits.h> #include <__memory/construct_at.h> -#include <__memory/pointer_traits.h> #include <__memory/voidify.h> -#include <__type_traits/is_constant_evaluated.h> #include <__utility/move.h> #include <__utility/pair.h> #include <__utility/transaction.h> @@ -352,7 +347,6 @@ uninitialized_move_n(_InputIterator __ifirst, _Size __n, _ForwardIterator __ofir __unreachable_sentinel(), __iter_move); } -// TODO: Rewrite this to iterate left to right and use reverse_iterators when calling // Destroys every element in the range [first, last) FROM RIGHT TO LEFT using allocator // destruction. If elements are themselves C-style arrays, they are recursively destroyed // in the same manner. @@ -498,133 +492,6 @@ constexpr void __uninitialized_allocator_value_construct_n(_Alloc& __alloc, _Bid #endif // _LIBCPP_STD_VER > 14 -// Destroy all elements in [__first, __last) from left to right using allocator destruction. -template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 void -__allocator_destroy(_Alloc& __alloc, _Iter __first, _Sent __last) { - for (; __first != __last; ++__first) - allocator_traits<_Alloc>::destroy(__alloc, std::__to_address(__first)); -} - -template -class _AllocatorDestroyRangeReverse { -public: - _AllocatorDestroyRangeReverse(_Alloc& __alloc, _Iter& __first, _Iter& __last) - : __alloc_(__alloc), __first_(__first), __last_(__last) {} - - _LIBCPP_CONSTEXPR_AFTER_CXX11 void operator()() const { - std::__allocator_destroy(__alloc_, std::reverse_iterator<_Iter>(__last_), std::reverse_iterator<_Iter>(__first_)); - } - -private: - _Alloc& __alloc_; - _Iter& __first_; - _Iter& __last_; -}; - -// Copy-construct [__first1, __last1) in [__first2, __first2 + N), where N is distance(__first1, __last1). -// -// The caller has to ensure that __first2 can hold at least N uninitialized elements. If an exception is thrown the -// already copied elements are destroyed in reverse order of their construction. -template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _Iter2 -__uninitialized_allocator_copy(_Alloc& __alloc, _Iter1 __first1, _Sent1 __last1, _Iter2 __first2) { - auto __destruct_first = __first2; - auto __guard = - std::__make_transaction(_AllocatorDestroyRangeReverse<_Alloc, _Iter2>(__alloc, __destruct_first, __first2)); - while (__first1 != __last1) { - allocator_traits<_Alloc>::construct(__alloc, std::__to_address(__first2), *__first1); - ++__first1; - ++__first2; - } - __guard.__complete(); - return __first2; -} - -template -struct __allocator_has_trivial_copy_construct : _Not<__has_construct<_Alloc, _Type*, const _Type&> > {}; - -template -struct __allocator_has_trivial_copy_construct, _Type> : true_type {}; - -template ::type, - __enable_if_t< - // using _RawType because of the allocator extension - is_trivially_copy_constructible<_RawType>::value && is_trivially_copy_assignable<_RawType>::value && - __allocator_has_trivial_copy_construct<_Alloc, _RawType>::value>* = nullptr> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _Type* -__uninitialized_allocator_copy(_Alloc&, const _Type* __first1, const _Type* __last1, _Type* __first2) { - // TODO: Remove the const_cast once we drop support for std::allocator - if (__libcpp_is_constant_evaluated()) { - while (__first1 != __last1) { - std::__construct_at(std::__to_address(__first2), *__first1); - ++__first1; - ++__first2; - } - return __first2; - } else { - return std::copy(__first1, __last1, const_cast<_RawType*>(__first2)); - } -} - -// Move-construct the elements [__first1, __last1) into [__first2, __first2 + N) -// if the move constructor is noexcept, where N is distance(__first1, __last1). -// -// Otherwise try to copy all elements. If an exception is thrown the already copied -// elements are destroyed in reverse order of their construction. -template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _Iter2 __uninitialized_allocator_move_if_noexcept( - _Alloc& __alloc, _Iter1 __first1, _Sent1 __last1, _Iter2 __first2) { - static_assert(__is_cpp17_move_insertable<_Alloc>::value, - "The specified type does not meet the requirements of Cpp17MoveInsertable"); - auto __destruct_first = __first2; - auto __guard = - std::__make_transaction(_AllocatorDestroyRangeReverse<_Alloc, _Iter2>(__alloc, __destruct_first, __first2)); - - while (__first1 != __last1) { -#ifndef _LIBCPP_NO_EXCEPTIONS - allocator_traits<_Alloc>::construct(__alloc, std::__to_address(__first2), std::move_if_noexcept(*__first1)); -#else - allocator_traits<_Alloc>::construct(__alloc, std::__to_address(__first2), std::move(*__first1)); -#endif - ++__first1; - ++__first2; - } - __guard.__complete(); - return __first2; -} - -template -struct __allocator_has_trivial_move_construct : _Not<__has_construct<_Alloc, _Type*, _Type&&> > {}; - -template -struct __allocator_has_trivial_move_construct, _Type> : true_type {}; - -#ifndef _LIBCPP_COMPILER_GCC -template < - class _Alloc, - class _Iter1, - class _Iter2, - class _Type = typename iterator_traits<_Iter1>::value_type, - class = __enable_if_t::value && is_trivially_move_assignable<_Type>::value && - __allocator_has_trivial_move_construct<_Alloc, _Type>::value> > -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _Iter1 -__uninitialized_allocator_move_if_noexcept(_Alloc&, _Iter1 __first1, _Iter1 __last1, _Iter2 __first2) { - if (__libcpp_is_constant_evaluated()) { - while (__first1 != __last1) { - std::__construct_at(std::__to_address(__first2), std::move(*__first1)); - ++__first1; - ++__first2; - } - return __first2; - } else { - return std::move(__first1, __last1, __first2); - } -} -#endif // _LIBCPP_COMPILER_GCC - _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H diff --git a/libcxx/include/__split_buffer b/libcxx/include/__split_buffer index f7816746621753..7409b51b1f96b4 100644 --- a/libcxx/include/__split_buffer +++ b/libcxx/include/__split_buffer @@ -19,7 +19,6 @@ #include <__iterator/move_iterator.h> #include <__memory/allocator.h> #include <__memory/compressed_pair.h> -#include <__memory/swap_allocator.h> #include <__utility/forward.h> #include #include diff --git a/libcxx/include/__tree b/libcxx/include/__tree index 59525a03047aed..8d8449706871f6 100644 --- a/libcxx/include/__tree +++ b/libcxx/include/__tree @@ -17,7 +17,6 @@ #include <__iterator/distance.h> #include <__iterator/iterator_traits.h> #include <__iterator/next.h> -#include <__memory/swap_allocator.h> #include <__utility/forward.h> #include <__utility/swap.h> #include diff --git a/libcxx/include/__utility/transaction.h b/libcxx/include/__utility/transaction.h index e2cc4382084516..87e51c0b198e01 100644 --- a/libcxx/include/__utility/transaction.h +++ b/libcxx/include/__utility/transaction.h @@ -86,11 +86,6 @@ struct __transaction { bool __completed_; }; -template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __transaction<_Rollback> __make_transaction(_Rollback __rollback) { - return __transaction<_Rollback>(std::move(__rollback)); -} - _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___UTILITY_TRANSACTION_H diff --git a/libcxx/include/forward_list b/libcxx/include/forward_list index ee90aaa4771f18..aab3b8715d0140 100644 --- a/libcxx/include/forward_list +++ b/libcxx/include/forward_list @@ -188,7 +188,6 @@ template #include <__iterator/iterator_traits.h> #include <__iterator/move_iterator.h> #include <__iterator/next.h> -#include <__memory/swap_allocator.h> #include <__utility/forward.h> #include #include diff --git a/libcxx/include/list b/libcxx/include/list index 5fcbd67c670368..1db29d14b84208 100644 --- a/libcxx/include/list +++ b/libcxx/include/list @@ -194,7 +194,6 @@ template #include <__iterator/next.h> #include <__iterator/prev.h> #include <__iterator/reverse_iterator.h> -#include <__memory/swap_allocator.h> #include <__utility/forward.h> #include <__utility/move.h> #include <__utility/swap.h> diff --git a/libcxx/include/memory b/libcxx/include/memory index 56f8159fbd4456..ec9f5773929f7a 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -885,6 +885,93 @@ template _LIBCPP_BEGIN_NAMESPACE_STD +template +_LIBCPP_INLINE_VISIBILITY +void __construct_forward_with_exception_guarantees(_Alloc& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) { + static_assert(__is_cpp17_move_insertable<_Alloc>::value, + "The specified type does not meet the requirements of Cpp17MoveInsertable"); + typedef allocator_traits<_Alloc> _Traits; + for (; __begin1 != __end1; ++__begin1, (void)++__begin2) { + _Traits::construct(__a, _VSTD::__to_address(__begin2), +#ifdef _LIBCPP_NO_EXCEPTIONS + _VSTD::move(*__begin1) +#else + _VSTD::move_if_noexcept(*__begin1) +#endif + ); + } +} + +template ::value || !__has_construct<_Alloc, _Tp*, _Tp>::value) && + is_trivially_move_constructible<_Tp>::value +>::type> +_LIBCPP_INLINE_VISIBILITY +void __construct_forward_with_exception_guarantees(_Alloc&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) { + ptrdiff_t _Np = __end1 - __begin1; + if (_Np > 0) { + _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); + __begin2 += _Np; + } +} + +template +_LIBCPP_INLINE_VISIBILITY +void __construct_range_forward(_Alloc& __a, _Iter __begin1, _Iter __end1, _Ptr& __begin2) { + typedef allocator_traits<_Alloc> _Traits; + for (; __begin1 != __end1; ++__begin1, (void) ++__begin2) { + _Traits::construct(__a, _VSTD::__to_address(__begin2), *__begin1); + } +} + +template ::type, + class _RawDest = typename remove_const<_Dest>::type, + class = + typename enable_if< + is_trivially_copy_constructible<_Dest>::value && + is_same<_RawSource, _RawDest>::value && + (__is_default_allocator<_Alloc>::value || !__has_construct<_Alloc, _Dest*, _Source&>::value) + >::type> +_LIBCPP_INLINE_VISIBILITY +void __construct_range_forward(_Alloc&, _Source* __begin1, _Source* __end1, _Dest*& __begin2) { + ptrdiff_t _Np = __end1 - __begin1; + if (_Np > 0) { + _VSTD::memcpy(const_cast<_RawDest*>(__begin2), __begin1, _Np * sizeof(_Dest)); + __begin2 += _Np; + } +} + +template +_LIBCPP_INLINE_VISIBILITY +void __construct_backward_with_exception_guarantees(_Alloc& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) { + static_assert(__is_cpp17_move_insertable<_Alloc>::value, + "The specified type does not meet the requirements of Cpp17MoveInsertable"); + typedef allocator_traits<_Alloc> _Traits; + while (__end1 != __begin1) { + _Traits::construct(__a, _VSTD::__to_address(__end2 - 1), +#ifdef _LIBCPP_NO_EXCEPTIONS + _VSTD::move(*--__end1) +#else + _VSTD::move_if_noexcept(*--__end1) +#endif + ); + --__end2; + } +} + +template ::value || !__has_construct<_Alloc, _Tp*, _Tp>::value) && + is_trivially_move_constructible<_Tp>::value +>::type> +_LIBCPP_INLINE_VISIBILITY +void __construct_backward_with_exception_guarantees(_Alloc&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) { + ptrdiff_t _Np = __end1 - __begin1; + __end2 -= _Np; + if (_Np > 0) + _VSTD::memcpy(static_cast(__end2), static_cast(__begin1), _Np * sizeof(_Tp)); +} + struct __destruct_n { private: @@ -926,6 +1013,37 @@ public: _LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); +// --- Helper for container swap -- +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 +void __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type) +#if _LIBCPP_STD_VER > 11 + _NOEXCEPT +#else + _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) +#endif +{ + using _VSTD::swap; + swap(__a1, __a2); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 +void __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 +void __swap_allocator(_Alloc & __a1, _Alloc & __a2) +#if _LIBCPP_STD_VER > 11 + _NOEXCEPT +#else + _NOEXCEPT_(__is_nothrow_swappable<_Alloc>::value) +#endif +{ + _VSTD::__swap_allocator(__a1, __a2, + integral_constant::propagate_on_container_swap::value>()); +} + template > struct __noexcept_move_assign_container : public integral_constant operator "" s( const char32_t *str, size_t len ); #include <__iterator/reverse_iterator.h> #include <__iterator/wrap_iter.h> #include <__memory/allocate_at_least.h> -#include <__memory/swap_allocator.h> #include <__string/char_traits.h> #include <__string/extern_template_lists.h> #include <__utility/auto_cast.h> diff --git a/libcxx/include/vector b/libcxx/include/vector index 30030f85e43c38..14f586c9bfd7ea 100644 --- a/libcxx/include/vector +++ b/libcxx/include/vector @@ -291,8 +291,6 @@ erase_if(vector& c, Predicate pred); // C++20 #include <__iterator/reverse_iterator.h> #include <__iterator/wrap_iter.h> #include <__memory/allocate_at_least.h> -#include <__memory/pointer_traits.h> -#include <__memory/swap_allocator.h> #include <__split_buffer> #include <__utility/forward.h> #include <__utility/move.h> @@ -897,11 +895,9 @@ template void vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer& __v) { + __annotate_delete(); - using _RevIter = std::reverse_iterator; - __v.__begin_ = std::__uninitialized_allocator_move_if_noexcept( - __alloc(), _RevIter(__end_), _RevIter(__begin_), _RevIter(__v.__begin_)) - .base(); + _VSTD::__construct_backward_with_exception_guarantees(this->__alloc(), this->__begin_, this->__end_, __v.__begin_); _VSTD::swap(this->__begin_, __v.__begin_); _VSTD::swap(this->__end_, __v.__end_); _VSTD::swap(this->__end_cap(), __v.__end_cap()); @@ -916,11 +912,8 @@ vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer; - __v.__begin_ = std::__uninitialized_allocator_move_if_noexcept( - __alloc(), _RevIter(__p), _RevIter(__begin_), _RevIter(__v.__begin_)) - .base(); - __v.__end_ = std::__uninitialized_allocator_move_if_noexcept(__alloc(), __p, __end_, __v.__end_); + _VSTD::__construct_backward_with_exception_guarantees(this->__alloc(), this->__begin_, __p, __v.__begin_); + _VSTD::__construct_forward_with_exception_guarantees(this->__alloc(), __p, this->__end_, __v.__end_); _VSTD::swap(this->__begin_, __v.__begin_); _VSTD::swap(this->__end_, __v.__end_); _VSTD::swap(this->__end_cap(), __v.__end_cap()); @@ -1008,8 +1001,8 @@ typename enable_if >::type vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n) { - _ConstructTransaction __tx(*this, __n); - __tx.__pos_ = std::__uninitialized_allocator_copy(__alloc(), __first, __last, __tx.__pos_); + _ConstructTransaction __tx(*this, __n); + _VSTD::__construct_range_forward(this->__alloc(), __first, __last, __tx.__pos_); } // Default constructs __n objects starting at __end_ diff --git a/libcxx/test/libcxx/containers/sequences/vector/asan_throw.pass.cpp b/libcxx/test/libcxx/containers/sequences/vector/asan_throw.pass.cpp index 6a267e546f927c..71d4f33366f33d 100644 --- a/libcxx/test/libcxx/containers/sequences/vector/asan_throw.pass.cpp +++ b/libcxx/test/libcxx/containers/sequences/vector/asan_throw.pass.cpp @@ -99,9 +99,9 @@ void test_insert_range() { v.insert(v.end(), a, a + 2); assert(0); } catch (int e) { - assert(v.size() == 2); + assert(v.size() == 3); } - assert(v.size() == 2); + assert(v.size() == 3); assert(is_contiguous_container_asan_correct(v)); } diff --git a/libcxx/test/libcxx/memory/uninitialized_allocator_copy.pass.cpp b/libcxx/test/libcxx/memory/uninitialized_allocator_copy.pass.cpp deleted file mode 100644 index 928d2ed0fe3e10..00000000000000 --- a/libcxx/test/libcxx/memory/uninitialized_allocator_copy.pass.cpp +++ /dev/null @@ -1,66 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: no-exceptions - -// ensure that __uninitialized_allocator_copy calls the proper construct and destruct functions - -#include -#include - -#include "test_allocator.h" - -template -class construct_counting_allocator { -public: - using value_type = T; - - int* constructed_count_; - int* max_constructed_count_; - - construct_counting_allocator(int* constructed_count, int* max_constructed_count) - : constructed_count_(constructed_count), max_constructed_count_(max_constructed_count) {} - - template - void construct(T* ptr, Args&&... args) { - ::new (static_cast(ptr)) T(args...); - ++*constructed_count_; - *max_constructed_count_ = std::max(*max_constructed_count_, *constructed_count_); - } - - void destroy(T* ptr) { - --*constructed_count_; - ptr->~T(); - } -}; - -int throw_if_zero = 15; - -struct ThrowSometimes { - ThrowSometimes() = default; - ThrowSometimes(const ThrowSometimes&) { - if (--throw_if_zero == 0) - throw 1; - } -}; - -int main(int, char**) { - int constructed_count = 0; - int max_constructed_count = 0; - construct_counting_allocator alloc(&constructed_count, &max_constructed_count); - ThrowSometimes in[20]; - TEST_ALIGNAS_TYPE(ThrowSometimes) char out[sizeof(ThrowSometimes) * 20]; - try { - std::__uninitialized_allocator_copy( - alloc, std::begin(in), std::end(in), reinterpret_cast(std::begin(out))); - } catch (...) { - } - - assert(constructed_count == 0); - assert(max_constructed_count == 14); -} diff --git a/libcxx/test/libcxx/private_headers.verify.cpp b/libcxx/test/libcxx/private_headers.verify.cpp index 0671cbf2399ce2..6c1b3b5e7bbfd9 100644 --- a/libcxx/test/libcxx/private_headers.verify.cpp +++ b/libcxx/test/libcxx/private_headers.verify.cpp @@ -415,7 +415,6 @@ END-SCRIPT #include <__memory/ranges_uninitialized_algorithms.h> // expected-error@*:* {{use of private header from outside its module: '__memory/ranges_uninitialized_algorithms.h'}} #include <__memory/raw_storage_iterator.h> // expected-error@*:* {{use of private header from outside its module: '__memory/raw_storage_iterator.h'}} #include <__memory/shared_ptr.h> // expected-error@*:* {{use of private header from outside its module: '__memory/shared_ptr.h'}} -#include <__memory/swap_allocator.h> // expected-error@*:* {{use of private header from outside its module: '__memory/swap_allocator.h'}} #include <__memory/temporary_buffer.h> // expected-error@*:* {{use of private header from outside its module: '__memory/temporary_buffer.h'}} #include <__memory/uninitialized_algorithms.h> // expected-error@*:* {{use of private header from outside its module: '__memory/uninitialized_algorithms.h'}} #include <__memory/unique_ptr.h> // expected-error@*:* {{use of private header from outside its module: '__memory/unique_ptr.h'}} diff --git a/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_initializer_list.pass.cpp b/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_initializer_list.pass.cpp index 4a81fbfed65e7a..eef63795619948 100644 --- a/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_initializer_list.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector/vector.modifiers/insert_iter_initializer_list.pass.cpp @@ -19,46 +19,9 @@ #include "min_allocator.h" #include "asan_testing.h" -#ifndef TEST_HAS_NO_EXCEPTIONS -int throw_if_zero = 2; -int constructed_count = 0; - -struct ThrowSometimes { - ThrowSometimes() { ++constructed_count; } - ThrowSometimes(const ThrowSometimes&) { - if (--throw_if_zero == 0) - throw 1; - ++constructed_count; - } - ThrowSometimes& operator=(const ThrowSometimes&) { - if (--throw_if_zero == 0) - throw 1; - ++constructed_count; - return *this; - } - ~ThrowSometimes() { --constructed_count; } -}; - -void test_throwing() { - std::vector v; - v.reserve(4); - v.emplace_back(); - v.emplace_back(); - try { - v.insert(v.end(), {ThrowSometimes{}, ThrowSometimes{}}); - assert(false); - } catch (int) { - assert(v.size() == 2); - assert(constructed_count == 2); - } -} -#endif // TEST_HAS_NO_EXCEPTIONS - -int main(int, char**) { -#ifndef TEST_HAS_NO_EXCEPTIONS - test_throwing(); -#endif - { +int main(int, char**) +{ + { std::vector d(10, 1); std::vector::iterator i = d.insert(d.cbegin() + 2, {3, 4, 5, 6}); assert(d.size() == 14); @@ -78,8 +41,8 @@ int main(int, char**) { assert(d[11] == 1); assert(d[12] == 1); assert(d[13] == 1); - } - { + } + { std::vector> d(10, 1); std::vector>::iterator i = d.insert(d.cbegin() + 2, {3, 4, 5, 6}); assert(d.size() == 14); @@ -99,7 +62,7 @@ int main(int, char**) { assert(d[11] == 1); assert(d[12] == 1); assert(d[13] == 1); - } + } return 0; }