bug-gnulib
[Top][All Lists]
Advanced

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

fix compilation errors in C++ mode on Solaris 10 and Solaris 11


From: Bruno Haible
Subject: fix compilation errors in C++ mode on Solaris 10 and Solaris 11
Date: Thu, 05 Dec 2019 22:39:58 +0100
User-agent: KMail/5.1.3 (Linux/4.4.0-166-generic; KDE/5.18.0; x86_64; ; )

A testdir built with
  ./gnulib-tool --create-testdir --dir=../testdir1 --single-configure 
--with-c++-tests `./posix-modules`
does not compile on Solaris 10 with CC="cc -O" and CXX="CC -O":

gmake[4]: Entering directory '/home/haible/testdir1/build-sparc-64-cc/gltests'
source='../../gltests/test-math-c++.cc' object='test-math-c++.o' libtool=no \
DEPDIR=.deps depmode=none /bin/bash ../../build-aux/depcomp \
CC -xarch=generic64 -O -DHAVE_CONFIG_H -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/prefix-sparc64/include -D_REENTRANT   -c -o test-math-c++.o 
../../gltests/test-math-c++.cc
"../gllib/math.h", line 2724: Error: The function "isfinite" must have a 
prototype.
"../gllib/math.h", line 2724: Error: The function "isfinite" must have a 
prototype.
"../gllib/math.h", line 2724: Error: The function "isfinite" must have a 
prototype.
"../gllib/math.h", line 2758: Error: The function "isinf" must have a prototype.
"../gllib/math.h", line 2758: Error: The function "isinf" must have a prototype.
"../gllib/math.h", line 2758: Error: The function "isinf" must have a prototype.
"../gllib/math.h", line 2966: Error: The function "signbit" must have a 
prototype.
"../gllib/math.h", line 2966: Error: The function "signbit" must have a 
prototype.
"../gllib/math.h", line 2966: Error: The function "signbit" must have a 
prototype.
9 Error(s) and 88 Warning(s) detected.
gmake[4]: *** [Makefile:9711: test-math-c++.o] Error 9

source='../../gltests/test-pthread-c++.cc' object='test-pthread-c++.o' 
libtool=no \
DEPDIR=.deps depmode=none /bin/bash ../../build-aux/depcomp \
CC -xarch=generic64 -O -DHAVE_CONFIG_H -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/prefix-sparc64/include -D_REENTRANT   -c -o test-pthread-c++.o 
../../gltests/test-pthread-c++.cc
"../gllib/pthread.h", line 983: Error: Cannot return extern "C" 
int(*)(unsigned*,const _pthread_attr*,extern "C" void*(*)(void*),void*) from a 
function that should return int(*)(unsigned*,const 
_pthread_attr*,void*(*)(void*),void*).
"../gllib/pthread.h", line 1237: Error: Cannot return extern "C" 
int(*)(_once*,extern "C" void(*)()) from a function that should return 
int(*)(_once*,void(*)()).
"../gllib/pthread.h", line 2111: Error: Cannot return extern "C" 
int(*)(unsigned*,extern "C" void(*)(void*)) from a function that should return 
int(*)(unsigned*,void(*)(void*)).
3 Error(s) and 48 Warning(s) detected.
gmake[4]: *** [Makefile:9711: test-pthread-c++.o] Error 3

source='../../gltests/test-threads-c++.cc' object='test-threads-c++.o' 
libtool=no \
DEPDIR=.deps depmode=none /bin/bash ../../build-aux/depcomp \
CC -xarch=generic64 -O -DHAVE_CONFIG_H -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/prefix-sparc64/include -D_REENTRANT   -c -o test-threads-c++.o 
../../gltests/test-threads-c++.cc
"../gllib/threads.h", line 953: Error: Cannot return extern "C" 
void(*)(_once*,extern "C" void(*)()) from a function that should return 
void(*)(_once*,void(*)()).
4 Error(s) and 81 Warning(s) detected.
gmake[4]: *** [Makefile:9711: test-threads-c++.o] Error 4

Regarding the first problem, e.g. isfinite is not declared in C++ mode. We
need to provide the gnulib replacement, even though this would not be
necessary in packages that don't use C++.

The second and third problems are that the compiler distinguishes C function
pointers and C++ function pointers, even if they have the same arguments and
return types. AFAIK, such a distinction is not necessary in practice: such
function pointers are interchangeable. So let's use a cast.

