https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68739
--- Comment #3 from John David Anglin <danglin at gcc dot gnu.org> --- As far as I can tell, the definition for PTHREAD_MUTEX_INITIALIZE only involves constant elements: #define PTHREAD_MUTEX_INITIALIZER { \ __PTHREAD_MUTEX_VALID, 0, \ (PTHREAD_MUTEX_DEFAULT | PTHREAD_PROCESS_PRIVATE), \ __SPNLCK_INITIALIZER, \ 0, 0, -1, 0, \ 0, __LWP_MTX_VALID, 0, 1, 1, 1, 1, \ 0, 0 \ } __GTHREAD_MUTEX_INIT is defined. We have the following declaration for struct pthread_mutex: #ifdef __LP64__ #define __MPOINTER void *m_ptr #define __POINTER_SET ((void *) 1LL) #else #define __MPOINTER int m_pad; \ void *m_ptr #define __POINTER_SET 0, ((void *) 1L) #endif struct pthread_mutex { short m_short[2]; int m_int; int m_int1[4]; __MPOINTER; int m_int2[2]; int m_int3[4]; short m_short2[2]; int m_int4[5]; int m_int5[2]; }; We have: #define __PTHREAD_MUTEX_VALID 0x36 #define __LWP_MTX_VALID 2368 #define PTHREAD_MUTEX_DEFAULT 0x80 #define PTHREAD_PROCESS_PRIVATE 0x1 and #define __SPNLCK_INITIALIZER \ 1, 1, 1, 1, \ __POINTER_SET, \ 1, \ 0 I guess the problem is the shorts. But we don't have a literal suffix for it.