Blame gnulib/tests/test-stdbool.c

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