Compiling a testdir on OpenBSD 6.0, I get this compilation error: ../gllib/wchar.h: In member function 'gnulib::_gl_wcrtomb_wrapper::operator size_t (*)(char*, wchar_t, rpl_mbstate_t*)() const': ../gllib/wchar.h:1254: error: invalid conversion from 'size_t (*)(char*, wchar_t, mbstate_t*)' to 'size_t (*)(char*, wchar_t, rpl_mbstate_t*)'
It's not easy to fix this: - If I force REPLACE_MBSTATE_T to 0, I get 25 test failures, due to mbsinit() not working right and not being overridden. - If I let REPLACE_MBSTATE_T be 1 and mbstate_t gets overridden by a 32-bit type, wcrtomb() - which in _citrus_utf8_ctype_wcrtomb() accesses the second 32-bit word of the mbstate_t - makes an out-of-bounds access. - So, the fix is to let REPLACE_MBSTATE_T be 1, but don't actually override mbstate_t. Like we already do on AIX. 2024-12-28 Bruno Haible <br...@clisp.org> wchar-h: Fix wcrtomb prototype conflict in C++ mode on OpenBSD 6.0. * lib/wchar.in.h (rpl_mbstate_t): Don't define on OpenBSD. diff --git a/lib/wchar.in.h b/lib/wchar.in.h index 1eaaf363f4..da475e01a4 100644 --- a/lib/wchar.in.h +++ b/lib/wchar.in.h @@ -198,11 +198,12 @@ typedef unsigned int rpl_wint_t; /* Override mbstate_t if it is too small. On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for implementing mbrtowc for encodings like UTF-8. - On AIX and MSVC, mbrtowc needs to be overridden, but mbstate_t exists and is - large enough and overriding it would cause problems in C++ mode. */ + On AIX, MSVC, and OpenBSD 6.0, mbrtowc needs to be overridden, but + mbstate_t exists and is large enough and overriding it would cause problems + in C++ mode. */ #if !(((defined _WIN32 && !defined __CYGWIN__) || @HAVE_MBSINIT@) && @HAVE_MBRTOWC@) || @REPLACE_MBSTATE_T@ # if !GNULIB_defined_mbstate_t -# if !(defined _AIX || defined _MSC_VER) +# if !(defined _AIX || defined _MSC_VER || defined __OpenBSD__) typedef int rpl_mbstate_t; # undef mbstate_t # define mbstate_t rpl_mbstate_t