[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: strnlen on OSX & C++
From: |
Jarno Rajahalme |
Subject: |
Re: strnlen on OSX & C++ |
Date: |
Thu, 15 Apr 2010 12:41:50 -0700 |
Bruno,
I have those patches applied (and a up-to-date gnulib, as git diff shows
nothing), but now get a different compilation error:
In file included from main.cc:4:
../lib/string.h:684: error: 'strnlen' was not declared in this scope
../lib/string.h:684: error: invalid type in declaration before ';' token
This is the same issue as with fchownat before, and this patch makes the
compile and run successful:
$ git diff
diff --git a/lib/string.in.h b/lib/string.in.h
index de446b4..e01dbd8 100644
--- a/lib/string.in.h
+++ b/lib/string.in.h
@@ -389,7 +389,9 @@ _GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, si
# endif
_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen));
# endif
+# if @HAVE_DECL_STRNLEN@
_GL_CXXALIASWARN (strnlen);
+# endif
#elif defined GNULIB_POSIXCHECK
# undef strnlen
# if HAVE_RAW_DECL_STRNLEN
Jarno
On Apr 10, 2010, at 2:29 AM, ext Bruno Haible wrote:
> Jarno Rajahalme wrote:
>> main.cc:9: warning: call to 'rpl_strnlen' declared with attribute warning:
>> The symbol ::rpl_strnlen refers to the system function. Use
>> gnulib::rpl_strnlen instead.
>
> The problem here is that gnulib's handling of strnlen is using an ancient
> idiom. In string.in.h it uses _GL_CXXALIAS_SYS. _GL_CXXALIAS_RPL has a
> workaround against a strange behaviour of g++, but _GL_CXXALIAS_SYS doesn't.
>
> This should fix it.
>
>
> 2010-04-10 Bruno Haible <address@hidden>
>
> strnlen: Fix warning in C++ mode on MacOS X.
> * lib/string.in.h (strnlen): Use the modern idiom.
> * m4/strnlen.m4 (gl_FUNC_STRNLEN): Set REPLACE_STRNLEN to 1, instead of
> defining strnlen as a macro already in <config.h>.
> * m4/string_h.m4 (gl_HEADER_STRING_H_DEFAULTS): Initialize
> REPLACE_STRNLEN.
> * modules/string (Makefile.am): Substitute REPLACE_STRNLEN.
> Reported by Jarno Rajahalme <address@hidden>.
>
> --- lib/string.in.h.orig Sat Apr 10 11:25:04 2010
> +++ lib/string.in.h Sat Apr 10 11:22:32 2010
> @@ -372,12 +372,23 @@
> MAXLEN bytes. If no '\0' terminator is found in that many bytes,
> return MAXLEN. */
> #if @GNULIB_STRNLEN@
> -# if ! @HAVE_DECL_STRNLEN@
> +# if @REPLACE_STRNLEN@
> +# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
> +# undef strnlen
> +# define strnlen rpl_strnlen
> +# endif
> +_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__string, size_t __maxlen)
> + __attribute__ ((__pure__))
> + _GL_ARG_NONNULL ((1)));
> +_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__string, size_t __maxlen));
> +# else
> +# if ! @HAVE_DECL_STRNLEN@
> _GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, size_t __maxlen)
> __attribute__ ((__pure__))
> _GL_ARG_NONNULL ((1)));
> -# endif
> +# endif
> _GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen));
> +# endif
> _GL_CXXALIASWARN (strnlen);
> #elif defined GNULIB_POSIXCHECK
> # undef strnlen
> --- m4/string_h.m4.orig Sat Apr 10 11:25:04 2010
> +++ m4/string_h.m4 Sat Apr 10 11:23:01 2010
> @@ -5,7 +5,7 @@
> # gives unlimited permission to copy and/or distribute it,
> # with or without modifications, as long as this notice is preserved.
>
> -# serial 16
> +# serial 17
>
> # Written by Paul Eggert.
>
> @@ -105,6 +105,7 @@
> REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR])
> REPLACE_STRNCAT=0; AC_SUBST([REPLACE_STRNCAT])
> REPLACE_STRNDUP=0; AC_SUBST([REPLACE_STRNDUP])
> + REPLACE_STRNLEN=0; AC_SUBST([REPLACE_STRNLEN])
> REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL])
> REPLACE_STRTOK_R=0; AC_SUBST([REPLACE_STRTOK_R])
> UNDEFINE_STRTOK_R=0; AC_SUBST([UNDEFINE_STRTOK_R])
> --- m4/strnlen.m4.orig Sat Apr 10 11:25:04 2010
> +++ m4/strnlen.m4 Sat Apr 10 11:24:45 2010
> @@ -1,4 +1,4 @@
> -# strnlen.m4 serial 10
> +# strnlen.m4 serial 11
> dnl Copyright (C) 2002-2003, 2005-2007, 2009-2010 Free Software Foundation,
> dnl Inc.
> dnl This file is free software; the Free Software Foundation
> @@ -7,10 +7,11 @@
>
> AC_DEFUN([gl_FUNC_STRNLEN],
> [
> + AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
> +
> dnl Persuade glibc <string.h> to declare strnlen().
> AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
>
> - AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
> AC_CHECK_DECLS_ONCE([strnlen])
> if test $ac_cv_have_decl_strnlen = no; then
> HAVE_DECL_STRNLEN=0
> @@ -18,12 +19,11 @@
>
> AC_FUNC_STRNLEN
> if test $ac_cv_func_strnlen_working = no; then
> + REPLACE_STRNLEN=1
> # This is necessary because automake-1.6.1 doesn't understand
> # that the above use of AC_FUNC_STRNLEN means we may have to use
> # lib/strnlen.c.
> #AC_LIBOBJ([strnlen])
> - AC_DEFINE([strnlen], [rpl_strnlen],
> - [Define to rpl_strnlen if the replacement function should be used.])
> gl_PREREQ_STRNLEN
> fi
> ])
> --- modules/string.orig Sat Apr 10 11:25:04 2010
> +++ modules/string Sat Apr 10 11:23:17 2010
> @@ -89,6 +89,7 @@
> -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
> -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \
> -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \
> + -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \
> -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
> -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
> -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
Re: strnlen on OSX & C++, Bruno Haible, 2010/04/10
Re: gnulib bugs on OSX & C++, Bruno Haible, 2010/04/10
Re: gnulib bugs on OSX & C++, Bruno Haible, 2010/04/10