On Solaris 11, I also got a compilation error regarding iconv. Apparently
the #ifs in the system's <iconv.h> pick a different declaration of iconv()
in C++ mode than in C mode, and since our autoconf tests that determine
ICONV_CONST run with the C compiler, ... - We need a cast here as well.


2019-12-05  Bruno Haible  <address@hidden>

        Fix compilation errors in C++ mode on Solaris 10 and Solaris 11.
        * m4/isfinite.m4 (gl_ISFINITE): Require AC_CANONICAL_HOST. On Solaris,
        set REPLACE_ISFINITE to 1.
        * m4/isinf.m4 (gl_ISINF): Require AC_CANONICAL_HOST. On Solaris, set
        REPLACE_ISINF to 1.
        * m4/signbit.m4 (gl_SIGNBIT): On Solaris, set REPLACE_SIGNBIT to 1.
        * lib/pthread.in.h (pthread_create, pthread_once, pthread_key_create):
        Use _GL_CXXALIAS_SYS_CAST instead of _GL_CXXALIAS_SYS.
        * lib/threads.in.h (call_once): Likewise.
        * lib/iconv.in.h (iconv): Likewise.

diff --git a/lib/iconv.in.h b/lib/iconv.in.h
index f244f87..62e6986 100644
--- a/lib/iconv.in.h
+++ b/lib/iconv.in.h
@@ -87,10 +87,12 @@ _GL_CXXALIAS_RPL (iconv, size_t,
                    @ICONV_CONST@ char **inbuf, size_t *inbytesleft,
                    char **outbuf, size_t *outbytesleft));
 # else
-_GL_CXXALIAS_SYS (iconv, size_t,
-                  (iconv_t cd,
-                   @ICONV_CONST@ char **inbuf, size_t *inbytesleft,
-                   char **outbuf, size_t *outbytesleft));
+/* Need to cast, because on some versions of Solaris, ICONV_CONST does
+   not have the right value for C++.  */
+_GL_CXXALIAS_SYS_CAST (iconv, size_t,
+                       (iconv_t cd,
+                        @ICONV_CONST@ char **inbuf, size_t *inbytesleft,
+                        char **outbuf, size_t *outbytesleft));
 # endif
 _GL_CXXALIASWARN (iconv);
 # ifndef ICONV_CONST
diff --git a/lib/pthread.in.h b/lib/pthread.in.h
index a2c76e4..4ba7e7b 100644
--- a/lib/pthread.in.h
+++ b/lib/pthread.in.h
@@ -464,9 +464,9 @@ _GL_FUNCDECL_SYS (pthread_create, int,
                    void * (*mainfunc) (void *), void *arg)
                   _GL_ARG_NONNULL ((1, 3)));
 #  endif
-_GL_CXXALIAS_SYS (pthread_create, int,
-                  (pthread_t *threadp, const pthread_attr_t *attr,
-                   void * (*mainfunc) (void *), void *arg));
+_GL_CXXALIAS_SYS_CAST (pthread_create, int,
+                       (pthread_t *threadp, const pthread_attr_t *attr,
+                        void * (*mainfunc) (void *), void *arg));
 # endif
 _GL_CXXALIASWARN (pthread_create);
 #elif defined GNULIB_POSIXCHECK
@@ -721,8 +721,9 @@ _GL_FUNCDECL_SYS (pthread_once, int,
                   (pthread_once_t *once_control, void (*initfunction) (void))
                    _GL_ARG_NONNULL ((1, 2)));
 #  endif
-_GL_CXXALIAS_SYS (pthread_once, int,
-                  (pthread_once_t *once_control, void (*initfunction) (void)));
+_GL_CXXALIAS_SYS_CAST (pthread_once, int,
+                       (pthread_once_t *once_control,
+                        void (*initfunction) (void)));
 # endif
 _GL_CXXALIASWARN (pthread_once);
 #elif defined GNULIB_POSIXCHECK
@@ -1595,8 +1596,8 @@ _GL_FUNCDECL_SYS (pthread_key_create, int,
                   (pthread_key_t *keyp, void (*destructor) (void *))
                   _GL_ARG_NONNULL ((1)));
 #  endif
