3535
3636#include < new>
3737
38+ #if __cplusplus < 202002l || !defined(__cpp_lib_bit_cast)
39+ namespace std {
40+ template <typename Destination, typename Source>
41+ std::enable_if_t <sizeof (Destination) == sizeof (Source) &&
42+ std::is_trivially_copyable_v<Source> &&
43+ std::is_trivially_copyable_v<Destination>, Destination>
44+ bit_cast (const Source &src) noexcept {
45+ static_assert (std::is_trivially_constructible_v<Destination>,
46+ " The destination type must be trivially constructible" );
47+ Destination dst;
48+ if constexpr (std::is_pointer_v<Source> || std::is_pointer_v<Destination>)
49+ std::memcpy (reinterpret_cast <uintptr_t *>(&dst),
50+ reinterpret_cast <const uintptr_t *>(&src), sizeof (Destination));
51+ else
52+ std::memcpy (&dst, &src, sizeof (Destination));
53+ return dst;
54+ }
55+ }
56+ #else
57+ #include < bit>
58+ #endif
59+
3860using namespace swift ;
3961
4062namespace {
@@ -287,8 +309,8 @@ static void _asyncLet_get_throwing_continuation(
287309 }
288310
289311 // Continue the caller's execution.
290- auto throwingResume
291- = reinterpret_cast <ThrowingTaskFutureWaitContinuationFunction*>(callContext->ResumeParent );
312+ auto throwingResume =
313+ std::bit_cast <ThrowingTaskFutureWaitContinuationFunction*>(callContext->ResumeParent );
292314 return throwingResume (callContext->Parent , error);
293315}
294316
@@ -305,8 +327,8 @@ static void swift_asyncLet_get_throwingImpl(
305327 }
306328
307329 auto aletContext = static_cast <AsyncLetContinuationContext*>(callContext);
308- aletContext->ResumeParent
309- = reinterpret_cast <TaskContinuationFunction*>(resumeFunction);
330+ aletContext->ResumeParent =
331+ std::bit_cast <TaskContinuationFunction*>(resumeFunction);
310332 aletContext->Parent = callerContext;
311333 aletContext->alet = alet;
312334 auto futureContext = asImpl (alet)->getFutureContext ();
@@ -376,7 +398,7 @@ static void asyncLet_finish_after_task_completion(SWIFT_ASYNC_CONTEXT AsyncConte
376398 swift_task_dealloc (task);
377399 }
378400
379- return reinterpret_cast <ThrowingTaskFutureWaitContinuationFunction*>(resumeFunction)
401+ return std::bit_cast <ThrowingTaskFutureWaitContinuationFunction*>(resumeFunction)
380402 (callerContext, error);
381403}
382404
@@ -528,14 +550,14 @@ static void swift_asyncLet_consume_throwingImpl(
528550 if (asImpl (alet)->hasResultInBuffer ()) {
529551 return asyncLet_finish_after_task_completion (callerContext,
530552 alet,
531- reinterpret_cast <TaskContinuationFunction*>(resumeFunction),
553+ std::bit_cast <TaskContinuationFunction*>(resumeFunction),
532554 callContext,
533555 nullptr );
534556 }
535557
536558 auto aletContext = static_cast <AsyncLetContinuationContext*>(callContext);
537- aletContext->ResumeParent
538- = reinterpret_cast <TaskContinuationFunction*>(resumeFunction);
559+ aletContext->ResumeParent =
560+ std::bit_cast <TaskContinuationFunction*>(resumeFunction);
539561 aletContext->Parent = callerContext;
540562 aletContext->alet = alet;
541563 auto futureContext = asImpl (alet)->getFutureContext ();
0 commit comments