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