]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Check for C99 compatible compiler
authorOndřej Surý <ondrej@sury.org>
Tue, 24 Jul 2018 12:42:20 +0000 (14:42 +0200)
committerOndřej Surý <ondrej@sury.org>
Fri, 10 Aug 2018 09:42:43 +0000 (11:42 +0200)
(cherry picked from commit 9e493798c6143bdef738385f0942661f9c9d03b7)
(cherry picked from commit ee22f606ae0d02a15c4789753200e26353f6a29b)

config.h.in
configure
configure.in

index e1364dd9211fd7d9ad84c2827dddf12b90a5847b..b6f1a2894da9120c64c82bded265751d270a0493 100644 (file)
@@ -519,6 +519,9 @@ int sigwait(const unsigned int *set, int *sig);
 /* Define if running under Compaq TruCluster */
 #undef HAVE_TRUCLUSTER
 
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef HAVE_UINTPTR_T
+
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
@@ -642,7 +645,8 @@ int sigwait(const unsigned int *set, int *sig);
 /* Define to `int' if <sys/types.h> does not define. */
 #undef ssize_t
 
-/* Define to `unsigned long' if <sys/types.h> does not define. */
+/* Define to the type of an unsigned integer type wide enough to hold a
+   pointer, if such a type exists, and if the system does not define it. */
 #undef uintptr_t
 
 /* Define to empty if the keyword `volatile' does not work. Warning: valid
index abaff6aba1dc4a777406899ad52eb77df27effe6..3460ddf14948f4529204b62ea6706aed07f9312f 100755 (executable)
--- a/configure
+++ b/configure
@@ -12686,52 +12686,6 @@ case "$INSTALL" in
                ;;
 esac
 
-#
-# On these hosts, we really want to use cc, not gcc, even if it is
-# found.  The gcc that these systems have will not correctly handle
-# pthreads.
-#
-# However, if the user sets $CC to be something, let that override
-# our change.
-#
-if test "X$CC" = "X" ; then
-       case "$host" in
-               *-dec-osf*)
-                       CC="cc"
-                       ;;
-               *-solaris*)
-                       # Use Sun's cc if it is available, but watch
-                       # out for /usr/ucb/cc; it will never be the right
-                       # compiler to use.
-                       #
-                       # If setting CC here fails, the AC_PROG_CC done
-                       # below might still find gcc.
-                       IFS="${IFS=     }"; ac_save_ifs="$IFS"; IFS=":"
-                       for ac_dir in $PATH; do
-                               test -z "$ac_dir" && ac_dir=.
-                               case "$ac_dir" in
-                               /usr/ucb)
-                                       # exclude
-                                       ;;
-                               *)
-                                       if test -f "$ac_dir/cc"; then
-                                               CC="$ac_dir/cc"
-                                               break
-                                       fi
-                                       ;;
-                               esac
-                       done
-                       IFS="$ac_save_ifs"
-                       ;;
-               *-hp-hpux*)
-                       CC="cc"
-                       ;;
-               mips-sgi-irix*)
-                       CC="cc"
-                       ;;
-       esac
-fi
-
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -13271,18 +13225,184 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if ${ac_cv_prog_cc_c99+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+  your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str;
+  int number;
+  float fnumber;
+
+  while (*format)
+    {
+      switch (*format++)
+       {
+       case 's': // string
+         str = va_arg (args_copy, const char *);
+         break;
+       case 'd': // int
+         number = va_arg (args_copy, int);
+         break;
+       case 'f': // float
+         fnumber = va_arg (args_copy, double);
+         break;
+       default:
+         break;
+       }
+    }
+  va_end (args_copy);
+  va_end (args);
+}
+
+int
+main ()
+{
+
+  // Check bool.
+  _Bool success = false;
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  test_varargs ("s, d' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+         || dynamic_array[ni.number - 1] != 543);
+
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c99"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then :
 
-#
-# gcc's optimiser is broken at -02 for ultrasparc
-#
-if test "$ac_env_CFLAGS_set" != set -a "X$GCC" = "Xyes"; then
-       case "$host" in
-       sparc-*)
-               CCFLAGS="-g -O1"
-               ;;
-       esac
 fi
 
+
+
 #
 # OS dependent CC flags
 #
@@ -13787,16 +13907,43 @@ _ACEOF
 
 fi
 
-ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default"
+
+  ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default"
 if test "x$ac_cv_type_uintptr_t" = xyes; then :
 
+$as_echo "#define HAVE_UINTPTR_T 1" >>confdefs.h
+
 else
+  for ac_type in 'unsigned int' 'unsigned long int' \
+       'unsigned long long int'; do
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
 
 cat >>confdefs.h <<_ACEOF
-#define uintptr_t unsigned long
+#define uintptr_t $ac_type
 _ACEOF
 
+         ac_type=
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+       test -z "$ac_type" && break
+     done
+fi
+
+
 
 ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "
 #include <sys/types.h>
index 55c8a888ae9fa56c1df1aa187155caa4300552e0..d80c2b8b5c86e372ee247780a3b563ad44f75dd9 100644 (file)
@@ -433,64 +433,8 @@ case "$INSTALL" in
                ;;
 esac
 
-#
-# On these hosts, we really want to use cc, not gcc, even if it is
-# found.  The gcc that these systems have will not correctly handle
-# pthreads.
-#
-# However, if the user sets $CC to be something, let that override
-# our change.
-#
-if test "X$CC" = "X" ; then
-       case "$host" in
-               *-dec-osf*)
-                       CC="cc"
-                       ;;
-               *-solaris*)
-                       # Use Sun's cc if it is available, but watch
-                       # out for /usr/ucb/cc; it will never be the right
-                       # compiler to use.
-                       #
-                       # If setting CC here fails, the AC_PROG_CC done
-                       # below might still find gcc.
-                       IFS="${IFS=     }"; ac_save_ifs="$IFS"; IFS=":"
-                       for ac_dir in $PATH; do
-                               test -z "$ac_dir" && ac_dir=.
-                               case "$ac_dir" in
-                               /usr/ucb)
-                                       # exclude
-                                       ;;
-                               *)
-                                       if test -f "$ac_dir/cc"; then
-                                               CC="$ac_dir/cc"
-                                               break
-                                       fi
-                                       ;;
-                               esac
-                       done
-                       IFS="$ac_save_ifs"
-                       ;;
-               *-hp-hpux*)
-                       CC="cc"
-                       ;;
-               mips-sgi-irix*)
-                       CC="cc"
-                       ;;
-       esac
-fi
-
 AC_PROG_CC
-
-#
-# gcc's optimiser is broken at -02 for ultrasparc
-#
-if test "$ac_env_CFLAGS_set" != set -a "X$GCC" = "Xyes"; then
-       case "$host" in
-       sparc-*)
-               CCFLAGS="-g -O1"
-               ;;
-       esac
-fi
+AC_PROG_CC_C99
 
 #
 # OS dependent CC flags
@@ -590,8 +534,9 @@ AC_TRY_COMPILE([
         AC_DEFINE(inline, ,[Define to empty if your compiler does not support "static inline".])])
 
 AC_TYPE_SIZE_T
-AC_CHECK_TYPE(ssize_t, int)
-AC_CHECK_TYPE(uintptr_t,unsigned long)
+AC_TYPE_SSIZE_T
+AC_TYPE_UINTPTR_T
+
 AC_CHECK_TYPE(socklen_t,
 [AC_DEFINE(ISC_SOCKADDR_LEN_T, socklen_t)],
 [