[PATCH] libgfortran: Define macro to handle z length modifier in format strings

John David Anglin <[email protected]> Fri, 12 Jun 2026 14:20:49 -0400
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <[email protected]>
Tested on hppa64-hp-hpux11.11 and x86_64-pc-linux-gnu.

Okay?

Dave
---

libgfortran: Define macro to handle z length modifier in format strings

hppa64-hp-hpux* lacks the z length modifier.  It specifies the following
integer conversion corresponds to a size_t or a ssize_t argument.  The
size_t type is unsigned long on HP-UX, so we can replace the z length
modifier with l on HP-UX.

2026-06-11  John David Anglin  <[email protected]>

libgfortran/ChangeLog:

	* libgfortran.h (FLM_Z): Define.
	* caf/shmem/alloc.c (get_memory_by_id_internal): Use FLM_Z.
	(alloc_free_memory_with_id): Likewise.
	* caf/shmem/supervisor.c (get_memory_size_from_envvar): Likewise.
	* caf/shmem/thread_support.c (get_handle): Likewise.
	(thread_support_init_supervisor): Likewise.
	* intrinsics/reduce.c (reduce): Likewise.

diff --git a/libgfortran/caf/shmem/alloc.c b/libgfortran/caf/shmem/alloc.c
index 4fc2307ffec..adbab848bd2 100644
--- a/libgfortran/caf/shmem/alloc.c
+++ b/libgfortran/caf/shmem/alloc.c
@@ -85,7 +85,7 @@ get_memory_by_id_internal (alloc *iface, size_t size, memid id, bool *created)
 	{
 	  allocator_unlock (&iface->alloc);
 	  caf_runtime_error (
-	    "Size mismatch for coarray allocation id %zd: found = %lu "
+	    "Size mismatch for coarray allocation id %" FLM_Z "d: found = %lu "
 	    "< size = %lu\n",
 	    id, found_size, size);
 	  return NULL; // The runtime_error exit()s, so this is never reached.
@@ -144,7 +144,8 @@ alloc_free_memory_with_id (alloc *iface, memid id)
   if (!hm_search_result_contains (&res))
     {
       allocator_unlock (&iface->alloc);
-      caf_runtime_error ("Error in free_memory_with_id: %zd not found.\n", id);
+      caf_runtime_error ("Error in free_memory_with_id: %" FLM_Z
+			 "d not found.\n", id);
       return;
     }
 
diff --git a/libgfortran/caf/shmem/supervisor.c b/libgfortran/caf/shmem/supervisor.c
index aa692a6551d..8f676c5aa0a 100644
--- a/libgfortran/caf/shmem/supervisor.c
+++ b/libgfortran/caf/shmem/supervisor.c
@@ -106,7 +106,7 @@ get_memory_size_from_envvar (void)
     {
       char suffix[2];
       int rv;
-      rv = sscanf (e, "%zu%1s", &sz, suffix);
+      rv = sscanf (e, "%" FLM_Z "u%1s", &sz, suffix);
       if (rv == 2)
 	{
 	  switch (suffix[0])
diff --git a/libgfortran/caf/shmem/thread_support.c b/libgfortran/caf/shmem/thread_support.c
index 0c5f8cc2763..dc907c95b0a 100755
--- a/libgfortran/caf/shmem/thread_support.c
+++ b/libgfortran/caf/shmem/thread_support.c
@@ -122,7 +122,8 @@ get_handle (const size_t id, const char t)
 
       if (!pid)
 	pid = shared_memory_get_env ();
-      snprintf (name, MAX_PATH, "Global_gfortran-%s-%c-%zd", pid, t, id);
+      snprintf (name, MAX_PATH, "Global_gfortran-%s-%c-%" FLM_Z "d",
+		pid, t, id);
       switch (t)
 	{
 	case 'm':
@@ -131,8 +132,8 @@ get_handle (const size_t id, const char t)
 	case 'c':
 	  {
 	    handles[id] = CreateSemaphore (NULL, 0, __INT_MAX__, name);
-	    snprintf (name, MAX_PATH, "Global_gfortran-%s-%c-%zd_lock", pid, t,
-		      id);
+	    snprintf (name, MAX_PATH, "Global_gfortran-%s-%c-%" FLM_Z "d_lock",
+		      pid, t, id);
 	    handles[id + 1] = CreateSemaphore (NULL, 1, 1, name);
 	    this_image.supervisor->global_used_handles
 	      = smax (this_image.supervisor->global_used_handles, id + 2);
@@ -173,7 +174,7 @@ void
 thread_support_init_supervisor (void)
 {
   if (local->total_num_images > ULONGBITS * MAX_NUM_SIGNALED)
-    caf_runtime_error ("Maximum number of supported images is %zd.",
+    caf_runtime_error ("Maximum number of supported images is %" FLM_Z "d.",
 		       ULONGBITS * MAX_NUM_SIGNALED);
   this_image.supervisor->global_used_handles = 0;
 }
diff --git a/libgfortran/intrinsics/reduce.c b/libgfortran/intrinsics/reduce.c
index f1f3b838adb..28bc834bc73 100644
--- a/libgfortran/intrinsics/reduce.c
+++ b/libgfortran/intrinsics/reduce.c
@@ -110,7 +110,7 @@ reduce (parray *ret,
 	{
 	  int mext = (int)GFC_DESCRIPTOR_EXTENT (mask, i);
 	  runtime_error ("shape mismatch between ARRAY and MASK in the REDUCE "
-			 "intrinsic (%zd/%d)", ext, mext);
+			 "intrinsic (%" FLM_Z "d/%d)", ext, mext);
 	}
 
       if (scalar_result)
diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h
index 10c5313e1bc..8381cbd7cd4 100644
--- a/libgfortran/libgfortran.h
+++ b/libgfortran/libgfortran.h
@@ -36,6 +36,14 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #  define gfc_printf __printf__
 #endif
 
+/* Handle unsupported C99 length modifiers.  */
+#if defined(__hpux__)
+/* size_t is unsigned long on HP-UX.  */
+#define FLM_Z "l"
+#else
+#define FLM_Z "z"
+#endif
+
 /* config.h MUST be first because it can affect system headers.  */
 #include "config.h"
signature.asc (application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEnRzl+6e9+DTrEhyEXb/Nrl8ZTfEFAmosTfUACgkQXb/Nrl8Z
TfF8rA/9Gv81FL/DiZ7B8VV1rHnGdAlBrq9Z4scc+abh9999rsaTlK+D/F10X2wN
+sAm+Aj9yRLv0N/K1+ASQ3IXkHVbpQONA1FM600Rq/Xspx630NVtigKveEQ5nnzM
WxHeuvzC/bkWAj1XaPI8vGLlXmweSmiHfBbrSzOt34/dLX3Cl5u6OAnupO0PnOX4
BtfA2tpnJ23oflrZ3cUWDX2cw3v/ctIkB+Ph6g9STNO6RJNAg+NCz1PdAAFJpLPe
V/8PAKNlfaJbYNUFZB81GmqOqcnYw7eTuDIdgVYtfYaCYYVR1u9jsUlEabNTs/kG
XfKoutxCt/B2k8WA4IqpKwGuWJ/wP3Nnb2WMR4fJuqb4SkHFg57/YrRzJmP81W/v
QEt/B3IKQxoMzoItFji/PpigCDBu1y6zYbQoo7UV28N1i/IoJB0CRVbTr7zdDiiP
mFMw+kLtRL4NQsObIxXyyORqCg4g7kPWrsJ+2+SKzMsE0VZBQdCeWU1GX7cRG40y
zz6ltDKhHMZMhspyCgw4f/sJkUsGQjBKd9iQw3Dkx6LkLVR98aZ+GoxowgT0h9nf
MJ5+H+/BUm1d5zpyIuqgvX+HkrD8PLXHw8BrwHK4drx1PhJJVL5MnsmcDQ8+c2LR
KL2rsVGcYNyT2Uz4APb/cyggpIVArVd3SqXm/h72P0pyvYiEN+Y=
=SVFc
-----END PGP SIGNATURE-----