aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libstdc++-v3/include/std/optional16
-rw-r--r--libstdc++-v3/testsuite/20_util/optional/monadic/and_then.cc12
-rw-r--r--libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc12
3 files changed, 32 insertions, 8 deletions
diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional
index eac91d3..783d7ca 100644
--- a/libstdc++-v3/include/std/optional
+++ b/libstdc++-v3/include/std/optional
@@ -1048,7 +1048,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// [optional.monadic]
- template<typename _Fn> requires invocable<_Fn, _Tp&>
+ template<typename _Fn>
constexpr auto
and_then(_Fn&& __f) &
{
@@ -1060,7 +1060,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return _Up();
}
- template<typename _Fn> requires invocable<_Fn, const _Tp&>
+ template<typename _Fn>
constexpr auto
and_then(_Fn&& __f) const &
{
@@ -1072,7 +1072,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return _Up();
}
- template<typename _Fn> requires invocable<_Fn, _Tp>
+ template<typename _Fn>
constexpr auto
and_then(_Fn&& __f) &&
{
@@ -1084,7 +1084,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return _Up();
}
- template<typename _Fn> requires invocable<_Fn, const _Tp>
+ template<typename _Fn>
constexpr auto
and_then(_Fn&& __f) const &&
{
@@ -1096,7 +1096,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return _Up();
}
- template<typename _Fn> requires invocable<_Fn, _Tp&>
+ template<typename _Fn>
constexpr auto
transform(_Fn&& __f) &
{
@@ -1107,7 +1107,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return optional<_Up>();
}
- template<typename _Fn> requires invocable<_Fn, const _Tp&>
+ template<typename _Fn>
constexpr auto
transform(_Fn&& __f) const &
{
@@ -1118,7 +1118,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return optional<_Up>();
}
- template<typename _Fn> requires invocable<_Fn, _Tp>
+ template<typename _Fn>
constexpr auto
transform(_Fn&& __f) &&
{
@@ -1129,7 +1129,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return optional<_Up>();
}
- template<typename _Fn> requires invocable<_Fn, const _Tp>
+ template<typename _Fn>
constexpr auto
transform(_Fn&& __f) const &&
{
diff --git a/libstdc++-v3/testsuite/20_util/optional/monadic/and_then.cc b/libstdc++-v3/testsuite/20_util/optional/monadic/and_then.cc
index 02dcafe..f69ab95 100644
--- a/libstdc++-v3/testsuite/20_util/optional/monadic/and_then.cc
+++ b/libstdc++-v3/testsuite/20_util/optional/monadic/and_then.cc
@@ -113,8 +113,20 @@ test_forwarding()
static_assert( test_forwarding() );
+void f(int&) { }
+
+void
+test_unconstrained()
+{
+ // PR libstc++/102863 - Optional monadic ops should not be constrained
+ std::optional<int> x;
+ auto answer = x.and_then([](auto& y) { f(y); return std::optional<int>{42}; });
+ VERIFY( !answer );
+}
+
int main()
{
test_and_then();
test_forwarding();
+ test_unconstrained();
}
diff --git a/libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc b/libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc
index 13977b8..356c94d 100644
--- a/libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc
+++ b/libstdc++-v3/testsuite/20_util/optional/monadic/transform.cc
@@ -132,9 +132,21 @@ test_copy_elision()
static_assert( test_copy_elision() );
+void f(int&) { }
+
+void
+test_unconstrained()
+{
+ // PR libstc++/102863 - Optional monadic ops should not be constrained
+ std::optional<int> x;
+ auto answer = x.transform([](auto& y) { f(y); return 42; });
+ VERIFY( !answer );
+}
+
int main()
{
test_transform();
test_forwarding();
test_copy_elision();
+ test_unconstrained();
}