// { dg-options "-std=gnu++20" } // { dg-do compile { target c++20 } } #include #include constexpr bool test_assign() { std::optional oi(1); std::optional 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 os1, os2; // template 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 optional& operator=(const optional&); oi = ou; VERIFY( *oi == 2 ); oi = ou3; VERIFY( *oi == 3 ); // template optional& operator=(optional&&); 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 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 os; // template constexpr T& emplace(Args&&...); os.emplace(1); VERIFY( *os == 1 ); os.emplace(2); VERIFY( *os == 2 ); os.emplace(2, 3); VERIFY( *os == 5 ); // template // constexpr T& emplace(initializer_list, Args&&...); os.emplace({'3', '4', '5'}); VERIFY( *os == -156 ); os.emplace({'6', '7', '8'}, 25); VERIFY( *os == -140 ); return true; } static_assert( test_emplace() );