PTHREAD_MUTEX_INITIALIZER and constinit

2025年6月14日 16:43:01 -0700

Consider the following -std=c++20:
#include <pthread.h>
constinit pthread_mutex_t foo = PTHREAD_MUTEX_INITIALIZER;
With g++ 12.4.0, this succeeds, but with clang 20.1.6 it fails:
pthreadtest.cpp:3:27: error: variable does not have a constant initializer
 3 | constinit pthread_mutex_t foo = PTHREAD_MUTEX_INITIALIZER;
 | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~
pthreadtest.cpp:3:1: note: required by 'constinit' specifier here
 3 | constinit pthread_mutex_t foo = PTHREAD_MUTEX_INITIALIZER;
 | ^~~~~~~~~
pthreadtest.cpp:3:33: note: cast that performs the conversions of a 
reinterpret_cast is not allowed in a constant expression
 3 | constinit pthread_mutex_t foo = PTHREAD_MUTEX_INITIALIZER;
 | ^
/usr/include/pthread.h:49:35: note: expanded from macro 
'PTHREAD_MUTEX_INITIALIZER'
 49 | #define PTHREAD_MUTEX_INITIALIZER PTHREAD_NORMAL_MUTEX_INITIALIZER_NP
 | ^
/usr/include/pthread.h:47:45: note: expanded from macro 
'PTHREAD_NORMAL_MUTEX_INITIALIZER_NP'
 47 | #define PTHREAD_NORMAL_MUTEX_INITIALIZER_NP (pthread_mutex_t)19
 | ^
1 error generated.
It seems the standard disallows this sort of cast pretty comprehensively.
Is there some way that Cygwin's pthread initializer macros can be made
compatible with constinit?
-- 
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple

Reply via email to