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.
* Update wrap files
* Ignore clang's warning in doctest:
<ciso646> is not a standard header since C++20, use <version> to detect implementation-specific macros" [-Werror,-W#warnings]
Make sure app/doctest.h is used everywhere instead of directly including the header, so the warning is disabled everywhere