https://gcc.gnu.org/g:0a98b1a6ac91cb1aa0f89f7dcdb9c35daa88c2a1

commit r16-6670-g0a98b1a6ac91cb1aa0f89f7dcdb9c35daa88c2a1
Author: Thomas Koenig <[email protected]>
Date:   Fri Jan 9 22:00:07 2026 +0100

    Fix broken bootstrap on FreeBSD.
    
    As analyzed by Steve, on freebsd __gthread_t is a pointer type.
    I thought it the cleanest solution to remove the #ifdef in gfc_unit,
    make the "self" member a intptr_t and cast the return value of
    __gthread_t to that type.
    
    PR fortran/123512
    
    libgfortran/ChangeLog:
    
            * io/io.h: Change type of self to intptr_t.
            * io/async.h (LOCK_UNIT): Cast __gthread_self () to intptr_t.
            (TRYLOCK_UNIT): Likewise.
            (OWN_THREAD_ID): Likewise.

Diff:
---
 libgfortran/io/async.h | 16 ++++++++--------
 libgfortran/io/io.h    |  6 +-----
 2 files changed, 9 insertions(+), 13 deletions(-)

diff --git a/libgfortran/io/async.h b/libgfortran/io/async.h
index c4451f28f318..596b6d6f5f71 100644
--- a/libgfortran/io/async.h
+++ b/libgfortran/io/async.h
@@ -248,7 +248,7 @@
 
 #define LOCK_UNIT(unit) do {           \
     LOCK (&(unit)->lock);              \
-    (unit)->self = __gthread_self ();  \
+    (unit)->self = (intptr_t) __gthread_self ();       \
   } while (0)
 
 #ifdef __GTHREAD_RWLOCK_INIT
@@ -390,11 +390,11 @@
    unlocking; the only use for this is checking for recursion.  */
 
 #define LOCK_UNIT(unit) do {                                   \
-  if (__gthread_active_p ()) {                                 \
-    LOCK (&(unit)->lock); (unit)->self = __gthread_self ();    \
-  } else {                                                     \
-    (unit)->self = 1;                                          \
-  }                                                            \
+    if (__gthread_active_p ()) {                                       \
+      LOCK (&(unit)->lock); (unit)->self = (intptr_t) __gthread_self (); \
+    } else {                                                           \
+      (unit)->self = 1;                                                        
\
+    }                                                                  \
   } while(0)
 #else
 
@@ -430,7 +430,7 @@
       if (__gthread_active_p ()) {                             \
        res = __gthread_mutex_trylock (&(unit)->lock);          \
        if (!res)                                               \
-         (unit)->self = __gthread_self ();                     \
+         (unit)->self = (intptr_t) __gthread_self ();          \
       }                                                                \
       else {                                                   \
        res = (unit)->self;                                     \
@@ -555,7 +555,7 @@ extern __thread gfc_unit *thread_unit;
    to be 1.  */
 
 #ifdef __GTHREADS_CXX0X
-#define OWN_THREAD_ID (__gthread_active_p () ? __gthread_self () : 1)
+#define OWN_THREAD_ID (__gthread_active_p () ? (intptr_t) __gthread_self () : 
1)
 #else
 #define OWN_THREAD_ID 1
 #endif
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index ebb225296681..7928c196f63f 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -728,11 +728,7 @@ typedef struct gfc_unit
   int last_char;
   bool has_size;
   GFC_IO_INT size_used;
-#ifdef __GTHREADS_CXX0X
-  __gthread_t self;
-#else
-  int self;
-#endif
+  intptr_t self;
 }
 gfc_unit;

Reply via email to