================ @@ -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 ---------------- cjdb wrote:
> I fully agree that adding this to a project-wide style guide would be very > useful (to be clear, I don't mean to imply it has to be a comprehensive huge > guide, even if it documents just a few randomly chosen aspects, it's already > helpful and we can always expand later). We do have a ["Coding > standards"](https://libcxx.llvm.org/Contributing.html#coding-standards) > section in the `Contributing` document -- we might want to add a new page and > link it from that section. Thanks for taking this on! Re ultranit: applied in #76534. Re second comment: Not sure what this is pertaining to? 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