================
@@ -0,0 +1,104 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+
+// template <class I, class T>
+// struct in_value_result;
+
+#include <algorithm>
+#include <cassert>
+#include <type_traits>
+#include <utility>
+
+#include "MoveOnly.h"
+
+struct A {
+  explicit A(int);
+};
+// no implicit conversion
+static_assert(!std::is_constructible_v<std::ranges::in_value_result<A, A>, 
std::ranges::in_value_result<int, int>>);
+
+struct B {
+  B(int);
+};
+// implicit conversion
+static_assert(std::is_constructible_v<std::ranges::in_value_result<B, B>, 
std::ranges::in_value_result<int, int>>);
+static_assert(std::is_constructible_v<std::ranges::in_value_result<B, B>, 
std::ranges::in_value_result<int, int>&>);
+static_assert(
+    std::is_constructible_v<std::ranges::in_value_result<B, B>, const 
std::ranges::in_value_result<int, int>>);
+static_assert(
+    std::is_constructible_v<std::ranges::in_value_result<B, B>, const 
std::ranges::in_value_result<int, int>&>);
+
+struct C {
+  C(int&);
+};
+static_assert(!std::is_constructible_v<std::ranges::in_value_result<C, C>, 
std::ranges::in_value_result<int, int>&>);
+
+// has to be convertible via const&
+static_assert(std::is_convertible_v<std::ranges::in_value_result<int, int>&, 
std::ranges::in_value_result<long, long>>);
+static_assert(
+    std::is_convertible_v<const std::ranges::in_value_result<int, int>&, 
std::ranges::in_value_result<long, long>>);
+static_assert(
+    std::is_convertible_v<std::ranges::in_value_result<int, int>&&, 
std::ranges::in_value_result<long, long>>);
+static_assert(
+    std::is_convertible_v<const std::ranges::in_value_result<int, int>&&, 
std::ranges::in_value_result<long, long>>);
+
+// should be move constructible
+static_assert(std::is_move_constructible_v<std::ranges::in_value_result<MoveOnly,
 int>>);
+static_assert(std::is_move_constructible_v<std::ranges::in_value_result<int, 
MoveOnly>>);
+
+// should not copy constructible with move-only type
----------------
EricWF wrote:

Attaching to this comment, because the comment about names is attached to the 
same line.

I think the project should document any policies we wish to enforce inside our 
documentation. That way we aren't depending on the visibility of conversations, 
and we have a place to scope our discussions of said policy. Changes to the 
policy can then happen in PR's changing the documentation.  Further, it better 
provides all contributors the ability to weigh in, hopefully at the time, but 
also after the fact.

To keep in with my suggestion, I will create a PR documenting our documenting 
policy to root this discussion under.

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

Reply via email to