//===----------------------------------------------------------------------===// // // 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 // template // concept assignable_from = // std::is_lvalue_reference_v && // std::common_reference_with< // const std::remove_reference_t&, // const std::remove_reference_t&> && // requires (LHS lhs, RHS&& rhs) { // { lhs = std::forward(rhs) } -> std::same_as; // }; #include #include #include "MoveOnly.h" struct NoCommonRef { NoCommonRef& operator=(const int&); }; static_assert(std::is_assignable_v); static_assert(!std::assignable_from); // no common reference type struct Base {}; struct Derived : Base {}; static_assert(!std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert(!std::assignable_from); static_assert(!std::assignable_from); static_assert(!std::assignable_from); static_assert(!std::assignable_from); static_assert(!std::assignable_from); static_assert(!std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); struct VoidResultType { void operator=(const VoidResultType&); }; static_assert(std::is_assignable_v); static_assert(!std::assignable_from); struct ValueResultType { ValueResultType operator=(const ValueResultType&); }; static_assert(std::is_assignable_v); static_assert(!std::assignable_from); struct Locale { const Locale& operator=(const Locale&); }; static_assert(std::is_assignable_v); static_assert(!std::assignable_from); struct Tuple { Tuple& operator=(const Tuple&); const Tuple& operator=(const Tuple&) const; }; static_assert(!std::assignable_from); static_assert( std::assignable_from); static_assert(!std::assignable_from); static_assert(!std::assignable_from); static_assert( std::assignable_from); static_assert(!std::assignable_from); // Finally, check a few simple cases. static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert(!std::assignable_from); static_assert(!std::assignable_from); static_assert(!std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert( std::assignable_from); static_assert(!std::assignable_from); static_assert(!std::assignable_from); static_assert( std::assignable_from); static_assert(!std::assignable_from); static_assert( std::assignable_from); static_assert(!std::assignable_from); static_assert(!std::assignable_from);