[libc] [flang] [llvm] [libcxx] [clang] [compiler-rt] [clang-tools-extra] [libc++] Implement LWG3940: std::expected::value() also needs E to be copy constructible (PR #71819)

2024-01-05 Thread via cfe-commits

PragmaTwice wrote:

The CI finally passed now : )

https://github.com/llvm/llvm-project/pull/71819
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libc] [flang] [llvm] [libcxx] [clang] [compiler-rt] [clang-tools-extra] [libc++] Implement LWG3940: std::expected::value() also needs E to be copy constructible (PR #71819)

2024-01-05 Thread via cfe-commits


@@ -0,0 +1,49 @@
+//===--===//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
+
+// constexpr void value() const &;
+// Mandates: is_copy_constructible_v is true.
+
+// constexpr void value() &&;
+// Mandates: is_copy_constructible_v is true and is_move_constructible_v 
is true.
+
+#include 
+
+#include "MoveOnly.h"
+
+struct CopyOnly {
+  CopyOnly()= default;
+  CopyOnly(const CopyOnly&) = default;
+  CopyOnly(CopyOnly&&)  = delete;
+};
+
+void test() {
+  // MoveOnly type as error_type
+  std::expected e(std::unexpect, 5);
+
+  e.value(); // expected-note {{in instantiation of member function 
'std::expected::value' requested here}}
+  // expected-error@*:* {{static assertion failed due to requirement 
'is_copy_constructible_v'}}
+
+  std::move(e)
+  .value(); // expected-note {{in instantiation of member function 
'std::expected::value' requested here}}
+  // expected-error@*:* {{static assertion failed due to requirement 
'is_copy_constructible_v': error_type has to be both copy 
constructible and move constructible}}
+
+  // CopyOnly type as error_type
+  std::expected e2(std::unexpect);
+
+  e2.value();
+
+  std::move(e2)
+  .value(); // expected-note {{in instantiation of member function 
'std::expected::value' requested here}}
+  // expected-error@*:* {{static assertion failed due to requirement 
'is_move_constructible_v': error_type has to be both copy 
constructible and move constructible}}
+
+  // expected-error@*:* {{call to deleted constructor of 'MoveOnly'}}
+  // expected-error@*:* {{call to deleted constructor of 'CopyOnly'}}
+  // expected-error@*:* {{call to deleted constructor of 'CopyOnly'}}

PragmaTwice wrote:

Fixed : )

https://github.com/llvm/llvm-project/pull/71819
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits