[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: test-string-c++ test failure
From: |
Bruno Haible |
Subject: |
Re: test-string-c++ test failure |
Date: |
Sat, 13 Mar 2010 12:08:37 +0100 |
User-agent: |
KMail/1.9.9 |
Jim Meyering wrote:
> In file included from test-string-c++.cc:23:
> ../lib/string.h:299: error: type of 'memchr' is unknown
> ../lib/string.h:299: error: invalid type in declaration before ';' token
> ../lib/string.h:299: error: 'int memchr' redeclared as different kind of
> symbol
> /usr/include/string.h:76: error: previous declaration of 'const void*
> memchr(const void*, int, size_t)'
> In file included from test-string-c++.cc:23:
> ../lib/string.h:375: error: type of 'memrchr' is unknown
> ../lib/string.h:375: error: invalid type in declaration before ';' token
> ../lib/string.h:375: error: 'int memrchr' redeclared as different kind of
> symbol
> /usr/include/string.h:116: error: previous declaration of 'const void*
> memrchr(const void*, int, size_t)'
> In file included from test-string-c++.cc:23:
> ../lib/string.h:580: error: type of 'strpbrk' is unknown
> ../lib/string.h:580: error: invalid type in declaration before ';' token
> ../lib/string.h:580: error: 'int strpbrk' redeclared as different kind of
> symbol
> /usr/include/string.h:294: error: previous declaration of 'const char*
> strpbrk(const char*, const char*)'
> In file included from test-string-c++.cc:23:
> ../lib/string.h:675: error: type of 'strstr' is unknown
> ../lib/string.h:675: error: invalid type in declaration before ';' token
> ../lib/string.h:675: error: 'int strstr' redeclared as different kind of
> symbol
> /usr/include/string.h:321: error: previous declaration of 'const char*
> strstr(const char*, const char*)'
Ok, at least the _GL_CXXALIAS_SYS_CAST2 stuff is working fine now. The rest
is probably fixed this way:
2010-03-13 Bruno Haible <address@hidden>
Fix compilation error with glibc >= 2.10 and g++ >= 4.4.
* build-aux/warn-on-use.h (_GL_WARN_ON_USE_CXX): New macro.
* build-aux/c++defs.h (_GL_CXXALIASWARN1): New macro.
* lib/string.in.h (memchr, memrchr, rawmemchr, strchrnul, strpbrk,
strstr, strcasestr): Use _GL_CXXALIASWARN1 instead of _GL_CXXALIASWARN
when appropriate.
Reported by Jim Meyering.
--- build-aux/c++defs.h.orig Sat Mar 13 12:02:10 2010
+++ build-aux/c++defs.h Sat Mar 13 11:39:30 2010
@@ -196,13 +196,14 @@
/* _GL_CXXALIASWARN (func);
causes a warning to be emitted when ::func is used but not when
- GNULIB_NAMESPACE::func is used. */
+ GNULIB_NAMESPACE::func is used. func must be defined without overloaded
+ variants. */
#if defined __cplusplus && defined GNULIB_NAMESPACE
# define _GL_CXXALIASWARN(func) \
- _GL_CXXALIASWARN1 (func, GNULIB_NAMESPACE)
-# define _GL_CXXALIASWARN1(func,namespace) \
- _GL_CXXALIASWARN2 (func, namespace)
-# define _GL_CXXALIASWARN2(func,namespace) \
+ _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+ _GL_CXXALIASWARN_2 (func, namespace)
+# define _GL_CXXALIASWARN_2(func,namespace) \
_GL_WARN_ON_USE (func, \
"The symbol ::" #func " refers to the system function. " \
"Use " #namespace "::" #func " instead.")
@@ -211,4 +212,22 @@
_GL_EXTERN_C int _gl_cxxalias_dummy
#endif
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+ causes a warning to be emitted when the given overloaded variant of ::func
+ is used but not when GNULIB_NAMESPACE::func is used. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+# _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+ GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace)
\
+ _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace)
\
+ _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+ "The symbol ::" #func " refers to the system function.
" \
+ "Use " #namespace "::" #func " instead.")
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
#endif /* _GL_CXXDEFS_H */
--- build-aux/warn-on-use.h.orig Sat Mar 13 12:02:10 2010
+++ build-aux/warn-on-use.h Sat Mar 13 11:30:03 2010
@@ -14,7 +14,7 @@
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-/* _GL_WARN_ON_USE(function, "literal string") issues a declaration
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
for FUNCTION which will then trigger a compiler warning containing
the text of "literal string" anywhere that function is called, if
supported by the compiler. If the compiler does not support this
@@ -73,3 +73,20 @@
extern int _gl_warn_on_use
# endif
#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
+ is like _GL_WARN_ON_USE (function, "string"), except that the function is
+ declared with the given prototype, consisting of return type, parameters,
+ and attributes.
+ This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+ not work in this case. */
+#ifndef _GL_WARN_ON_USE_CXX
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+extern rettype function parameters_and_attributes \
+ __attribute__ ((__warning__ (msg)))
+# else /* Unsupported. */
+# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+extern int _gl_warn_on_use
+# endif
+#endif
--- lib/string.in.h.orig Sat Mar 13 12:02:10 2010
+++ lib/string.in.h Sat Mar 13 12:01:00 2010
@@ -73,7 +73,14 @@
void *, (void const *__s, int __c, size_t __n),
void const *, (void const *__s, int __c, size_t __n));
# endif
+# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n));
+_GL_CXXALIASWARN1 (memchr, void const *,
+ (void const *__s, int __c, size_t __n));
+# else
_GL_CXXALIASWARN (memchr);
+# endif
#elif defined GNULIB_POSIXCHECK
# undef memchr
/* Assume memchr is always declared. */
@@ -149,7 +156,13 @@
_GL_CXXALIAS_SYS_CAST2 (memrchr,
void *, (void const *, int, size_t),
void const *, (void const *, int, size_t));
+# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t));
+_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t));
+# else
_GL_CXXALIASWARN (memrchr);
+# endif
#elif defined GNULIB_POSIXCHECK
# undef memrchr
# if HAVE_RAW_DECL_MEMRCHR
@@ -173,7 +186,13 @@
_GL_CXXALIAS_SYS_CAST2 (rawmemchr,
void *, (void const *__s, int __c_in),
void const *, (void const *__s, int __c_in));
+# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in));
+_GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in));
+# else
_GL_CXXALIASWARN (rawmemchr);
+# endif
#elif defined GNULIB_POSIXCHECK
# undef rawmemchr
# if HAVE_RAW_DECL_RAWMEMCHR
@@ -251,7 +270,13 @@
_GL_CXXALIAS_SYS_CAST2 (strchrnul,
char *, (char const *__s, int __c_in),
char const *, (char const *__s, int __c_in));
+# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in));
+_GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in));
+# else
_GL_CXXALIASWARN (strchrnul);
+# endif
#elif defined GNULIB_POSIXCHECK
# undef strchrnul
# if HAVE_RAW_DECL_STRCHRNUL
@@ -354,7 +379,14 @@
_GL_CXXALIAS_SYS_CAST2 (strpbrk,
char *, (char const *__s, char const *__accept),
const char *, (char const *__s, char const *__accept));
+# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept));
+_GL_CXXALIASWARN1 (strpbrk, char const *,
+ (char const *__s, char const *__accept));
+# else
_GL_CXXALIASWARN (strpbrk);
+# endif
# if defined GNULIB_POSIXCHECK
/* strpbrk() assumes the second argument is a list of single-byte characters.
Even in this simple case, it does not work with multibyte strings if the
@@ -449,7 +481,14 @@
char *, (const char *haystack, const char *needle),
const char *, (const char *haystack, const char
*needle));
# endif
+# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle));
+_GL_CXXALIASWARN1 (strstr, const char *,
+ (const char *haystack, const char *needle));
+# else
_GL_CXXALIASWARN (strstr);
+# endif
#elif defined GNULIB_POSIXCHECK
/* strstr() does not work with multibyte strings if the locale encoding is
different from UTF-8:
@@ -489,7 +528,14 @@
char *, (const char *haystack, const char *needle),
const char *, (const char *haystack, const char
*needle));
# endif
+# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle));
+_GL_CXXALIASWARN1 (strcasestr, const char *,
+ (const char *haystack, const char *needle));
+# else
_GL_CXXALIASWARN (strcasestr);
+# endif
#elif defined GNULIB_POSIXCHECK
/* strcasestr() does not work with multibyte strings:
It is a glibc extension, and glibc implements it only for unibyte