-_GL_CXXALIAS_SYS (pthread_key_create, int,
-                  (pthread_key_t *keyp, void (*destructor) (void *)));
+_GL_CXXALIAS_SYS_CAST (pthread_key_create, int,
+                       (pthread_key_t *keyp, void (*destructor) (void *)));
 # endif
 _GL_CXXALIASWARN (pthread_key_create);
 #elif defined GNULIB_POSIXCHECK
diff --git a/lib/threads.in.h b/lib/threads.in.h
index 1d28351..3136257 100644
--- a/lib/threads.in.h
+++ b/lib/threads.in.h
@@ -438,7 +438,7 @@ typedef pthread_once_t once_flag;
 _GL_FUNCDECL_SYS (call_once, void, (once_flag *, void (*) (void))
                                    _GL_ARG_NONNULL ((1, 2)));
 # endif
-_GL_CXXALIAS_SYS (call_once, void, (once_flag *, void (*) (void)));
+_GL_CXXALIAS_SYS_CAST (call_once, void, (once_flag *, void (*) (void)));
 _GL_CXXALIASWARN (call_once);
 #elif defined GNULIB_POSIXCHECK
 # undef call_once
diff --git a/m4/isfinite.m4 b/m4/isfinite.m4
index e2a0234..1eb6c0b 100644
--- a/m4/isfinite.m4
+++ b/m4/isfinite.m4
@@ -1,4 +1,4 @@
-# isfinite.m4 serial 16
+# isfinite.m4 serial 17
 dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -7,6 +7,7 @@ dnl with or without modifications, as long as this notice is 
