https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108331
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- That would be more flexible, but I'm not sure this is a problem that will happen again. This is a particular case where we have a completely unused member variable that just needs a specific layout. It occurs to me libstdc++ could just check the GCC_GTHR_WIN32_H include guard, although an explicitly-defined macro with a documented purpose (even if just via a comment) would be less fragile. How's this? diff --git a/libgcc/config/i386/gthr-win32.h b/libgcc/config/i386/gthr-win32.h index 146357fa436..050c7a21fcc 100644 --- a/libgcc/config/i386/gthr-win32.h +++ b/libgcc/config/i386/gthr-win32.h @@ -381,6 +381,14 @@ typedef struct timespec __gthread_time_t; #define __GTHREAD_COND_INIT_FUNCTION __gthread_cond_init_function #define __GTHREAD_TIME_INIT {0, 0} +// Libstdc++ std::basic_filebuf needs the old definition of __gthread_mutex_t +// for layout purposes, but doesn't actually use it. +typedef struct { + long __unused1; + void *__unused2; +} __gthr_win32_legacy_mutex_t; +#define __GTHREAD_LEGACY_MUTEX_T __gthr_win32_legacy_mutex_t + #if defined (_WIN32) && !defined(__CYGWIN__) #define MINGW32_SUPPORTS_MT_EH 1 /* Mingw runtime >= v0.3 provides a magic variable that is set to nonzero diff --git a/libstdc++-v3/config/io/c_io_stdio.h b/libstdc++-v3/config/io/c_io_stdio.h index 1a5e05a844a..e9e6e3ef4d8 100644 --- a/libstdc++-v3/config/io/c_io_stdio.h +++ b/libstdc++-v3/config/io/c_io_stdio.h @@ -39,7 +39,14 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION +#ifdef __GTHREAD_LEGACY_MUTEX_T + // The layout of __gthread_mutex_t changed in GCC 13, but libstdc++ doesn't + // actually use the basic_filebuf::_M_lock member, so define it consistently + // with the old __gthread_mutex_t to avoid an unnecessary layout change: + typedef __GTHREAD_LEGACY_MUTEX_T __c_lock; +#else typedef __gthread_mutex_t __c_lock; +#endif // for basic_file.h typedef FILE __c_file;