Hi, I was about to propose adding headerscheck / cpluspluscheck to the CI file so that cfbot can catch future issues. Unfortunately running cpluspluscheck with ICU enabled is, um, not fun: There's 30k lines of error output.
/home/andres/src/postgresql/src/tools/pginclude/cpluspluscheck /home/andres/src/postgresql /home/andres/build/postgres/dev-assert/vpath In file included from /usr/include/c++/12/bits/stl_algobase.h:60, from /usr/include/c++/12/memory:63, from /usr/include/unicode/localpointer.h:45, from /usr/include/unicode/unorm2.h:34, from /usr/include/unicode/unorm.h:25, from /usr/include/unicode/ucol.h:17, from /home/andres/src/postgresql/src/include/utils/pg_locale.h:19, from /home/andres/src/postgresql/src/include/tsearch/ts_locale.h:20, from /tmp/cpluspluscheck.H59Y6V/test.cpp:3: /usr/include/c++/12/bits/functexcept.h:101:3: error: conflicting declaration of C function ‘void std::__throw_ios_failure(const char*, int)’ 101 | __throw_ios_failure(const char*, int) __attribute__((__noreturn__)); | ^~~~~~~~~~~~~~~~~~~ /usr/include/c++/12/bits/functexcept.h:98:3: note: previous declaration ‘void std::__throw_ios_failure(const char*)’ 98 | __throw_ios_failure(const char*) __attribute__((__noreturn__)); | ^~~~~~~~~~~~~~~~~~~ In file included from /usr/include/c++/12/bits/stl_algobase.h:63: /usr/include/c++/12/ext/numeric_traits.h:50:3: error: template with C linkage 50 | template<typename _Tp> | ^~~~~~~~ /tmp/cpluspluscheck.H59Y6V/test.cpp:1:1: note: ‘extern "C"’ linkage started here 1 | extern "C" { | ^~~~~~~~~~ ... with one warning for each declaration in numeric_traits.h, I think. So, there's two questions: 1) How can we prevent this problem when ICU support is enabled? 2) Can we prevent such absurdly long error output? For 2), perhaps we should just specify EXTRAFLAGS=-fmax-errors=10 in the cpluspluscheck invocation, or add it in cpluspluscheck itself? For 1), I don't immediately see a minimal solution other than ignoring it in cpluspluscheck, similar to pg_trace.h/probes.h. A different / complimentary approach could be to add -Wc++-compat to the headerscheck invocation. Both gcc and clang understand that. But neither of these really gets to the heart of the problem. There's still no way for C++ code to include pg_locale.h correctly. And in contrast to pg_trace.h/probes.h pg_locale.h is somewhat important. This isn't a new problem, afaics. Perhaps we should strive to remove the use of ICU headers from within our headers? The members of pg_locale are just pointers and could thus be void *, and HAVE_UCOL_STRCOLLUTF8 could be computed at configure time or such. Greetings, Andres Freund