xref: /llvm-project/libcxx/test/std/utilities/utility/pairs/pairs.pair/assign_pair_cxx03.pass.cpp (revision 0acafcd8043412b028be89ce68ce301ce329d3eb)
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // REQUIRES: c++03
10 
11 // <utility>
12 
13 // template <class T1, class T2> struct pair
14 
15 // pair& operator=(pair const& p);
16 
17 #include <utility>
18 #include <memory>
19 #include <cassert>
20 
21 #include "test_macros.h"
22 
23 struct NonAssignable {
NonAssignableNonAssignable24   NonAssignable() {}
25 private:
26   NonAssignable& operator=(NonAssignable const&);
27 };
28 
29 struct Incomplete;
30 extern Incomplete inc_obj;
31 
32 struct ConstructibleFromInt {
ConstructibleFromIntConstructibleFromInt33   ConstructibleFromInt() : value(-1) { }
ConstructibleFromIntConstructibleFromInt34   explicit ConstructibleFromInt(int v) : value(v) { }
35   int value;
36 };
37 
main(int,char **)38 int main(int, char**)
39 {
40     {
41       // Test that we don't constrain the assignment operator in C++03 mode.
42       // Since we don't have access control SFINAE having pair evaluate SFINAE
43       // may cause a hard error.
44       typedef std::pair<int, NonAssignable> P;
45       static_assert(std::is_copy_assignable<P>::value, "");
46     }
47     {
48       typedef std::pair<int, Incomplete&> P;
49       static_assert(std::is_copy_assignable<P>::value, "");
50       P p(42, inc_obj);
51       assert(&p.second == &inc_obj);
52     }
53     {
54       // The type is constructible from int, but not assignable from int.
55       // This ensures that operator=(pair const&) can be used in conjunction with
56       // pair(pair<U, V> const&) to mimic operator=(pair<U, V> const&) in C++03.
57       // This is weird but valid in C++03.
58       std::pair<ConstructibleFromInt, char> p;
59       std::pair<int, char> from(11, 'x');
60       p = from;
61       assert(p.first.value == 11);
62       assert(p.second == 'x');
63     }
64 
65   return 0;
66 }
67 
68 struct Incomplete {};
69 Incomplete inc_obj;
70