pgsql: Use stdbool.h if suitable

Started by Peter Eisentrautover 8 years ago4 messagescomitters
Jump to latest
#1Peter Eisentraut
peter_e@gmx.net

Use stdbool.h if suitable

Using the standard bool type provided by C allows some recent compilers
and debuggers to give better diagnostics. Also, some extension code and
third-party headers are increasingly pulling in stdbool.h, so it's
probably saner if everyone uses the same definition.

But PostgreSQL code is not prepared to handle bool of a size other than
1, so we keep our own old definition if we encounter a stdbool.h with a
bool of a different size. (Among current build farm members, this only
applies to old macOS versions on PowerPC.)

To check that the used bool is of the right size, add a static
assertions about size of GinTernaryValue vs bool. This is currently the
only place that assumes that bool and char are of the same size.

Discussion: /messages/by-id/3a0fe7e1-5ed1-414b-9230-53bbc0ed1f49@2ndquadrant.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/9a95a77d9d5d3003d2d67121f2731b6e5fc37336

Modified Files
--------------
src/backend/utils/adt/tsginidx.c | 4 +++-
src/include/access/gin.h | 4 ++--
src/include/c.h | 14 ++++++++++++--
src/include/pg_config.h.win32 | 9 +++++++++
src/pl/plperl/plperl.h | 10 +++++-----
5 files changed, 31 insertions(+), 10 deletions(-)

#2Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#1)
Re: pgsql: Use stdbool.h if suitable

Hi,

On 2018-03-23 00:42:39 +0000, Peter Eisentraut wrote:

Use stdbool.h if suitable

Using the standard bool type provided by C allows some recent compilers
and debuggers to give better diagnostics. Also, some extension code and
third-party headers are increasingly pulling in stdbool.h, so it's
probably saner if everyone uses the same definition.

Hah. I was setting up LLVM buildfarm animals that run with LLVM
assertions enabled, and was getting confused why they're failing after
I'd run a check-world locally with assertions enabled.

Turns out this broke it. I'll fix it. Just amazed that we've gone weeks
without a change breaking my JIT work, and then within hours of it
getting it got broken. Turns out LLVM represents a stdbool.h boolean as
an i1 (int with 1 bit) rather than an i8 (int with 8 bits), which makes
sense given the desired boolean behaviour (still takes 8 bits of
storage).

Greetings,

Andres Freund

#3Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#1)
Re: pgsql: Use stdbool.h if suitable

Hi,

On 2018-03-23 00:42:39 +0000, Peter Eisentraut wrote:

Use stdbool.h if suitable

Using the standard bool type provided by C allows some recent compilers
and debuggers to give better diagnostics. Also, some extension code and
third-party headers are increasingly pulling in stdbool.h, so it's
probably saner if everyone uses the same definition.

But PostgreSQL code is not prepared to handle bool of a size other than
1, so we keep our own old definition if we encounter a stdbool.h with a
bool of a different size. (Among current build farm members, this only
applies to old macOS versions on PowerPC.)

To check that the used bool is of the right size, add a static
assertions about size of GinTernaryValue vs bool. This is currently the
only place that assumes that bool and char are of the same size.

This appears to have broken buildfarm animal locust:

https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=locust&dt=2018-03-23%2001%3A13%3A30

I suspect that's because of the perl hunk

src/pl/plperl/plperl.h | 10 +++++-----

Greetings,

Andres Freund

#4Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#2)
Re: pgsql: Use stdbool.h if suitable

On 2018-03-22 18:25:01 -0700, Andres Freund wrote:

Hi,

On 2018-03-23 00:42:39 +0000, Peter Eisentraut wrote:

Use stdbool.h if suitable

Using the standard bool type provided by C allows some recent compilers
and debuggers to give better diagnostics. Also, some extension code and
third-party headers are increasingly pulling in stdbool.h, so it's
probably saner if everyone uses the same definition.

Hah. I was setting up LLVM buildfarm animals that run with LLVM
assertions enabled, and was getting confused why they're failing after
I'd run a check-world locally with assertions enabled.

Turns out this broke it. I'll fix it. Just amazed that we've gone weeks
without a change breaking my JIT work, and then within hours of it
getting it got broken. Turns out LLVM represents a stdbool.h boolean as
an i1 (int with 1 bit) rather than an i8 (int with 8 bits), which makes
sense given the desired boolean behaviour (still takes 8 bits of
storage).

Pushed a fix. There's now an array of llvm with assertion using
buildfarm animals. The one I was trying to setup, shows the before/after
now:
https://buildfarm.postgresql.org/cgi-bin/show_history.pl?nm=xenodermus&br=HEAD

- Andres