Blame gl/tests/test-stdbool.c

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