brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 253bd1b Raw
105 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// <utility>12 13// template <class T1, class T2> struct pair14 15// pair& operator=(pair const& p);16 17#include <utility>18#include <memory>19#include <cassert>20 21#include "test_macros.h"22#include "archetypes.h"23 24struct CountAssign {25  int copied = 0;26  int moved = 0;27  TEST_CONSTEXPR_CXX20 CountAssign() = default;28  TEST_CONSTEXPR_CXX20 CountAssign& operator=(CountAssign const&) {29    ++copied;30    return *this;31  }32  TEST_CONSTEXPR_CXX20 CountAssign& operator=(CountAssign&&) {33    ++moved;34    return *this;35  }36};37 38struct Incomplete;39extern Incomplete inc_obj;40 41TEST_CONSTEXPR_CXX20 bool test() {42  {43    typedef std::pair<ConstexprTestTypes::CopyOnly, int> P;44    const P p1(ConstexprTestTypes::CopyOnly(), short{4});45    P p2;46    p2 = p1;47    assert(p2.second == 4);48  }49  {50    using P = std::pair<int&, int&&>;51    int x = 42;52    int y = 101;53    int x2 = -1;54    int y2 = 300;55    P p1(x, std::move(y));56    P p2(x2, std::move(y2));57    p1 = p2;58    assert(p1.first == x2);59    assert(p1.second == y2);60  }61  {62    using P = std::pair<int, ConstexprTestTypes::NonCopyable>;63    static_assert(!std::is_copy_assignable<P>::value, "");64  }65  {66    using P = std::pair<CountAssign, ConstexprTestTypes::Copyable>;67    static_assert(std::is_copy_assignable<P>::value, "");68    P p;69    P p2;70    p = p2;71    assert(p.first.copied == 1);72    assert(p.first.moved == 0);73    assert(p2.first.copied == 0);74    assert(p2.first.moved == 0);75  }76  {77    using P = std::pair<int, ConstexprTestTypes::MoveAssignOnly>;78    static_assert(!std::is_copy_assignable<P>::value, "");79  }80  {81    using P = std::pair<int, std::unique_ptr<int> >;82    static_assert(!std::is_copy_assignable<P>::value, "");83  }84  {85    using P = std::pair<int, Incomplete&>;86    static_assert(!std::is_copy_assignable<P>::value, "");87    P p(42, inc_obj);88    assert(&p.second == &inc_obj);89  }90 91  return true;92}93 94int main(int, char**) {95  test();96#if TEST_STD_VER >= 2097  static_assert(test());98#endif99 100  return 0;101}102 103struct Incomplete {};104Incomplete inc_obj;105