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() );
|