Hi Bruno,

On AIX 7.3 (cfarm119) you can see the following warning:

    $ gnulib-tool --create-testdir --dir testdir1 thrd
    $ cd testdir1 && ./configure && make
    [...]
    depbase=`echo thrd.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
    gcc -DHAVE_CONFIG_H -I. -I..  -DGNULIB_STRICT_CHECKING=1 -D_THREAD_SAFE  -g 
-O2 -MT thrd.o -MD -MP -MF $depbase.Tpo -c -o thrd.o thrd.c &&\
    mv -f $depbase.Tpo $depbase.Po
    thrd.c: In function 'rpl_thrd_create':
    thrd.c:116:51: warning: passing argument 2 of 'thrd_create' from 
incompatible pointer type [-Wincompatible-pointer-types]
      116 |         thrd_create ((thrd_t *) &main_arg->t.tid, thrd_main_func, 
main_arg);
          |                                                   ^~~~~~~~~~~~~~
          |                                                   |
          |                                                   void * (*)(void *)
    In file included from ./threads.h:43,
                     from thrd.c:22:
    /usr/include/threads.h:100:39: note: expected 'thrd_start_t' {aka 'int 
(*)(void *)'} but argument is of type 'void * (*)(void *)'
      100 | thrd_create(thrd_t *thr, thrd_start_t func,void *arg);
          |                          ~~~~~~~~~~~~~^~~~

Since this becomes an error by default in newer versions of GCC than are
on this machine (GCC 14, IIRC), I think it should be fixed.

The issue is on AIX ≤ 7.2, thrd_start_t is defined to the wrong
type. The static 'thrd_main_func' wrapper uses that type to call the
system's thrd_create. However, on AIX 7.3 this type was fixed. We still
need to compile this file though since thrd_join does not store the exit
code.

How about the attached patch to fix it? Maybe you can think of a cleaner
way to do it without the function cast.

Collin

>From 47cbc846b6b082ce5741fda20690a04f47c2e098 Mon Sep 17 00:00:00 2001
Message-ID: <47cbc846b6b082ce5741fda20690a04f47c2e098.1753212997.git.collin.fu...@gmail.com>
From: Collin Funk <collin.fu...@gmail.com>
Date: Tue, 22 Jul 2025 12:36:04 -0700
Subject: [PATCH] thrd: Fix -Wincompatible-pointer-types on AIX 7.3.

* lib/thrd.c (SYSTEM_THRD_START_T): Define macro.
(rpl_thrd_create): Use it when calling the system's thrd_create
function.
---
 ChangeLog  |  7 +++++++
 lib/thrd.c | 12 ++++++++++--
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ac20d475da..37e2ff9ec7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2025-07-22  Collin Funk  <collin.fu...@gmail.com>
+
+	thrd: Fix -Wincompatible-pointer-types on AIX 7.3.
+	* lib/thrd.c (SYSTEM_THRD_START_T): Define macro.
+	(rpl_thrd_create): Use it when calling the system's thrd_create
+	function.
+
 2025-07-22  Paul Eggert  <egg...@cs.ucla.edu>
 
 	mkdir-p: ENOENT/ENOTDIR safety and consistency
diff --git a/lib/thrd.c b/lib/thrd.c
index ea7f0f5397..18e3e3e4a1 100644
--- a/lib/thrd.c
+++ b/lib/thrd.c
@@ -30,6 +30,14 @@
 
 #  undef thrd_t
 
+/* On AIX 7.3 we have to cast to the system's thrd_start_t type before calling
+   the system's thrd_create function.  */
+#  if !defined thrd_start_t
+#    define SYSTEM_THRD_START_T(func) ((int (*) (void *)) func)
+#  else
+#    define SYSTEM_THRD_START_T(func) (func)
+#  endif
+
 /* AIX 7.1..7.2 defines thrd_start_t incorrectly, namely as
    'void * (*) (void *)' instead of 'int (*) (void *)'.
    As a consequence, its thrd_join function never stores an exit code.
@@ -112,8 +120,8 @@ rpl_thrd_create (rpl_thrd_t *threadp, thrd_start_t mainfunc, void *arg)
     main_arg->a.arg = arg;
     main_arg->t.detached = 0;
     {
-      int err =
-        thrd_create ((thrd_t *) &main_arg->t.tid, thrd_main_func, main_arg);
+      int err = thrd_create ((thrd_t *) &main_arg->t.tid,
+                             SYSTEM_THRD_START_T (thrd_main_func), main_arg);
       if (err == thrd_success)
         *threadp = &main_arg->t;
       else
-- 
2.50.1

Reply via email to