preserved.
 AC_DEFUN([gl_ISFINITE],
 [
   AC_REQUIRE([gl_MATH_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
   dnl Persuade glibc <math.h> to declare isfinite.
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
   AC_CHECK_DECLS([isfinite], , , [[#include <math.h>]])
@@ -25,8 +26,13 @@ AC_DEFUN([gl_ISFINITE],
       dnl isfinite(long double) also does not work in this situation.
     fi
   fi
-  if test "$ac_cv_have_decl_isfinite" != yes ||
-     test "$ISFINITE_LIBM" = missing; then
+  dnl On Solaris 10, with CC in C++ mode, isfinite is not available although
+  dnl is with cc in C mode. This cannot be worked around by defining
+  dnl _XOPEN_SOURCE=600, because the latter does not work in C++ mode on
+  dnl Solaris 11.0. Therefore use the replacement functions on Solaris.
+  if test "$ac_cv_have_decl_isfinite" != yes \
+     || test "$ISFINITE_LIBM" = missing \
+     || { case "$host_os" in solaris*) true;; *) false;; esac; }; then
     REPLACE_ISFINITE=1
     dnl No libraries are needed to link lib/isfinite.c.
     ISFINITE_LIBM=
diff --git a/m4/isinf.m4 b/m4/isinf.m4
index 9bafc53..920be7e 100644
--- a/m4/isinf.m4
+++ b/m4/isinf.m4
@@ -1,4 +1,4 @@
-# isinf.m4 serial 12
+# isinf.m4 serial 13
 dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -7,6 +7,7 @@ dnl with or without modifications, as long as this notice is 
preserved.
 AC_DEFUN([gl_ISINF],
 [
   AC_REQUIRE([gl_MATH_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
   dnl Persuade glibc <math.h> to declare isinf.
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
   AC_CHECK_DECLS([isinf], , ,
@@ -26,8 +27,13 @@ AC_DEFUN([gl_ISINF],
       esac
     fi
   fi
-  if test "$ac_cv_have_decl_isinf" != yes ||
-     test "$ISINF_LIBM" = missing; then
+  dnl On Solaris 10, with CC in C++ mode, isinf is not available although
+  dnl is with cc in C mode. This cannot be worked around by defining
+  dnl _XOPEN_SOURCE=600, because the latter does not work in C++ mode on
+  dnl Solaris 11.0. Therefore use the replacement functions on Solaris.
+  if test "$ac_cv_have_decl_isinf" != yes \
+     || test "$ISINF_LIBM" = missing \
+     || { case "$host_os" in solaris*) true;; *) false;; esac; }; then
     REPLACE_ISINF=1
     dnl No libraries are needed to link lib/isinf.c.
     ISINF_LIBM=
diff --git a/m4/signbit.m4 b/m4/signbit.m4
index 097682b..2718aef 100644
--- a/m4/signbit.m4
+++ b/m4/signbit.m4
@@ -1,4 +1,4 @@
-# signbit.m4 serial 18
+# signbit.m4 serial 19
 dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -7,7 +7,7 @@ dnl with or without modifications, as long as this notice is 
preserved.
 AC_DEFUN([gl_SIGNBIT],
 [
   AC_REQUIRE([gl_MATH_H_DEFAULTS])
-  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_REQUIRE([AC_CANONICAL_HOST])
   AC_CACHE_CHECK([for signbit macro], [gl_cv_func_signbit],
     [
       AC_RUN_IFELSE(
@@ -90,79 +90,90 @@ AC_DEFUN([gl_SIGNBIT],
         *)
           dnl REPLACE_SIGNBIT=1 makes sure the signbit[fdl] functions get 
built.
           REPLACE_SIGNBIT=1
-          gl_FLOAT_SIGN_LOCATION
-          gl_DOUBLE_SIGN_LOCATION
-          gl_LONG_DOUBLE_SIGN_LOCATION
-          if test "$gl_cv_cc_float_signbit" = unknown; then
-            dnl Test whether copysignf() is declared.
-            AC_CHECK_DECLS([copysignf], , , [[#include <math.h>]])
-            if test "$ac_cv_have_decl_copysignf" = yes; then
-              dnl Test whether copysignf() can be used without libm.
-              AC_CACHE_CHECK([whether copysignf can be used without linking 
with libm],
-                [gl_cv_func_copysignf_no_libm],
-                [
-                  AC_LINK_IFELSE(
-                    [AC_LANG_PROGRAM(
-                       [[#include <math.h>
-                         float x, y;]],
-                       [[return copysignf (x, y) < 0;]])],
-                    [gl_cv_func_copysignf_no_libm=yes],
-                    [gl_cv_func_copysignf_no_libm=no])
-                ])
-              if test $gl_cv_func_copysignf_no_libm = yes; then
-                AC_DEFINE([HAVE_COPYSIGNF_IN_LIBC], [1],
-                  [Define if the copysignf function is declared in <math.h> 
and available in libc.])
-              fi
-            fi
-          fi
-          if test "$gl_cv_cc_double_signbit" = unknown; then
-            dnl Test whether copysign() is declared.
-            AC_CHECK_DECLS([copysign], , , [[#include <math.h>]])
-            if test "$ac_cv_have_decl_copysign" = yes; then
-              dnl Test whether copysign() can be used without libm.
-              AC_CACHE_CHECK([whether copysign can be used without linking 
with libm],
-                [gl_cv_func_copysign_no_libm],
-                [
-                  AC_LINK_IFELSE(
-                    [AC_LANG_PROGRAM(
-                       [[#include <math.h>
-                         double x, y;]],
-                       [[return copysign (x, y) < 0;]])],
-                    [gl_cv_func_copysign_no_libm=yes],
-                    [gl_cv_func_copysign_no_libm=no])
-                ])
-              if test $gl_cv_func_copysign_no_libm = yes; then
-                AC_DEFINE([HAVE_COPYSIGN_IN_LIBC], [1],
-                  [Define if the copysign function is declared in <math.h> and 
available in libc.])
-              fi
-            fi
-          fi
-          if test "$gl_cv_cc_long_double_signbit" = unknown; then
-            dnl Test whether copysignl() is declared.
-            AC_CHECK_DECLS([copysignl], , , [[#include <math.h>]])
-            if test "$ac_cv_have_decl_copysignl" = yes; then
-              dnl Test whether copysignl() can be used without libm.
-              AC_CACHE_CHECK([whether copysignl can be used without linking 
with libm],
-                [gl_cv_func_copysignl_no_libm],
-                [
-                  AC_LINK_IFELSE(
-                    [AC_LANG_PROGRAM(
-                       [[#include <math.h>
-                         long double x, y;]],
-                       [[return copysignl (x, y) < 0;]])],
-                    [gl_cv_func_copysignl_no_libm=yes],
-                    [gl_cv_func_copysignl_no_libm=no])
-                ])
-              if test $gl_cv_func_copysignl_no_libm = yes; then
-                AC_DEFINE([HAVE_COPYSIGNL_IN_LIBC], [1],
-                  [Define if the copysignl function is declared in <math.h> 
and available in libc.])
-              fi
-            fi
-          fi
           ;;
       esac
       ;;
   esac
+  dnl On Solaris 10, with CC in C++ mode, signbit is not available although
+  dnl is with cc in C mode. This cannot be worked around by defining
+  dnl _XOPEN_SOURCE=600, because the latter does not work in C++ mode on
+  dnl Solaris 11.0. Therefore use the replacement functions on Solaris.
+  case "$host_os" in
+    solaris*)
+      REPLACE_SIGNBIT=1
+      ;;
+  esac
+  if test $REPLACE_SIGNBIT = 1; then
+    gl_FLOAT_SIGN_LOCATION
+    gl_DOUBLE_SIGN_LOCATION
+    gl_LONG_DOUBLE_SIGN_LOCATION
+    if test "$gl_cv_cc_float_signbit" = unknown; then
+      dnl Test whether copysignf() is declared.
+      AC_CHECK_DECLS([copysignf], , , [[#include <math.h>]])
+      if test "$ac_cv_have_decl_copysignf" = yes; then
+        dnl Test whether copysignf() can be used without libm.
+        AC_CACHE_CHECK([whether copysignf can be used without linking with 
libm],
+          [gl_cv_func_copysignf_no_libm],
+          [
+            AC_LINK_IFELSE(
+              [AC_LANG_PROGRAM(
+                 [[#include <math.h>
+                   float x, y;]],
+                 [[return copysignf (x, y) < 0;]])],
+              [gl_cv_func_copysignf_no_libm=yes],
+              [gl_cv_func_copysignf_no_libm=no])
+          ])
+        if test $gl_cv_func_copysignf_no_libm = yes; then
+          AC_DEFINE([HAVE_COPYSIGNF_IN_LIBC], [1],
+            [Define if the copysignf function is declared in <math.h> and 
available in libc.])
+        fi
+      fi
+    fi
+    if test "$gl_cv_cc_double_signbit" = unknown; then
+      dnl Test whether copysign() is declared.
+      AC_CHECK_DECLS([copysign], , , [[#include <math.h>]])
+      if test "$ac_cv_have_decl_copysign" = yes; then
+        dnl Test whether copysign() can be used without libm.
+        AC_CACHE_CHECK([whether copysign can be used without linking with 
libm],
+          [gl_cv_func_copysign_no_libm],
+          [
+            AC_LINK_IFELSE(
+              [AC_LANG_PROGRAM(
+                 [[#include <math.h>
+                   double x, y;]],
+                 [[return copysign (x, y) < 0;]])],
+              [gl_cv_func_copysign_no_libm=yes],
+              [gl_cv_func_copysign_no_libm=no])
+          ])
+        if test $gl_cv_func_copysign_no_libm = yes; then
+          AC_DEFINE([HAVE_COPYSIGN_IN_LIBC], [1],
+            [Define if the copysign function is declared in <math.h> and 
available in libc.])
+        fi
+      fi
+    fi
+    if test "$gl_cv_cc_long_double_signbit" = unknown; then
+      dnl Test whether copysignl() is declared.
+      AC_CHECK_DECLS([copysignl], , , [[#include <math.h>]])
+      if test "$ac_cv_have_decl_copysignl" = yes; then
+        dnl Test whether copysignl() can be used without libm.
+        AC_CACHE_CHECK([whether copysignl can be used without linking with 
libm],
+          [gl_cv_func_copysignl_no_libm],
+          [
+            AC_LINK_IFELSE(
+              [AC_LANG_PROGRAM(
+                 [[#include <math.h>
+                   long double x, y;]],
+                 [[return copysignl (x, y) < 0;]])],
+              [gl_cv_func_copysignl_no_libm=yes],
+              [gl_cv_func_copysignl_no_libm=no])
+          ])
+        if test $gl_cv_func_copysignl_no_libm = yes; then
+          AC_DEFINE([HAVE_COPYSIGNL_IN_LIBC], [1],
+            [Define if the copysignl function is declared in <math.h> and 
available in libc.])
+        fi
+      fi
+    fi
+  fi
 ])
 
 AC_DEFUN([gl_SIGNBIT_TEST_PROGRAM], [[




reply via email to

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