From f9697fc439f863c444c729ad6ffbddd574797cda Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Sun, 4 Sep 2022 05:53:03 +0700 Subject: [PATCH] add test coverage for P2445R1 (`std::forward_like`) (#3072) --- .../test.compile.pass.cpp | 72 ------------ tests/std/tests/P2445R1_forward_like/test.cpp | 111 ++++++++++++++++++ 2 files changed, 111 insertions(+), 72 deletions(-) delete mode 100644 tests/std/tests/P2445R1_forward_like/test.compile.pass.cpp create mode 100644 tests/std/tests/P2445R1_forward_like/test.cpp diff --git a/tests/std/tests/P2445R1_forward_like/test.compile.pass.cpp b/tests/std/tests/P2445R1_forward_like/test.compile.pass.cpp deleted file mode 100644 index 3787ed8055..0000000000 --- a/tests/std/tests/P2445R1_forward_like/test.compile.pass.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -#include -#include -#include - -using namespace std; - -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(is_same_v(U{})), U&&>); -static_assert(is_same_v(CU{})), CU&&>); -static_assert(is_same_v(u)), U&&>); -static_assert(is_same_v(cu)), CU&&>); -static_assert(is_same_v(move(u))), U&&>); -static_assert(is_same_v(move(cu))), CU&&>); - -static_assert(is_same_v(U{})), CU&&>); -static_assert(is_same_v(CU{})), CU&&>); -static_assert(is_same_v(u)), CU&&>); -static_assert(is_same_v(cu)), CU&&>); -static_assert(is_same_v(move(u))), CU&&>); -static_assert(is_same_v(move(cu))), CU&&>); - -static_assert(is_same_v(U{})), U&>); -static_assert(is_same_v(CU{})), CU&>); -static_assert(is_same_v(u)), U&>); -static_assert(is_same_v(cu)), CU&>); -static_assert(is_same_v(move(u))), U&>); -static_assert(is_same_v(move(cu))), CU&>); - -static_assert(is_same_v(U{})), CU&>); -static_assert(is_same_v(CU{})), CU&>); -static_assert(is_same_v(u)), CU&>); -static_assert(is_same_v(cu)), CU&>); -static_assert(is_same_v(move(u))), CU&>); -static_assert(is_same_v(move(cu))), CU&>); - -static_assert(is_same_v(U{})), U&&>); -static_assert(is_same_v(CU{})), CU&&>); -static_assert(is_same_v(u)), U&&>); -static_assert(is_same_v(cu)), CU&&>); -static_assert(is_same_v(move(u))), U&&>); -static_assert(is_same_v(move(cu))), CU&&>); - -static_assert(is_same_v(U{})), CU&&>); -static_assert(is_same_v(CU{})), CU&&>); -static_assert(is_same_v(u)), CU&&>); -static_assert(is_same_v(cu)), CU&&>); -static_assert(is_same_v(move(u))), CU&&>); -static_assert(is_same_v(move(cu))), CU&&>); - -static_assert(noexcept(forward_like(u))); - -constexpr bool test() { - int val = 1729; - auto&& result = forward_like(val); - static_assert(is_same_v); - assert(&result == &val); - return true; -} - -static_assert(test()); - -int main() {} // COMPILE-ONLY diff --git a/tests/std/tests/P2445R1_forward_like/test.cpp b/tests/std/tests/P2445R1_forward_like/test.cpp new file mode 100644 index 0000000000..401fcb3d79 --- /dev/null +++ b/tests/std/tests/P2445R1_forward_like/test.cpp @@ -0,0 +1,111 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include +#include +#include + +using namespace std; + +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(is_same_v(U{})), U&&>); +static_assert(is_same_v(CU{})), CU&&>); +static_assert(is_same_v(u)), U&&>); +static_assert(is_same_v(cu)), CU&&>); +static_assert(is_same_v(std::move(u))), U&&>); +static_assert(is_same_v(std::move(cu))), CU&&>); + +static_assert(is_same_v(U{})), CU&&>); +static_assert(is_same_v(CU{})), CU&&>); +static_assert(is_same_v(u)), CU&&>); +static_assert(is_same_v(cu)), CU&&>); +static_assert(is_same_v(std::move(u))), CU&&>); +static_assert(is_same_v(std::move(cu))), CU&&>); + +static_assert(is_same_v(U{})), U&>); +static_assert(is_same_v(CU{})), CU&>); +static_assert(is_same_v(u)), U&>); +static_assert(is_same_v(cu)), CU&>); +static_assert(is_same_v(std::move(u))), U&>); +static_assert(is_same_v(std::move(cu))), CU&>); + +static_assert(is_same_v(U{})), CU&>); +static_assert(is_same_v(CU{})), CU&>); +static_assert(is_same_v(u)), CU&>); +static_assert(is_same_v(cu)), CU&>); +static_assert(is_same_v(std::move(u))), CU&>); +static_assert(is_same_v(std::move(cu))), CU&>); + +static_assert(is_same_v(U{})), U&&>); +static_assert(is_same_v(CU{})), CU&&>); +static_assert(is_same_v(u)), U&&>); +static_assert(is_same_v(cu)), CU&&>); +static_assert(is_same_v(std::move(u))), U&&>); +static_assert(is_same_v(std::move(cu))), CU&&>); + +static_assert(is_same_v(U{})), CU&&>); +static_assert(is_same_v(CU{})), CU&&>); +static_assert(is_same_v(u)), CU&&>); +static_assert(is_same_v(cu)), CU&&>); +static_assert(is_same_v(std::move(u))), CU&&>); +static_assert(is_same_v(std::move(cu))), CU&&>); + +static_assert(noexcept(forward_like(u))); + +static_assert(is_same_v(u)), U&>); +static_assert(is_same_v(cu)), CU&>); +static_assert(is_same_v(std::move(u))), U&&>); +static_assert(is_same_v(std::move(cu))), CU&&>); + +struct NoCtorCopyMove { + NoCtorCopyMove() = delete; + NoCtorCopyMove(const NoCtorCopyMove&) = delete; + NoCtorCopyMove(NoCtorCopyMove&&) = delete; +}; + +static_assert(is_same_v(declval())), const NoCtorCopyMove&&>); +static_assert(is_same_v(declval())), const NoCtorCopyMove&>); +static_assert(is_same_v(declval())), NoCtorCopyMove&&>); +static_assert(is_same_v(declval())), NoCtorCopyMove&>); + +static_assert(noexcept(forward_like(declval()))); + +constexpr bool test() { + { + int val = 1729; + auto&& result = forward_like(val); + static_assert(is_same_v); + assert(&result == &val); + } + { + int val = 1729; + auto&& result = forward_like(val); + static_assert(is_same_v); + assert(&result == &val); + } + { + int val = 1729; + auto&& result = forward_like(val); + static_assert(is_same_v); + assert(&result == &val); + } + { + int val = 1729; + auto&& result = forward_like(val); + static_assert(is_same_v); + assert(&result == &val); + } + return true; +} + +int main() { + assert(test()); + static_assert(test()); +}