libstdc++: Add missing test for std::optional::transform(F&&)

The test_copy_elision() function was supposed to ensure that the result
is constructed directly in the std::optional, without early temporary
materialization. But I forgot to write the test.

libstdc++-v3/ChangeLog:

	* testsuite/20_util/optional/monadic/transform.cc: Check that
	an rvalue result is not materialized too soon.
This commit is contained in:
Jonathan Wakely 2021-10-20 20:12:28 +01:00
parent 154c6d430e
commit 4ba4b05315

View File

@ -110,6 +110,23 @@ static_assert( test_forwarding() );
constexpr bool
test_copy_elision()
{
struct immovable
{
constexpr immovable(int p) : power_level(p) { }
immovable(immovable&&) = delete;
int power_level;
};
struct Force
{
constexpr immovable operator()(int i) const { return {i+1}; }
};
std::optional<int> irresistible(9000);
std::optional<immovable> object = irresistible.transform(Force{});
VERIFY( object->power_level > 9000 );
return true;
}