bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: wctype.h compile error on mingw with GNULIB_NAMESPACE


From: Christian Biesinger
Subject: Re: wctype.h compile error on mingw with GNULIB_NAMESPACE
Date: Sat, 16 Nov 2019 22:40:52 -0600

On Sat, Nov 16, 2019 at 9:05 PM Bruno Haible <address@hidden> wrote:
>
> Hello Christian,
>
> > Specifically, this testcase:
> >
> > #define GNULIB_NAMESPACE gnulib
> > #include "gnulib/config.h"
> > #include "wctype.h"
> >
> > x86_64-w64-mingw32-g++ -c test.cc -I build/gnulib/import/ -I
> > binutils-gdb/gnulib/import/
> >
> > Fails with errors like:
> > gnulib/import/wctype.h: In member function
> > ‘gnulib::_gl_iswalnum_wrapper::operator
> > gnulib::_gl_iswalnum_wrapper::type() const’:
> > gnulib/import/wctype.h:856:1: error: invalid conversion from ‘int
> > (*)(wint_t)’ {aka ‘int (*)(short unsigned int)’} to
> > ‘gnulib::_gl_iswalnum_wrapper::type’ {aka ‘int (*)(unsigned int)’}
> > [-fpermissive]
> >  _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
> >  ^~~~~~~~~~~~~~~~
> >
> > (and followed by many other is* functions)
>
> Fixed through the following patch.

Thanks for your quick patches! This solves the problem for me.

Christian

