https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88462
--- Comment #5 from ro at CeBiTec dot Uni-Bielefeld.DE <ro at CeBiTec dot Uni-Bielefeld.DE> --- > --- Comment #4 from Iain Buclaw <ibuclaw at gdcproject dot org> --- > Stepping through the backtrace, I see the following at Thread.initLocks > (core/thread.d around line 1719). [...] > So there are two things. Firstly, the object instance is type punned from a > void[N] array. Secondly it is aligned to pointer size, not the alignment of > the underlying record type. > > So I'm certain that the problem will be fixed if `align(Mutex.alignof)` is > replaced with `align(8)`. Unfortunately, this doesn't work: the first time through, _locks[0] was already 8-byte aligned and everything worked fine. This remained when using align(8) instead. However, Mutex is 44 bytes on 32-bit Solaris/x86, so again _locks[1] lands on a non-8 byte boundary and pthread_mutex_init fails. I tried rouding up the size of the _locks array members to a multiple of 8, but that let the constructor already fail the first time through where _d_arraycopy checks that the right amount of data is copied: _d_arraycopy -> rt.util.array.enforceRawArraysConformable -> rt.util.array._enforceSameLength