Skip to content

Commit 059d7df

Browse files
committed
implemented noexcept for basic_operation/basic_sender
1 parent cd50ced commit 059d7df

File tree

3 files changed

+21
-5
lines changed

3 files changed

+21
-5
lines changed

include/beman/execution26/detail/basic_operation.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ template <typename Sender, typename Receiver>
3535
using inner_ops_t = ::beman::execution26::detail::connect_all_result<Sender, Receiver>;
3636
inner_ops_t inner_ops;
3737

38-
basic_operation(Sender&& sender, Receiver&& receiver) noexcept(true /*-dk:TODO*/)
38+
basic_operation(Sender&& sender, Receiver&& receiver) noexcept(
39+
noexcept(::beman::execution26::detail::basic_state<Sender, Receiver>(::std::forward<Sender>(sender),
40+
::std::move(receiver))) &&
41+
noexcept(::beman::execution26::detail::connect_all(this,
42+
::std::forward<Sender>(sender),
43+
::beman::execution26::detail::indices_for<Sender>())))
3944
: ::beman::execution26::detail::basic_state<Sender, Receiver>(::std::forward<Sender>(sender),
4045
::std::move(receiver)),
4146
// NOLINTBEGIN(bugprone-use-after-move,hicpp-invalid-access-moved)

include/beman/execution26/detail/basic_sender.hpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,23 +46,29 @@ struct basic_sender : ::beman::execution26::detail::product_type<Tag, Data, Chil
4646
private:
4747
#if __cpp_explicit_this_parameter < 202110L
4848
template <::beman::execution26::receiver Receiver>
49-
auto connect(Receiver receiver) & noexcept(true /*-dk:TODO*/)
49+
auto connect(Receiver receiver) & noexcept(
50+
noexcept(::beman::execution26::detail::basic_operation<basic_sender&, Receiver>{*this, ::std::move(receiver)}))
5051
-> ::beman::execution26::detail::basic_operation<basic_sender&, Receiver> {
5152
return {*this, ::std::move(receiver)};
5253
}
5354
template <::beman::execution26::receiver Receiver>
54-
auto connect(Receiver receiver) const& noexcept(true /*-dk:TODO*/)
55+
auto connect(Receiver receiver) const& noexcept(noexcept(
56+
::beman::execution26::detail::basic_operation<const basic_sender&, Receiver>{*this, ::std::move(receiver)}))
5557
-> ::beman::execution26::detail::basic_operation<const basic_sender&, Receiver> {
5658
return {*this, ::std::move(receiver)};
5759
}
5860
template <::beman::execution26::receiver Receiver>
59-
auto connect(Receiver receiver) && noexcept(true /*-dk:TODO*/)
61+
auto connect(Receiver receiver) && noexcept(
62+
noexcept(::beman::execution26::detail::basic_operation<basic_sender, Receiver>{::std::move(*this),
63+
::std::move(receiver)}))
6064
-> ::beman::execution26::detail::basic_operation<basic_sender, Receiver> {
6165
return {::std::move(*this), ::std::move(receiver)};
6266
}
6367
#else
6468
template <::beman::execution26::detail::decays_to<basic_sender> Self, ::beman::execution26::receiver Receiver>
65-
auto connect(this Self&& self, Receiver receiver) noexcept(true /*-dk:TODO*/)
69+
auto connect(this Self&& self, Receiver receiver) && noexcept(
70+
noexcept(::beman::execution26::detail::basic_operation<basic_sender, Receiver>{::std::forward<Self>(self),
71+
::std::move(receiver)}))
6672
-> ::beman::execution26::detail::basic_operation<Self, Receiver> {
6773
return {::std::forward<Self>(self), ::std::move(receiver)};
6874
}

include/beman/execution26/detail/then.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ struct then_t : ::beman::execution26::sender_adaptor_closure<then_t<Completion>>
5151

5252
template <typename Completion>
5353
struct impls_for<then_t<Completion>> : ::beman::execution26::detail::default_impls {
54+
// NOLINTBEGIN(bugprone-exception-escape)
5455
static constexpr auto complete =
5556
[]<typename Tag, typename... Args>(auto, auto& fun, auto& receiver, Tag, Args&&... args) noexcept -> void {
5657
if constexpr (::std::same_as<Completion, Tag>) {
@@ -66,13 +67,17 @@ struct impls_for<then_t<Completion>> : ::beman::execution26::detail::default_imp
6667
if constexpr (not noexcept(::std::invoke(::std::move(fun), ::std::forward<Args>(args)...)
6768

6869
)) {
70+
static_assert(
71+
noexcept(::beman::execution26::set_error(::std::move(receiver), ::std::current_exception())));
6972
::beman::execution26::set_error(::std::move(receiver), ::std::current_exception());
7073
}
7174
}
7275
} else {
76+
static_assert(noexcept(Tag()(::std::move(receiver), ::std::forward<Args>(args)...)));
7377
Tag()(::std::move(receiver), ::std::forward<Args>(args)...);
7478
}
7579
};
80+
// NOLINTEND(bugprone-exception-escape)
7681
};
7782

7883
template <typename T>

0 commit comments

Comments
 (0)