> 2019-11-16  Bruno Haible  <address@hidden>
>
>         wctype-h: When overriding wint_t, override also the related functions.
>         Reported by Christian Biesinger <address@hidden> in
>         <https://lists.gnu.org/archive/html/bug-gnulib/2019-11/msg00027.html>.
>         * m4/wctype_h.m4 (gl_WCTYPE_H): When GNULIB_OVERRIDES_WINT_T is 1, set
>         REPLACE_ISWCNTRL to 1.
>         * lib/wctype.in.h (rpl_iswalnum, rpl_iswalpha, rpl_iswblank,
>         rpl_iswcntrl, rpl_iswdigit, rpl_iswgraph, rpl_iswlower, rpl_iswprint,
>         rpl_iswpunct, rpl_iswspace, rpl_iswupper, rpl_iswxdigit, rpl_towlower,
>         rpl_towupper): New definitions when GNULIB_OVERRIDES_WINT_T is 1.
>         * doc/posix-headers/wchar.texi: Mention that wint_t is also overridden
>         on mingw.
>         * doc/posix-headers/wctype.texi: Likewise.
>
> diff --git a/doc/posix-headers/wchar.texi b/doc/posix-headers/wchar.texi
> index 5336d6b..6a94f13 100644
> --- a/doc/posix-headers/wchar.texi
> +++ b/doc/posix-headers/wchar.texi
> @@ -12,7 +12,7 @@ This header file cannot be included on some platforms:
>  Linux uClibc built without wide character support.
>  @item
>  The type @code{wint_t} is incorrect on some platforms:
> -MSVC 14.
> +mingw, MSVC 14.
>
>  @item
>  Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
> diff --git a/doc/posix-headers/wctype.texi b/doc/posix-headers/wctype.texi
> index e288094..b97d491 100644
> --- a/doc/posix-headers/wctype.texi
> +++ b/doc/posix-headers/wctype.texi
> @@ -12,7 +12,7 @@ This header file is missing on some platforms:
>  HP-UX 11.00.
>  @item
>  The type @code{wint_t} is incorrect on some platforms:
> -MSVC 14.
> +mingw, MSVC 14.
>  @item
>  The functions @code{isw*} are missing on some platforms:
>  FreeBSD 4.11.
> diff --git a/lib/wctype.in.h b/lib/wctype.in.h
> index 3cd568e..1a04742 100644
> --- a/lib/wctype.in.h
> +++ b/lib/wctype.in.h
> @@ -133,33 +133,113 @@ typedef unsigned int rpl_wint_t;
>
>  /* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
>     Linux libc5 has <wctype.h> and the functions but they are broken.
> +   mingw and MSVC have <wctype.h> and the functions but they take a wchar_t
> +   as argument, not an rpl_wint_t.
>     Assume all 11 functions (all isw* except iswblank) are implemented the
>     same way, or not at all.  */
>  # if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
>
> -/* IRIX 5.3 has macros but no functions, its isw* macros refer to an
> -   undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
> -   refer to system functions like _iswctype that are not in the
> -   standard C library.  Rather than try to get ancient buggy
> -   implementations like this to work, just disable them.  */
> -#  undef iswalnum
> -#  undef iswalpha
> -#  undef iswblank
> -#  undef iswcntrl
> -#  undef iswdigit
> -#  undef iswgraph
> -#  undef iswlower
> -#  undef iswprint
> -#  undef iswpunct
> -#  undef iswspace
> -#  undef iswupper
> -#  undef iswxdigit
> -#  undef towlower
> -#  undef towupper
> +#  if @GNULIB_OVERRIDES_WINT_T@ /* implies @REPLACE_ISWCNTRL@ */
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswalnum (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswalnum ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswalpha (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswalpha ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswblank (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswblank ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswcntrl (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswcntrl ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswdigit (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswdigit ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswgraph (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswgraph ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswlower (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswlower ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswprint (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswprint ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswpunct (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswpunct ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswspace (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswspace ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswupper (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswupper ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE int
> +rpl_iswxdigit (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? iswxdigit ((wchar_t) wc) : 0);
> +}
> +
> +_GL_WCTYPE_INLINE wint_t
> +rpl_towlower (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? (wchar_t) towlower ((wchar_t) wc) : wc);
> +}
> +
> +_GL_WCTYPE_INLINE wint_t
> +rpl_towupper (wint_t wc)
> +{
> +  return ((wchar_t) wc == wc ? (wchar_t) towupper ((wchar_t) wc) : wc);
> +}
>
> -/* Linux libc5 has <wctype.h> and the functions but they are broken.  */
> -#  if @REPLACE_ISWCNTRL@
>  #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
> +#    undef iswalnum
> +#    undef iswalpha
> +#    undef iswblank
> +#    undef iswcntrl
> +#    undef iswdigit
> +#    undef iswgraph
> +#    undef iswlower
> +#    undef iswprint
> +#    undef iswpunct
> +#    undef iswspace
> +#    undef iswupper
> +#    undef iswxdigit
> +#    undef towlower
> +#    undef towupper
>  #    define iswalnum rpl_iswalnum
>  #    define iswalpha rpl_iswalpha
>  #    define iswblank rpl_iswblank
> @@ -172,21 +252,62 @@ typedef unsigned int rpl_wint_t;
>  #    define iswspace rpl_iswspace
>  #    define iswupper rpl_iswupper
>  #    define iswxdigit rpl_iswxdigit
> -#   endif
> -#  endif
> -#  if @REPLACE_TOWLOWER@
> -#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
>  #    define towlower rpl_towlower
>  #    define towupper rpl_towupper
>  #   endif
> -#  endif
> +
> +#  else
> +
> +/* IRIX 5.3 has macros but no functions, its isw* macros refer to an
> +   undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
> +   refer to system functions like _iswctype that are not in the
> +   standard C library.  Rather than try to get ancient buggy
> +   implementations like this to work, just disable them.  */
> +#   undef iswalnum
> +#   undef iswalpha
> +#   undef iswblank
> +#   undef iswcntrl
> +#   undef iswdigit
> +#   undef iswgraph
> +#   undef iswlower
> +#   undef iswprint
> +#   undef iswpunct
> +#   undef iswspace
> +#   undef iswupper
> +#   undef iswxdigit
> +#   undef towlower
> +#   undef towupper
> +
> +/* Linux libc5 has <wctype.h> and the functions but they are broken.  */
> +#   if @REPLACE_ISWCNTRL@
> +#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
> +#     define iswalnum rpl_iswalnum
> +#     define iswalpha rpl_iswalpha
> +#     define iswblank rpl_iswblank
> +#     define iswcntrl rpl_iswcntrl
> +#     define iswdigit rpl_iswdigit
> +#     define iswgraph rpl_iswgraph
> +#     define iswlower rpl_iswlower
> +#     define iswprint rpl_iswprint
> +#     define iswpunct rpl_iswpunct
> +#     define iswspace rpl_iswspace
> +#     define iswupper rpl_iswupper
> +#     define iswxdigit rpl_iswxdigit
> +#    endif
> +#   endif
> +#   if @REPLACE_TOWLOWER@
> +#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
> +#     define towlower rpl_towlower
> +#     define towupper rpl_towupper
> +#    endif
> +#   endif
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswalnum
> -#  else
> +#   else
>  iswalnum
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return ((wc >= '0' && wc <= '9')
> @@ -194,88 +315,88 @@ iswalnum
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswalpha
> -#  else
> +#   else
>  iswalpha
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswblank
> -#  else
> +#   else
>  iswblank
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return wc == ' ' || wc == '\t';
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswcntrl
> -#  else
> +#   else
>  iswcntrl
> -#  endif
> +#   endif
>          (wint_t wc)
>  {
>    return (wc & ~0x1f) == 0 || wc == 0x7f;
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswdigit
> -#  else
> +#   else
>  iswdigit
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return wc >= '0' && wc <= '9';
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswgraph
> -#  else
> +#   else
>  iswgraph
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return wc >= '!' && wc <= '~';
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswlower
> -#  else
> +#   else
>  iswlower
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return wc >= 'a' && wc <= 'z';
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswprint
> -#  else
> +#   else
>  iswprint
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return wc >= ' ' && wc <= '~';
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswpunct
> -#  else
> +#   else
>  iswpunct
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return (wc >= '!' && wc <= '~'
> @@ -284,11 +405,11 @@ iswpunct
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswspace
> -#  else
> +#   else
>  iswspace
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return (wc == ' ' || wc == '\t'
> @@ -296,22 +417,22 @@ iswspace
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswupper
> -#  else
> +#   else
>  iswupper
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return wc >= 'A' && wc <= 'Z';
>  }
>
>  _GL_WCTYPE_INLINE int
> -#  if @REPLACE_ISWCNTRL@
> +#   if @REPLACE_ISWCNTRL@
>  rpl_iswxdigit
> -#  else
> +#   else
>  iswxdigit
> -#  endif
> +#   endif
>            (wint_t wc)
>  {
>    return ((wc >= '0' && wc <= '9')
> @@ -319,27 +440,29 @@ iswxdigit
>  }
>
>  _GL_WCTYPE_INLINE wint_t
> -#  if @REPLACE_TOWLOWER@
> +#   if @REPLACE_TOWLOWER@
>  rpl_towlower
> -#  else
> +#   else
>  towlower
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
>  }
>
>  _GL_WCTYPE_INLINE wint_t
> -#  if @REPLACE_TOWLOWER@
> +#   if @REPLACE_TOWLOWER@
>  rpl_towupper
> -#  else
> +#   else
>  towupper
> -#  endif
> +#   endif
>           (wint_t wc)
>  {
>    return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
>  }
>
> +#  endif
> +
>  # elif @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@)
>  /* Only the iswblank function is missing.  */
>
> @@ -354,7 +477,7 @@ _GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
>
>  # endif
>
> -# if defined __MINGW32__
> +# if defined __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@
>
>  /* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
>     The functions towlower and towupper are implemented in the MSVCRT library
> @@ -387,7 +510,7 @@ rpl_towupper (wint_t wc)
>  #   define towupper rpl_towupper
>  #  endif
>
> -# endif /* __MINGW32__ */
> +# endif /* __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@ */
>
>  # define GNULIB_defined_wctype_functions 1
>  #endif
> diff --git a/m4/wctype_h.m4 b/m4/wctype_h.m4
> index 6903d75..d5acb72 100644
> --- a/m4/wctype_h.m4
> +++ b/m4/wctype_h.m4
> @@ -1,4 +1,4 @@
> -# wctype_h.m4 serial 21
> +# wctype_h.m4 serial 22
>
>  dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it.
>
> @@ -69,10 +69,14 @@ AC_DEFUN([gl_WCTYPE_H],
>    fi
>    AC_SUBST([HAVE_WCTYPE_H])
>
> -  case "$gl_cv_func_iswcntrl_works" in
> -    *yes) REPLACE_ISWCNTRL=0 ;;
> -    *)    REPLACE_ISWCNTRL=1 ;;
> -  esac
> +  if test $GNULIB_OVERRIDES_WINT_T = 1; then
> +    REPLACE_ISWCNTRL=1
> +  else
> +    case "$gl_cv_func_iswcntrl_works" in
> +      *yes) REPLACE_ISWCNTRL=0 ;;
> +      *)    REPLACE_ISWCNTRL=1 ;;
> +    esac
> +  fi
>    AC_SUBST([REPLACE_ISWCNTRL])
>
>    if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]