1# Check for stdbool.h that conforms to C99.
2
3dnl Copyright (C) 2002-2006 Free Software Foundation, Inc.
4dnl This file is free software; the Free Software Foundation
5dnl gives unlimited permission to copy and/or distribute it,
6dnl with or without modifications, as long as this notice is preserved.
7
8# Prepare for substituting <stdbool.h> if it is not supported.
9
10AC_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.
32AC_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
37AC_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