diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index ad74f7ea0..9a8c4380e 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2012-10-23  Corinna Vinschen  <corinna@vinschen.de>
+
+	* thread.h (List_insert): Cast first parameter in
+	InterlockedCompareExchangePointer call to avoid compiler warnings.
+	(List_remove): Ditto.
+
 2012-10-22  Corinna Vinschen  <corinna@vinschen.de>
 
 	* winbase.h: Remove.
diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h
index 07652758c..a0412e1d0 100644
--- a/winsup/cygwin/thread.h
+++ b/winsup/cygwin/thread.h
@@ -59,18 +59,18 @@ public:
 
   void lock ()
   {
-    if (InterlockedIncrement ((long *) &lock_counter) != 1)
+    if (InterlockedIncrement (&lock_counter) != 1)
       cygwait (win32_obj_id, cw_infinite, cw_sig);
   }
 
   void unlock ()
   {
-    if (InterlockedDecrement ((long *) &lock_counter))
+    if (InterlockedDecrement (&lock_counter))
       ::SetEvent (win32_obj_id);
   }
 
 private:
-  unsigned long lock_counter;
+  LONG lock_counter;
   HANDLE win32_obj_id;
 };
 
@@ -119,18 +119,20 @@ List_insert (list_node *&head, list_node *node)
     return;
   do
     node->next = head;
-  while (InterlockedCompareExchangePointer (&head, node, node->next) != node->next);
+  while (InterlockedCompareExchangePointer ((PVOID volatile *) &head,
+					    node, node->next) != node->next);
 }
 
 template <class list_node> inline void
-List_remove (fast_mutex &mx, list_node *&head, list_node const *node)
+List_remove (fast_mutex &mx, list_node *&head, list_node *node)
 {
   if (!node)
     return;
   mx.lock ();
   if (head)
     {
-      if (InterlockedCompareExchangePointer (&head, node->next, node) != node)
+      if (InterlockedCompareExchangePointer ((PVOID volatile *) &head,
+					     node->next, node) != node)
 	{
 	  list_node *cur = head;
 
@@ -297,7 +299,7 @@ public:
   }
 
 protected:
-  unsigned long lock_counter;
+  LONG lock_counter;
   HANDLE win32_obj_id;
   pthread_t owner;
 #ifdef DEBUGGING
@@ -680,7 +682,7 @@ struct MTinterface
 {
   // General
   int concurrency;
-  long int threadcount;
+  LONG threadcount;
 
   callback *pthread_prepare;
   callback *pthread_child;