//===----------------------------------------------------------------------===// // // 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 // test forward_like #include #include #include struct U {}; // class type so const-qualification is not stripped from a prvalue using CU = const U; using T = int; using CT = const T; U u{}; const U& cu = u; static_assert(std::is_same_v(U{})), U&&>); static_assert(std::is_same_v(CU{})), CU&&>); static_assert(std::is_same_v(u)), U&&>); static_assert(std::is_same_v(cu)), CU&&>); static_assert(std::is_same_v(std::move(u))), U&&>); static_assert(std::is_same_v(std::move(cu))), CU&&>); static_assert(std::is_same_v(U{})), CU&&>); static_assert(std::is_same_v(CU{})), CU&&>); static_assert(std::is_same_v(u)), CU&&>); static_assert(std::is_same_v(cu)), CU&&>); static_assert(std::is_same_v(std::move(u))), CU&&>); static_assert(std::is_same_v(std::move(cu))), CU&&>); static_assert(std::is_same_v(U{})), U&>); static_assert(std::is_same_v(CU{})), CU&>); static_assert(std::is_same_v(u)), U&>); static_assert(std::is_same_v(cu)), CU&>); static_assert(std::is_same_v(std::move(u))), U&>); static_assert(std::is_same_v(std::move(cu))), CU&>); static_assert(std::is_same_v(U{})), CU&>); static_assert(std::is_same_v(CU{})), CU&>); static_assert(std::is_same_v(u)), CU&>); static_assert(std::is_same_v(cu)), CU&>); static_assert(std::is_same_v(std::move(u))), CU&>); static_assert(std::is_same_v(std::move(cu))), CU&>); static_assert(std::is_same_v(U{})), U&&>); static_assert(std::is_same_v(CU{})), CU&&>); static_assert(std::is_same_v(u)), U&&>); static_assert(std::is_same_v(cu)), CU&&>); static_assert(std::is_same_v(std::move(u))), U&&>); static_assert(std::is_same_v(std::move(cu))), CU&&>); static_assert(std::is_same_v(U{})), CU&&>); static_assert(std::is_same_v(CU{})), CU&&>); static_assert(std::is_same_v(u)), CU&&>); static_assert(std::is_same_v(cu)), CU&&>); static_assert(std::is_same_v(std::move(u))), CU&&>); static_assert(std::is_same_v(std::move(cu))), CU&&>); static_assert(noexcept(std::forward_like(u))); static_assert(std::is_same_v(u)), U&>); static_assert(std::is_same_v(cu)), CU&>); static_assert(std::is_same_v(std::move(u))), U&&>); static_assert(std::is_same_v(std::move(cu))), CU&&>); struct NoCtorCopyMove { NoCtorCopyMove() = delete; NoCtorCopyMove(const NoCtorCopyMove&) = delete; NoCtorCopyMove(NoCtorCopyMove&&) = delete; }; static_assert(std::is_same_v(std::declval())), const NoCtorCopyMove&&>); static_assert(std::is_same_v(std::declval())), const NoCtorCopyMove&>); static_assert(std::is_same_v(std::declval())), NoCtorCopyMove&&>); static_assert(std::is_same_v(std::declval())), NoCtorCopyMove&>); static_assert(noexcept(std::forward_like(std::declval()))); constexpr bool test() { { int val = 1729; auto&& result = std::forward_like(val); static_assert(std::is_same_v); assert(&result == &val); } { int val = 1729; auto&& result = std::forward_like(val); static_assert(std::is_same_v); assert(&result == &val); } { int val = 1729; auto&& result = std::forward_like(val); static_assert(std::is_same_v); assert(&result == &val); } { int val = 1729; auto&& result = std::forward_like(val); static_assert(std::is_same_v); assert(&result == &val); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }