summaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/20_util/unique_ptr/comparison/constexpr.cc
blob: 83e4f0826a8359f8cb9c6bfa93d395c32129061d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// { dg-options "-std=gnu++23" }
// { dg-do compile { target c++23 } }

#include <memory>
#include <testsuite_hooks.h>

constexpr bool
test_eq()
{
  std::unique_ptr<int> p1, p2;
  VERIFY( p1 == p2 );
  p1.reset(new int(1));
  VERIFY( p1 == p1 );
  VERIFY( p1 != p2 );
  struct null_deleter { constexpr void operator()(const void*) const { } };
  std::unique_ptr<const int[], null_deleter> p3(p1.get());
  VERIFY( p3 == p3 );
  VERIFY( p1 == p3 );
  VERIFY( p3 != p2 );

  return true;
}
static_assert( test_eq() );

constexpr bool
test_rel()
{
  std::unique_ptr<int> p1, p2;
  VERIFY( !(p1 < p2) );
  VERIFY( !(p1 > p2) );
  VERIFY( p1 <= p2 );
  VERIFY( p1 >= p2 );
  p1.reset(new int(1));
  VERIFY( p1 <= p1 );
  VERIFY( p1 >= p1 );
  VERIFY( p1 > p2 );
  VERIFY( p2 < p1 );
  VERIFY( p2 <= p1 );
  VERIFY( p1 >= p2 );
  struct null_deleter { constexpr void operator()(const void*) const { } };
  std::unique_ptr<const int[], null_deleter> p3(p1.get());
  VERIFY( p3 <= p3 );
  VERIFY( p3 >= p3 );
  VERIFY( p1 <= p3 );
  VERIFY( p3 > p2 );
  VERIFY( p3 >= p2 );
  VERIFY( p2 < p3 );
  VERIFY( p2 <= p3 );

  return true;
}
static_assert( test_rel() );

constexpr bool
test_3way()
{
  std::unique_ptr<int> p1, p2;
  VERIFY( (p1 <=> p1) == 0 );
  VERIFY( (p1 <=> p2) == 0 );
  p1.reset(new int(1));
  VERIFY( (p1 <=> p1) == 0 );
  VERIFY( (p1 <=> p2) > 0 );
  VERIFY( (p2 <=> p1) < 0 );
  struct null_deleter { constexpr void operator()(const void*) const { } };
  std::unique_ptr<const int[], null_deleter> p3(p1.get());
  VERIFY( (p3 <=> p3) == 0 );
  VERIFY( (p1 <=> p3) == 0 );
  VERIFY( (p3 <=> p2) > 0 );
  VERIFY( (p2 <=> p3) < 0 );

  return true;
}
static_assert( test_3way() );