https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125956
--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> ---
--- a/libstdc++-v3/src/c++20/format.cc
+++ b/libstdc++-v3/src/c++20/format.cc
@@ -93,6 +93,19 @@ struct __encoding : locale::facet
#ifdef _GLIBCXX_HAVE_ICONV
::iconv_t _M_cd = (::iconv_t)-1;
mutable mutex mx;
+
+
+ // This adaptor works around the signature problems of the second
+ // argument to iconv(): SUSv2 and others use 'const char**', but glibc 2.2
+ // uses 'char**', which matches the POSIX 1003.1-2001 standard.
+ // Using this adaptor, we deduce the correct type from the function pointer
+ // and then cast the `inbuf` parameter to that type.
+ template<typename T>
+ size_t
+ do_iconv(size_t (*func)(iconv_t, T, size_t*, char**, size_t*),
+ char** inbuf, size_t* inbytes,
+ char** outbuf, size_t* outbytes)
+ { return ::iconv(_M_cd, (T)inbuf, inbytes, outbuf, outbytes); }
#endif
// Convert `input` to UTF-8, using `out` to hold the result.
@@ -115,8 +128,7 @@ struct __encoding : locale::facet
= const_cast<char*>(input.data()) + input.size() - inbytesleft;
char* outbytes = p + written;
size_t outbytesleft = n - written;
- size_t res = ::iconv(_M_cd, &inbytes, &inbytesleft,
- &outbytes, &outbytesleft);
+ size_t res = do_iconv(&inbytes, &inbytesleft, &outbytes, &outbytesleft);
if (res == (size_t)-1)
{
if (errno != E2BIG)