Skip to content

Commit b931c00

Browse files
committed
Fix MinGW build with _WIN32_WINNT<0x600, GCC>=13, model=win32
unordered_dense.h fails to compile on Windows/MinGW with GCC >= 13 with thread model win32, and _WIN32_WINNT < 0x600 (Vista), in CFLAGS/CXXFLAGS. E.g., GDB defines _WIN32_WINNT to 0x501, and it fails to build with GCC 14.2 like so: CXX ada-exp.o In file included from /opt/xpack-mingw-w64-gcc-14.2.0-1/x86_64-w64-mingw32/include/c++/14.2.0/shared_mutex:42, from /opt/xpack-mingw-w64-gcc-14.2.0-1/x86_64-w64-mingw32/include/c++/14.2.0/memory_resource:66, from /home/pedro/gdb/src/gdb/../gdbsupport/unordered_dense.h:104, from /home/pedro/gdb/src/gdb/../gdbsupport/unordered_map.h:21, from /home/pedro/gdb/src/gdb/gdbtypes.h:53, from /home/pedro/gdb/src/gdb/expression.h:23, from /home/pedro/gdb/src/gdb/ada-exp.y:40: /opt/xpack-mingw-w64-gcc-14.2.0-1/x86_64-w64-mingw32/include/c++/14.2.0/bits/std_mutex.h:164:5: error: '__gthread_cond_t' does not name a type; did you mean '__gthread_once_t'? 164 | __gthread_cond_t* native_handle() noexcept { return &_M_cond; } | ^~~~~~~~~~~~~~~~ | __gthread_once_t (... snip other instances of same ...) The problem is that unordered_dense.h includes <memory_resource>, which uses std::mutex, and thus needs to include <mutex>. (See <https://quuxplusone.github.io/blog/2018/06/05/libcpp-memory-resource>, "Notice that synchronized_pool_resource contains a mutex, which means that <memory_resource> effectively must include <mutex>.") GCC 13 rewrote the win32 thread model support, and in that rewrite, support for __gthread_cond_t in std_mutex.h became conditional on _WIN32_WINNT >= 0x600. GCC/libstdc++ also has <experimental/memory_resource> so with this patch, such a configuration takes that branch and succeeds, because <experimental/memory_resource> does not include <mutex>. Tested with MinGW-w64 GCC 14.2, posix and win32 models. Tested with MinGW-w64 GCC 10.1, posix and win32 models. Tested with GNU/Linux GCC 11.4.0.
1 parent 73f3cbb commit b931c00

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

include/ankerl/unordered_dense.h

+20-1
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,27 @@
9898
# include <cstdlib> // for abort
9999
# endif
100100

101+
// <memory_resource> includes <mutex>, which fails to compile if
102+
// targeting GCC >= 13 with the (rewritten) win32 thread model, and
103+
// targeting Windows earlier than Vista (0x600). GCC predefines
104+
// _REENTRANT when using the 'posix' model, and doesn't when using the
105+
// 'win32' model.
106+
# if defined __MINGW64__ && defined __GNUC__ && __GNUC__ >= 13 && !defined _REENTRANT
107+
// _WIN32_WINNT is garanteed to be defined here because of the
108+
// <cstdint> inclusion above.
109+
# ifndef _WIN32_WINNT
110+
# error "_WIN32_WINNT not defined"
111+
# endif
112+
# if _WIN32_WINNT < 0x600
113+
# define ANKERL_MEMORY_RESOURCE_IS_BAD() 1 // NOLINT(cppcoreguidelines-macro-usage)
114+
# endif
115+
# endif
116+
# ifndef ANKERL_MEMORY_RESOURCE_IS_BAD
117+
# define ANKERL_MEMORY_RESOURCE_IS_BAD() 0 // NOLINT(cppcoreguidelines-macro-usage)
118+
# endif
119+
101120
# if defined(__has_include) && !defined(ANKERL_UNORDERED_DENSE_DISABLE_PMR)
102-
# if __has_include(<memory_resource>)
121+
# if __has_include(<memory_resource>) && !ANKERL_MEMORY_RESOURCE_IS_BAD()
103122
# define ANKERL_UNORDERED_DENSE_PMR std::pmr // NOLINT(cppcoreguidelines-macro-usage)
104123
# include <memory_resource> // for polymorphic_allocator
105124
# elif __has_include(<experimental/memory_resource>)

0 commit comments

Comments
 (0)