summaryrefslogtreecommitdiff
path: root/lib/stdbool_.h
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2003-08-18 09:44:49 +0000
committerJim Meyering <jim@meyering.net>2003-08-18 09:44:49 +0000
commitb1b4af8047b2d6c2b2ea0d552969e25f872da675 (patch)
treeee8166cbc3f75e901def92c7c94473473d360165 /lib/stdbool_.h
parent84a9ab5a07427ab8322424cd0c401e847326e7e2 (diff)
downloadcoreutils-b1b4af8047b2d6c2b2ea0d552969e25f872da675.tar.xz
Sync with gnulib.
Diffstat (limited to 'lib/stdbool_.h')
-rw-r--r--lib/stdbool_.h55
1 files changed, 47 insertions, 8 deletions
diff --git a/lib/stdbool_.h b/lib/stdbool_.h
index c29958d4a..3dbb51b24 100644
--- a/lib/stdbool_.h
+++ b/lib/stdbool_.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2003 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
Written by Bruno Haible <haible@clisp.cons.org>, 2001.
This program is free software; you can redistribute it and/or modify
@@ -20,6 +20,37 @@
/* ISO C 99 <stdbool.h> for platforms that lack it. */
+/* Usage suggestions:
+
+ Programs that use <stdbool.h> should be aware of some limitations
+ and standards compliance issues.
+
+ Standards compliance:
+
+ - <stdbool.h> must be #included before 'bool', 'false', 'true'
+ can be used.
+
+ - You cannot assume that sizeof (bool) == 1.
+
+ - Programs should not undefine the macros bool, true, and false,
+ as C99 lists that as an "obsolescent feature".
+
+ Limitations of this substitute, when used in a C89 environment:
+
+ - <stdbool.h> must be #included before the '_Bool' type can be used.
+
+ - You cannot assume that _Bool is a typedef; it might be a macro.
+
+ - In C99, casts and automatic conversions to '_Bool' or 'bool' are
+ performed in such a way that every nonzero value gets converted
+ to 'true', and zero gets converted to 'false'. This doesn't work
+ with this substitute. With this substitute, only the values 0 and 1
+ give the expected result when converted to _Bool' or 'bool'.
+
+ Also, it is suggested that programs use 'bool' rather than '_Bool';
+ this isn't required, but 'bool' is more common. */
+
+
/* 7.16. Boolean type and values */
/* BeOS <sys/socket.h> already #defines false 0, true 1. We use the same
@@ -29,16 +60,24 @@
# undef true
#endif
-/* For the sake of symbolic names in gdb, define true and false as
- enum constants. However, do not define _Bool as the enum type,
- since the enum type might be compatible with unsigned int, whereas
- _Bool must promote to int. Also, make _Bool a macro rather than a
- typedef, to suppress warnings by the Sun Forte Developer 7 C
- compiler that _Bool is a keyword in ISO C99. */
+/* For the sake of symbolic names in gdb, we define true and false as
+ enum constants, not only as macros.
+ It is tempting to write
+ typedef enum { false = 0, true = 1 } _Bool;
+ so that gdb prints values of type 'bool' symbolically. But if we do
+ this, values of type '_Bool' may promote to 'int' or 'unsigned int'
+ (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
+ (see ISO C 99 6.3.1.1.(2)). So we add a negative value to the
+ enum; this ensures that '_Bool' promotes to 'int'. */
#ifndef __cplusplus
# if !@HAVE__BOOL@
+# if defined __SUNPRO_C && (__SUNPRO_C < 0x550 || __STDC__ == 1)
+ /* Avoid stupid "warning: _Bool is a keyword in ISO C99". */
+# define _Bool signed char
enum { false = 0, true = 1 };
-# define _Bool signed char
+# else
+typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
+# endif
# endif
#else
typedef bool _Bool;