[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: bool and C23
From: |
Bruno Haible |
Subject: |
Re: bool and C23 |
Date: |
Sun, 18 Sep 2022 19:10:47 +0200 |
Paul Eggert wrote on 2022-09-10:
> I installed into Gnulib the stdbool patches ...
>
> After we have more experience with this in Gnulib, we can start thinking
> about updating Autoconf.
As part of this "gathering experience", I compiled a gnulib testdir with
various compilers on various systems.
No problems seen
- with GCC,
- with clang (I tested all versions from clang 3.9 to clang 14),
- with AIX xlc and xlclang.
But with Sun C++ on Solaris 10 (SOS11, __SUNPRO_CC=0x580 [1]) and
11.3 (solstudio12.2, __SUNPRO_CC=0x5110 [1]) I get a compilation error:
CC -xarch=generic64 -O -DHAVE_CONFIG_H -DEXEEXT=\"\" -I. -I../../gltests -I..
-DGNULIB_STRICT_CHECKING=1 -DIN_GNULIB_TESTS=1 -I. -I../../gltests -I..
-I../../gltests/.. -I../gllib -I../../gltests/../gllib
-I/home/haible/prefix-x86_64/include -D_REENTRANT -g -c -o test-stdbool-c++.o
../../gltests/test-stdbool-c++.cc
"../../gltests/test-stdbool-c++.cc", line 33: Error: A declaration was expected
instead of ""error: true is not 1"".
1 Error(s) detected.
*** Error code 1
This compiler defines _BOOL, to indicate that 'bool', 'true', 'false' are
keywords [2]. But in the preprocessor, 'true' evaluates to 0, not 1 !
Although cppreference.com does not clearly state that 'true' and 'false'
must be usable as in preprocessor directives, such a compiler behaviour
will show up as bugs in application programs, when more and more applications
use 'true' and 'false' instead of old-style '1' and '0'. Thus, I think we
should fix this compiler behaviour.
What can the replacement be?
#define true 1
does not work, because it would be of type 'int' and thus not behave right
w.r.t. overloaded functions, such as
int func (int);
int func (bool);
#define true ((bool) 1)
fixes the type, but is not usable in preprocessor expressions, since casts
are not allowed there.
#define true (!false)
works! It evaluates to 1 and is of the right type.
Done through the attached patches. The second one should get included into
Autoconf's AC_C_BOOL, when that comes to exist.
[1] https://github.com/cpredef/predef/blob/master/Compilers.md
[2] https://docs.oracle.com/cd/E37069_01/html/E54439/uc-cc-1.html
2022-09-18 Bruno Haible <bruno@clisp.org>
stdbool: Ensure that 'true' can be used in the preprocessor.
* m4/c-bool.m4 (gl_C_BOOL): With Sun C++, redefine 'true' if it does not
evaluate to 1 in the preprocessor.
stdbool-c99: Ensure that 'true' can be used in the preprocessor.
* lib/stdbool.in.h (true): Redefine if it does not evaluate to 1 in the
preprocessor.
0001-stdbool-c99-Ensure-that-true-can-be-used-in-the-prep.patch
Description: Text Data
0002-stdbool-Ensure-that-true-can-be-used-in-the-preproce.patch
Description: Text Data
- Re: bool and C23, Paul Eggert, 2022/09/09
- Re: bool and C23, Bruno Haible, 2022/09/09
- Re: bool and C23, Paul Eggert, 2022/09/10
- Re: bool and C23, Bruno Haible, 2022/09/10
- Re: bool and C23, Paul Eggert, 2022/09/10
- Re: bool and C23,
Bruno Haible <=
- Re: bool and C23, Paul Eggert, 2022/09/18
- Re: bool and C23, Bruno Haible, 2022/09/18