File: assign.cc

package info (click to toggle)
gcc-arm-none-eabi 15%3A12.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 959,712 kB
  • sloc: cpp: 3,275,382; ansic: 2,061,766; ada: 840,956; f90: 208,513; makefile: 76,132; asm: 73,433; xml: 50,448; exp: 34,146; sh: 32,436; objc: 15,637; fortran: 14,012; python: 11,991; pascal: 6,787; awk: 4,779; perl: 3,054; yacc: 338; ml: 285; lex: 201; haskell: 122
file content (94 lines) | stat: -rw-r--r-- 1,876 bytes parent folder | download
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// { dg-options "-std=gnu++20" }
// { dg-do compile { target c++20 } }

#include <optional>
#include <testsuite_hooks.h>


constexpr bool
test_assign()
{
  std::optional<int> oi(1);
  std::optional<unsigned> ou(2u), ou3(3u);

  // optional& operator=(nullopt_t);
  oi = std::nullopt;
  VERIFY( ! oi.has_value() );
  oi = std::nullopt;
  VERIFY( ! oi.has_value() );

  struct S {
    constexpr S() { }
    constexpr S(char, int, unsigned) { }
  };
  std::optional<S> os1, os2;

  // template<class U = T> optional& operator=(U&&);
  os1 = {'0', 1, 2u};
  VERIFY( os1.has_value() );
  os2 = {'3', 4, 5u};
  VERIFY( os2.has_value() );
  oi = 0u;
  VERIFY( *oi == 0 );
  oi = 1u;
  VERIFY( *oi == 1 );

  // template<class U> optional& operator=(const optional<U>&);
  oi = ou;
  VERIFY( *oi == 2 );
  oi = ou3;
  VERIFY( *oi == 3 );

  // template<class U> optional& operator=(optional<U>&&);
  oi = std::move(ou);
  VERIFY( *oi == 2 );
  oi = std::move(ou);
  VERIFY( *oi == 2 );
  oi = std::move(ou3);
  VERIFY( *oi == 3 );

  return true;
}

static_assert( test_assign() );

constexpr bool
test_emplace()
{
  struct S
  {
    constexpr S(int i) : val(i) { }
    constexpr S(int i, int j) : val(i + j) { }
    constexpr S(std::initializer_list<char> l, int i = 0) : val(i)
    {
      for (char c : l)
	val -= c;
    }

    int val;

    constexpr bool operator==(int i) const { return val == i; }
  };


  std::optional<S> os;

  // template<class... Args> constexpr T& emplace(Args&&...);
  os.emplace(1);
  VERIFY( *os == 1 );
  os.emplace(2);
  VERIFY( *os == 2 );
  os.emplace(2, 3);
  VERIFY( *os == 5 );

  // template<class U, class... Args>
  // constexpr T& emplace(initializer_list<U>, Args&&...);
  os.emplace({'3', '4', '5'});
  VERIFY( *os == -156 );
  os.emplace({'6', '7', '8'}, 25);
  VERIFY( *os == -140 );

  return true;
}

static_assert( test_emplace() );