Files
gcc/libstdc++-v3/include
Jonathan Wakely ff58310f27 libstdc++: Do not use std::expected::value() in monadic ops (LWG 3938)
The monadic operations in std::expected always check has_value() so we
can avoid the execptional path in value() and the assertions in error()
by accessing _M_val and _M_unex directly. This means that the monadic
operations no longer require _M_unex to be copyable so that it can be
thrown from value(), as modified by LWG 3938.

This also fixes two incorrect uses of std::move in transform(F&&)& and
transform(F&&) const& which I found while making these changes.

Now that move-only error types are supported, it's possible to properly
test the constraints that LWG 3877 added to and_then and transform. The
lwg3877.cc test now does that.

libstdc++-v3/ChangeLog:

	* include/std/expected (expected::and_then, expected::or_else)
	(expected::transform_error): Use _M_val and _M_unex instead of
	calling value() and error(), as per LWG 3938.
	(expected::transform): Likewise. Remove incorrect std::move
	calls from lvalue overloads.
	(expected<void, E>::and_then, expected<void, E>::or_else)
	(expected<void, E>::transform): Use _M_unex instead of calling
	error().
	* testsuite/20_util/expected/lwg3877.cc: Add checks for and_then
	and transform, and for std::expected<void, E>.
	* testsuite/20_util/expected/lwg3938.cc: New test.

(cherry picked from commit fe94f8b7e022b7e154f6c47cc292d4463bddac5e)
2023-06-06 23:58:17 +01:00
..
2023-01-16 11:52:17 +01:00
2023-01-16 11:52:17 +01:00
2023-01-16 11:52:17 +01:00
2023-01-16 11:52:17 +01:00
2023-01-16 11:52:17 +01:00
2023-01-16 11:52:17 +01:00
2023-01-16 11:52:17 +01:00
2023-01-16 11:52:17 +01:00