Home | History | Annotate | Download | only in m4
      1 # Check for stdbool.h that conforms to C99.
      2 
      3 dnl Copyright (C) 2002-2006 Free Software Foundation, Inc.
      4 dnl This file is free software; the Free Software Foundation
      5 dnl gives unlimited permission to copy and/or distribute it,
      6 dnl with or without modifications, as long as this notice is preserved.
      7 
      8 # Prepare for substituting <stdbool.h> if it is not supported.
      9 
     10 AC_DEFUN([AM_STDBOOL_H],
     11 [
     12   AC_REQUIRE([AC_HEADER_STDBOOL])
     13 
     14   # Define two additional variables used in the Makefile substitution.
     15 
     16   if test "$ac_cv_header_stdbool_h" = yes; then
     17     STDBOOL_H=''
     18   else
     19     STDBOOL_H='stdbool.h'
     20   fi
     21   AC_SUBST([STDBOOL_H])
     22 
     23   if test "$ac_cv_type__Bool" = yes; then
     24     HAVE__BOOL=1
     25   else
     26     HAVE__BOOL=0
     27   fi
     28   AC_SUBST([HAVE__BOOL])
     29 ])
     30 
     31 # AM_STDBOOL_H will be renamed to gl_STDBOOL_H in the future.
     32 AC_DEFUN([gl_STDBOOL_H], [AM_STDBOOL_H])
     33 
     34 # This macro is only needed in autoconf <= 2.59.  Newer versions of autoconf
     35 # have this macro built-in.
     36 
     37 AC_DEFUN([AC_HEADER_STDBOOL],
     38   [AC_CACHE_CHECK([for stdbool.h that conforms to C99],
     39      [ac_cv_header_stdbool_h],
     40      [AC_TRY_COMPILE(
     41 	[
     42 	  #include <stdbool.h>
     43 	  #ifndef bool
     44 	   "error: bool is not defined"
     45 	  #endif
     46 	  #ifndef false
     47 	   "error: false is not defined"
     48 	  #endif
     49 	  #if false
     50 	   "error: false is not 0"
     51 	  #endif
     52 	  #ifndef true
     53 	   "error: true is not defined"
     54 	  #endif
     55 	  #if true != 1
     56 	   "error: true is not 1"
     57 	  #endif
     58 	  #ifndef __bool_true_false_are_defined
     59 	   "error: __bool_true_false_are_defined is not defined"
     60 	  #endif
     61 
     62 	  struct s { _Bool s: 1; _Bool t; } s;
     63 
     64 	  char a[true == 1 ? 1 : -1];
     65 	  char b[false == 0 ? 1 : -1];
     66 	  char c[__bool_true_false_are_defined == 1 ? 1 : -1];
     67 	  char d[(bool) 0.5 == true ? 1 : -1];
     68 	  bool e = &s;
     69 	  char f[(_Bool) 0.0 == false ? 1 : -1];
     70 	  char g[true];
     71 	  char h[sizeof (_Bool)];
     72 	  char i[sizeof s.t];
     73 	  enum { j = false, k = true, l = false * true, m = true * 256 };
     74 	  _Bool n[m];
     75 	  char o[sizeof n == m * sizeof n[0] ? 1 : -1];
     76 	  char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
     77 	  #if defined __xlc__ || defined __GNUC__
     78 	   /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
     79 	      reported by James Lemley on 2005-10-05; see
     80 	      http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
     81 	      This test is not quite right, since xlc is allowed to
     82 	      reject this program, as the initializer for xlcbug is
     83 	      not one of the forms that C requires support for.
     84 	      However, doing the test right would require a run-time
     85 	      test, and that would make cross-compilation harder.
     86 	      Let us hope that IBM fixes the xlc bug, and also adds
     87 	      support for this kind of constant expression.  In the
     88 	      meantime, this test will reject xlc, which is OK, since
     89 	      our stdbool.h substitute should suffice.  We also test
     90 	      this with GCC, where it should work, to detect more
     91 	      quickly whether someone messes up the test in the
     92 	      future.  */
     93 	   char digs[] = "0123456789";
     94 	   int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
     95 	  #endif
     96 	  /* Catch a bug in an HP-UX C compiler.  See
     97 	     http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
     98 	     http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
     99 	   */
    100 	  _Bool q = true;
    101 	  _Bool *pq = &q;
    102 	],
    103 	[
    104 	  *pq |= q;
    105 	  *pq |= ! q;
    106 	  /* Refer to every declared value, to avoid compiler optimizations.  */
    107 	  return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
    108 		  + !m + !n + !o + !p + !q + !pq);
    109 	],
    110 	[ac_cv_header_stdbool_h=yes],
    111 	[ac_cv_header_stdbool_h=no])])
    112    AC_CHECK_TYPES([_Bool])
    113    if test $ac_cv_header_stdbool_h = yes; then
    114      AC_DEFINE(HAVE_STDBOOL_H, 1, [Define to 1 if stdbool.h conforms to C99.])
    115    fi])
    116