Add constexpr to std::optional::value_or(U&&)&&

In C++1z drafts up to N4606 the constexpr keyword was missing from the
detailed description of this function, despite being shown in the class
synopsis.  That was fixed editorially for N4618, but our implementation
was not corrected to match.

	* include/std/optional (optional::value_or(U&&) &&): Add missing
	constexpr specifier.
	* testsuite/20_util/optional/constexpr/observers/4.cc: Check value_or
	for disengaged optionals and rvalue optionals.
	* testsuite/20_util/optional/observers/4.cc: Likewise.

From-SVN: r270409
This commit is contained in:
Jonathan Wakely 2019-04-17 14:13:30 +01:00 committed by Jonathan Wakely
parent 2fa9c1f65f
commit 02c9b9ccff
4 changed files with 77 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2019-04-17 Jonathan Wakely <jwakely@redhat.com>
* include/std/optional (optional::value_or(U&&) &&): Add missing
constexpr specifier.
* testsuite/20_util/optional/constexpr/observers/4.cc: Check value_or
for disengaged optionals and rvalue optionals.
* testsuite/20_util/optional/observers/4.cc: Likewise.
2019-04-12 Thomas Rodgers <trodgers@redhat.com>
* include/pstl/algorithm_impl.h: Uglify identfiers.

View File

@ -959,7 +959,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
template<typename _Up>
_Tp
constexpr _Tp
value_or(_Up&& __u) &&
{
static_assert(is_move_constructible_v<_Tp>);

View File

@ -25,10 +25,42 @@ struct value_type
int i;
};
int main()
void test01()
{
constexpr std::optional<value_type> o { value_type { 51 } };
constexpr value_type fallback { 3 };
static_assert( o.value_or(fallback).i == 51, "" );
static_assert( o.value_or(fallback).i == (*o).i, "" );
static_assert( o.value_or(fallback).i == 51 );
static_assert( o.value_or(fallback).i == (*o).i );
}
void test02()
{
constexpr std::optional<value_type> o;
constexpr value_type fallback { 3 };
static_assert( o.value_or(fallback).i == 3 );
}
template<typename T>
constexpr std::optional<value_type>
make_rvalue(T t)
{ return std::optional<value_type>{t}; }
void test03()
{
constexpr value_type fallback { 3 };
static_assert( make_rvalue(value_type{51}).value_or(fallback).i == 51 );
}
void test04()
{
constexpr value_type fallback { 3 };
static_assert( make_rvalue(std::nullopt).value_or(fallback).i == 3 );
}
int main()
{
test01();
test02();
test03();
test04();
}

View File

@ -26,10 +26,42 @@ struct value_type
int i;
};
int main()
void test01()
{
std::optional<value_type> o { value_type { 51 } };
value_type fallback { 3 };
VERIFY( o.value_or(fallback).i == 51 );
VERIFY( o.value_or(fallback).i == (*o).i );
}
void test02()
{
std::optional<value_type> o;
value_type fallback { 3 };
VERIFY( o.value_or(fallback).i == 3 );
}
void test03()
{
std::optional<value_type> o { value_type { 51 } };
value_type fallback { 3 };
VERIFY( std::move(o).value_or(fallback).i == 51 );
VERIFY( o.has_value() );
VERIFY( std::move(o).value_or(fallback).i == (*o).i );
}
void test04()
{
std::optional<value_type> o;
value_type fallback { 3 };
VERIFY( std::move(o).value_or(fallback).i == 3 );
VERIFY( !o.has_value() );
}
int main()
{
test01();
test02();
test03();
test04();
}