diff options
Diffstat (limited to 'libcxx/test')
21 files changed, 548 insertions, 12 deletions
diff --git a/libcxx/test/containers/associative/map/map.cons/default_noexcept.pass.cpp b/libcxx/test/containers/associative/map/map.cons/default_noexcept.pass.cpp index 4e497b92a23..d673c6d673e 100644 --- a/libcxx/test/containers/associative/map/map.cons/default_noexcept.pass.cpp +++ b/libcxx/test/containers/associative/map/map.cons/default_noexcept.pass.cpp @@ -42,7 +42,7 @@ int main() static_assert(std::is_nothrow_default_constructible<C>::value, ""); } { - typedef std::map<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; static_assert(!std::is_nothrow_default_constructible<C>::value, ""); } { diff --git a/libcxx/test/containers/associative/map/map.cons/dtor_noexcept.pass.cpp b/libcxx/test/containers/associative/map/map.cons/dtor_noexcept.pass.cpp index c3b99707c87..a563371aca9 100644 --- a/libcxx/test/containers/associative/map/map.cons/dtor_noexcept.pass.cpp +++ b/libcxx/test/containers/associative/map/map.cons/dtor_noexcept.pass.cpp @@ -40,7 +40,7 @@ int main() static_assert(std::is_nothrow_destructible<C>::value, ""); } { - typedef std::map<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; static_assert(std::is_nothrow_destructible<C>::value, ""); } { diff --git a/libcxx/test/containers/associative/map/map.cons/move_assign_noexcept.pass.cpp b/libcxx/test/containers/associative/map/map.cons/move_assign_noexcept.pass.cpp index 4a35a9227de..3bc1e68585f 100644 --- a/libcxx/test/containers/associative/map/map.cons/move_assign_noexcept.pass.cpp +++ b/libcxx/test/containers/associative/map/map.cons/move_assign_noexcept.pass.cpp @@ -42,7 +42,7 @@ int main() static_assert(!std::is_nothrow_move_assignable<C>::value, ""); } { - typedef std::map<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; static_assert(std::is_nothrow_move_assignable<C>::value, ""); } { diff --git a/libcxx/test/containers/associative/map/map.cons/move_noexcept.pass.cpp b/libcxx/test/containers/associative/map/map.cons/move_noexcept.pass.cpp index 18b595fd739..e9ec1202927 100644 --- a/libcxx/test/containers/associative/map/map.cons/move_noexcept.pass.cpp +++ b/libcxx/test/containers/associative/map/map.cons/move_noexcept.pass.cpp @@ -40,7 +40,7 @@ int main() static_assert(std::is_nothrow_move_constructible<C>::value, ""); } { - typedef std::map<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; static_assert(std::is_nothrow_move_constructible<C>::value, ""); } { diff --git a/libcxx/test/containers/associative/map/map.special/swap_noexcept.pass.cpp b/libcxx/test/containers/associative/map/map.special/swap_noexcept.pass.cpp index 5f75032ea59..ef2ef040379 100644 --- a/libcxx/test/containers/associative/map/map.special/swap_noexcept.pass.cpp +++ b/libcxx/test/containers/associative/map/map.special/swap_noexcept.pass.cpp @@ -47,7 +47,7 @@ int main() static_assert(noexcept(swap(c1, c2)), ""); } { - typedef std::map<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; C c1, c2; static_assert(noexcept(swap(c1, c2)), ""); } diff --git a/libcxx/test/containers/associative/multimap/multimap.cons/default_noexcept.pass.cpp b/libcxx/test/containers/associative/multimap/multimap.cons/default_noexcept.pass.cpp index 56f119a2201..a144ba9406d 100644 --- a/libcxx/test/containers/associative/multimap/multimap.cons/default_noexcept.pass.cpp +++ b/libcxx/test/containers/associative/multimap/multimap.cons/default_noexcept.pass.cpp @@ -42,7 +42,7 @@ int main() static_assert(std::is_nothrow_default_constructible<C>::value, ""); } { - typedef std::multimap<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; static_assert(!std::is_nothrow_default_constructible<C>::value, ""); } { diff --git a/libcxx/test/containers/associative/multimap/multimap.cons/dtor_noexcept.pass.cpp b/libcxx/test/containers/associative/multimap/multimap.cons/dtor_noexcept.pass.cpp index f1d8afdc33d..14e3f6400c2 100644 --- a/libcxx/test/containers/associative/multimap/multimap.cons/dtor_noexcept.pass.cpp +++ b/libcxx/test/containers/associative/multimap/multimap.cons/dtor_noexcept.pass.cpp @@ -40,7 +40,7 @@ int main() static_assert(std::is_nothrow_destructible<C>::value, ""); } { - typedef std::multimap<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; static_assert(std::is_nothrow_destructible<C>::value, ""); } { diff --git a/libcxx/test/containers/associative/multimap/multimap.cons/move_assign_noexcept.pass.cpp b/libcxx/test/containers/associative/multimap/multimap.cons/move_assign_noexcept.pass.cpp index cada1b1d7b0..ddb4e484bd2 100644 --- a/libcxx/test/containers/associative/multimap/multimap.cons/move_assign_noexcept.pass.cpp +++ b/libcxx/test/containers/associative/multimap/multimap.cons/move_assign_noexcept.pass.cpp @@ -42,7 +42,7 @@ int main() static_assert(!std::is_nothrow_move_assignable<C>::value, ""); } { - typedef std::multimap<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; static_assert(std::is_nothrow_move_assignable<C>::value, ""); } { diff --git a/libcxx/test/containers/associative/multimap/multimap.cons/move_noexcept.pass.cpp b/libcxx/test/containers/associative/multimap/multimap.cons/move_noexcept.pass.cpp index 2f0b9ccc8cf..6ea06994940 100644 --- a/libcxx/test/containers/associative/multimap/multimap.cons/move_noexcept.pass.cpp +++ b/libcxx/test/containers/associative/multimap/multimap.cons/move_noexcept.pass.cpp @@ -40,7 +40,7 @@ int main() static_assert(std::is_nothrow_move_constructible<C>::value, ""); } { - typedef std::multimap<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; static_assert(std::is_nothrow_move_constructible<C>::value, ""); } { diff --git a/libcxx/test/containers/associative/multimap/multimap.special/swap_noexcept.pass.cpp b/libcxx/test/containers/associative/multimap/multimap.special/swap_noexcept.pass.cpp index 2aa901a8ac2..b07d56a2158 100644 --- a/libcxx/test/containers/associative/multimap/multimap.special/swap_noexcept.pass.cpp +++ b/libcxx/test/containers/associative/multimap/multimap.special/swap_noexcept.pass.cpp @@ -47,7 +47,7 @@ int main() static_assert(noexcept(swap(c1, c2)), ""); } { - typedef std::multimap<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; C c1, c2; static_assert(noexcept(swap(c1, c2)), ""); } diff --git a/libcxx/test/containers/associative/multiset/multiset.cons/default_noexcept.pass.cpp b/libcxx/test/containers/associative/multiset/multiset.cons/default_noexcept.pass.cpp new file mode 100644 index 00000000000..2e3e56ef5ef --- /dev/null +++ b/libcxx/test/containers/associative/multiset/multiset.cons/default_noexcept.pass.cpp @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <set> + +// multiset() +// noexcept( +// is_nothrow_default_constructible<allocator_type>::value && +// is_nothrow_default_constructible<key_compare>::value && +// is_nothrow_copy_constructible<key_compare>::value); + +// This tests a conforming extension + +#include <set> +#include <cassert> + +#include "../../../MoveOnly.h" +#include "../../../test_allocator.h" + +template <class T> +struct some_comp +{ + typedef T value_type; + some_comp(); +}; + +int main() +{ +#if __has_feature(cxx_noexcept) + { + typedef std::multiset<MoveOnly> C; + static_assert(std::is_nothrow_default_constructible<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_default_constructible<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + static_assert(!std::is_nothrow_default_constructible<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, some_comp<MoveOnly>> C; + static_assert(!std::is_nothrow_default_constructible<C>::value, ""); + } +#endif +} diff --git a/libcxx/test/containers/associative/multiset/multiset.cons/dtor_noexcept.pass.cpp b/libcxx/test/containers/associative/multiset/multiset.cons/dtor_noexcept.pass.cpp new file mode 100644 index 00000000000..f04ae9457e1 --- /dev/null +++ b/libcxx/test/containers/associative/multiset/multiset.cons/dtor_noexcept.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <set> + +// ~multiset() // implied noexcept; + +#include <set> +#include <cassert> + +#include "../../../MoveOnly.h" +#include "../../../test_allocator.h" + +#if __has_feature(cxx_noexcept) + +template <class T> +struct some_comp +{ + typedef T value_type; + ~some_comp() noexcept(false); +}; + +#endif + +int main() +{ +#if __has_feature(cxx_noexcept) + { + typedef std::multiset<MoveOnly> C; + static_assert(std::is_nothrow_destructible<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_destructible<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_destructible<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, some_comp<MoveOnly>> C; + static_assert(!std::is_nothrow_destructible<C>::value, ""); + } +#endif +} diff --git a/libcxx/test/containers/associative/multiset/multiset.cons/move_assign_noexcept.pass.cpp b/libcxx/test/containers/associative/multiset/multiset.cons/move_assign_noexcept.pass.cpp new file mode 100644 index 00000000000..e5ce3498164 --- /dev/null +++ b/libcxx/test/containers/associative/multiset/multiset.cons/move_assign_noexcept.pass.cpp @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <set> + +// multiset& operator=(multiset&& c) +// noexcept( +// allocator_type::propagate_on_container_move_assignment::value && +// is_nothrow_move_assignable<allocator_type>::value && +// is_nothrow_move_assignable<key_compare>::value); + +// This tests a conforming extension + +#include <set> +#include <cassert> + +#include "../../../MoveOnly.h" +#include "../../../test_allocator.h" + +template <class T> +struct some_comp +{ + typedef T value_type; + some_comp& operator=(const some_comp&); +}; + +int main() +{ +#if __has_feature(cxx_noexcept) + { + typedef std::multiset<MoveOnly> C; + static_assert(std::is_nothrow_move_assignable<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; + static_assert(!std::is_nothrow_move_assignable<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_move_assignable<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, some_comp<MoveOnly>> C; + static_assert(!std::is_nothrow_move_assignable<C>::value, ""); + } +#endif +} diff --git a/libcxx/test/containers/associative/multiset/multiset.cons/move_noexcept.pass.cpp b/libcxx/test/containers/associative/multiset/multiset.cons/move_noexcept.pass.cpp new file mode 100644 index 00000000000..8f2b49604ca --- /dev/null +++ b/libcxx/test/containers/associative/multiset/multiset.cons/move_noexcept.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <set> + +// multiset(multiset&&) +// noexcept(is_nothrow_move_constructible<allocator_type>::value && +// is_nothrow_move_constructible<key_compare>::value); + +// This tests a conforming extension + +#include <set> +#include <cassert> + +#include "../../../MoveOnly.h" +#include "../../../test_allocator.h" + +template <class T> +struct some_comp +{ + typedef T value_type; + some_comp(const some_comp&); +}; + +int main() +{ +#if __has_feature(cxx_noexcept) + { + typedef std::multiset<MoveOnly> C; + static_assert(std::is_nothrow_move_constructible<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_move_constructible<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_move_constructible<C>::value, ""); + } + { + typedef std::multiset<MoveOnly, some_comp<MoveOnly>> C; + static_assert(!std::is_nothrow_move_constructible<C>::value, ""); + } +#endif +} diff --git a/libcxx/test/containers/associative/multiset/multiset.special/swap_noexcept.pass.cpp b/libcxx/test/containers/associative/multiset/multiset.special/swap_noexcept.pass.cpp new file mode 100644 index 00000000000..dd2878706be --- /dev/null +++ b/libcxx/test/containers/associative/multiset/multiset.special/swap_noexcept.pass.cpp @@ -0,0 +1,60 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <set> + +// void swap(multiset& c) +// noexcept(!allocator_type::propagate_on_container_swap::value || +// __is_nothrow_swappable<allocator_type>::value); + +// This tests a conforming extension + +#include <set> +#include <cassert> + +#include "../../../MoveOnly.h" +#include "../../../test_allocator.h" + +template <class T> +struct some_comp +{ + typedef T value_type; + + some_comp() {} + some_comp(const some_comp&) {} + void deallocate(void*, unsigned) {} + + typedef std::true_type propagate_on_container_swap; +}; + +int main() +{ +#if __has_feature(cxx_noexcept) + { + typedef std::multiset<MoveOnly> C; + C c1, c2; + static_assert(noexcept(swap(c1, c2)), ""); + } + { + typedef std::multiset<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; + C c1, c2; + static_assert(noexcept(swap(c1, c2)), ""); + } + { + typedef std::multiset<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + C c1, c2; + static_assert(noexcept(swap(c1, c2)), ""); + } + { + typedef std::multiset<MoveOnly, some_comp<MoveOnly>> C; + C c1, c2; + static_assert(!noexcept(swap(c1, c2)), ""); + } +#endif +} diff --git a/libcxx/test/containers/associative/set/set.cons/default_noexcept.pass.cpp b/libcxx/test/containers/associative/set/set.cons/default_noexcept.pass.cpp new file mode 100644 index 00000000000..6cf394e6454 --- /dev/null +++ b/libcxx/test/containers/associative/set/set.cons/default_noexcept.pass.cpp @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <set> + +// set() +// noexcept( +// is_nothrow_default_constructible<allocator_type>::value && +// is_nothrow_default_constructible<key_compare>::value && +// is_nothrow_copy_constructible<key_compare>::value); + +// This tests a conforming extension + +#include <set> +#include <cassert> + +#include "../../../MoveOnly.h" +#include "../../../test_allocator.h" + +template <class T> +struct some_comp +{ + typedef T value_type; + some_comp(); +}; + +int main() +{ +#if __has_feature(cxx_noexcept) + { + typedef std::set<MoveOnly> C; + static_assert(std::is_nothrow_default_constructible<C>::value, ""); + } + { + typedef std::set<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_default_constructible<C>::value, ""); + } + { + typedef std::set<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + static_assert(!std::is_nothrow_default_constructible<C>::value, ""); + } + { + typedef std::set<MoveOnly, some_comp<MoveOnly>> C; + static_assert(!std::is_nothrow_default_constructible<C>::value, ""); + } +#endif +} diff --git a/libcxx/test/containers/associative/set/set.cons/dtor_noexcept.pass.cpp b/libcxx/test/containers/associative/set/set.cons/dtor_noexcept.pass.cpp new file mode 100644 index 00000000000..66adff0a836 --- /dev/null +++ b/libcxx/test/containers/associative/set/set.cons/dtor_noexcept.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <set> + +// ~set() // implied noexcept; + +#include <set> +#include <cassert> + +#include "../../../MoveOnly.h" +#include "../../../test_allocator.h" + +#if __has_feature(cxx_noexcept) + +template <class T> +struct some_comp +{ + typedef T value_type; + ~some_comp() noexcept(false); +}; + +#endif + +int main() +{ +#if __has_feature(cxx_noexcept) + { + typedef std::set<MoveOnly> C; + static_assert(std::is_nothrow_destructible<C>::value, ""); + } + { + typedef std::set<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_destructible<C>::value, ""); + } + { + typedef std::set<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_destructible<C>::value, ""); + } + { + typedef std::set<MoveOnly, some_comp<MoveOnly>> C; + static_assert(!std::is_nothrow_destructible<C>::value, ""); + } +#endif +} diff --git a/libcxx/test/containers/associative/set/set.cons/move_assign_noexcept.pass.cpp b/libcxx/test/containers/associative/set/set.cons/move_assign_noexcept.pass.cpp new file mode 100644 index 00000000000..35683b1b67e --- /dev/null +++ b/libcxx/test/containers/associative/set/set.cons/move_assign_noexcept.pass.cpp @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <set> + +// set& operator=(set&& c) +// noexcept( +// allocator_type::propagate_on_container_move_assignment::value && +// is_nothrow_move_assignable<allocator_type>::value && +// is_nothrow_move_assignable<key_compare>::value); + +// This tests a conforming extension + +#include <set> +#include <cassert> + +#include "../../../MoveOnly.h" +#include "../../../test_allocator.h" + +template <class T> +struct some_comp +{ + typedef T value_type; + some_comp& operator=(const some_comp&); +}; + +int main() +{ +#if __has_feature(cxx_noexcept) + { + typedef std::set<MoveOnly> C; + static_assert(std::is_nothrow_move_assignable<C>::value, ""); + } + { + typedef std::set<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; + static_assert(!std::is_nothrow_move_assignable<C>::value, ""); + } + { + typedef std::set<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_move_assignable<C>::value, ""); + } + { + typedef std::set<MoveOnly, some_comp<MoveOnly>> C; + static_assert(!std::is_nothrow_move_assignable<C>::value, ""); + } +#endif +} diff --git a/libcxx/test/containers/associative/set/set.cons/move_noexcept.pass.cpp b/libcxx/test/containers/associative/set/set.cons/move_noexcept.pass.cpp new file mode 100644 index 00000000000..c3df4cace68 --- /dev/null +++ b/libcxx/test/containers/associative/set/set.cons/move_noexcept.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <set> + +// set(set&&) +// noexcept(is_nothrow_move_constructible<allocator_type>::value && +// is_nothrow_move_constructible<key_compare>::value); + +// This tests a conforming extension + +#include <set> +#include <cassert> + +#include "../../../MoveOnly.h" +#include "../../../test_allocator.h" + +template <class T> +struct some_comp +{ + typedef T value_type; + some_comp(const some_comp&); +}; + +int main() +{ +#if __has_feature(cxx_noexcept) + { + typedef std::set<MoveOnly> C; + static_assert(std::is_nothrow_move_constructible<C>::value, ""); + } + { + typedef std::set<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_move_constructible<C>::value, ""); + } + { + typedef std::set<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + static_assert(std::is_nothrow_move_constructible<C>::value, ""); + } + { + typedef std::set<MoveOnly, some_comp<MoveOnly>> C; + static_assert(!std::is_nothrow_move_constructible<C>::value, ""); + } +#endif +} diff --git a/libcxx/test/containers/associative/set/set.special/non_member_swap.pass.cpp b/libcxx/test/containers/associative/set/set.special/non_member_swap.pass.cpp index 00e19a7dbdf..6f7d0bf5a98 100644 --- a/libcxx/test/containers/associative/set/set.special/non_member_swap.pass.cpp +++ b/libcxx/test/containers/associative/set/set.special/non_member_swap.pass.cpp @@ -109,7 +109,7 @@ int main() { typedef test_allocator<V> A; typedef test_compare<std::less<int> > C; - typedef std::multiset<int, C, A> M; + typedef std::set<int, C, A> M; V ar1[] = { 1, @@ -143,7 +143,7 @@ int main() { typedef other_allocator<V> A; typedef test_compare<std::less<int> > C; - typedef std::multiset<int, C, A> M; + typedef std::set<int, C, A> M; V ar1[] = { 1, diff --git a/libcxx/test/containers/associative/set/set.special/swap_noexcept.pass.cpp b/libcxx/test/containers/associative/set/set.special/swap_noexcept.pass.cpp new file mode 100644 index 00000000000..2ce1d8c5eae --- /dev/null +++ b/libcxx/test/containers/associative/set/set.special/swap_noexcept.pass.cpp @@ -0,0 +1,60 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <set> + +// void swap(set& c) +// noexcept(!allocator_type::propagate_on_container_swap::value || +// __is_nothrow_swappable<allocator_type>::value); + +// This tests a conforming extension + +#include <set> +#include <cassert> + +#include "../../../MoveOnly.h" +#include "../../../test_allocator.h" + +template <class T> +struct some_comp +{ + typedef T value_type; + + some_comp() {} + some_comp(const some_comp&) {} + void deallocate(void*, unsigned) {} + + typedef std::true_type propagate_on_container_swap; +}; + +int main() +{ +#if __has_feature(cxx_noexcept) + { + typedef std::set<MoveOnly> C; + C c1, c2; + static_assert(noexcept(swap(c1, c2)), ""); + } + { + typedef std::set<MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C; + C c1, c2; + static_assert(noexcept(swap(c1, c2)), ""); + } + { + typedef std::set<MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C; + C c1, c2; + static_assert(noexcept(swap(c1, c2)), ""); + } + { + typedef std::set<MoveOnly, some_comp<MoveOnly>> C; + C c1, c2; + static_assert(!noexcept(swap(c1, c2)), ""); + } +#endif +} |