Blame gnulib/tests/test-stdbool.c

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