Headers that c.h includes early should not have another header included before them in the headerscheck test file, especially not c.h.

A particular instance of a problem is that pg_config.h defines some symbols that c.h later undefines in some cases, such as in the code added by commit cd083b54bd67, but there were also some before that. This only works correctly if pg_config.h is included first.

This problem can currently be observed on CI.

pg_config_manual.h and pg_config_os.h are closely related to pg_config.h and should be treated the same way.

postgres_ext.h is meant to be usable standalone, so testing it with c.h included first defeats the point.

c.h also includes port.h, but this patch leaves that alone, since port.h does need some of c.h to be processed first. (But because of header guards, testing port.h separately is probably ineffective.)
From 8b5c6b5e2607878a206ce04c7ec885abd6a92dc3 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 23 Mar 2026 09:35:24 +0100
Subject: [PATCH] headerscheck: Avoid mutual inclusion of pg_config.h and c.h

Headers that c.h includes early should not have another header
included before them in the headerscheck test file, especially not
c.h.

A particular instance of a problem is that pg_config.h defines some
symbols that c.h later undefines in some cases, such as in the code
added by commit cd083b54bd67, but there were also some before that.
This only works correctly if pg_config.h is included first.

pg_config_manual.h and pg_config_os.h are closely related to
pg_config.h and should be treated the same way.

postgres_ext.h is meant to be usable standalone, so testing it with
c.h included first defeats the point.

c.h also includes port.h, but this commit leaves that alone, since
port.h does need some of c.h to be processed first.  (But because of
header guards, testing port.h separately is probably ineffective.)
---
 src/tools/pginclude/headerscheck | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 7f03c2b47bd..e6913140549 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -215,11 +215,16 @@ do
            # info to guess which, but in some subdirectories there's a
            # reasonable choice to make, and otherwise we use postgres.h.
            # Also, those three files should compile with no pre-include, as
-           # should src/interfaces headers meant to be exposed to clients.
+           # should files included early by c.h, as well as
+           # src/interfaces headers meant to be exposed to clients.
            case "$f" in
+               src/include/c.h) ;;
+               src/include/pg_config.h) ;;
+               src/include/pg_config_manual.h) ;;
+               src/include/pg_config_os.h) ;;
                src/include/postgres.h) ;;
+               src/include/postgres_ext.h) ;;
                src/include/postgres_fe.h) ;;
-               src/include/c.h) ;;
                src/interfaces/libpq/libpq-fe.h) ;;
                src/interfaces/libpq/libpq-events.h) ;;
                src/interfaces/ecpg/ecpglib/ecpglib_extern.h)
-- 
2.53.0

Reply via email to