@@ -307,22 +307,22 @@ namespace winrt::impl
307307 template <typename T>
308308 struct free_await_adapter
309309 {
310- free_await_adapter_impl<T> && awaitable;
310+ T && awaitable;
311311
312312 bool await_ready ()
313313 {
314- return awaitable.ready ();
314+ return free_await_adapter_impl<T>{ static_cast <T&&>( awaitable) } .ready ();
315315 }
316316
317317 template <typename U>
318318 auto await_suspend (std::experimental::coroutine_handle<U> handle)
319319 {
320- return awaitable.suspend (handle);
320+ return free_await_adapter_impl<T>{ static_cast <T&&>( awaitable) } .suspend (handle);
321321 }
322322
323323 auto await_resume ()
324324 {
325- return awaitable.resume ();
325+ return free_await_adapter_impl<T>{ static_cast <T&&>( awaitable) } .resume ();
326326 }
327327 };
328328
@@ -369,13 +369,17 @@ namespace winrt::impl
369369 template <typename T, std::enable_if_t <has_awaitable_free<T>::value, int > = 0 >
370370 auto get_awaiter (T&& value) noexcept
371371 {
372- return free_await_adapter<T>{ { static_cast <T&&>(value) } };
372+ return free_await_adapter<T>{ static_cast <T&&>(value) };
373373 }
374374
375375 template <typename T>
376376 struct notify_awaiter
377377 {
378- decltype (get_awaiter(std::declval<T&&>()))&& awaitable;
378+ decltype (get_awaiter(std::declval<T&&>())) awaitable;
379+
380+ notify_awaiter (T&& awaitable) : awaitable(get_awaiter(static_cast <T&&>(awaitable)))
381+ {
382+ }
379383
380384 bool await_ready ()
381385 {
@@ -618,7 +622,7 @@ namespace winrt::impl
618622 throw winrt::hresult_canceled ();
619623 }
620624
621- return notify_awaiter<Expression>{ get_awaiter<Expression>( static_cast <Expression&&>(expression) ) };
625+ return notify_awaiter<Expression>{ static_cast <Expression&&>(expression) };
622626 }
623627
624628 cancellation_token<Derived> await_transform (get_cancellation_token_t ) noexcept
0 commit comments