Hi Bruno,
The warnings say:
> ../gllib/string.h:809:20: error: declaration of 'memchr' has a different
> language linkage
> 809 | _GL_CXXALIASWARN1 (memchr, void *,
> | ^
> /usr/include/string.h:94:1: note: previous definition is here
> 94 | memchr (void *__s, int __c, size_t __n) __THROW
> | ^
Initially looking at glibc's string.h on my system I had suspicions of
the following code in string.h:
/* Tell the caller that we provide correct C++ prototypes. */
#if defined __cplusplus && (__GNUC_PREREQ (4, 4) \
|| __glibc_clang_prereq (3, 5))
# define __CORRECT_ISO_CPP_STRING_H_PROTO
#endif
[...]
#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
extern "C++"
{
extern void *memchr (void *__s, int __c, size_t __n)
__THROW __asm ("memchr") __attribute_pure__ __nonnull ((1));
extern const void *memchr (const void *__s, int __c, size_t __n)
__THROW __asm ("memchr") __attribute_pure__ __nonnull ((1));
[...]
Upon looking further I see that someone else ran into errors like this
using clang++ in 2021 [1]. AFAIK it was never resolved but the archives
split replies by month I think. So maybe I am wrong.
Does this sound reasonable to you? I have attached a patch that should
fix the testdir of all modules while using clang++.
Those _GL_CXXALIASWARN1, etc. macros sort of go over my head so sorry if
I am totally off mark.
Collin
[1] https://lists.gnu.org/archive/html/bug-gnulib/2021-01/msg00206.html
diff --git a/lib/string.in.h b/lib/string.in.h
index 44ec2e7ecd..8b084ae198 100644
--- a/lib/string.in.h
+++ b/lib/string.in.h
@@ -288,14 +288,14 @@ _GL_CXXALIAS_SYS_CAST2 (memchr,
# endif
# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
+ || (defined __clang__ && !defined __CORRECT_ISO_CPP_STRING_H_PROTO))
_GL_CXXALIASWARN1 (memchr, void *,
(void *__s, int __c, size_t __n)
_GL_ATTRIBUTE_NOTHROW);
_GL_CXXALIASWARN1 (memchr, void const *,
(void const *__s, int __c, size_t __n)
_GL_ATTRIBUTE_NOTHROW);
-# elif __GLIBC__ >= 2
+# elif __GLIBC__ >= 2 && !(defined __clang__ && defined __CORRECT_ISO_CPP_STRING_H_PROTO)
_GL_CXXALIASWARN (memchr);
# endif
#elif defined GNULIB_POSIXCHECK
@@ -393,14 +393,14 @@ _GL_CXXALIAS_SYS_CAST2 (memrchr,
void const *, (void const *, int, size_t));
# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
+ || (defined __clang__ && !defined __CORRECT_ISO_CPP_STRING_H_PROTO))
_GL_CXXALIASWARN1 (memrchr, void *,
(void *, int, size_t)
_GL_ATTRIBUTE_NOTHROW);
_GL_CXXALIASWARN1 (memrchr, void const *,
(void const *, int, size_t)
_GL_ATTRIBUTE_NOTHROW);
-# elif __GLIBC__ >= 2
+# elif __GLIBC__ >= 2 && !(defined __clang__ && defined __CORRECT_ISO_CPP_STRING_H_PROTO)
_GL_CXXALIASWARN (memrchr);
# endif
#elif defined GNULIB_POSIXCHECK
@@ -455,14 +455,14 @@ _GL_CXXALIAS_SYS_CAST2 (rawmemchr,
void const *, (void const *__s, int __c_in));
# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
+ || (defined __clang__ && !defined __CORRECT_ISO_CPP_STRING_H_PROTO))
_GL_CXXALIASWARN1 (rawmemchr, void *,
(void *__s, int __c_in)
_GL_ATTRIBUTE_NOTHROW);
_GL_CXXALIASWARN1 (rawmemchr, void const *,
(void const *__s, int __c_in)
_GL_ATTRIBUTE_NOTHROW);
-# else
+# elif __GLIBC__ >= 2 && !(defined __clang__ && defined __CORRECT_ISO_CPP_STRING_H_PROTO)
_GL_CXXALIASWARN (rawmemchr);
# endif
#elif defined GNULIB_POSIXCHECK
@@ -580,14 +580,14 @@ _GL_CXXALIAS_SYS_CAST2 (strchrnul,
# endif
# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
+ || (defined __clang__ && !defined __CORRECT_ISO_CPP_STRING_H_PROTO))
_GL_CXXALIASWARN1 (strchrnul, char *,
(char *__s, int __c_in)
_GL_ATTRIBUTE_NOTHROW);
_GL_CXXALIASWARN1 (strchrnul, char const *,
(char const *__s, int __c_in)
_GL_ATTRIBUTE_NOTHROW);
-# elif __GLIBC__ >= 2
+# elif __GLIBC__ >= 2 && !(defined __clang__ && defined __CORRECT_ISO_CPP_STRING_H_PROTO)
_GL_CXXALIASWARN (strchrnul);
# endif
#elif defined GNULIB_POSIXCHECK
@@ -819,14 +819,14 @@ _GL_CXXALIAS_SYS_CAST2 (strpbrk,
const char *, (char const *__s, char const *__accept));
# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
+ || (defined __clang__ && !defined __CORRECT_ISO_CPP_STRING_H_PROTO))
_GL_CXXALIASWARN1 (strpbrk, char *,
(char *__s, char const *__accept)
_GL_ATTRIBUTE_NOTHROW);
_GL_CXXALIASWARN1 (strpbrk, char const *,
(char const *__s, char const *__accept)
_GL_ATTRIBUTE_NOTHROW);
-# elif __GLIBC__ >= 2
+# elif __GLIBC__ >= 2 && !(defined __clang__ && defined __CORRECT_ISO_CPP_STRING_H_PROTO)
_GL_CXXALIASWARN (strpbrk);
# endif
# if defined GNULIB_POSIXCHECK
@@ -931,14 +931,14 @@ _GL_CXXALIAS_SYS_CAST2 (strstr,
# endif
# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
+ || (defined __clang__ && !defined __CORRECT_ISO_CPP_STRING_H_PROTO))
_GL_CXXALIASWARN1 (strstr, char *,
(char *haystack, const char *needle)
_GL_ATTRIBUTE_NOTHROW);
_GL_CXXALIASWARN1 (strstr, const char *,
(const char *haystack, const char *needle)
_GL_ATTRIBUTE_NOTHROW);
-# elif __GLIBC__ >= 2
+# elif __GLIBC__ >= 2 && !(defined __clang__ && defined __CORRECT_ISO_CPP_STRING_H_PROTO)
_GL_CXXALIASWARN (strstr);
# endif
#elif defined GNULIB_POSIXCHECK
@@ -984,14 +984,14 @@ _GL_CXXALIAS_SYS_CAST2 (strcasestr,
# endif
# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
+ || (defined __clang__ && !defined __CORRECT_ISO_CPP_STRING_H_PROTO))
_GL_CXXALIASWARN1 (strcasestr, char *,
(char *haystack, const char *needle)
_GL_ATTRIBUTE_NOTHROW);
_GL_CXXALIASWARN1 (strcasestr, const char *,
(const char *haystack, const char *needle)
_GL_ATTRIBUTE_NOTHROW);
-# elif __GLIBC__ >= 2
+# elif __GLIBC__ >= 2 && !(defined __clang__ && defined __CORRECT_ISO_CPP_STRING_H_PROTO)
_GL_CXXALIASWARN (strcasestr);
# endif
#elif defined GNULIB_POSIXCHECK