aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2021-10-20 20:12:28 +0100
committerJonathan Wakely <jwakely@redhat.com>2021-10-20 20:20:18 +0100
commit4ba4b053151a20262d4b61eb4501aa1c48337abb (patch)
tree7b5eee1327bf4b70bbf087d507c64cc79b06f1dd
parent154c6d430ee173904237de64d5aae11565201318 (diff)
downloadgcc-4ba4b053151a20262d4b61eb4501aa1c48337abb.zip
gcc-4ba4b053151a20262d4b61eb4501aa1c48337abb.tar.gz
gcc-4ba4b053151a20262d4b61eb4501aa1c48337abb.tar.bz2
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.
-rw-r--r--libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc17
1 files changed, 17 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc b/libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc
index d01ccb2..13977b8 100644
--- a/libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc
+++ b/libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc
@@ -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;
}