@@ -23,9 +23,10 @@ SOFTWARE.
2323*/
2424#pragma once
2525
26+ #include < cassert>
2627#include < memory>
2728#include < string>
28- #include < cassert >
29+ #include < type_traits >
2930
3031#include " async.h"
3132#include " internal/channelimpl.h"
@@ -256,6 +257,9 @@ inline Promise<T...> make_promise(typename Promise<T...>::BodyResolve f, Promise
256257template <typename ... T>
257258template <typename ... U, typename OnResolve>
258259Promise<U...> Promise<T...>::then(const Asyncable *receiver, OnResolve &&onResolveF) {
260+ static_assert (std::is_same_v<std::invoke_result_t <OnResolve, T..., typename Promise<U...>::Resolve>,
261+ typename Promise<U...>::Result>,
262+ " onResolveF must return Promise<U...>::Result when called with (T... , Promise<U...>::Resolve)" );
259263 if (m_data->rejectCh != nullptr ) {
260264 return make_promise<U...>([this , receiver, onResolveF](auto resolve, auto reject) {
261265 this ->onResolve (receiver, [onResolveF, resolve](const T&... args) {
@@ -279,6 +283,9 @@ Promise<U...> Promise<T...>::then(const Asyncable *receiver, OnResolve &&onResol
279283template <typename ... T>
280284template <typename ... U, typename OnResolve, typename OnReject>
281285Promise<U...> Promise<T...>::then(const Asyncable *receiver, OnResolve &&onResolveF, OnReject &&onRejectF) {
286+ static_assert (std::is_same_v<std::invoke_result_t <OnResolve, T..., typename Promise<U...>::Resolve, typename Promise<U...>::Reject>,
287+ typename Promise<U...>::Result>,
288+ " onResolveF must return Promise<U...>::Result when called with (T... , Promise<U...>::Resolve, Promise<U...>::Reject)" );
282289 return make_promise<U...>([this , receiver, onResolveF, onRejectF](auto resolve, auto reject) {
283290 this ->onResolve (receiver, [onResolveF, resolve, reject](const T&... args) {
284291 onResolveF (args ..., resolve, reject);
0 commit comments