Blame gnulib-tests/test-stdbool.c

Packit 33f14e
/* Test of <stdbool.h> substitute.
Packit 33f14e
   Copyright (C) 2002-2007, 2009-2017 Free Software Foundation, Inc.
Packit 33f14e
Packit 33f14e
   This program is free software: you can redistribute it and/or modify
Packit 33f14e
   it under the terms of the GNU General Public License as published by
Packit 33f14e
   the Free Software Foundation; either version 3 of the License, or
Packit 33f14e
   (at your option) any later version.
Packit 33f14e
Packit 33f14e
   This program is distributed in the hope that it will be useful,
Packit 33f14e
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 33f14e
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 33f14e
   GNU General Public License for more details.
Packit 33f14e
Packit 33f14e
   You should have received a copy of the GNU General Public License
Packit 33f14e
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit 33f14e
Packit 33f14e
/* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
Packit 33f14e
Packit 33f14e
/* We want this test to succeed even when using gcc's -Werror; but to
Packit 33f14e
   do that requires a pragma that didn't exist before 4.3.0.  */
Packit 33f14e
#ifndef __GNUC__
Packit 33f14e
# define ADDRESS_CHECK_OKAY
Packit 33f14e
#elif __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
Packit 33f14e
/* No way to silence -Waddress.  */
Packit 33f14e
#else
Packit 33f14e
# pragma GCC diagnostic ignored "-Waddress"
Packit 33f14e
# define ADDRESS_CHECK_OKAY
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
#include <config.h>
Packit 33f14e
Packit 33f14e
#include <stdbool.h>
Packit 33f14e
Packit 33f14e
#ifndef bool
Packit 33f14e
 "error: bool is not defined"
Packit 33f14e
#endif
Packit 33f14e
#ifndef false
Packit 33f14e
 "error: false is not defined"
Packit 33f14e
#endif
Packit 33f14e
#if false
Packit 33f14e
 "error: false is not 0"
Packit 33f14e
#endif
Packit 33f14e
#ifndef true
Packit 33f14e
 "error: true is not defined"
Packit 33f14e
#endif
Packit 33f14e
#if true != 1
Packit 33f14e
 "error: true is not 1"
Packit 33f14e
#endif
Packit 33f14e
#ifndef __bool_true_false_are_defined
Packit 33f14e
 "error: __bool_true_false_are_defined is not defined"
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
/* Several tests cannot be guaranteed with gnulib's <stdbool.h>, at
Packit 33f14e
   least, not for all compilers and compiler options.  */
Packit 33f14e
#if HAVE_STDBOOL_H || 3 <= __GNUC__
Packit 33f14e
struct s { _Bool s: 1; _Bool t; } s;
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
char a[true == 1 ? 1 : -1];
Packit 33f14e
char b[false == 0 ? 1 : -1];
Packit 33f14e
char c[__bool_true_false_are_defined == 1 ? 1 : -1];
Packit 33f14e
#if HAVE_STDBOOL_H || 3 <= __GNUC__ /* See above.  */
Packit 33f14e
char d[(bool) 0.5 == true ? 1 : -1];
Packit 33f14e
# ifdef ADDRESS_CHECK_OKAY /* Avoid gcc warning.  */
Packit 33f14e
/* C99 may plausibly be interpreted as not requiring support for a cast from
Packit 33f14e
   a variable's address to bool in a static initializer.  So treat it like a
Packit 33f14e
   GCC extension.  */
Packit 33f14e
#  ifdef __GNUC__
Packit 33f14e
bool e = &s;
Packit 33f14e
#  endif
Packit 33f14e
# endif
Packit 33f14e
char f[(_Bool) 0.0 == false ? 1 : -1];
Packit 33f14e
#endif
Packit 33f14e
char g[true];
Packit 33f14e
char h[sizeof (_Bool)];
Packit 33f14e
#if HAVE_STDBOOL_H || 3 <= __GNUC__ /* See above.  */
Packit 33f14e
char i[sizeof s.t];
Packit 33f14e
#endif
Packit 33f14e
enum { j = false, k = true, l = false * true, m = true * 256 };
Packit 33f14e
_Bool n[m];
Packit 33f14e
char o[sizeof n == m * sizeof n[0] ? 1 : -1];
Packit 33f14e
char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
Packit 33f14e
/* Catch a bug in an HP-UX C compiler.  See
Packit 33f14e
   http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
Packit 33f14e
   http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
Packit 33f14e
 */
Packit 33f14e
_Bool q = true;
Packit 33f14e
_Bool *pq = &q;
Packit 33f14e
Packit 33f14e
int
Packit 33f14e
main ()
Packit 33f14e
{
Packit 33f14e
  int error = 0;
Packit 33f14e
Packit 33f14e
#if HAVE_STDBOOL_H || 3 <= __GNUC__ /* See above.  */
Packit 33f14e
# ifdef ADDRESS_CHECK_OKAY /* Avoid gcc warning.  */
Packit 33f14e
  /* A cast from a variable's address to bool is valid in expressions.  */
Packit 33f14e
  {
Packit 33f14e
    bool e1 = &s;
Packit 33f14e
    if (!e1)
Packit 33f14e
      error = 1;
Packit 33f14e
  }
Packit 33f14e
# endif
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
  /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
Packit 33f14e
     reported by James Lemley on 2005-10-05; see
Packit 33f14e
     http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
Packit 33f14e
     This is a runtime test, since a corresponding compile-time
Packit 33f14e
     test would rely on initializer extensions.  */
Packit 33f14e
  {
Packit 33f14e
    char digs[] = "0123456789";
Packit 33f14e
    if (&(digs + 5)[-2 + (bool) 1] != &digs[4])
Packit 33f14e
      error = 1;
Packit 33f14e
  }
Packit 33f14e
Packit 33f14e
  return error;
Packit 33f14e
}