//===----------------------------------------------------------------------===// // // 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: c++03, no-exceptions // TODO: // - throwing upon moving; // - initializer lists; // - throwing when constructing the element in place. // forward_list(size_type n, const value_type& v); // forward_list(size_type n, const value_type& v, const allocator_type& a); // template // forward_list(InputIterator first, InputIterator last); // template // forward_list(InputIterator first, InputIterator last, const allocator_type& a); // forward_list(const forward_list& x); // forward_list(const forward_list& x, const allocator_type& a); // template R> // forward_list(from_range_t, R&& rg, const Allocator& = Allocator()); // C++23 // // forward_list& operator=(const forward_list& x); // // template // void assign(InputIterator first, InputIterator last); // void assign(size_type n, const value_type& v); // template R> // void assign_range(R&& rg); // C++23 // // void push_front(const value_type& v); // template R> // void prepend_range(R&& rg); // C++23 // // iterator insert_after(const_iterator p, const value_type& v); // iterator insert_after(const_iterator p, size_type n, const value_type& v); // template // iterator insert_after(const_iterator p, // InputIterator first, InputIterator last); // template R> // iterator insert_range_after(const_iterator position, R&& rg); // C++23 // // void resize(size_type n, const value_type& v); #include #include #include "../../exception_safety_helpers.h" #include "test_macros.h" #if TEST_STD_VER >= 23 #include #endif int main(int, char**) { { constexpr int ThrowOn = 1; constexpr int Size = 1; using T = ThrowingCopy; // void push_front(const value_type& v); test_exception_safety_throwing_copy([](T* from, T*){ std::forward_list c; c.push_front(*from); }); // iterator insert_after(const_iterator p, const value_type& v); test_exception_safety_throwing_copy([](T* from, T*){ std::forward_list c; c.insert_after(c.before_begin(), *from); }); } { constexpr int ThrowOn = 3; constexpr int Size = 5; using T = ThrowingCopy; using C = std::forward_list; using Alloc = std::allocator; // forward_list(size_type n, const value_type& v); test_exception_safety_throwing_copy([](T* from, T*){ std::forward_list c(Size, *from); (void)c; }); // forward_list(size_type n, const value_type& v, const allocator_type& a); test_exception_safety_throwing_copy([](T* from, T*){ std::forward_list c(Size, *from, Alloc()); (void)c; }); // template // forward_list(InputIterator first, InputIterator last); test_exception_safety_throwing_copy([](T* from, T* to){ std::forward_list c(from, to); (void)c; }); #if TEST_STD_VER >= 23 // template R> // forward_list(from_range_t, R&& rg, const Allocator& = Allocator()); // C++23 test_exception_safety_throwing_copy([](T* from, T* to){ { std::forward_list c(std::from_range, std::ranges::subrange(from, to)); (void)c; } { std::forward_list c(std::from_range, std::ranges::subrange(from, to), Alloc()); (void)c; } }); #endif // template // forward_list(InputIterator first, InputIterator last, const allocator_type& a); test_exception_safety_throwing_copy([](T* from, T* to){ std::forward_list c(from, to, Alloc()); (void)c; }); // forward_list(const forward_list& x); test_exception_safety_throwing_copy_container([](C&& in) { std::forward_list c(in); (void)c; }); // forward_list(const forward_list& x, const allocator_type& a); test_exception_safety_throwing_copy_container([](C&& in) { std::forward_list c(in, Alloc()); (void)c; }); // forward_list& operator=(const forward_list& x); test_exception_safety_throwing_copy_container([](C&& in) { std::forward_list c; c = in; }); // template // void assign(InputIterator first, InputIterator last); test_exception_safety_throwing_copy([](T* from, T* to) { std::forward_list c; c.assign(from, to); }); #if TEST_STD_VER >= 23 // template R> // void assign_range(R&& rg); // C++23 test_exception_safety_throwing_copy([](T* from, T* to) { std::forward_list c; c.assign_range(std::ranges::subrange(from, to)); }); #endif // void assign(size_type n, const value_type& v); test_exception_safety_throwing_copy([](T* from, T*) { std::forward_list c; c.assign(Size, *from); }); #if TEST_STD_VER >= 23 // template R> // void prepend_range(R&& rg); // C++23 test_exception_safety_throwing_copy([](T* from, T* to) { std::forward_list c; c.prepend_range(std::ranges::subrange(from, to)); }); #endif // iterator insert_after(const_iterator p, size_type n, const value_type& v); test_exception_safety_throwing_copy([](T* from, T*) { std::forward_list c; c.insert_after(c.before_begin(), Size, *from); }); // template // iterator insert_after(const_iterator p, // InputIterator first, InputIterator last); test_exception_safety_throwing_copy([](T* from, T* to) { std::forward_list c; c.insert_after(c.before_begin(), from, to); }); #if TEST_STD_VER >= 23 // template R> // iterator insert_range_after(const_iterator position, R&& rg); // C++23 test_exception_safety_throwing_copy([](T* from, T* to) { std::forward_list c; c.insert_range_after(c.before_begin(), std::ranges::subrange(from, to)); }); #endif // void resize(size_type n, const value_type& v); test_exception_safety_throwing_copy([](T* from, T*) { std::forward_list c; c.resize(Size, *from); }); } return 0; }