1*3b217f2fSAdrian Vogelsgesang //===----------------------------------------------------------------------===//
2*3b217f2fSAdrian Vogelsgesang //
3*3b217f2fSAdrian Vogelsgesang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*3b217f2fSAdrian Vogelsgesang // See https://llvm.org/LICENSE.txt for license information.
5*3b217f2fSAdrian Vogelsgesang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*3b217f2fSAdrian Vogelsgesang //
7*3b217f2fSAdrian Vogelsgesang //===----------------------------------------------------------------------===//
8*3b217f2fSAdrian Vogelsgesang 
9*3b217f2fSAdrian Vogelsgesang // <memory>
10*3b217f2fSAdrian Vogelsgesang 
11*3b217f2fSAdrian Vogelsgesang // shared_ptr
12*3b217f2fSAdrian Vogelsgesang 
13*3b217f2fSAdrian Vogelsgesang // template<class T, class U> bool operator==(const shared_ptr<T>& a, const shared_ptr<U>& b);
14*3b217f2fSAdrian Vogelsgesang // template<class T, class U> bool operator!=(const shared_ptr<T>& a, const shared_ptr<U>& b);
15*3b217f2fSAdrian Vogelsgesang // template<class T, class U> bool operator< (const shared_ptr<T>& a, const shared_ptr<U>& b);
16*3b217f2fSAdrian Vogelsgesang // template<class T, class U> bool operator<=(const shared_ptr<T>& a, const shared_ptr<U>& b);
17*3b217f2fSAdrian Vogelsgesang // template<class T, class U> bool operator> (const shared_ptr<T>& a, const shared_ptr<U>& b);
18*3b217f2fSAdrian Vogelsgesang // template<class T, class U> bool operator>=(const shared_ptr<T>& a, const shared_ptr<U>& b);
19*3b217f2fSAdrian Vogelsgesang // template<class T1, class D1, class T2, class D2>
20*3b217f2fSAdrian Vogelsgesang //   requires three_way_comparable_with<typename unique_ptr<T1, D1>::pointer,
21*3b217f2fSAdrian Vogelsgesang //                                      typename unique_ptr<T2, D2>::pointer>
22*3b217f2fSAdrian Vogelsgesang //   compare_three_way_result_t<typename unique_ptr<T1, D1>::pointer,
23*3b217f2fSAdrian Vogelsgesang //                              typename unique_ptr<T2, D2>::pointer>
24*3b217f2fSAdrian Vogelsgesang //     operator<=>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
25*3b217f2fSAdrian Vogelsgesang 
26*3b217f2fSAdrian Vogelsgesang #include <memory>
27*3b217f2fSAdrian Vogelsgesang #include <cassert>
28*3b217f2fSAdrian Vogelsgesang 
29*3b217f2fSAdrian Vogelsgesang #include "test_macros.h"
30*3b217f2fSAdrian Vogelsgesang #include "test_comparisons.h"
31*3b217f2fSAdrian Vogelsgesang 
do_nothing(int *)32*3b217f2fSAdrian Vogelsgesang void do_nothing(int*) {}
33*3b217f2fSAdrian Vogelsgesang 
main(int,char **)34*3b217f2fSAdrian Vogelsgesang int main(int, char**) {
35*3b217f2fSAdrian Vogelsgesang   AssertComparisonsAreNoexcept<std::shared_ptr<int> >();
36*3b217f2fSAdrian Vogelsgesang   AssertComparisonsReturnBool<std::shared_ptr<int> >();
37*3b217f2fSAdrian Vogelsgesang #if TEST_STD_VER > 17
38*3b217f2fSAdrian Vogelsgesang   AssertOrderAreNoexcept<std::shared_ptr<int>>();
39*3b217f2fSAdrian Vogelsgesang   AssertOrderReturn<std::strong_ordering, std::shared_ptr<int>>();
40*3b217f2fSAdrian Vogelsgesang #endif
41*3b217f2fSAdrian Vogelsgesang 
42*3b217f2fSAdrian Vogelsgesang   int* ptr1(new int);
43*3b217f2fSAdrian Vogelsgesang   int* ptr2(new int);
44*3b217f2fSAdrian Vogelsgesang   const std::shared_ptr<int> p1(ptr1);
45*3b217f2fSAdrian Vogelsgesang   const std::shared_ptr<int> p2(ptr2);
46*3b217f2fSAdrian Vogelsgesang 
47*3b217f2fSAdrian Vogelsgesang   assert(!(p1 == p2));
48*3b217f2fSAdrian Vogelsgesang   assert(p1 != p2);
49*3b217f2fSAdrian Vogelsgesang   assert((p1 < p2) == (ptr1 < ptr2));
50*3b217f2fSAdrian Vogelsgesang   assert((p1 <= p2) == (ptr1 <= ptr2));
51*3b217f2fSAdrian Vogelsgesang   assert((p1 > p2) == (ptr1 > ptr2));
52*3b217f2fSAdrian Vogelsgesang   assert((p1 >= p2) == (ptr1 >= ptr2));
53*3b217f2fSAdrian Vogelsgesang #if TEST_STD_VER > 17
54*3b217f2fSAdrian Vogelsgesang   assert((p1 <=> p2) != std::strong_ordering::equal);
55*3b217f2fSAdrian Vogelsgesang   assert((p1 <=> p2) == (ptr1 <=> ptr2));
56*3b217f2fSAdrian Vogelsgesang #endif
57*3b217f2fSAdrian Vogelsgesang 
58*3b217f2fSAdrian Vogelsgesang   // The deleter does not influence the comparisons
59*3b217f2fSAdrian Vogelsgesang   // of the `shared_ptr`
60*3b217f2fSAdrian Vogelsgesang   const std::shared_ptr<int> p3(ptr2, do_nothing);
61*3b217f2fSAdrian Vogelsgesang   assert(p2 == p3);
62*3b217f2fSAdrian Vogelsgesang   assert(!(p1 == p3));
63*3b217f2fSAdrian Vogelsgesang   assert(!(p2 != p3));
64*3b217f2fSAdrian Vogelsgesang   assert(p1 != p3);
65*3b217f2fSAdrian Vogelsgesang   assert((p1 < p3) == (ptr1 < ptr2));
66*3b217f2fSAdrian Vogelsgesang   assert((p1 <= p3) == (ptr1 <= ptr2));
67*3b217f2fSAdrian Vogelsgesang   assert((p1 > p3) == (ptr1 > ptr2));
68*3b217f2fSAdrian Vogelsgesang   assert((p1 >= p3) == (ptr1 >= ptr2));
69*3b217f2fSAdrian Vogelsgesang #if TEST_STD_VER > 17
70*3b217f2fSAdrian Vogelsgesang   assert((p2 <=> p3) == std::strong_ordering::equal);
71*3b217f2fSAdrian Vogelsgesang   assert((p1 <=> p3) != std::strong_ordering::equal);
72*3b217f2fSAdrian Vogelsgesang   assert((p1 <=> p3) == (ptr1 <=> ptr2));
73*3b217f2fSAdrian Vogelsgesang #endif
74*3b217f2fSAdrian Vogelsgesang 
75*3b217f2fSAdrian Vogelsgesang   return 0;
76*3b217f2fSAdrian Vogelsgesang }
77