libstdc++: Fix constraints on std::expected<void, E> constructor [PR105153]
authorJonathan Wakely <jwakely@redhat.com>
Fri, 8 Apr 2022 17:26:23 +0000 (18:26 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Fri, 8 Apr 2022 17:30:07 +0000 (18:30 +0100)
libstdc++-v3/ChangeLog:

PR libstdc++/105153
* include/std/expected
(expected<void,E>::expected(expected<U,G>&&)): Fix constraints.
* testsuite/20_util/expected/cons.cc: Check constructor.

libstdc++-v3/include/std/expected
libstdc++-v3/testsuite/20_util/expected/cons.cc

index 1864e86..3446d6d 100644 (file)
@@ -966,8 +966,8 @@ namespace __expected
        }
 
       template<typename _Up, typename _Gr>
-       requires is_void_v<_Tp>
-             && is_constructible_v<_Er, const _Gr&>
+       requires is_void_v<_Up>
+             && is_constructible_v<_Er, _Gr>
              && (!__cons_from_expected<_Up, _Gr>)
        constexpr explicit(!is_convertible_v<_Gr, _Er>)
        expected(expected<_Up, _Gr>&& __x)
index 1fe5b7b..6946858 100644 (file)
@@ -162,6 +162,22 @@ test_copy()
   return true;
 }
 
+constexpr bool
+test_pr105153()
+{
+  struct E {
+    E(int&&) = delete;
+    E(const int&);
+  };
+
+  std::expected<void, E> e(std::expected<void, int>{});
+
+  static_assert( ! std::is_constructible_v<std::expected<void, int>,
+                                          std::expected<int, int>> );
+
+  return true;
+}
+
 int main()
 {
   test_default();
@@ -172,4 +188,6 @@ int main()
   static_assert( test_err() );
   test_copy();
   static_assert( test_copy() );
+  test_pr105153();
+  static_assert( test_pr105153() );
 }