| //===----------------------------------------------------------------------===// |
| // |
| // 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 |
| // UNSUPPORTED: libcpp-no-concepts |
| |
| // struct identity; |
| |
| #include <functional> |
| |
| #include <cassert> |
| #include <concepts> |
| |
| #include "MoveOnly.h" |
| |
| static_assert(std::semiregular<std::identity>); |
| static_assert(requires { typename std::identity::is_transparent; }); |
| |
| constexpr bool test() { |
| std::identity id; |
| int i = 42; |
| assert(id(i) == 42); |
| assert(id(std::move(i)) == 42); |
| |
| MoveOnly m1 = 2; |
| MoveOnly m2 = id(std::move(m1)); |
| assert(m2.get() == 2); |
| |
| assert(&id(i) == &i); |
| static_assert(&id(id) == &id); |
| |
| const std::identity idc; |
| assert(idc(1) == 1); |
| assert(std::move(id)(1) == 1); |
| assert(std::move(idc)(1) == 1); |
| |
| id = idc; // run-time checks assignment |
| static_assert(std::is_same_v<decltype(id(i)), int&>); |
| static_assert(std::is_same_v<decltype(id(std::declval<int&&>())), int&&>); |
| static_assert( |
| std::is_same_v<decltype(id(std::declval<int const&>())), int const&>); |
| static_assert( |
| std::is_same_v<decltype(id(std::declval<int const&&>())), int const&&>); |
| static_assert(std::is_same_v<decltype(id(std::declval<int volatile&>())), |
| int volatile&>); |
| static_assert(std::is_same_v<decltype(id(std::declval<int volatile&&>())), |
| int volatile&&>); |
| static_assert( |
| std::is_same_v<decltype(id(std::declval<int const volatile&>())), |
| int const volatile&>); |
| static_assert( |
| std::is_same_v<decltype(id(std::declval<int const volatile&&>())), |
| int const volatile&&>); |
| |
| struct S { |
| constexpr S() = default; |
| constexpr S(S&&) noexcept(false) {} |
| constexpr S(S const&) noexcept(false) {} |
| }; |
| S x; |
| static_assert(noexcept(id(x))); |
| static_assert(noexcept(id(S()))); |
| |
| return true; |
| } |
| |
| int main(int, char**) { |
| test(); |
| static_assert(test()); |
| |
| return 0; |
| } |