| //===----------------------------------------------------------------------===// |
| // |
| // 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-coroutines |
| |
| #include <coroutine> |
| #include <type_traits> |
| #include <cassert> |
| #include <utility> |
| |
| #include "test_macros.h" |
| |
| // Test that the type 'std::suspend_never' is in the correct namespace |
| |
| TEST_SAFE_STATIC std::suspend_never safe_sn; |
| constexpr std::suspend_never constexpr_sn; |
| |
| constexpr bool check_suspend_constexpr() { |
| std::suspend_never s{}; |
| const std::suspend_never scopy(s); ((void)scopy); |
| std::suspend_never smove(std::move(s)); ((void)smove); |
| s = scopy; |
| s = std::move(smove); |
| return true; |
| } |
| |
| template<class T> |
| constexpr bool test_trivial_awaitable_constexpr(bool expected) { |
| T t; |
| assert(t.await_ready() == expected); |
| t.await_suspend(nullptr); |
| t.await_resume(); |
| return true; |
| } |
| |
| int main(int, char**) |
| { |
| using H = std::coroutine_handle<>; |
| using S = std::suspend_never; |
| H h{}; |
| S s{}; |
| S const& cs = s; |
| { |
| LIBCPP_STATIC_ASSERT(noexcept(s.await_ready()), ""); |
| static_assert(std::is_same<decltype(s.await_ready()), bool>::value, ""); |
| assert(s.await_ready() == true); |
| assert(cs.await_ready() == true); |
| } |
| { |
| LIBCPP_STATIC_ASSERT(noexcept(s.await_suspend(h)), ""); |
| static_assert(std::is_same<decltype(s.await_suspend(h)), void>::value, ""); |
| s.await_suspend(h); |
| cs.await_suspend(h); |
| } |
| { |
| LIBCPP_STATIC_ASSERT(noexcept(s.await_resume()), ""); |
| static_assert(std::is_same<decltype(s.await_resume()), void>::value, ""); |
| s.await_resume(); |
| cs.await_resume(); |
| } |
| { |
| static_assert(std::is_nothrow_default_constructible<std::suspend_never>::value, ""); |
| static_assert(std::is_nothrow_copy_constructible<std::suspend_never>::value, ""); |
| static_assert(std::is_nothrow_move_constructible<std::suspend_never>::value, ""); |
| static_assert(std::is_nothrow_copy_assignable<std::suspend_never>::value, ""); |
| static_assert(std::is_nothrow_move_assignable<std::suspend_never>::value, ""); |
| static_assert(std::is_trivially_copyable<std::suspend_never>::value, ""); |
| static_assert(check_suspend_constexpr(), ""); |
| } |
| { |
| static_assert(test_trivial_awaitable_constexpr<std::suspend_never>(true)); |
| } |
| { |
| // suppress unused warnings for the global constexpr test variable |
| ((void)constexpr_sn); |
| } |
| |
| return 0; |
| } |