brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · 118158f Raw
137 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++0310 11// <map>12 13// void swap(map& c)14//     noexcept(!allocator_type::propagate_on_container_swap::value ||15//              __is_nothrow_swappable<allocator_type>::value);16//17//  In C++17, the standard says that swap shall have:18//     noexcept(allocator_traits<Allocator>::is_always_equal::value &&19//              noexcept(swap(declval<Compare&>(), declval<Compare&>())));20 21// This tests a conforming extension22 23#include <map>24#include <utility>25#include <cassert>26 27#include "test_macros.h"28#include "MoveOnly.h"29#include "test_allocator.h"30 31template <class T>32struct some_comp {33  typedef T value_type;34 35  some_comp() {}36  some_comp(const some_comp&) {}37  bool operator()(const T&, const T&) const { return false; }38};39 40template <class T>41struct some_comp2 {42  typedef T value_type;43 44  some_comp2() {}45  some_comp2(const some_comp2&) {}46  bool operator()(const T&, const T&) const { return false; }47};48 49#if TEST_STD_VER >= 1450template <typename T>51void swap(some_comp2<T>&, some_comp2<T>&) noexcept {}52#endif53 54template <class T>55struct some_alloc {56  typedef T value_type;57 58  some_alloc() {}59  some_alloc(const some_alloc&);60  void deallocate(void*, unsigned) {}61 62  typedef std::true_type propagate_on_container_swap;63};64 65template <class T>66struct some_alloc2 {67  typedef T value_type;68 69  some_alloc2() {}70  some_alloc2(const some_alloc2&);71  void deallocate(void*, unsigned) {}72 73  typedef std::false_type propagate_on_container_swap;74  typedef std::true_type is_always_equal;75};76 77template <class T>78struct some_alloc3 {79  typedef T value_type;80 81  some_alloc3() {}82  some_alloc3(const some_alloc3&);83  void deallocate(void*, unsigned) {}84 85  typedef std::false_type propagate_on_container_swap;86  typedef std::false_type is_always_equal;87};88 89int main(int, char**) {90  typedef std::pair<const MoveOnly, MoveOnly> V;91  {92    typedef std::map<MoveOnly, MoveOnly> C;93    static_assert(noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");94  }95#if defined(_LIBCPP_VERSION)96  {97    typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<V>> C;98    static_assert(noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");99  }100  {101    typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<V>> C;102    static_assert(noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");103  }104#endif // _LIBCPP_VERSION105  {106    typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;107    static_assert(!noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");108  }109 110#if TEST_STD_VER >= 14111  { // POCS allocator, throwable swap for comp112    typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>, some_alloc<V>> C;113    static_assert(!noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");114  }115  { // always equal allocator, throwable swap for comp116    typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>, some_alloc2<V>> C;117    static_assert(!noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");118  }119  { // POCS allocator, nothrow swap for comp120    typedef std::map<MoveOnly, MoveOnly, some_comp2<MoveOnly>, some_alloc<V>> C;121    static_assert(noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");122  }123  { // always equal allocator, nothrow swap for comp124    typedef std::map<MoveOnly, MoveOnly, some_comp2<MoveOnly>, some_alloc2<V>> C;125    static_assert(noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");126  }127#  if defined(_LIBCPP_VERSION)128  { // NOT always equal allocator, nothrow swap for comp129    typedef std::map<MoveOnly, MoveOnly, some_comp2<MoveOnly>, some_alloc3<V>> C;130    static_assert(noexcept(swap(std::declval<C&>(), std::declval<C&>())), "");131  }132#  endif // _LIBCPP_VERSION133#endif134 135  return 0;136}137