fix clang/-Wcast-function-type-strict warning

Fixes:
src/utils/context_switch.cc:133:7: error:
  cast from 'void (*)(LocalContext *)' to 'LPFIBER_START_ROUTINE' (aka
  'void (*)(void *)') converts to incompatible function type
  [-Werror,-Wcast-function-type-strict]
  133 |       (LPFIBER_START_ROUTINE)suspendable_function, (LPVOID)&context_);
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Change-Id: Ie47ada32c1ed1cb17755697688cf0fed05d5c36b
Reviewed-on: https://chromium-review.googlesource.com/c/codecs/libwebp2/+/5445185
Reviewed-by: Yannis Guyon <yguyon@google.com>
Tested-by: WebM Builds <builds@webmproject.org>
diff --git a/src/dec/incr/decoder_context.cc b/src/dec/incr/decoder_context.cc
index b7b9ae6..ab3a126 100644
--- a/src/dec/incr/decoder_context.cc
+++ b/src/dec/incr/decoder_context.cc
@@ -19,13 +19,16 @@
 
 #include "src/dec/incr/decoder_context.h"
 
+#include "src/utils/context_switch.h"
+
 #if defined(WP2_USE_CONTEXT_SWITCH) && (WP2_USE_CONTEXT_SWITCH > 0)
 
 namespace WP2 {
 
 //------------------------------------------------------------------------------
 
-void ContextTileDecoder::SuspendingDecode(LocalContext* const context) {
+void ContextTileDecoder::SuspendingDecode(void* const local_context) {
+  LocalContext* const context = reinterpret_cast<LocalContext*>(local_context);
   InterContextData* const inter_context_data =
       (InterContextData*)context->GetInterContextData();
   inter_context_data->input.SetContext(context);  // Enable suspension.
diff --git a/src/dec/incr/decoder_context.h b/src/dec/incr/decoder_context.h
index 4fa3258..85edefd 100644
--- a/src/dec/incr/decoder_context.h
+++ b/src/dec/incr/decoder_context.h
@@ -42,7 +42,7 @@
 
  protected:
   // To be called only through MainContext::CreateLocalContext().
-  static void SuspendingDecode(LocalContext* const context);
+  static void SuspendingDecode(void* local_context);
 
   // Resumes decoding and sets partial_tile_.status.
   void DecodePartialTile();
diff --git a/src/utils/context_switch.cc b/src/utils/context_switch.cc
index 6795a74..125cb16 100644
--- a/src/utils/context_switch.cc
+++ b/src/utils/context_switch.cc
@@ -105,8 +105,8 @@
 
 //------------------------------------------------------------------------------
 
-bool MainContext::CreateLocalContext(
-    void (*suspendable_function)(LocalContext*), void* inter_context_data) {
+bool MainContext::CreateLocalContext(void (*suspendable_function)(void*),
+                                     void* inter_context_data) {
   if (!context_.closed_) {
     LOG_CONTEXT_ERROR("Another context is already created.");
     return false;
diff --git a/src/utils/context_switch.h b/src/utils/context_switch.h
index 7d66eae..6dcbaed 100644
--- a/src/utils/context_switch.h
+++ b/src/utils/context_switch.h
@@ -164,7 +164,7 @@
   // MainContext::Resume() is called. It must end with a LocalContext::Close().
   // The 'inter_context_data' can be accessed with
   // LocalContext::GetInterContextData().
-  bool CreateLocalContext(void (*suspendable_function)(LocalContext*),
+  bool CreateLocalContext(void (*suspendable_function)(void*),
                           void* inter_context_data);
 
   // Give back control to the local context. Returns false if local context
diff --git a/tests/test_context.cc b/tests/test_context.cc
index 3df66e3..021fcb4 100644
--- a/tests/test_context.cc
+++ b/tests/test_context.cc
@@ -44,12 +44,14 @@
   inter_context_data->data += 16;
 }
 
-void RunContext(LocalContext* const context) {
+void RunContext(void* const local_context) {
+  LocalContext* const context = reinterpret_cast<LocalContext*>(local_context);
   IncrementData(context, (InterContextData*)context->GetInterContextData());
   context->Close();
 }
 
-void RunBadContext(LocalContext* const context) {
+void RunBadContext(void* const local_context) {
+  LocalContext* const context = reinterpret_cast<LocalContext*>(local_context);
   context->Close();
   context->Yield();  // Nothing should be called after Close().
   context->Close();