Skip to content

Commit 9b41fe8

Browse files
committed
more missing/wrong noexcept specifications
1 parent 598ec57 commit 9b41fe8

6 files changed

Lines changed: 68 additions & 6 deletions

File tree

include/beman/execution/detail/just.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ struct just_t {
5151
template <typename... T>
5252
requires ::beman::execution::detail::just_size<Completion, T...> &&
5353
(::beman::execution::detail::movable_value<T> && ...)
54-
auto operator()(T&&... arg) const {
54+
auto operator()(T&&... arg) const noexcept((::std::is_nothrow_constructible_v<::std::remove_cvref_t<T>, T> && ...)) {
5555
return ::beman::execution::detail::make_sender(
5656
*this, ::beman::execution::detail::product_type{::std::forward<T>(arg)...});
5757
}

include/beman/execution/detail/product_type.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@ struct product_type_base<::std::index_sequence<I...>, T...>
4747
}
4848

4949
template <::std::size_t J>
50-
auto get() & -> decltype(auto) {
50+
auto get() & noexcept -> decltype(auto) {
5151
return this->element_get<J>(*this);
5252
}
5353
template <::std::size_t J>
54-
auto get() && -> decltype(auto) {
54+
auto get() && noexcept -> decltype(auto) {
5555
return this->element_get<J>(::std::move(*this));
5656
}
5757
template <::std::size_t J>
58-
auto get() const& -> decltype(auto) {
58+
auto get() const& noexcept -> decltype(auto) {
5959
return this->element_get<J>(*this);
6060
}
6161

include/beman/execution/detail/then.hpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,16 @@ struct then_exception<Comp, Fun, ::beman::execution::completion_signatures<Compl
112112
template <typename Completion>
113113
struct then_t : ::beman::execution::sender_adaptor_closure<then_t<Completion>> {
114114
template <::beman::execution::detail::movable_value Fun>
115-
auto operator()(Fun&& fun) const {
115+
auto operator()(Fun&& fun) const
116+
noexcept(::std::is_nothrow_constructible_v<::std::remove_cvref_t<Fun>, Fun>)
117+
{
116118
return ::beman::execution::detail::make_sender_adaptor(*this, std::forward<decltype(fun)>(fun));
117119
}
118120
template <::beman::execution::sender Sender, ::beman::execution::detail::movable_value Fun>
119-
auto operator()(Sender&& sender, Fun&& fun) const {
121+
auto operator()(Sender&& sender, Fun&& fun) const
122+
noexcept(::std::is_nothrow_constructible_v<::std::remove_cvref_t<Sender>, Sender> &&
123+
::std::is_nothrow_constructible_v<::std::remove_cvref_t<Fun>, Fun>)
124+
{
120125
auto domain{::beman::execution::detail::get_domain_early(sender)};
121126
return ::beman::execution::transform_sender(
122127
domain,

tests/beman/execution/exec-let.test.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,42 @@ auto test_let_value_env() -> void {
123123
ex::then([](auto s) { static_assert(ex::scheduler<decltype(s)>); }));
124124
}
125125

126+
struct all_receiver {
127+
using receiver_concept = test_std::receiver_t;
128+
auto set_value(auto&&...) && noexcept {}
129+
auto set_error(auto&&) && noexcept {}
130+
auto set_stopped() && noexcept {}
131+
};
132+
126133
auto test_completion_signatures() -> void {
127134
test_std::sync_wait(
128135
test::completion_test(test_std::just() | test_std::let_value([]() { return test_std::just(); })));
129136
test_std::sync_wait(
130137
test::completion_test(test_std::just() | test_std::let_value([]() noexcept { return test_std::just(); })));
131138
test_std::sync_wait(test::completion_test(
132139
test_std::just() | test_std::let_value([]() noexcept { return test_std::just_error(std::exception_ptr{}); })));
140+
141+
test_std::sync_wait(test::completion_test(test_std::let_value(
142+
test_std::just(),
143+
[]() noexcept { return test_std::just(); })));
144+
static_assert(
145+
std::is_nothrow_move_constructible_v<decltype(test_std::just() | test_std::then([]() noexcept {}))>);
146+
static_assert(
147+
requires{test_std::connect(test_std::just() | test_std::then([]() noexcept {}), all_receiver{}); });
148+
static_assert(noexcept(all_receiver{}));
149+
static_assert(noexcept(test_std::just()));
150+
static_assert(noexcept(test_std::just().connect(all_receiver{})));
151+
static_assert(
152+
noexcept(test_std::connect(test_std::just(), all_receiver{})));
153+
static_assert(noexcept(ex::then(test_std::just(), []() noexcept {})));
154+
static_assert(noexcept(test_std::just() | ex::then([]() noexcept {})));
155+
static_assert(
156+
noexcept((test_std::just() | test_std::then([]() noexcept {})).connect(all_receiver{})));
157+
static_assert(
158+
noexcept(test_std::connect(test_std::just() | test_std::then([]() noexcept {}), all_receiver{})));
159+
test_std::sync_wait(test::completion_test(test_std::let_value(
160+
test_std::just(),
161+
[]() noexcept { return test_std::just() | test_std::then([]() noexcept {}); })));
133162
}
134163
} // namespace
135164

tests/beman/execution/exec-starts-on.test.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <concepts>
55
#include <test/execution.hpp>
6+
#include <test/completion_test.hpp>
67
#ifdef BEMAN_HAS_MODULES
78
import beman.execution;
89
#else
@@ -79,6 +80,24 @@ auto test_use(Scheduler&& scheduler, Sender&& sender) -> void {
7980
//-dk:TODO test::check_type<void>(test_std::get_completion_signatures(s, test_std::test_std::env<>{}));
8081
test_std::sync_wait(std::move(s));
8182
}
83+
84+
auto test_starts_on_completions() {
85+
test_std::sync_wait(test::completion_test(test_std::starts_on(test_std::inline_scheduler(),
86+
test_std::just())));
87+
test_std::sync_wait(test::completion_test(test_std::just() | test_std::then([]() noexcept {})));
88+
test_std::sync_wait(test::completion_test(test_std::just() | test_std::then([]() noexcept {})));
89+
test_std::sync_wait(test::completion_test(test_std::let_value(
90+
test_std::just(),
91+
[]() noexcept { return test_std::just(); })));
92+
test_std::sync_wait(test::completion_test(test_std::let_value(
93+
test_std::just(),
94+
[]() noexcept { return test_std::just() | test_std::then([]() noexcept {}); })));
95+
test_std::sync_wait(test::completion_test(test_std::let_value(
96+
test_std::schedule(test_std::inline_scheduler()),
97+
[]() noexcept { return test_std::just() | test_std::then([]() noexcept {}); })));
98+
test_std::sync_wait(test::completion_test(test_std::starts_on(test_std::inline_scheduler(),
99+
test_std::just() | test_std::then([]() noexcept {}))));
100+
}
82101
} // namespace
83102

84103
TEST(exec_starts_on) {
@@ -94,4 +113,5 @@ TEST(exec_starts_on) {
94113
test_constraints<true>(scheduler{}, sender{});
95114

96115
test_use(scheduler{}, sender{});
116+
test_starts_on_completions();
97117
}

tests/beman/execution/exec-then.test.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <tuple>
88
#include <utility>
99
#include <test/execution.hpp>
10+
#include <test/completion_test.hpp>
1011
#ifdef BEMAN_HAS_MODULES
1112
import beman.execution;
1213
#else
@@ -257,6 +258,12 @@ auto test_then_env() -> void {
257258
}
258259
}
259260

261+
auto test_then_completions() {
262+
test_std::sync_wait(test::completion_test(test_std::just() | test_std::then([](){})));
263+
test_std::sync_wait(test::completion_test(test_std::just() | test_std::then([]() noexcept {})));
264+
test_std::sync_wait(test::completion_test(test_std::just() | test_std::then([](auto&&...) noexcept {})));
265+
}
266+
260267
} // namespace
261268

262269
TEST(exec_then) {
@@ -275,4 +282,5 @@ TEST(exec_then) {
275282
test_then_allocator();
276283

277284
test_then_env();
285+
test_then_completions();
278286
}

0 commit comments

Comments
 (0)