From 1bc58985ac5a576c22ecafdd554e7b207fd731ba Mon Sep 17 00:00:00 2001
From: Bruno Haible <bruno@clisp.org>
Date: Mon, 24 Aug 2020 01:38:14 +0200
Subject: [PATCH] AC_TYPE_PID_T: Define pid_t correctly on 64-bit native
 Windows.

Reported at <https://savannah.gnu.org/support/index.php?110296>.

* lib/autoconf/types.m4 (AC_TYPE_PID_T): Define pid_t to '__int64' on 64-bit
native Windows, and to 'int' otherwise.
---
 lib/autoconf/types.m4 | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/lib/autoconf/types.m4 b/lib/autoconf/types.m4
index 543a638..d28a8ef 100644
--- a/lib/autoconf/types.m4
+++ b/lib/autoconf/types.m4
@@ -610,7 +610,32 @@ AN_IDENTIFIER([ssize_t], [AC_TYPE_SSIZE_T])
 AC_DEFUN([AC_TYPE_SSIZE_T], [AC_CHECK_TYPE(ssize_t, int)])
 
 AN_IDENTIFIER([pid_t], [AC_TYPE_PID_T])
-AC_DEFUN([AC_TYPE_PID_T],  [AC_CHECK_TYPE(pid_t,  int)])
+AC_DEFUN([AC_TYPE_PID_T],
+[
+  AC_CHECK_TYPE([pid_t],
+    [],
+    [dnl On 64-bit native Windows, define it to the equivalent of 'intptr_t'
+     dnl (= 'long long' = '__int64'), because that is the return type
+     dnl of the _spawnv* functions
+     dnl <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/spawnvp-wspawnvp>
+     dnl and the argument type of the _cwait function
+     dnl <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/cwait>.
+     dnl Otherwise (on 32-bit Windows and on old Unix platforms), define it
+     dnl to 'int'.
+     AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM([[
+          #if defined _WIN64 && !defined __CYGWIN__
+          LLP64
+          #endif
+          ]])
+       ],
+       [ac_pid_type='int'],
+       [ac_pid_type='__int64'])
+     AC_DEFINE_UNQUOTED([pid_t], [$ac_pid_type],
+       [Define as a signed integer type capable of holding a process identifier.])
+    ],
+    [AC_INCLUDES_DEFAULT])
+])
 
 AN_IDENTIFIER([off_t], [AC_TYPE_OFF_T])
 AC_DEFUN([AC_TYPE_OFF_T],  [AC_CHECK_TYPE(off_t,  long int)])
-- 
2.7.4

