Skip to content

Commit 80d6116

Browse files
committed
work-around for clang-15 overload bug
1 parent e4095e0 commit 80d6116

1 file changed

Lines changed: 27 additions & 1 deletion

File tree

include/exec/timed_scheduler.hpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,20 @@ namespace exec {
126126
};
127127

128128
struct schedule_after_t : __schedule_after_base_t {
129+
#if !STDEXEC_CLANG() || (__clang_major__ >= 16)
129130
using __schedule_after_base_t::operator();
131+
#else
132+
// clang prior to 16 is not able to find the correct overload in the
133+
// __schedule_after_base_t class.
134+
template <class _Scheduler>
135+
requires __callable<__schedule_after_base_t, _Scheduler, const duration_of_t<_Scheduler>&>
136+
auto operator()(_Scheduler&& __sched, const duration_of_t<_Scheduler>& __time_point) const
137+
noexcept(
138+
__nothrow_callable<__schedule_after_base_t, _Scheduler, const duration_of_t<_Scheduler>&>)
139+
-> __call_result_t<__schedule_after_base_t, _Scheduler, const duration_of_t<_Scheduler>&> {
140+
return __schedule_after_base_t{}(static_cast<_Scheduler&&>(__sched), __time_point);
141+
}
142+
#endif
130143

131144
template <class _Scheduler>
132145
requires(!__callable<__schedule_after_base_t, _Scheduler, const duration_of_t<_Scheduler>&>)
@@ -138,7 +151,7 @@ namespace exec {
138151
return let_value(
139152
just(),
140153
[__sched, __duration]() noexcept(
141-
__nothrow_callable<schedule_at_t, _Scheduler, const time_point_of_t<_Scheduler>&>&&
154+
__nothrow_callable<schedule_at_t, _Scheduler, time_point_of_t<_Scheduler>>&&
142155
__nothrow_callable<now_t, const _Scheduler&>) {
143156
return schedule_at(__sched, now(__sched) + __duration);
144157
});
@@ -185,7 +198,20 @@ namespace exec {
185198
};
186199

187200
struct schedule_at_t : __schedule_at_base_t {
201+
#if !STDEXEC_CLANG() || (__clang_major__ >= 16)
188202
using __schedule_at_base_t::operator();
203+
#else
204+
// clang prior to 16 is not able to find the correct overload in the
205+
// __schedule_at_base_t class.
206+
template <class _Scheduler>
207+
requires __callable<__schedule_at_base_t, _Scheduler, const time_point_of_t<_Scheduler>&>
208+
auto operator()(_Scheduler&& __sched, const time_point_of_t<_Scheduler>& __time_point) const
209+
noexcept(
210+
__nothrow_callable<__schedule_at_base_t, _Scheduler, const time_point_of_t<_Scheduler>&>)
211+
-> __call_result_t<__schedule_at_base_t, _Scheduler, const time_point_of_t<_Scheduler>&> {
212+
return __schedule_at_base_t{}(static_cast<_Scheduler&&>(__sched), __time_point);
213+
}
214+
#endif
189215

190216
template <class _Scheduler>
191217
requires(!__callable<__schedule_at_base_t, _Scheduler, const time_point_of_t<_Scheduler>&>)

0 commit comments

Comments
 (0)