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.
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;
}