> mbsstr, mbscasestr, mbspcasecmp: Use const-improved C++ templates.
> * lib/string.in.h (mbsstr, mbspcasecmp, mbscasestr): In C++, define
> through a template that supports both 'char *' and 'const char *'.
On AIX 7.1 with xlc I get these compilation errors:
xlC -q64 -qthreaded -qtls -DHAVE_CONFIG_H -DEXEEXT=\"\" -DEXEEXT=\"\" -I.
-I../../gltests -I.. -DGNULIB_STRICT_CHECKING=1 -DIN_GNULIB_TESTS=1 -I.
-I../../gltests -I.. -I../../gltests/.. -I../gllib -I../../gltests/../gllib
-I/home/haible/prefix64/include -D_THREAD_SAFE -g -c -o test-strings-h-c++.o
../../gltests/test-strings-h-c++.cc
"../gllib/string.h", line 1723.7: 1540-0121 (S) A template cannot have "C"
linkage.
"../gllib/string.h", line 1725.17: 1540-0603 (S) The template declaration
"mbsstr_template" cannot be found. An extra "template <>" may be specified on
this declaration.
"../gllib/string.h", line 1728.23: 1540-0603 (S) The template declaration
"mbsstr_template" cannot be found. An extra "template <>" may be specified on
this declaration.
"../gllib/string.h", line 1787.7: 1540-0121 (S) A template cannot have "C"
linkage.
"../gllib/string.h", line 1789.17: 1540-0603 (S) The template declaration
"mbspcasecmp_template" cannot be found. An extra "template <>" may be specified
on this declaration.
"../gllib/string.h", line 1792.23: 1540-0603 (S) The template declaration
"mbspcasecmp_template" cannot be found. An extra "template <>" may be specified
on this declaration.
"../gllib/string.h", line 1821.7: 1540-0121 (S) A template cannot have "C"
linkage.
"../gllib/string.h", line 1823.17: 1540-0603 (S) The template declaration
"mbscasestr_template" cannot be found. An extra "template <>" may be specified
on this declaration.
"../gllib/string.h", line 1826.23: 1540-0603 (S) The template declaration
"mbscasestr_template" cannot be found. An extra "template <>" may be specified
on this declaration.
gmake[4]: *** [Makefile:26704: test-strings-h-c++.o] Error 1
The cause is that some header files in /usr/include do things like
extern "C" {
#include <...>
}
and one of these system include files ends up doing '#include <string.h>',
which includes Gnulib's string.h.
This patch fixes it.
2025-02-10 Bruno Haible <[email protected]>
mbsstr, etc.: Fix compilation in C++ mode on AIX with xlc.
* lib/string.in.h (mbsstr, mbspcasecmp, mbscasestr): Wrap template
declarations and definitions in 'extern "C++" { ... }'.
diff --git a/lib/string.in.h b/lib/string.in.h
index 0b7f8cebc6..ac6b459de9 100644
--- a/lib/string.in.h
+++ b/lib/string.in.h
@@ -1182,6 +1182,7 @@ _GL_EXTERN_C char * mbsstr (const char *haystack, const
char *needle)
/* Don't silently convert a 'const char *' to a 'char *'. Programmers want
compiler warnings for 'const' related mistakes. */
# ifdef __cplusplus
+extern "C++" { /* needed for AIX */
template <typename T>
T * mbsstr_template (T* haystack, const char *needle);
template <>
@@ -1190,6 +1191,7 @@ template <>
template <>
inline const char * mbsstr_template (const char *haystack, const char
*needle)
{ return mbsstr (haystack, needle); }
+}
# define mbsstr mbsstr_template
# else
# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
@@ -1247,6 +1249,7 @@ _GL_EXTERN_C char * mbspcasecmp (const char *string,
const char *prefix)
/* Don't silently convert a 'const char *' to a 'char *'. Programmers want
compiler warnings for 'const' related mistakes. */
# ifdef __cplusplus
+extern "C++" { /* needed for AIX */
template <typename T>
T * mbspcasecmp_template (T* string, const char *prefix);
template <>
@@ -1255,6 +1258,7 @@ template <>
template <>
inline const char * mbspcasecmp_template (const char *string, const char
*prefix)
{ return mbspcasecmp (string, prefix); }
+}
# define mbspcasecmp mbspcasecmp_template
# else
# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
@@ -1282,6 +1286,7 @@ _GL_EXTERN_C char * mbscasestr (const char *haystack,
const char *needle)
/* Don't silently convert a 'const char *' to a 'char *'. Programmers want
compiler warnings for 'const' related mistakes. */
# ifdef __cplusplus
+extern "C++" { /* needed for AIX */
template <typename T>
T * mbscasestr_template (T* haystack, const char *needle);
template <>
@@ -1290,6 +1295,7 @@ template <>
template <>
inline const char * mbscasestr_template (const char *haystack, const char
*needle)
{ return mbscasestr (haystack, needle); }
+}
# define mbscasestr mbscasestr_template
# else
# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \