[committed] libstdc++: Add missing test for std::optional::transform(F&&)
Jonathan Wakely
jwakely@redhat.com
Wed Oct 20 19:22:39 GMT 2021
On Wed, 20 Oct 2021 at 09:42, Jonathan Wakely wrote:
>
> On Wed, 20 Oct 2021 at 06:48, Tim Song wrote:
> >
> > On Tue, Oct 19, 2021 at 9:05 AM Jonathan Wakely via Gcc-patches
> > <gcc-patches@gcc.gnu.org> wrote:
> > >
> > > +constexpr bool
> > > +test_copy_elision()
> > > +{
> > > + return true;
> > > +}
> > > +
> > > +static_assert( test_copy_elision() );
> > > +
> >
> > This isn't much of a test :)
>
> The ultimate copy elision. The copies even get removed from the source code.
>
> Thanks for spotting it. I meant to check we're constructing directly
> into the union member without materializing the temporary early. I'll
> add that today.
Fixed by the attached patch. Tested x86_64-linux, pushed to trunk.
Thanks again!
-------------- next part --------------
commit 4ba4b053151a20262d4b61eb4501aa1c48337abb
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Wed Oct 20 20:12:28 2021
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.
diff --git a/libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc b/libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc
index d01ccb2e0f2..13977b8ba8d 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;
}
More information about the Libstdc++
mailing list